Présentation :
Pour que le microcontrôleur ne passe pas la majeurer partie de son temps à attendre une condition que vous auriez programmé, les constructeurs ont mis au point les interruptions.Iil s'agit d' avertir le microcontrôleur qu'une condition est remplie et qu' il faut immédiatement la traiter.
Pratiquement chaque périphérique interne dispose d' une source d' interruption.
Fonctionnement :
Raisonnons pratique : imaginons un projet qui aurait pour but d' allumer l' ampoule d' une cage d' escalier pendant x secondes à l' appui d' un bouton poussoir (En réalité nous n' utiliserions pas un microcontrôleur pour effectuer cette tache !) :
Sans les interruptions : nous aurions programmer ainsi :
- attende d' un appui sur le bouton poussoir
- allumage de la lampe
- boucle de temporisation logicielle
- Extinction de la lampe
C' est tout à fait imaginable, mais que diriez vous si en plus votre projet se voyait ajouter quelques fonctions supplémentaires comme la surveillance d' une zone à l' aide d' un capteur infrarouge, la gestion du digicode...
Ça commence à se compliquer. Laissons de coté ces fonctions et intéressons nous aux interruptions :
Avec les interruptions :
- L' appui sur le bouton poussoir est détecté par l' entrée INT0 (cela évite une boucle de conditions)
- l' allumage de la lampe est effectué
- on met en marche un temporisateur qui demande une interruption toutes les secondes
- une valeur de X fois une secondes est chargée dans une registre quelconque
- a chaque interruptions du timer on décrémente le contenue du registre
- si la valeur du registre = 0 : on arrête le timer et la lampe est désactivée
Voila, votre programme principale n'a pas eu à s' occuper de la gestion de la lampe, ce qui vous laisse des ressources logiciels et matérielles pour effectuer bien d' autres taches
Conseils :
Pensez d' abord à lever le drapeau d' autorisation d' interruption général dans SREG (instruction SEI).
Donner au périphérique concerné la possibilité d' interrompre en réglant les bits de leurs registres.
Ensuite chaque interruption va provoquer un saut de programme à une adresse bien précise, c' est ici que vous écrirez un saut vers la procédure choisi, le retour de l' interruption sera provoqué par l' instruction RETI.
Sauvegarder impérativement vos registres de travail, surtout SREG : en effet dans le programme de l' interruption, la valeur de ce registre à de très grande chance de changer et au retour de l' interruption, imaginez que votre programme principal effectuais un test sur ce même registre...
Pour sauvegarder un registre, il faut le mettre sur la pile avec l' instruction PUSH, puis le replacer à l' aide de POP
A propos de la pile, il faut changer immédiatement son pointeur en début de programme, car sa configuration d' origine pointe sur $00, en clair vous ne pouvez pas faire de sous-programme !
Si une seconde interruption intervient pendant le traitement de la première, le programme la traitera aussitôt fini la première.
La priorité des interruptions va par ordre croissant (voir tableau) ex : INT1 prioritaire sur ADC
Cartographie des vecteurs d' interruptions : (90S8535)
Adresse |
Nom |
Description |
$00 |
RESET |
RESET |
$01 |
INT0 |
Entrée d' interruption broche INT0 |
$02 |
INT1 |
Entrée d' interruption broche INT0 |
$03 |
TIM2_COMP |
Comparaison réussie Timer 2 |
$04 |
TIM2_OVF |
Débordement Timer 2 |
$05 |
TIM1_CAPT |
Capture terminé Timer 1 |
$06 |
TIM1_COMPA |
Comparaison réussie Timer 1A |
$07 |
TIM1_COMPB |
Comparaison réussie Timer 1B |
$08 |
TIM1_OVF |
Débordement Timer 1 |
$09 |
TIM0_OVF |
Débordement Timer 0 |
$0A |
SPI_STC |
Transmissions SPI terminée |
$0B |
UART_RXC |
Réception d' un caractère par l'UART |
$0C |
UART_DRE |
Registre tampon UART vide |
$0D |
UART_TXC |
Émission d' un caractère par l'UART terminée |
$0E |
ADC |
Conversion A/D terminée |
$0F |
EE_RDY |
EEprom Prête |
$10 |
ANA_COMP |
Comparaison analogique effectuée |
Listing :
Un exemple utilisant les interruptions est publié dans la section comparateur analogique |