Programmation des µC ATMEL
SOMMAIRE
Vos commentaires ici Datasheets ATmega 16 AT90S8515 AT90S8535 |
Exemple
Interruption externe: Test de INT0 en mode front montant
#include <mega16.h> interrupt [EXT_INT0] void ext_int0_isr(void) { // Code d'interruption ici PORTA.0=!PORT A.0; //inverse l'état de PA0 } void main(void) { DDRA=0x01; // configuration de PORTA.0 en sortie MCUCR=0x03; //initialisation de INT0 en mode front montant MCUCSR=0x00; //sert uniquement pour INT2 GICR|=0x40; //active INT0 GIFR=0x40; //active l'interruption INT0 #asm("sei") //active les interruptions while (1); }
Un changement d'état de PA0 se produira à chaque front montant de INT0. On remarquera également que même si la patte correspondant à INT0 (c'est-à-dire PD2) était configurée en sortie l'interruption se produirait aussi, il est donc possible de forcer une interruption en provoquant logiciellement un changement d'état de la sortie.
L'instruction #asm permet d'introduire du code en assembleur dans le programme.
#asm("sei")
permet d'activer l'ensemble des interruptions.#asm("cli")
permet de désactiver l'ensemble des interruptions.A noter qu'il est nécessaire d'introduire une boucle infinie (while(1);) pour que le programme puisse fonctionner.
Compteur/timer: Configuration du Timer2 en mode PWM, Phase correct
#include <mega16.h> void main(void) { DDRD=0x80; //on configure PIND.7 en sortie ASSR=0x00; TCCR2=0x64; TCNT2=0x00; OCR2=200; //valeur de la PWM, ici 200/255=78.5% while (1); }
On peut également utiliser les interruptions en mode comparaison entre TCNTx et OCRx (compare match mode) ou en mode débordement (overflow) connection impossible