Bonjour,
Voici un programme qui devrait allumer une led 5s toutes les 5, 30 ou 60 minutes...mais la led s'allume bien, mais s'eteint 1/10 de s avant de se rallumer etc.
#define F_CPU 1000000L #include <avr/io.h> #include <avr/wdt.h> #include <avr/interrupt.h> #include <avr/sleep.h> #include <util/delay.h> #define PIN_SORTIE PB3 #define TEMPS_SORTIE_SECONDES 5 #define NOMBRE_MODES 3 unsigned char temps_cycle_minutes[]={5,30,60}; unsigned char mode; unsigned char compteur_secondes; unsigned char compteur_minutes; //Action à effectuer toutes les secondes ISR(WDT_vect) { wdt_reset(); if(compteur_secondes==59) { compteur_secondes=0; if(compteur_minutes==temps_cycle_minutes[mode]-1) { compteur_minutes=0; PORTB|=1<<PIN_SORTIE; } else compteur_minutes++; } else compteur_secondes++; if(compteur_secondes==TEMPS_SORTIE_SECONDES) PORTB&=~(1<<PIN_SORTIE); } ISR(INT0_vect) { //Anti-rebond _delay_ms(50); if((PINB&(1<<PB2))==0) { if(mode==NOMBRE_MODES-1) mode=0; else mode++; unsigned char i; for(i=0; i<=mode; i++) { PORTB|=1<<PIN_SORTIE; _delay_ms(500); PORTB&=~(1<<PIN_SORTIE); _delay_ms(500); } PORTB|=1<<PIN_SORTIE; compteur_secondes=0; compteur_minutes=0; wdt_reset(); } } void setup() { cli(); mode=0; compteur_secondes=0; compteur_minutes=0; //PIN_SORTIE comme sortie DDRB|=1<<PIN_SORTIE; //PIN_SORTIE à l'état haut, les autres pins avec résistances de pull up PORTB=0xFF; //Mode de veille le plus économique set_sleep_mode(SLEEP_MODE_PWR_DOWN); //Paramétrage du watchdog (cf datasheet p44-47) //Interruption au déclenchement du watchdog WDTCR|=(1<<WDE)|(1<<WDIE); //Prescaller sur 65536 tours d'horloge WDTCR&=~(1<<WDP0); WDTCR|=(1<<WDP1)|(1<<WDP2); //Paramétrage de l'interruption INT0 (cf p51-54 de la datasheet) //INT0 sur front descendant MCUCR&=~(1<<ISC00); MCUCR|=1<<ISC01; //On active l'interruption sur INT0 GIMSK|=(1<<INT0); sei(); //On active les interruptions } void loop() { sleep_enable(); sleep_cpu(); sleep_disable(); } int main(void) { setup(); while(1) { loop(); } }
Afficher la suite