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)
