Cours:Atmega328p : Différence entre versions

De troyesGEII
Aller à : navigation, rechercher
m ({{Vert|Exemple}})
m (Interruptions)
Ligne 1 : Ligne 1 :
 
=Interruptions=
 
=Interruptions=
 +
On rappelle qu'une interruption peut être imaginée comme un sous-programme appelé par un événement (et non pas par un autre programme). Les événements dont il s'agit sont en général des positionnements de bits spéciaux qui sont appelés drapeaux (on gardera souvent la terminologie anglaise de "flag"). Ces '''flags''' sont toujours positionnés à un par le matériel et non par le logiciel (ou le programmeur si vous voulez).
 
=={{Bleu|Activer/Désactiver les interruptions}}==
 
=={{Bleu|Activer/Désactiver les interruptions}}==
  

Version du 26 mars 2014 à 15:05

Interruptions

On rappelle qu'une interruption peut être imaginée comme un sous-programme appelé par un événement (et non pas par un autre programme). Les événements dont il s'agit sont en général des positionnements de bits spéciaux qui sont appelés drapeaux (on gardera souvent la terminologie anglaise de "flag"). Ces flags sont toujours positionnés à un par le matériel et non par le logiciel (ou le programmeur si vous voulez).

Activer/Désactiver les interruptions

Les fonctions suivantes permettent d'activer et désactiver globalement les interruptions :

cli(); //désactive toute interruption
sei(); //autorise les interruptions

Attention

Quand une interruption est appelée, les autres interruptions sont automatiquement désactivées par le µcontrôleur

Les variables partagée entre interruption et programme principal doivent être de type volatile

Les opérations de lecture/écriture sur des variables de plus de 8 bits doivent être protégées en désactivant les interruptions.

Exemple :

unsigned long c;
uint8_t SaveSREG = SREG;
cli();
c = PulseCounts;
SREG = SaveSREG;
sei();


Interruption externe

Cette partie détaille l'utilisation des interruptions INT0 et INT1, attachées aux pin PD2 et PD3.

Registre EICRA

Le registre EICRA permet de choisir le mode de déclenchement de l'interruption.

EICRA bit 7 6 5 4 3 2 1 0
Fonction ----- ----- ----- ----- ISC11 ISC10 ISC01 ISC00
Valeur initiale 0 0 0 0 0 0 0 0

Le tableau suivant donne la valeur des bits ISCx0 et ISCx1 pour configurer le mode de déclenchement associé à l'interruption INTx :

ISCx1 ISCx0 Déclenchement de l'interruption sur :
0 0 Un niveau bas sur l'entrée INTx
0 1 Un changement d'état sur l'entrée INTx
1 0 Un front descendant sur l'entrée INTx
1 1 Un front montant sur l'entrée INTx

Registre EIMSK

Le registre EIMSK permet d'autoriser ou non les interruptions INT1 et INT0.

EIMSK bit 7 6 5 4 3 2 1 0
Fonction ----- ----- ----- ----- ----- ----- INT1 INT0
Valeur initiale 0 0 0 0 0 0 0 0

Une mise à '1' du bit INTx permet d'autoriser l'interruption associée.

Registre EIFR Exernal Interrupt Flag Register

Le registre EIFR permet d'observer l'état des interruptions INT1 et INT0.

EIFR bit 7 6 5 4 3 2 1 0
Fonction ----- ----- ----- ----- ----- ----- INTF1 INTF0
Valeur initiale 0 0 0 0 0 0 0 0

Le bit INTFx passe à '1' lors du déclenchement de l'interruption.


Exemple

Pour déclencher une interruption a chaque changement d'état de la patte PD2 (donc sur les fronts montant et descendant), on pourra utiliser le code suivant :

ISR(INT0_vect)    // programme d'interruption : le programme principal est interrompu,
{                 // l'interruption exécutée et ensuite le programme principal continu normalement son exécution
  PORTB^=0x01;    // modification de la sortie PB0
} 

void setup()
{
  DDRB=0x0F;      // configuration de PB0 en sortie
  cli();          // arrêt des interruptions
  EICRA=0x01;     // mode de déclenchement de l'interruption
  EIMSK=0x01;     // choix des interruptions actives
  sei();          // autorisation des interruptions
}

void loop()
{
  
}

Remarque : l'appel "sei();" peut être remplacé par "interrupts();" avec l'Arduino.

Fonctions d'interruption

Le tableau donne la liste des interruptions et le vecteur d'interruption associé :

Nom de l'interruption Description Fonction
INT0 Changement d'état de la patte PD2 ISR(INT0_vect)
INT1 Changement d'état de la patte PD3 ISR(INT1_vect)