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 15:24] – raivo.sell | et:examples:timer:periodic_interrupt [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ====== Perioodiline katkestus ====== | ||
| + | //Vajalikud teadmised: | ||
| + | [HW] [[et: | ||
| + | [AVR] [[et: | ||
| + | [LIB] [[et: | ||
| + | [LIB] [[et: | ||
| + | |||
| + | ===== Teooria ===== | ||
| + | |||
| + | Käesoleva peatüki eesmärk on demonstreerida katkestuste kasutamist loendurite näitel. Katkestused on mikrokontrolleris esinevatele sündmustele reageerivad programmilõigud. Katkestusi kasutatakse tavaliselt kiireks sündmusele reageerimiseks, | ||
| + | |||
| + | [{{ : | ||
| + | |||
| + | ===== Praktika ===== | ||
| + | |||
| + | 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 xmega kontrolleril katkestuste kasutamine. \\ | ||
| + | Programmi alguses toimub 16-bitise loendur/ | ||
| + | |||
| + | 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 // | ||
| + | |||
| + | <code c> | ||
| + | // Kodulabor III loenduri katkestusega vilkuva LED-i näide | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Katkestus | ||
| + | ISR(TCE1_OVF_vect) | ||
| + | { | ||
| + | // Rohelise LED-i oleku muutmine | ||
| + | pin_toggle(led_green); | ||
| + | } | ||
| + | |||
| + | // Põhiprogramm | ||
| + | int main(void) | ||
| + | { | ||
| + | // LED-i viigu väljundiks seadmine | ||
| + | pin_setup_output(led_green); | ||
| + | |||
| + | // Taimer E1 perioodi seadistamine | ||
| + | // F_CPU/ | ||
| + | // 32000000 / 1024 / 1 - 1 = 31249 | ||
| + | TC_SetPeriod(& | ||
| + | |||
| + | // Taimer E1 taktsageduse seadistamine (F_CPU/ | ||
| + | TC1_ConfigClockSource(& | ||
| + | // Taimer E1 seadistamine töötama normaalrežiimis | ||
| + | TC1_ConfigWGM(& | ||
| + | |||
| + | // Kõrge prioriteediga ületäituvuse katkestuse lubamine | ||
| + | TC1_SetOverflowIntLevel(& | ||
| + | |||
| + | // Kõrge prioriteediga katkestuste lubamine | ||
| + | PMIC.CTRL |= PMIC_HILVLEN_bm; | ||
| + | // Globaalne katkestuste lubamine | ||
| + | sei(); | ||
| + | |||
| + | // Lõputu tsükkel | ||
| + | while (1) { } | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | ATmega seeria (antud näites ATmega2561) kontrollerite puhul on katkestuse näide mõnevõrra erinev, kuna taimerid on võrreldes xmega seeria kontrolleritega samuti erinevad. | ||
| + | |||
| + | Programmi alguses toimub 16-bitise loendur/ | ||
| + | |||
| + | f = 14745600 Hz / 1024 / 14400 = 1 | ||
| + | |||
| + | <code c> | ||
| + | // Kodulabor II loenduri katkestusega vilkuva LED-i näide | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | #include < | ||
| + | |||
| + | // Katkestus | ||
| + | ISR(TIMER1_CAPT_vect) | ||
| + | { | ||
| + | // Rohelise LED-i oleku muutmine | ||
| + | pin_toggle(led_green); | ||
| + | } | ||
| + | |||
| + | // Põhiprogramm | ||
| + | int main(void) | ||
| + | { | ||
| + | // LED-i viigu väljundiks seadmine | ||
| + | pin_setup_output(led_green); | ||
| + | |||
| + | // Taimeri seadistamine CTC režiimi | ||
| + | timer1_init_ctc( | ||
| + | TIMER1_PRESCALE_1024, | ||
| + | | ||
| + | |||
| + | // Taimeri maksimaalne väärtus 14400, mis | ||
| + | // teeb perioodi pikkuseks 1 s | ||
| + | // Valem: 14,7456Mhz / 1024 = 14400 | ||
| + | timer1_set_input_capture_value(14400); | ||
| + | |||
| + | // Väärtuse saavutamise katkestuse lubamine | ||
| + | timer1_input_capture_interrupt_enable(true); | ||
| + | |||
| + | // Globaalne katkestuste lubamine | ||
| + | sei(); | ||
| + | |||
| + | // Lõputu tsükkel | ||
| + | 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. | ||