Arduino.nu Arduino.nu
Interrupts: Werking en afhandeling

Soms kan het voorkomen dat er iets afgehandeld moet worden in een microcontroller dat absolute voorrang heeft t.o.v. een ander proces dat de microcontroller op dat moment aan het regelen is. Het lukt de microcontroller niet om dat in de snelheid van het lopende programma te regelen. Een goed voorbeeld hier van is: Het uitlezen van een rotary encoder.

Bij het uitlezen van een rotary-encoder mag de microcontroller nooit een puls missen. Zou de microcontroller wel een puls missen dan is de positie van de encoder bij de microcontroller niet gelijk aan de werkelijke positie van de encoder zelf!!
Bij het uitlezen van deze encoder maak je dan ook gebruik van een interrupt. Bij een interrupt krijgt de microcontroller op een ingang een puls en springt het onmiddellijk vanuit het lopende programma naar een subroutine. De subroutine wordt eerst afgehandeld en pas daarna springt het programma terug naar waar het gebleven was.

In het voorbeeld hier onder wordt een schakelaar gebruikt in plaats van een rotary encoder:

 


Het programma:

// Dit voorbeeld laat zien hoe je werkt met external interrupts. 
// Wiring supports external interrupts 0-7, which are 
// triggered by digital i/o pins 0-3 and 36-39. Arduino 
// supports external interrupts on pins 2 and 3.  

int n = 0;    // n = Aantal interrupts die geteld worden   

void setup() 
	{    
	Serial.begin(9600);    // start serial communication   
	pinMode(2, INPUT);    // maak van pin 2 een input pin      

	// koppel myRoutine() to ext interrupt 0, en zorg er voor   
	// dat de subroutine wordt aangeroepen zodra pin 2 falls van 
	// HOOG naar LAAG. 
	// Alternatieven zijn LOW, CHANGE, RISING.   

	attachInterrupt(0, myRoutine, FALLING); 
	}   

void loop() 
	{   
	Serial.println(n);      // print de huidige waarde van n   
	delay(200); 
	}   

void myRoutine() 
	{   
	n++;                    // tel deze interrupt