This shows you the differences between two versions of the page.
Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
et:examples:timer:periodic_interrupt [2014/10/08 10:24] – raivo.sell | et:examples:timer:periodic_interrupt [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
---|---|---|---|
Line 1: | Line 1: | ||
- | ~~PB~~ | ||
====== Perioodiline katkestus ====== | ====== Perioodiline katkestus ====== | ||
- | //Vajalikud teadmised: | + | //Vajalikud teadmised: |
+ | [HW] [[et: | ||
+ | [AVR] [[et: | ||
+ | [LIB] [[et: | ||
+ | [LIB] [[et: | ||
===== Teooria ===== | ===== Teooria ===== | ||
Line 14: | Line 17: | ||
Järgnev programm näitab, kuidas seadistada loendurit tekitama katkestust. Programmis on kasutusel kaks Kasutajaliidese mooduli LED-i, millest punase olekut muudetakse perioodiliselt tarkvaralise viitega ja roheline, mille olekut muudetakse katkestuse tekkimisel. Tarkvaralise viitega LED-i vilgutamise kohta on olemas eraldi harjutus ja seda siinkohal selgitatud pole. Põhieesmärk on selgitada loendurite teegi ja katkestuste kasutamist. | Järgnev programm näitab, kuidas seadistada loendurit tekitama katkestust. Programmis on kasutusel kaks Kasutajaliidese mooduli LED-i, millest punase olekut muudetakse perioodiliselt tarkvaralise viitega ja roheline, mille olekut muudetakse katkestuse tekkimisel. Tarkvaralise viitega LED-i vilgutamise kohta on olemas eraldi harjutus ja seda siinkohal selgitatud pole. Põhieesmärk on selgitada loendurite teegi ja katkestuste kasutamist. | ||
- | Järgnevalt on ära toodud | + | Järgnevalt on ära toodud |
Programmi alguses toimub 16-bitise loendur/ | Programmi alguses toimub 16-bitise loendur/ | ||
perioodi väärtus = (32000000 Hz / 1024 / 1) - 1 = 31249 | perioodi väärtus = (32000000 Hz / 1024 / 1) - 1 = 31249 | ||
- | Pärast loendur 1 maksimaalse väärtuse saavutamise katkestuse lubamist tuleb katkestuse tekkimine lubada ka globaalselt ehk üle kogu mikrokontrolleri. Globaalseks katkestuste lubamiseks on funktsioon //sei// ja keelamiseks //cli//. Nende funktsioonide ja katkestuste programmilõigu defineerimiseks peab programmi kaasama ka // | + | Pärast loendur 1 maksimaalse väärtuse saavutamise katkestuse lubamist tuleb katkestuse tekkimine lubada ka globaalselt ehk üle kogu mikrokontrolleri. Globaalseks katkestuste lubamiseks on funktsioon //sei// ja keelamiseks //cli//. Nende funktsioonide ja katkestuste programmilõigu defineerimiseks peab programmi kaasama ka // |
<code c> | <code c> | ||
- | // Kodulabor III loenduri katkestusega vilkuva LED-i näide. | + | // Kodulabor III loenduri katkestusega vilkuva LED-i näide |
#include < | #include < | ||
#include < | #include < | ||
Line 31: | Line 34: | ||
ISR(TCE1_OVF_vect) | ISR(TCE1_OVF_vect) | ||
{ | { | ||
- | // Rohelise LED oleku muutmine | + | // Rohelise LED-i oleku muutmine |
pin_toggle(led_green); | pin_toggle(led_green); | ||
} | } | ||
Line 41: | Line 44: | ||
pin_setup_output(led_green); | pin_setup_output(led_green); | ||
- | // Seame taimer E1i perioodi | + | // Taimer E1 perioodi |
// F_CPU/ | // F_CPU/ | ||
// 32000000 / 1024 / 1 - 1 = 31249 | // 32000000 / 1024 / 1 - 1 = 31249 | ||
TC_SetPeriod(& | TC_SetPeriod(& | ||
- | // Seame taimer E1i taktsageduse (F_CPU/ | + | // Taimer E1 taktsageduse |
TC1_ConfigClockSource(& | TC1_ConfigClockSource(& | ||
- | // Seame taimer E1i töötama normaalrežiimis | + | // Taimer E1 seadistamine |
TC1_ConfigWGM(& | TC1_ConfigWGM(& | ||
- | // Lubame | + | // Kõrge prioriteediga |
TC1_SetOverflowIntLevel(& | TC1_SetOverflowIntLevel(& | ||
- | // Lubame kõrge prioriteedika katkestused | + | // Kõrge prioriteediga katkestuste lubamine |
- | // Lubame globaalselt katkestused | + | |
PMIC.CTRL |= PMIC_HILVLEN_bm; | PMIC.CTRL |= PMIC_HILVLEN_bm; | ||
+ | // Globaalne katkestuste lubamine | ||
sei(); | sei(); | ||
// Lõputu tsükkel | // Lõputu tsükkel | ||
- | while (true) | + | while (1) { } |
- | { | + | |
- | } | + | |
} | } | ||
</ | </ | ||
- | ATmega seeria (antud näites ATmega2561) kontrollerite puhul on katkestuse näide mõnevõrra erinev, kuna taimerid on võrreldes | + | ATmega seeria (antud näites ATmega2561) kontrollerite puhul on katkestuse näide mõnevõrra erinev, kuna taimerid on võrreldes |
Programmi alguses toimub 16-bitise loendur/ | Programmi alguses toimub 16-bitise loendur/ | ||
Line 73: | Line 74: | ||
<code c> | <code c> | ||
- | // Kodulabor II loenduri katkestusega vilkuva LED-i näide. | + | // Kodulabor II loenduri katkestusega vilkuva LED-i näide |
#include < | #include < | ||
#include < | #include < | ||
Line 82: | Line 83: | ||
ISR(TIMER1_CAPT_vect) | ISR(TIMER1_CAPT_vect) | ||
{ | { | ||
- | // Rohelise LED oleku muutmine | + | // Rohelise LED-i oleku muutmine |
pin_toggle(led_green); | pin_toggle(led_green); | ||
} | } | ||
Line 98: | Line 99: | ||
// Taimeri maksimaalne väärtus 14400, mis | // Taimeri maksimaalne väärtus 14400, mis | ||
- | // teeb perioodi pikkuseks | + | // teeb perioodi pikkuseks |
// Valem: 14,7456Mhz / 1024 = 14400 | // Valem: 14,7456Mhz / 1024 = 14400 | ||
timer1_set_input_capture_value(14400); | timer1_set_input_capture_value(14400); | ||
Line 109: | Line 110: | ||
// Lõputu tsükkel | // Lõputu tsükkel | ||
- | while (true) | + | while (1) { } |
- | { | + | |
- | } | + | |
} | } | ||
</ | </ | ||
Programmi käivitades on näha, et hoolimata sellest, et põhitsüklis mingeid tegevusi ei ole, toimuvad katkestused ja roheline LED vilgub. | Programmi käivitades on näha, et hoolimata sellest, et põhitsüklis mingeid tegevusi ei ole, toimuvad katkestused ja roheline LED vilgub. |