====== Débuter ====== ===== Allumer une led ===== Ce premier petit programme permet juste d'allumer une led sur le port B. La fonction initPort permet de configurer le port B en sortie et de forcer les sorties a zero. Les sorties du PORTB sont mises à 1 dans le main. #include /* pour les definitions des registres */ void initPort (void) { /* configuration des ports : '1' pour sortie */ DDRB=0b11111111; /* PORTB en sortie */ PORTB=0b00000000; /* PORTB a 0 */ } int main (void) { initPort(); while(1) { PORTB = 0b11111111; /* PORTB force a 1 */ } return 1; } ===== Faire clignoter une led ===== Le but de ce programme est de faire clignoter une led en utilisant le timer0 et les interruptions. ==== Initialisation du timer en mode timer ==== TCCR0B sert à initialiser le timer 0 et son prescaler. Le registre TCNT0 est le compteur . Il est incrémenté tous les cycles d'horloge. Le bit 0 du registre TIFR0 est le flag d'interuption. Le bit TOIE0 du registre TIMSK0 active l'interruption sur le débordement du timer 0. Le débordement du compteur TCNT0 provoque une interruption. Dans la routine d'interruption « ISR(TIMER0_OVF_vect) », nous incrémentons une variable « cmp »qui nous servira à faire clignoter la led. Une fois que « cmp » est supérieur à 100, le PORTB est inversé. #include /* pour les definitions des registres */ #include /* pour les interruptions */ volatile unsigned char cmp; /* interruption sur le debordement de TCNT0 : toutes les 13ms (1/20MHz * 256*1024) */ ISR(TIMER0_OVF_vect) { /* a chaque debordement de TCNT0 on incremente un compteur */ cmp++; TIFR0 = 0b00000001; /* TOV0 = 1 : remise a 1 du flag */ } void initPort (void) { /* configuration des ports : '1' pour sortie */ DDRB=0b11111111; /* PORTB en sortie */ PORTB=0b00000000; /* PORTB a 0 */ } /* * initialise le timer 0 en mode timer avec un prescaler de 1024 * acrivation de l'interruption sur le debordement du compteur */ void initTimer0(void) { TCCR0B= 0b00000101; /* mode timer avec un prescaler de 1024 */ TCNT0 = 0; /* mise a zero du compteur */ TIFR0 = 0b00000001; /* TOV0 = 1 : remise a 1 du flag */ TIMSK0 = 0b00000001; /* TOIE0 = 1: active l'interruption sur le debordement de TCNT0 */ } int main (void) { initPort(); initTimer0(); SREG = 0b10000000; /* active les interruptions */ while(1) { if (cmp>100) /* 13*100 = 1.3s */ { PORTB = ~PORTB; /* inverse la valeur du PORTB */ cmp=0; } } return 1; }