Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revisionPrevious revision
Next revision
Previous revision
et:examples:timer:periodic_interrupt [2014/10/08 10:24] raivo.sellet: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: [HW] [[et:hardware:homelab:controller]], [HW] [[et:hardware:homelab:digi]], \\ [AVR] [[et:avr:interrupts]], [AVR] [[et:avr:timers]], [LIB] [[et:software:homelab:library:pin]], [LIB] [[et:software:homelab:library:delay]], \\ [LIB] [[et:software:homelab:library:timer]], [PRT] [[et:examples:timer:software_delay]]//+//Vajalikud teadmised:  
 +[HW] [[et:hardware:homelab:digi]],   
 +[AVR] [[et:avr:interrupts]], [AVR] [[et:avr:timers]], \\ 
 +[LIB] [[et:software:homelab:library:pin]],   
 +[LIB] [[et:software:homelab:library:timer]]//
  
 ===== 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 XMEGA kontrolleril katkestuste kasutamine. \\+Järgnevalt on ära toodud xmega kontrolleril katkestuste kasutamine. \\
 Programmi alguses toimub 16-bitise loendur/taimer E1 seadistamine. Kõigepealt määratakse ära taimeri periood, ehk maksimaalne loendatav väärtus funktsiooniga //TC_SetPeriod//. Loenduri jaguriks on 1024 ja perioodi väärtuseks 31249, mille tulemusena 32 MHz taktsageduse puhul on loenduri perioodiks täpselt 1 sekund. Seda on lihtne arvutada valemist: Programmi alguses toimub 16-bitise loendur/taimer E1 seadistamine. Kõigepealt määratakse ära taimeri periood, ehk maksimaalne loendatav väärtus funktsiooniga //TC_SetPeriod//. Loenduri jaguriks on 1024 ja perioodi väärtuseks 31249, mille tulemusena 32 MHz taktsageduse puhul on loenduri perioodiks täpselt 1 sekund. Seda on lihtne arvutada valemist:
  
 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 //avr/interrupt.h// päisfaili. Katkestuse programmilõik defineeritakse makrofunktsiooniga //ISR//, mille parameetriks on katkestuse vektori nimi. Nimetatud seadistuste juures on loendur 1 maksimaalse väärtuse saavutamise katkestuse vektoriks //TCE1_OVF_vect//. Lisaks globaalselt katkestuse lubamisele tuleb üks haaval lubada ka erineva prioriteediga katkestused XMega kontrolleril kasutades //PMIC.CTRL// registrit.+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 //avr/interrupt.h// päisfaili. Katkestuse programmilõik defineeritakse makrofunktsiooniga //ISR//, mille parameetriks on katkestuse vektori nimi. Nimetatud seadistuste juures on loendur 1 maksimaalse väärtuse saavutamise katkestuse vektoriks //TCE1_OVF_vect//. Lisaks globaalselt katkestuse lubamisele tuleb üks haaval lubada ka erineva prioriteediga katkestused xmega kontrolleril kasutades //PMIC.CTRL// registrit.
  
 <code c> <code c>
-// Kodulabor III loenduri katkestusega vilkuva LED-i näide.+// Kodulabor III loenduri katkestusega vilkuva LED-i näide
 #include <homelab/pin.h> #include <homelab/pin.h>
 #include <homelab/delay.h> #include <homelab/delay.h>
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 seadistamine
  // F_CPU/1024/[aeg] - 1 = periood  // F_CPU/1024/[aeg] - 1 = periood
  // 32000000 / 1024 / 1 - 1 = 31249  // 32000000 / 1024 / 1 - 1 = 31249
  TC_SetPeriod(&TCE1, 31249);  TC_SetPeriod(&TCE1, 31249);
  
- // Seame taimer E1i taktsageduse (F_CPU/1024)+ // Taimer E1 taktsageduse seadistamine (F_CPU/1024)
  TC1_ConfigClockSource(&TCE1, TC_CLKSEL_DIV1024_gc);  TC1_ConfigClockSource(&TCE1, TC_CLKSEL_DIV1024_gc);
- // Seame taimer E1i töötama normaalrežiimis+ // Taimer E1 seadistamine töötama normaalrežiimis
  TC1_ConfigWGM(&TCE1, TC_WGMODE_NORMAL_gc);  TC1_ConfigWGM(&TCE1, TC_WGMODE_NORMAL_gc);
  
- // Lubame ületäituvuse katkestuse kõrge prioriteediga+ // Kõrge prioriteediga ületäituvuse katkestuse lubamine
  TC1_SetOverflowIntLevel(&TCE1,TC_OVFINTLVL_HI_gc);  TC1_SetOverflowIntLevel(&TCE1,TC_OVFINTLVL_HI_gc);
  
- // 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) { }
- { +
- }+
 } }
 </code> </code>
  
-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.+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/taimer 1 seadistamine funktsiooniga //timer1_init_ctc//. Selle funktsiooni abil seatakse loendur CTC (inglise keeles //clear timer on compare match//) režiimi, kus taimeri maksimaalseks väärtuseks pole mitte 2<sup>16</sup> - 1, vaid see on valitav. Antud juhul määratakse maksimaalseks väärtuseks ICR1 registri väärtus. Loenduri jaguriks on 1024 ja ICR1 väärtuseks 14400, mille tulemusena 14,7456 Mhz taktsageduse puhul on loenduri perioodiks täpselt 1 sekund. Seda on lihtne arvutada valemist: Programmi alguses toimub 16-bitise loendur/taimer 1 seadistamine funktsiooniga //timer1_init_ctc//. Selle funktsiooni abil seatakse loendur CTC (inglise keeles //clear timer on compare match//) režiimi, kus taimeri maksimaalseks väärtuseks pole mitte 2<sup>16</sup> - 1, vaid see on valitav. Antud juhul määratakse maksimaalseks väärtuseks ICR1 registri väärtus. Loenduri jaguriks on 1024 ja ICR1 väärtuseks 14400, mille tulemusena 14,7456 Mhz taktsageduse puhul on loenduri perioodiks täpselt 1 sekund. Seda on lihtne arvutada valemist:
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 <homelab/pin.h> #include <homelab/pin.h>
 #include <homelab/delay.h> #include <homelab/delay.h>
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 1s+ // teeb perioodi pikkuseks 1 s
  // 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) { }
- { +
- }+
 } }
 </code> </code>
  
 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.
et/examples/timer/periodic_interrupt.1412763873.txt.gz · Last modified: 2020/07/20 09:00 (external edit)
CC Attribution-Share Alike 4.0 International
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0