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. | ||