This is an old revision of the document!


External interrupts

Välised katkestused (inglise keeles external interrupt) on ühed lihtsaimad perifeeria funktsioonid. AVR-idel on tavaliselt 1 kuni 8 spetsiaalset viiku, mille loogilise väärtuse muutumisel või kindlal olekul tekitatakse programmis katkestus. Kuna enamasti kasutatakse seda funktsiooni kontrolleriväliste loogikasignaalide jälgimiseks, siis nimetataksegi vastavaid viike välise katkestuse viikudeks.

Välise katkestuse kasutamiseks tuleb viiku kasutada tavalises IO sisendrežiimis (võib ka väljundrežiimis kasutada, aga siis saab katkestust tekitada vaid kontroller ise). Välise katkestuse seadistusregistrites tuleb ära märkida, kas lubada katkestuste tekitamine ja mille peale seda teha. Võimalikke tekitajaid on neli:

  • Loogiline null (pinge on 0V)
  • Loogilise väärtuse muutus
  • Langev front - loogiline muutus ühest nulli.
  • Tõusev front - loogiline muutus nullist ühte.

Katkestuse tekitamiseks loogilise nulli valimisel tekitatakse katkestust järjest senikaua, kuni viigu väärtus on null, ja samal ajal põhiprogrammil töötada ei lasta.

Väliseid katkestusi on tööpõhimõttelt kahte liiki: kontrolleri taktiga sünkroniseeritud ja asünkroonsed. Sünkroniseeritud katkestused toimivad sisendite väärtuse meelespidamise teel, st 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 ei teki õigesti või ei teki üldse. Asünkroonsed katkestused ei sõltu kontrolleri taktist ja võimaldavad natuke 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 kesta 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). Rakenduvad nad siis, kui vähemalt ühe viigu väärtus grupis muutub.

en/avr/external_interrupts.1265633793.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