Bonjour et bonne année à tous et à toutes!
J'essaie de réaliser un compteur de minutes avec un pic16f628a, avec une interruption à chaque 60 secondes avec le TMR0, voici le code :
mais mon problème c'est qu'on dirait le compteur Num n'est jamais égal à 1080, mon pic fonctionne sous 4 MhzCode:unsigned short i, DD0, DD1, DD2, DD3; sbit segment_deux_points at RA4_BIT; unsigned int count_heure, count_minute; unsigned short count, Num, Num2Points; //------ Function to Return mask for common anode 7-seg. display unsigned short mask(unsigned short num) { switch (num) { case 0 : return 0xC0; case 1 : return 0xF9; 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; } //case end } void Debounce(){ Delay_ms(300); } void interrupt() { Num ++; // Interrupt causes Num to be incremented by 1 Num2Points ++; if (Num2Points == 18) { // clignote les : à chaque seconde segment_deux_points = ~segment_deux_points; Num2Points = 0; } if (Num == 1080) { // 1 minute (18*60) Sound_Play(1500, 500); Delay_ms(500); // count = count + 1; Num = 0; } TMR0 = 39; // TMR0 returns to its initial value INTCON.T0IF = 0; // Bit T0IF is cleared so that the interrupt could reoccur } void main() { CMCON |= 7; // Disable Comparators TRISB = 0x00; // Set PORTB direction to be output PORTB = 0xff; // Turn OFF LEDs on PORTB PORTA = 0x00; TRISA = 0x00; count = 0; // initialize minute to display to 7 segment display Num = 0; Num2Points = 0; OPTION_REG = 0x07; // Prescaler (1:256) is assigned to the timer TMR0 TMR0 = 39; // Timer T0 counts from 39 to 255 INTCON = 0xA0; // Enable interrupt TMR0 and Global Interrupts Sound_Init(&PORTA, 5); segment_deux_points = 0; do { DD0 = count%10; // Extract Ones Digit DD0 = mask(DD0); DD1 = (count/10)%10; // Extract Tens Digit DD1 = mask(DD1); DD2 = (count/100)%10; // Extract Hundreds Digit DD2 = mask(DD2); DD3 = (count/1000); // Extract Thousands Digit DD3 = mask(DD3); for (i = 0; i<=50; i++) { PORTB = DD0; RA0_bit = 0; // Select Ones Digit RA1_bit = 1; RA2_bit = 1; RA3_bit = 1; delay_ms(5); PORTB = DD1; RA0_bit = 1; RA1_bit = 0; // Select Tens Digit RA2_bit = 1; RA3_bit = 1; delay_ms(5); PORTB = DD2; RA0_bit = 1; RA1_bit = 1; RA2_bit = 0; // Select Hundreds Digit RA3_bit = 1; delay_ms(5); PORTB = DD3; RA0_bit = 1; RA1_bit = 1; RA2_bit = 1; RA3_bit = 0; // Select Thousands Digit delay_ms(5); } } while(1); // endless loop }
donc si le num == 14 ca fait 1 seconde, pas de problème là-dessus...
Je me suis dis si 14 == 1 sec, donc 1080 fais 1 minutes, donc j'incrémente le count = count + 1 à chaque minute et
je l'affiche sur l'afficheurs 7 segments, malheureusement on dirait qu'il ne se rend jamais là..
J'ai ajouté le schéma en fichier joints.
pourrirez-vous m'aider à résoudre mon problème?
Ça serait très apprécié!
Merci les amis!
A+!
marC
-----