This is an old revision of the document!


External interrupts

External interrups are one of the most simple peripheral functions. AVRs typically have 1 to 8 special pins, which are used to cause interrupts in the program when their logical value changes or they are at a certain state. Since this function is usually used to monitor external logical signals, these pins are called external interrupt pins.

To use an external interrupt, the pin has to be configured as standard IO input (it can also be used as an output, but in this case the interrupt can only be created by the controller itself). It is necessary to allow receiving interrupts and specify the condition that causes the interrupt to fire in the external interrupt configuration register. There are four possible conditions:

  • Logical zero (voltage of 0V)
  • Change in the logical value
  • Descending front - logical change from one to zero.
  • Rising front - logical change from zero to one.

Katkestuse tekitamiseks loogilise nulli valimisel tekitatakse katkestust järjest senikaua, kuni viigu väärtus on null. Põhiprogrammi töö on samal ajal peatatud.

Lähtudes tööpõhimõttelt, on väliseid katkestusi kahte liiki: kontrolleri taktiga sünkroniseeritud ja asünkroonsed. Sünkroniseeritud katkestused toimivad sisendite väärtuse meelespidamise teel, mis tähendab, et loogilised muutused leitakse kahel erineval taktil saadud väärtuste võrdlemise teel. Kui välise signaali loogilised muutused toimuvad kiiremini, kui käib töötakt, siis katkestused, kas ei teki õigesti või jäävad üldse vahele. Asünkroonsed katkestused ei sõltu kontrolleri taktist ja võimaldavad tuvastada ka kiiremini muutuvat välist signaali - loogilist nivood peab signaal hoidma vähemalt 50 ns. ATmega128-l on 4 sünkroniseeritud ja 4 asünkroonset välist katkestust.

 

Näide

Vaja on panna ATmega128 viik number 9 ehk siini E viik 7 tekitama katkestust, kui selle väärtus muutub. Sellele viigule vastab väline katkestus INT7, mis on sünkroonne.

#include <avr/interrupt.h>
 
// Välise katkestuse programm
ISR(INT7_vect)
{
	// Tee midagi
}
 
int main()
{
	// Siini E viigu 7 muutmine sisendiks biti 7 nullimise teel
	DDRE &= ~(1 << PIN7);
 
	// Siini E viigule 7 pull-up takisti määramine sisendi ujumise vastu
	PORTE |= (1 << PIN7);
 
	// Väliste katkestuste seaderegistris katkestuse 7
	// tekitajaks loogilise muutuse määramine
	EICRB = (1 << ISC70);
 
	// Välise katkestuse 7 lubamine
	EIMSK |= (1 << INT7);
 
	// Globaalne katkestuste lubamine
	sei();
 
	// Lõputu programmitsükkel
	while (1) continue;
}

Lisaks üksikute viikude tekitatavatele katkestustele on suurematel AVR-idel võimalik kasutada ka tervete gruppide viikude loogiliste väärtuste muutuste katkestusi. Neid katkestusi nimetatakse lihtsalt viigu muutuse katkestusteks (inglise keeles pin change interrupt). Need rakenduvad siis, kui vähemalt ühe viigu väärtus grupis muutub.

en/avr/external_interrupts.1267710478.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0