This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:avr:external_interrupts [2010/02/01 13:00] – toimetaja | et:avr:external_interrupts [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
====== Välised katkestused ====== | ====== Välised katkestused ====== | ||
- | Välised katkestused (inglise keeles //external interrupt// | + | Välised katkestused (inglise keeles //external interrupt// |
- | Välise katkestuse kasutamiseks | + | Välise katkestuse kasutamiseks |
* Loogiline null (pinge on 0V) | * Loogiline null (pinge on 0V) | ||
Line 10: | Line 10: | ||
* Tõusev front - loogiline muutus nullist ühte. | * 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. | + | Katkestuse tekitamiseks loogilise nulli valimisel tekitatakse katkestust järjest senikaua, kuni viigu väärtus on null. Põhiprogrammi töö on samal ajal peatatud. |
- | 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 | + | Lähtudes |
- | ===== Näide ===== | + | Atmeli xmega seeria kontrolleritel on välised katkestused realiseeritud natuke erinevalt võrreldes tavaliste 8-bitiste kontrolleritega. Atmeli xmega seerial on igale siinile omistatud kaks välist katkestust INT0 ja INT1, mis on võimalik kasutades biti maski ühendada suvalise siini viiguga (või mitmega korraga). |
- | Vaja on panna ATmega128 kesta viik number 9 ehk siini E viik 7 tekitama katkestust, kui selle väärtus muutub. Selllele viigule vastab väline katkestus INT7, mis on sünkroonne. | ||
+ | <box 100% round # | ||
+ | |||
+ | 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. | ||
<code c> | <code c> | ||
#include < | #include < | ||
Line 27: | Line 29: | ||
} | } | ||
- | int main() | + | // Põhiprogramm |
+ | int main(void) | ||
{ | { | ||
// Siini E viigu 7 muutmine sisendiks biti 7 nullimise teel | // Siini E viigu 7 muutmine sisendiks biti 7 nullimise teel | ||
Line 50: | Line 53: | ||
</ | </ | ||
- | 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 muutus | + | Xmega puhul otsime sisendi muutust viigul PORTE0: |
+ | |||
+ | <code c> | ||
+ | #include < | ||
+ | |||
+ | // Välise katkestuse programm | ||
+ | ISR(PORTE_INT0_vect) | ||
+ | { | ||
+ | // Tee midagi | ||
+ | } | ||
+ | |||
+ | // Põhiprogramm | ||
+ | int main(void) | ||
+ | { | ||
+ | // Siini E viigu 0 muutmine sisendiks biti 0 nullimise teel | ||
+ | PORTE.DIR &= ~(PIN0_bm); | ||
+ | |||
+ | // Siini E viigule 0 pull-up takisti määramine sisendi ujumise vastu | ||
+ | PORTE.PIN0CTRL = (PORT_OPC_PULLUP_gc); | ||
+ | |||
+ | // Siini E viigu 0 katkestuse töörežiimi määramine | ||
+ | PORTE.PIN0CTRL |= (PORT_ISC_BOTHEDGES_gc); | ||
+ | |||
+ | // Siini E INT0 katkestuse prioriteedi määramine | ||
+ | PORTE.INTCTRL |= (PORT_INT0LVL_MED_gc); | ||
+ | |||
+ | // Viigu määramine siini E INT0 sisendiks | ||
+ | PORTC.INT0MASK = (PIN0_bm); | ||
+ | |||
+ | // Keskmise prioriteediga katkestuste lubamine | ||
+ | PMIC.CTRL |= PMIC_MEDLVLEN_bm; | ||
+ | |||
+ | // Globaalne katkestuste lubamine | ||
+ | sei(); | ||
+ | |||
+ | // Lõputu programmitsükkel | ||
+ | while (1){}; | ||
+ | } | ||
+ | </ | ||
+ | |||
+ | </ | ||
+ | |||
+ | 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 |