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 ?
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);
}
}
Dernière modification par Voltron ; 06/09/2007 à 01h36.
J'y connais rien en PIC, mais c'est typique d'un conflit entre ton entrée externe et ta patte de PIC qui est resté en Output. Règle ce problème et ensuite tu auras un beau 5V que ton PIC lira avec voluptuosité !
L'age n'est pas un handicap .... Encore faut-il arriver jusque là pour le constater !
06/09/2007 - 09h34
invite_P89
Invité
Re : 2,5 V sur l'input d'un PIC ???
LU
pour mettre ton port B en entrée IL faut TRISB=1
pour mettre ton port D en entrée Il faut TRISD=1
a bientôt
06/09/2007 - 09h49
invite_P89
Invité
Re : 2,5 V sur l'input d'un PIC ???
RELU
pas vu desolé sorties decodeur sur port A
fait attention A4 est a drain OUVERT donc resistance sur ce port si tu utilise A4
06/09/2007 - 09h58
invite_P89
Invité
Re : 2,5 V sur l'input d'un PIC ???
Envoyé par Voltron
salut,
je commande avec un PIC 16F877 avec un clavier 20 touches via l'encodeur 74C923 (à travers 4 pins), RB4,RB5,RB6 et RB7,
ici tu nous dit que ton decodeur est sur PORT B
puis apres c'est le port A qui gere le decodeur on sait plus regarde de ce coté
ou est ton decodeur sur quel port,ce port est-il en entré moi je ne sais plus
a bientôt
06/09/2007 - 17h07
freepicbasic
Date d'inscription
août 2006
Localisation
France
Âge
56
Messages
2 737
Re : 2,5 V sur l'input d'un PIC ???
2,5V sera lu comme un 5V c'est à dire 1.
Il semblerait qu'il y ai un mauvais cablage 2,5V signifie qu'il y a 2 résistances égales 1 au + 1 au moins, ou comme disait Daudet78 2 sorties en conflit l'une à 0 l'autre a 1.
Sur le bout de code on ne voit pas la partie scan ou autre ,
donc on ne peut pas savoir s'il y a un bug,
mais c'est plutôt un problème de câblage, un bug ne peut pas faire du 2,5V.
J'y connais rien en PIC, mais c'est typique d'un conflit entre ton entrée externe et ta patte de PIC qui est resté en Output. Règle ce problème et ensuite tu auras un beau 5V que ton PIC lira avec voluptuosité !
Salut,
salut DAUDET,
les ports B du PIC sont déjà configuré en input ?, la preuve c'est que le PIC a capté le signal issues de l'encodeur sur RB4 et RB5 !
06/09/2007 - 19h03
Voltron
Date d'inscription
mars 2007
Messages
353
Re : 2,5 V sur l'input d'un PIC ???
Envoyé par Pom26
ici tu nous dit que ton decodeur est sur PORT B
puis apres c'est le port A qui gere le decodeur on sait plus regarde de ce coté
ou est ton decodeur sur quel port,ce port est-il en entré moi je ne sais plus
a bientôt
salut Pom26,
il s'agit d'une erreur dans le commentaire que j'ai oublié de supprimer !
, ce sont uniquement les pins B (RB3-->RB7) qui gèrent l'encodeur !
06/09/2007 - 19h10
Voltron
Date d'inscription
mars 2007
Messages
353
Re : 2,5 V sur l'input d'un PIC ???
Envoyé par freepicbasic
2,5V sera lu comme un 5V c'est à dire 1.
Il semblerait qu'il y ai un mauvais cablage 2,5V signifie qu'il y a 2 résistances égales 1 au + 1 au moins, ou comme disait Daudet78 2 sorties en conflit l'une à 0 l'autre a 1.
Sur le bout de code on ne voit pas la partie scan ou autre ,
donc on ne peut pas savoir s'il y a un bug,
mais c'est plutôt un problème de câblage, un bug ne peut pas faire du 2,5V.
salut freepicbasic,
j'ai vérifié le cablage et le code et il me semble qu'il sont correctes !
06/09/2007 - 19h23
DAUDET78
Date d'inscription
septembre 2006
Localisation
Ile de France
Âge
69
Messages
32 131
Re : 2,5 V sur l'input d'un PIC ???
Faut être réaliste :
1/ Ton encodeur marche si il est seul et à un Vout de 5V
2/ ton niveau logique sur la broche du PIC passe à 2,5V si tu branches ton encodeur
Donc il y a un conflit, tu trouvera jamais la cause du problème si tu parts du principe que ton soft est bon et que ton hard est bon.
Un simple test. Fait un pont diviseur 5V__1K__1K__0V
Et place le point milieu sur la patte de ton PIC (sans l'encodeur).
1/ Tu mesures 5V ou 0V sur la patte, elle est en sortie
2/ Tu mesures 2,5V , elle est en entrée
(mesure à faire à l'oscilloscope de préférence)
L'age n'est pas un handicap .... Encore faut-il arriver jusque là pour le constater !
Faut être réaliste :
1/ Ton encodeur marche si il est seul et à un Vout de 5V
2/ ton niveau logique sur la broche du PIC passe à 2,5V si tu branches ton encodeur
Donc il y a un conflit, tu trouvera jamais la cause du problème si tu parts du principe que ton soft est bon et que ton hard est bon.
Un simple test. Fait un pont diviseur 5V__1K__1K__0V
Et place le point milieu sur la patte de ton PIC (sans l'encodeur).
1/ Tu mesures 5V ou 0V sur la patte, elle est en sortie
2/ Tu mesures 2,5V , elle est en entrée
(mesure à faire à l'oscilloscope de préférence)
bien DAUDET, mais j'aurais toujours 2,5 V sur RB6 ou RB7 dans ce cas !, car avec ce montage j'impose la tension au pin du PIC, qu'il soit configuré en entrée ou en sortie !?
t'en dis quoi ?
06/09/2007 - 20h00
DAUDET78
Date d'inscription
septembre 2006
Localisation
Ile de France
Âge
69
Messages
32 131
Re : 2,5 V sur l'input d'un PIC ???
Envoyé par Voltron
bien DAUDET, mais j'aurais toujours 2,5 V sur RB6 ou RB7 dans ce cas !, car avec ce montage j'impose la tension au pin du PIC, qu'il soit configuré en entrée ou en sortie !?
Si ton PIC est en sortie j'impose une tension de sortie de 2,5v à ton PIC Mais avec un courant max de 5 mA. Si ton PIC est en sortie, c'est lui qui impose sa tension (je crois qu'il peut driver 25 mA).
Avant de discuter, fait la manip et on regarde les résultats !
L'age n'est pas un handicap .... Encore faut-il arriver jusque là pour le constater !
06/09/2007 - 20h12
Voltron
Date d'inscription
mars 2007
Messages
353
Re : 2,5 V sur l'input d'un PIC ???
Envoyé par DAUDET78
Avant de discuter, fait la manip et on regarde les résultats !
OK !!
06/09/2007 - 20h58
cranor
Date d'inscription
août 2007
Localisation
Ile de France
Âge
27
Messages
71
Re : 2,5 V sur l'input d'un PIC ???
Envoyé par Pom26
LU
pour mettre ton port B en entrée IL faut TRISB=1
pour mettre ton port D en entrée Il faut TRISD=1
a bientôt
ça mettra uniquement la premiere broche de chaque port en entrée..
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 ?
Salut pour les microcontroleurs et autres circuits logiques, les 0 et 1 logiques correspondent à des plages de tensions qui dépendent de la tension d'alimentation.
Pour le PIC16F877, voir la documentation page 155 paramètres VIL et VIH : http://ww1.microchip.com/downloads/e...Doc/30292c.pdf
Un 0 logique (VIL) doit être compris entre 0 et 0.15Vdd
Un 1 logique (VIH) doit être compris entre 0.25Vdd+0.8V et Vdd .
Donc en gros de 0 à 0.8V c'est compris en entrée comme un 0 et de 2V à 5V comme un 1.
Ton 2.5V sera donc vu comme un 1 (si ton alimentation est de 5V).