Objectifs
- Savoir utiliser générer un pulse d’une seconde
- Savoir générer un signal carré d’une fréquence spécifique
- Savoir utiliser l’interruption INT0 & PWM
Programme Arduino
#define PWMout 2 // Signal PWM - [Mega: 4-13:980]
#define SecPulse 3 // Signal carré
#define ValSec 980 //= Fréquence = Nb cycles /sec 490
bool State=false;
unsigned long Count1Sec=0;
unsigned long CountEvent=0;
void setup()
{
// Câblage du pin et configuration en entrée: INT0 => PD0 (pin 38 de la carte)
DDRD =0x00; // Port D en entrée
// Activation de l'interruption globale (registre SREG)
SREG|=0x80;
//SREG|=0x80 // Activation
//SREG&=0x7f // Désactivation
//Ou bien
//sei(): Set interrupt - Activation
//cli(): clear interrup - Désactivation (masquer)
// Validation de l'interruption INT0 (Registre EIMSK)
EIMSK|=0x01; // INT0
//EIMSK|=0x02; // INT1
//EIMSK|=0x04; // INT2
//...
// Choix du mode de détection: Front montant dans INT0
EICRA|=0x01;
//EICRA|=0x00; //niveau bas '0' dans INTn
//EICRA|=0x01; //front montant ou descendant dans INTn
//EICRA|=0x02; //Front descendant dans INTn
//EICRA|=0x03; //Front montant dans INTn
// Initialisation de la sortie PWM (signal carré, rapport cyclique 50%)
analogWrite(PWMout, 128);
// Config PIN 1 sec (pulse 1 seconde, fréquence 1/2 Hz)
pinMode(SecPulse, OUTPUT);
}
void loop()
{
// Au chaumage
}
Routine de l’interruption
ISR(_VECTOR(1)){ // Ou _VECTOR(2)
CountEvent+=1;
CountEvent=CountEvent%ValSec;
if (!CountEvent)
{
State=not(State);
digitalWrite(SecPulse,State);
}
}