salut,
je commande avec un PIC 16F877 avec un clavier 20 touches via l'encodeur 74C923 (à travers 4 pins), RB4,RB5,RB6 et RB7,
comme première étape, j'ai testé mon encodeur (sans relier ses pin de sorties au pic !!! )qui lorseque j'appuie sur une touche du clavier (par exemple celle situé à la 2ème ligne,3ème colonne), me donne le code binaire correspondand à sa sortie (0110) qui en pratique , 5 Volts sur ces pins 16 et 17 et 0 Volt sur les pins 15, 18 et 19 !!,pour toutes les touches du clavier, l'encodeur a fonctionné correctement en donnant le code exacte pour chaque touche!!
dans la 2ème étape, j'ai relié les pins 15-->19 au pic et j'ai refait le test précédant !!, gros problème , lorseque j'appuie sur une touche qui dans le code binaire dépasse 00011, cad qu'elle sollicite les pin 16 et 17, j'ai toujours au alentours de 2,5 V sur ces pins, même si la pin n'est pas mise à 5 Volts (comme c le cas pour 00111), j'ai 5V, sur 19 et 18 (c'est bon), et 2,5 sur 17 et 16 !!!
Rque:
pin 16 (DATA OUT D) est rélié a RB7
pin 17 (DATA OUT C) est relié à RB6
je pense que dans ce cas en plus de l'erreur dans le codage, le pic ne va pas savoir si le 2,5 volts correspond à 0 ou à 5 V ?
d'après vous c'est quoi la cause de mon problème ?
pour mieux comprendre voici le datasheet du 74C923 : http://www.datasheetcatalog.com/data...9/74C923.shtml
NB: sur ISIS la simulation a pourtant bien fonctionner sur l'encodeur 74C922 relié à un clavier 16 touches !
voici le code du programme du PIC :
Code:#include <16F877a.h> //#device adc=8 #use delay(clock=4000000) #use rs232(baud=9600,parity=N,xmit=PIN_C6,rcv=PIN_C7) #define DEM1 PIN_A0 #define DEM2 PIN_A1 // pin reliée au démultiplexeur #define DEM3 PIN_A2 #define DEM4 PIN_A3 #define A4 PIN_A4 #define A5 PIN_A5 #define TIS PIN_E0 // pin relié au relais de choix Temp/Isol pour Simplexe #define TID PIN_E1 // pin relié au relais de choix Temp/Isol pour Duplexe #define CTD PIN_E2 // pin relié au relais de choix test de température C1/C2 pour Duplexe #define R1 PIN_C0 // pin reliée au relais 1 via l'étage de puissance #define R2 PIN_C1 // pin reliée au relais 2 via l'étage de puissance #define R3 PIN_C2 // pin reliée au relais 3 via l'étage de puissance #define R4 PIN_C3 // pin reliée au relais 4 via l'étage de puissance #define LED_isol PIN_C4 // pin reliée a une LED qui indique que le test en cours est un test d'isolement #define LED_temp PIN_C5 #define C6 PIN_C6 #define C7 PIN_C7 #define D0 PIN_D0 #define D1 PIN_D1 #define D2 PIN_D2 #define D3 PIN_D3 #define D4 PIN_D4 // pin du PIC relié au Décodeur (affichage) #define D5 PIN_D5 #define SIM PIN_D6 #define DUP PIN_D7 #define B0 PIN_B0 #define B1 PIN_B1 #define B2 PIN_B2 #define B3 PIN_B3 #define B4 PIN_B4 // pin du PIC relié au Décodeur (affichage) #define B5 PIN_B5 #define B6 PIN_B6 #define B7 PIN_B7 int simpl, dupl, isol, temp ; void choix_et_affich_isol(byte encodeur) // cette fonction lorsequ'elle est exécuté fait éteindre la LED d'isolement, pkoi ???!, port c ? { if (isol==1) { switch (encodeur) { case (0x04) : // test d'isolement C1m { output_c(0X19) ; //printf("maintenant test d'isolement C1m") ; output_d(0X01) ; break; } case (0x05) : // test d'isolement C1M { output_c(0X11) ; output_d(0X02) ; break; } case (0x06) : // test d'isolement mM { output_c(0X18) ; output_d(0X03) ; break; } case (0x07) : // test d'isolement C2m { output_c(0X1A) ; output_d(0X04) ; break; } } } } void reset(byte encodeur) { if ( (encodeur==0x00) || (encodeur==0x01) ) { simpl=0 ; dupl=0; isol=0; temp=0; output_low(LED_isol); output_low(LED_temp); output_low(TIS); output_low(TID); output_low(CTD); output_a(0x00); } } void choix_simplex_duplex(byte encodeur) // cette fonction est rebouclé tout le temps , on peut passer entre les deux boutons en traversant le programme sans alterer le reste car le main est un ensemble de fonction avec des case et si aucune n'est validé , on retourne a la fonction du début qui est choix simplex/duplex { reset(encodeur); // cette fonction n'est exécutée que si le dernier bouton appuyé est SIMPL ou DUPL --> il ya pas donc de risque d'une reset en boucle // même si on ne touche pas à un bouton (après avoir appuyé sur SIMPL ou DUPL ) la fonction reset() est exécutée ( car elle est à l'intérieur d'une boucle) . switch (encodeur) { case (0x00) : // bouton simplexe { //reset(encodeur); output_high(SIM) ; // c temporaire, juste pour visualiser simpl=1; dupl=0; break; } case (0x01) : // bouton duplexe { //reset(encodeur); output_high(DUP) ; dupl=1; simpl=0; break;} } } void choix_isol_temp(byte encodeur) { switch (encodeur) { case (0X02) : // bouton isolement appuyé { output_c(0x10) ; // LED d'isolement allumée // output_high(LED_isol) ; // output_low(LED_temp) ; isol=1; temp=0; if (simpl==1) { // output_low(TIS) ; output_e(0x0) ; // passer d'un eventuel test en Temp } if (dupl==1) { // output_low(TID) ; output_e(0x0) ; // passer d'un eventuel test en Temp } break; } case (0X03) : // bouton temperature appuyé { output_c(0x20) ; // c bon, ca n'affecte pas la commande des 4 relais et la LED reste allumé pendant la sélection de voies. //output_low(LED_isol) ; //output_high(LED_temp) ; isol=0; temp=1; if (simpl==1) { // output_high(TIS) ; output_e(0x01) ; // passer à un test en Temp } if (dupl==1) { // output_high(TID) ; output_e(0x02) ; // passer à un test en Temp } break; } } } void select_voie(byte encodeur) { if (simpl==1) { switch (encodeur) { case (0x08) : { output_a(0x00) ; break; } case (0b00001001) : // 0b00001101 : // voie 2, simplexe { output_a(0x01) ; break; } case (0b00001010) : // 0b00001110 : // voie 3, simplexe { output_a(0x02) ; break; } case (0b00001011) : // voie 4, simplexe { output_a(0x03) ; break; } case (0b00001100) : // voie 5, simplexe { output_a(0x04) ; break;} case (0b00001101) : // voie 6, simplexe { output_a(0x05) ; break; } case (0b00001110) : // voie 7, simplexe { output_a(0x06) ; break; } case (0b00001111) : // voie 8, simplexe { output_a(0x07) ; break; } } // fin pour switch } // pour if if (dupl==1) { switch (encodeur) { case (0b00001000) : // voie 1, duplexe { output_a(0x08) ; break; } case (0b00001001) : // voie 2, duplexe { output_a(0x09) ; break; } case (0b00001010) : // voie 3, duplexe { output_a(0x0a) ; break; } case (0b00001011) : // voie 4, duplexe { output_a(0x0b) ; break; } case (0b00001100) : // voie 5, duplexe { output_a(0x0c) ; break; } case (0b00001101) : // voie 6, duplexe { output_a(0x0d) ; break; } case (0b00001110) : // voie 7, duplexe { output_a(0x0e) ; break; } case (0b00001111) : // voie 8, duplexe { output_a(0x0f) ; break; } } // fin pour switch } //fin pour if } byte encodeur; void main() { setup_adc_ports(NO_ANALOGS); setup_adc(ADC_OFF); // convertisseur ana/num désactivé ! set_tris_a(0) ; set_tris_c(0) ; set_tris_d(0) ; set_tris_e(0) ; // set_tris_b(1) ; output_d(0) ; output_c(0) ; encodeur=input_b() >> 4 ; // même princie en nput ?? output_low(LED_isol) ; // LED éteinte output_low(LED_temp) ; while (1) { encodeur=input_b() >> 4 ; choix_simplex_duplex(encodeur) ; choix_isol_temp(encodeur) ; choix_et_affich_isol(encodeur) ; select_voie(encodeur); } }
-----