Bonsoir à tous,
je rencontre un gros probleme sur la gestion de 3 afficheurs septs segments anode commune multiplexé avec un PIC18F.
il s'agit d'un compteur de 000 jusqu'a 999.
;
J'ai testé le montage en hardware, ca fonctionne tres bien pour deux afficheurs, il compte bien de 00 jusqu'a 99 mais lorsque je rajoute le troisieme afficheur, ca fait n'importe quoi, au lieu de faire 001, 002, 003, etc jusqu'a 999, le premier digit et le 3 ieme digit donne toujours le meme chiffre!!
c'est a dire il commence a compter 000 puis 101 puis 202 puis 303, le premier digit et le dernier digit compte ensemble alors que dans le programme il devrait compter normalement!
voici le codeCode:// Mise en oeuvre Afficheur Sept Segment Anode Commune // 07/07/2014 // Mikroc Compiler From Mikroelektronika #define Sel1 LATC.F0 // On affecte la macro Sel1 au PORTC0 #define Sel2 LATC.F1 // On affecte la macro Sel2 au PORTC1 #define Sel3 LATC.F2 // On affecte la macro Sel3 au PORTC2 #define Sel4 LATB.F5 // On affecte la macro Sel4 au PORTD4 unsigned int val = 0; // Variable Val non signé servant à compter les chiffres volatile unsigned char count = 0; // Variable count utilisée pour multiple de l'interruption volatile unsigned char flag_0 = 0; int units; int tens; int cents; int digit[2]; // Prototype des fonctions void Init_Pic(); // Initialise le Pic18F4550 void InitTimer1(); // Initialise les registres du Timer1 du PIC18F4550 unsigned char Seven_seg(unsigned char Value); // Fonction qui sert à afficher les chiffres sur les afficheurs septs segments void main(){ Init_Pic(); InitTimer1(); Sel1 = 0; // Variable de multiplexage ( Premier afficheur) commande le transistor Q1 Sel2 = 0; // Variable de multiplexage ( Deuxième afficheur) commande le transistor Q2 while(1){ // Boucle infinie digit[0] = val % 10; tens = (val - digit[0]) / 10; digit[1] = tens % 10; cents = val / 100; digit[2] = cents % 10; Sel4 = 1; delay_ms(7); Sel4 = 0; PORTD = Seven_seg(digit[0]); Sel3 = 1; delay_ms(7); Sel3 = 0; PORTD = Seven_seg(digit[1]); Sel2 = 1; delay_ms(7); Sel2 = 0; PORTD = Seven_seg(digit[2]); if (flag_0 == 1){ // On a détecter une interruption ( On arrive ici chaque 1 seconde (100 ms * 10 = 1000 ms = 1 s)) val++; // On incrémente de 1 notre variable val flag_0 = 0; // On remet à Zéro le bit de flag } } } void Init_Pic(){ ADCON1 = 0x0D; // Tous les Ports en Digital sauf RA0 et RA1 qui restent en analogique CMCON = 7; // Désactiver les comparateurs analogiques TRISC = 0; // PORTC En sortie LATC = 0; // Mise à 0 du PORTC entier TRISD = 0; // PORTD en sortie LATD = 0; // Mise à 0 du PORTD entier TRISB = 0; // PORTB en entrée LATB = 0; // Mise à 0 du PORTB entier TRISE = 0; LATE = 0; TRISA = 0; LATA = 0; } unsigned char Seven_seg(unsigned char Value){ // Fonction d'affichage des chiffres switch(Value){ case 0 : return ~0xC0; // Retourne le chiffre 1 lorsque value vaut 0 (Les digits sont inversés à cause de l'usage du ULN2003) case 1 : return ~0xF9; // Retourne le chiffre 2 ....................... case 2 : return ~0xA4; case 3 : return ~0xB0; case 4 : return ~0x99; case 5 : return ~0x92; case 6 : return ~0x82; case 7 : return ~0xF8; case 8 : return ~0x80; case 9 : return ~0x90; } } void InitTimer1(){ T1CON = 0x11; TMR1IF_bit = 0; TMR1H = 0x3C; TMR1L = 0xB0; TMR1IE_bit = 1; INTCON = 0xC0; } void interrupt(){ if (TMR1IF_bit){ // Une interruption est déclenchée toute les 100 ms TMR1IF_bit = 0; // On efface le drapeau du flag TMR1H = 0x3C; // On loade les registres TMR1H et TMR1L TMR1L = 0xB0; // Interruption chaque 100 ms count++; // On incrémente une variable count pour avoir un multiple du temps de 100 ms if (count == 10) { flag_0 = 1; // On déclenche l'interruption généré par le débordement du timer à l'éxtétieur de l'ISR, voir Main count = 0; // On remet à 0 la variable count pour pouvoir compter de nouveau } } }
par contre lorsque je veux compter avec deux afficheurs et que j'enleve la gestion du 3 ieme afficheur, ca compte parfaitement!
Code:Sel4 = 1; delay_ms(7); Sel4 = 0; PORTD = Seven_seg(digit[0]); Sel3 = 1; delay_ms(7); Sel3 = 0; PORTD = Seven_seg(digit[1]); // avec ce code ca compte normalement de 00 a 99!
j'ai vérifié a mille reprise les connections hardware de l'afficheur, le probleme n'est pas hard, mais plutot software mais je vois pas ce qui se passe,
pouvez vous meclaircir?
-----