Bonsoir à tous,
Pour un projet en cours, j'ai besoin d'incrémenter et de décrémenter un afficheur 7 segments à l'aide de 2 boutons. L'incrémentation et la décrémentation de la variable sont réalisées au moyen d'interruptions. Je n'ai codé que l'incrémentation pour le moment, mais elle ne fonctionne pas correctement.
Le code d'abord (j'ai retiré les parties non en rapport):
Code:[...] void init_IO() { //sens sorties 1:output 0:input DDRA = 0b11111111; // 7 segment DDRC = 0b11111111; // 7 segment //declaration de l'interruption DDRD = 1<<PD2; // Set PD2 as input (Using for interupt INT0) PORTD = 1<<PD2; // Enable PD2 pull-up resistor GICR = 1<<INT0; // Enable INT0 //MCUCR = 1<<ISC01 | 1<<ISC00; // Trigger INT0 on rising edge MCUCR = 1<<ISC01 | 0<<ISC00; // Trigger INT0 on falling edge ??? sei(); //Enable Global Interrupt //fin code interruption //cli();// coupe interruption } void MiseAJourAfficheurs() { //met à jour les sorties [...] } //Interrupt Service Routine for INT0 ISR(INT0_vect) { _delay_ms(500); // Software debouncing control DigitDroite=DigitDroite+1; DigitGauche=DigitGauche+1; MiseAJourAfficheurs(); } int main(void) { //setup init_IO(); TotalActions=16; //couché le chien WDTCR = 0b00000000; DigitDroite=0; DigitGauche=0; while(1) { //la loop // fait défiler les chiffres DigitDroite=DigitDroite+1; DigitGauche=DigitGauche+1; if (DigitDroite>=10) {DigitDroite=0;} if (DigitGauche>=10) {DigitGauche=0;} _delay_ms(3000); MiseAJourAfficheurs(); } return 1; }
Coté hard, le montage est réalisé sur un ATMEGA8535. L'entrée du bouton est donc réalisée sur PD2 (INT0). Le registre MCUCR est configuré de façon à réagir au front descendant du signal. (J'ai tenté aussi montant...)
Problèmes : j'ai tout d'abord codé sans mettre la résistance de pullup interne, et j'ai réalisé un montage classique : 5v - résistance de 10k - PD2 - switch et masse.
Rien ne se passe quand je ferme le switch....?
J'ai tenté d'activer la résistance de pull-up interne (PORTD = 1<<PD2; ) . Cette fois-ci, l'interruption fonctionne (en mettant la pin à la masse), mais pas de chance, un problème (de rebond ?) fait incrémenter l'afficheur de 2 ou 3, malgré la présence de la tempo de 500 ms dans le code de l'interruption. J'ai tenté de couper les interruptions en début d'interruption, j'ai tenté de filtrer en ajoutant une capa de 100 nF en // de mon switch, mais rien à faire. Pull-up interne ou externe, aucune configuration de fonctionne correctement...
Une idée ?
Merci !
-----