Base de temps sur Attiny45 comportement étrange

Fermé
pe.mace Messages postés 1 Date d'inscription mardi 20 janvier 2015 Statut Membre Dernière intervention 20 janvier 2015 - 20 janv. 2015 à 21:29
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();
}
}