et:examples:timer:periodic_interrupt
Differences
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/09/26 10:38] – Homelab clock_init eemaldatud heikopikner | et:examples:timer:periodic_interrupt [2020/07/20 12:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Perioodiline katkestus ====== | ====== Perioodiline katkestus ====== | ||
| - | //Vajalikud teadmised: | + | //Vajalikud teadmised: |
| + | [HW] [[et: | ||
| + | [AVR] [[et: | ||
| + | [LIB] [[et: | ||
| + | [LIB] [[et: | ||
| ===== Teooria ===== | ===== Teooria ===== | ||
| - | Käesoleva | + | Käesoleva |
| + | |||
| + | [{{ : | ||
| ===== Praktika ===== | ===== Praktika ===== | ||
| - | Järgnev programm näitab, kuidas seadistada loendurit tekitama katkestust. Programmis on kasutusel kaks Digitaalse sisend-väljundmooduli | + | Järgnev programm näitab, kuidas seadistada loendurit tekitama katkestust. Programmis on kasutusel kaks Kasutajaliidese mooduli |
| - | 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 |
| - | // Kodulabo | + | |
| - | // Võrdluseks katkestusega vilkuvale LED-ile | + | |
| - | // töötab paralleelselt ka tarkvaralise viitega vilkuv LED. | + | |
| - | // | + | |
| - | #include < | + | |
| #include < | #include < | ||
| #include < | #include < | ||
| Line 30: | Line 31: | ||
| #include < | #include < | ||
| - | // | ||
| // Katkestus | // Katkestus | ||
| - | // | ||
| 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); | ||
| } | } | ||
| - | // | ||
| // Põhiprogramm | // Põhiprogramm | ||
| - | // | ||
| 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); | + | |
| - | } | + | |
| } | } | ||
| </ | </ | ||
| - | Järgnevalt | + | 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/ | Programmi alguses toimub 16-bitise loendur/ | ||
| f = 14745600 Hz / 1024 / 14400 = 1 | f = 14745600 Hz / 1024 / 14400 = 1 | ||
| - | |||
| - | 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 II loenduri katkestusega vilkuva LED-i näide |
| - | // Kodulabori | + | |
| - | // Võrdluseks katkestusega vilkuvale LED-ile | + | |
| - | // töötab paralleelselt ka tarkvaralise viitega vilkuv LED. | + | |
| - | // | + | |
| #include < | #include < | ||
| #include < | #include < | ||
| Line 96: | Line 80: | ||
| #include < | #include < | ||
| - | |||
| - | // | ||
| - | // LED-ide viikude määramine | ||
| - | // | ||
| - | pin led_red | ||
| - | pin led_green = PIN(C, 3); | ||
| - | |||
| - | // | ||
| // Katkestus | // Katkestus | ||
| - | // | ||
| 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); | ||
| } | } | ||
| - | // | ||
| // Põhiprogramm | // Põhiprogramm | ||
| - | // | ||
| 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 138: | 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, | + | |
et/examples/timer/periodic_interrupt.1411717083.txt.gz · Last modified: (external edit)
