This shows you the differences between two versions of the page.
| Both sides previous revisionPrevious revisionNext revision | Previous revision | ||
| et:avr:timers [2010/02/11 11:37] – toimetaja | et:avr:timers [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Loendurid/ | ====== Loendurid/ | ||
| - | Loendurid (inglise keeles // | + | Loendurid (inglise keeles // |
| + | | ||
| + | Atmeli xmega kontrollerite puhul tuleb jälgida, mis siini taimerit kasutatakse. AVR xmega taimerite registritesse kirjutamine toimib sarnaselt eelnevates peatükkides toodud näidetega. Režiimid on sarnased ning täpsem kirjeldus on toodud andmelehes. | ||
| - | ===== Üldine loendur | + | ===== Loenduri normaalrežiim |
| - | Loendurit, mille taktsignaal tuleb töötaktist ja mis ei ole väliselt millegagi liidestatud, võib nimetada üldiseks loenduriks (inglise keeles //general purpose//). Sel loenduril on lisaks hetkeväärtuse lugemisele vaid üks lisavõimalus | + | Normaalrežiimis |
| - | ==== Näide | + | <box 100% round #EEEEEE|Näide> |
| Vaja on 8 MHz taktsagedusel töötav ATmega128 10 ms (sagedus 100 Hz) ajavahemiku järel katkestust tekitama panna. Ülesandeks sobib 8-bitine loendur 0. | Vaja on 8 MHz taktsagedusel töötav ATmega128 10 ms (sagedus 100 Hz) ajavahemiku järel katkestust tekitama panna. Ülesandeks sobib 8-bitine loendur 0. | ||
| Line 14: | Line 16: | ||
| #include < | #include < | ||
| - | // Loenduri 0 ületäitumine | + | ISR(TIMER0_OVF_vect) { |
| - | ISR(TIMER0_OVF_vect) | + | |
| - | { | + | |
| // Loendurile sellise väärtuse omistamine, | // Loendurile sellise väärtuse omistamine, | ||
| - | // et järgmine ületäitumine | + | // et järgmine ületäitumine |
| // Valem: 256 - 8 MHz / 1024 / 100 Hz = 177,785 = ~178 | // Valem: 256 - 8 MHz / 1024 / 100 Hz = 177,785 = ~178 | ||
| TCNT0 = 178; | TCNT0 = 178; | ||
| - | |||
| - | // Tee midagi, aga alles pärast loendurile uue väärtuse omistamist | ||
| } | } | ||
| - | int main() | + | int main(void) { |
| - | { | + | // Et esimene |
| - | // Kui esimest | + | // tuleb ka siinkohal |
| - | // pärast, | + | |
| TCNT0 = 178; | TCNT0 = 178; | ||
| - | |||
| // Sagedusjaguri teguriks 1024 | // Sagedusjaguri teguriks 1024 | ||
| - | TCCR0 = 0x05; | + | TCCR0 = 0x07; |
| // Loenduri täitumise katkestuse lubamine | // Loenduri täitumise katkestuse lubamine | ||
| TIMSK |= (1 << TOIE0); | TIMSK |= (1 << TOIE0); | ||
| Line 46: | Line 41: | ||
| Näites toodud loendurile omistatava väärtusega siiski täpselt 10 ms järel katkestust ei tekitata, sest vaja oleks loendurile omistada komakohaga väärtus, kuid see pole võimalik. Et täpset katkestuse intervalli saada, tuleb nii sagedusjaguri tegur kui ka loendurile täitumisel omistatav väärtus valida nii, et taktsagedus jaguks täpselt. Paraku pole see alati võimalik, ja eriti just 8-bitise loenduri puhul, sest selle väärtuste skaala on üsna väike. Täpsema ja suurema intervalli tekitamiseks saab kasutada 16-bitist loendurit. | Näites toodud loendurile omistatava väärtusega siiski täpselt 10 ms järel katkestust ei tekitata, sest vaja oleks loendurile omistada komakohaga väärtus, kuid see pole võimalik. Et täpset katkestuse intervalli saada, tuleb nii sagedusjaguri tegur kui ka loendurile täitumisel omistatav väärtus valida nii, et taktsagedus jaguks täpselt. Paraku pole see alati võimalik, ja eriti just 8-bitise loenduri puhul, sest selle väärtuste skaala on üsna väike. Täpsema ja suurema intervalli tekitamiseks saab kasutada 16-bitist loendurit. | ||
| - | + | </ | |
| - | Kõik muud loendurid täiendavad üldist loendurit. Seega kõigil loenduritel on üldise loenduri tunnusjoon - ületäitumise katkestus. | + | |
| ==== Välise taktiga loendur ==== | ==== Välise taktiga loendur ==== | ||
| - | Loenduri taktsignaalina saab kasutada ka mikrokontrollerivälist signaali (inglise keeles //external clock source//). Selleks on AVR mikrokontrolleril Tn viik, kus n tähistab loenduri numbrit. Välist taktsignaali ja polaarsust saab valida sagedusjaguri registriga. Välise taktiga loenduril on muus osas samasugused omadused kui üldisel loenduril. | + | Loenduri taktsignaalina saab kasutada ka mikrokontrollerivälist signaali (inglise keeles //external clock source//). Selleks on AVR mikrokontrolleril Tn viik, kus n tähistab loenduri numbrit. Välist taktsignaali ja polaarsust saab valida sagedusjaguri registriga. |
| ==== Sündmuste mõõtmine ==== | ==== Sündmuste mõõtmine ==== | ||
| Line 57: | Line 51: | ||
| Kuna loendurid võimaldavad mõõta aega, on keerukamatel AVR mikrokontrolleritel võimalus riistvaraliselt mõõta ka aega, mil toimus mingi sündmus. Seda loenduri osa nimetatakse sündmuse püüdjaks (inglise keeles //input capture unit//). AVR-is on valida kahe sündmuse vahel: spetsiaalse sisendviigu või analoogkomparaatori võrdlustulemuse loogilise väärtuse muutus. Kui toimub valitud sündmus, kirjutatakse loenduri väärtus spetsiaalsesse registrisse, | Kuna loendurid võimaldavad mõõta aega, on keerukamatel AVR mikrokontrolleritel võimalus riistvaraliselt mõõta ka aega, mil toimus mingi sündmus. Seda loenduri osa nimetatakse sündmuse püüdjaks (inglise keeles //input capture unit//). AVR-is on valida kahe sündmuse vahel: spetsiaalse sisendviigu või analoogkomparaatori võrdlustulemuse loogilise väärtuse muutus. Kui toimub valitud sündmus, kirjutatakse loenduri väärtus spetsiaalsesse registrisse, | ||
| - | === Näide | + | <box 100% round #EEEEEE|Näide> |
| Vaja on 8 MHz taktsagedusel töötava ATmega128-ga mõõta välise 122 Hz - 100 kHz loogilise nelinurksignaali sagedust 1 Hz täpsusega. Programm on tehtud 16-bitise loendur 1 sündmuste püüdjaga. | Vaja on 8 MHz taktsagedusel töötava ATmega128-ga mõõta välise 122 Hz - 100 kHz loogilise nelinurksignaali sagedust 1 Hz täpsusega. Programm on tehtud 16-bitise loendur 1 sündmuste püüdjaga. | ||
| Line 67: | Line 60: | ||
| // Sündmuse toimumise katkestus | // Sündmuse toimumise katkestus | ||
| - | ISR(TIMER1_CAPT_vect) | + | ISR(TIMER1_CAPT_vect) { |
| - | { | + | |
| // Loenduri nullimine | // Loenduri nullimine | ||
| TCNT1 = 0; | TCNT1 = 0; | ||
| Line 90: | Line 82: | ||
| } | } | ||
| - | int main() | + | int main(void) { |
| - | { | + | |
| // Tõusva frondi registreerimine, | // Tõusva frondi registreerimine, | ||
| TCCR1B = (1 << ICES1) | (1 << CS10); | TCCR1B = (1 << ICES1) | (1 << CS10); | ||
| Line 107: | Line 98: | ||
| Programmis tekib välise signaali tõusva frondi ajal sündmuse katkestus. Katkestuse jooksul kontrollitakse, | Programmis tekib välise signaali tõusva frondi ajal sündmuse katkestus. Katkestuse jooksul kontrollitakse, | ||
| + | </ | ||
| Sündmuste püüdmist ning nende aja registreerimist saab teha ka tarkvaraliselt. Saab kasutada väliseid või muid katkestusi ja nende tekkimise ajal lugeda loenduri väärtus. Riistvaraline sündmuste püüdmine on siiski mõeldud eeskätt programmist sõltumatuks töötamiseks ja suhteliselt lühiajaliste (või tihedate) sündmuste mõõtmiseks. | Sündmuste püüdmist ning nende aja registreerimist saab teha ka tarkvaraliselt. Saab kasutada väliseid või muid katkestusi ja nende tekkimise ajal lugeda loenduri väärtus. Riistvaraline sündmuste püüdmine on siiski mõeldud eeskätt programmist sõltumatuks töötamiseks ja suhteliselt lühiajaliste (või tihedate) sündmuste mõõtmiseks. | ||
| Line 112: | Line 104: | ||
| ===== Signaali genereerimine ===== | ===== Signaali genereerimine ===== | ||
| - | Keerukamate loenduritega saab peale signaali pikkuse mõõtmise ka signaali tekitada. Selleks on loenduril väärtuse võrdlemise üksus (inglise keeles //output compare unit//) ja võrdlustulemuse väljastusüksus (inglise keeles //compare match output unit//). Võrdlusüksusesse kuuluvad registrid sama bitilaiusega kui loendur ise ja __nende__ ?väärtusi võrreldakse loenduri väärtusega selle töö ajal. Hetkel, mil loenduri väärtus saab võrdseks võrdlusüksuse registri väärtusega, | + | Keerukamate loenduritega saab peale signaali pikkuse mõõtmise ka signaali tekitada. Selleks on loenduril väärtuse võrdlemise üksus (inglise keeles //output compare unit//) ja võrdlustulemuse väljastusüksus (inglise keeles //compare match output unit//). Võrdlusüksusesse kuuluvad registrid sama bitilaiusega kui loendur ise ja nende registrite |
| - | + | ||
| - | Väljastusüksuses | + | |
| Mõnedel signaali genereerimise režiimidel on määratav ka loenduri suurim väärtus - loenduri füüsiline suurus jääb küll samaks, kuid mängus on võrdlusregister, | Mõnedel signaali genereerimise režiimidel on määratav ka loenduri suurim väärtus - loenduri füüsiline suurus jääb küll samaks, kuid mängus on võrdlusregister, | ||
| - | Loendurid ja nende abil genereeritavate signaalide režiimid on ühed keerulisemad perifeeriamoodulid AVR-il. Kõigist neist kirjutamine läheks pikaks ja enamasti pole nende kasutamisel kõike detailselt teada. Seetõttu on järgnevalt kirjeldatud vaid üht levinuimat PWM signaali robootikas. Ülejäänut saab juba AVR dokumentatsioonist järgi uurida. | + | Loendurid ja nende abil genereeritavate signaalide režiimid on ühed keerulisemad perifeeriamoodulid AVR-il. Kõigist neist kirjutamine läheks pikaks ja enamasti pole nende kasutamisel |
| ==== Pulsilaius-modulatsioon ==== | ==== Pulsilaius-modulatsioon ==== | ||
| Line 124: | Line 114: | ||
| Pulsilaius-modulatsioon (inglise keeles //pulse width modulation//, | Pulsilaius-modulatsioon (inglise keeles //pulse width modulation//, | ||
| - | === Näide | + | <box 100% round #EEEEEE|Näide> |
| Vaja on 8 MHz taktsagedusel töötava ATmega128-ga genereerida kaks kiirusreguleeritavat servomootori signaali. Viiguga PB5 (OC1A) tuleb genereerida pulsipikkus 1 ms ja viiguga PB6 (OC1B) pulsipikkus 2 ms. | Vaja on 8 MHz taktsagedusel töötava ATmega128-ga genereerida kaks kiirusreguleeritavat servomootori signaali. Viiguga PB5 (OC1A) tuleb genereerida pulsipikkus 1 ms ja viiguga PB6 (OC1B) pulsipikkus 2 ms. | ||
| Line 131: | Line 121: | ||
| #include < | #include < | ||
| - | int main() | + | int main(void) { |
| - | { | + | |
| // Viigud väljundiks | // Viigud väljundiks | ||
| DDRB |= (1 << PIN5) | (1 << PIN6); | DDRB |= (1 << PIN5) | (1 << PIN6); | ||
| Line 153: | Line 142: | ||
| } | } | ||
| </ | </ | ||
| + | |||
| + | </ | ||