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/07 12: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 ===== | ||
- | Käesoleva | + | Käesoleva |
[{{ : | [{{ : | ||
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 |
- | // Võrdluseks katkestusega vilkuvale LED-ile | + | |
- | // töötab paralleelselt ka tarkvaralise viitega vilkuv LED. | + | |
#include < | #include < | ||
#include < | #include < | ||
Line 33: | 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 40: | Line 41: | ||
int main(void) | int main(void) | ||
{ | { | ||
- | // LED-ide viikude | + | // LED-i viigu väljundiks seadmine |
- | pin_setup_output(led_red); | + | |
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) { } |
- | { | + | |
- | // Tarkvaraline paus ~1000.3 millisekundit | + | |
- | sw_delay_ms(1000); | + | |
- | + | ||
- | // Punase LED oleku muutmine | + | |
- | pin_toggle(led_red); | + | |
- | } | + | |
} | } | ||
</ | </ | ||
- | Atmega | + | ATmega |
Programmi alguses toimub 16-bitise loendur/ | Programmi alguses toimub 16-bitise loendur/ | ||
Line 81: | Line 74: | ||
<code c> | <code c> | ||
- | // Kodulabor II loenduri katkestusega vilkuva LED-i näide. | + | // Kodulabor II loenduri katkestusega vilkuva LED-i näide |
- | // Võrdluseks katkestusega vilkuvale LED-ile | + | |
- | // töötab paralleelselt ka tarkvaralise viitega vilkuv LED. | + | |
#include < | #include < | ||
#include < | #include < | ||
Line 92: | 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 99: | Line 90: | ||
int main(void) | int main(void) | ||
{ | { | ||
- | // LED-ide viikude | + | // LED-i viigu väljundiks seadmine |
- | pin_setup_output(led_red); | + | |
pin_setup_output(led_green); | pin_setup_output(led_green); | ||
// Taimeri seadistamine CTC režiimi | // Taimeri seadistamine CTC režiimi | ||
timer1_init_ctc( | timer1_init_ctc( | ||
- | TIMER1_PRESCALE_1024, | + | TIMER1_PRESCALE_1024, |
- | TIMER1_CTC_TOP_ICR); | + | |
+ | |||
// 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 120: | Line 110: | ||
// Lõputu tsükkel | // Lõputu tsükkel | ||
- | while (true) | + | while (1) { } |
- | { | + | |
- | // Tarkvaraline paus 1000 millisekundit | + | |
- | sw_delay_ms(1000); | + | |
- | + | ||
- | // Punase LED oleku muutmine | + | |
- | pin_toggle(led_red); | + | |
- | } | + | |
} | } | ||
</ | </ | ||
- | Programmi käivitades on näha, et hoolimata sellest, | + | Programmi käivitades on näha, et hoolimata sellest, |
- | + | ||
- | Kui programmil lasta töötada mõni minut, tuleb välja oluline aspekt, mida tarkvaralise viite harjutuses nii lihtsalt näha polnud. Kuigi punase LEDi vilgutamise viide on 1000 ms, siis tegelik aeg, mis kulub iga tsükli täitmiseks, | + |