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:avr:timers [2010/02/11 14:51] mikk.leiniet:avr:timers [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Loendurid/Taimerid ====== ====== Loendurid/Taimerid ======
  
-Loendurid (inglise keeles //counter//), teatud mõttes taimerid (inglise keeles //timer//), on mikrokontrollerite ühed oluliseimad lisafunktsioonid. Nende abil saab protsesse täpselt ajastada, signaale genereerida ja sündmusi loendada. Loenduri tööpõhimõte seisneb sisendtaktide arvu trigerite ahela abil binaarväärtuseks teisendamises. Ahela pikkusest oleneb maksimaalne loendatavate taktide arv, mida tähistatakse kahendkoodi pikkusega. AVR mikrokontrolleril on loendurid 8- ja 16-bitised. Kui loendur omab maksimaalset väärtust (8-bitiste puhul 255, 16-bitiste puhul 65535), tekib järgmise taktiga ületäitumine (inglise keeles //overflow//) ja loendur alustab uuesti nullist. Loenduri taktsignaal saab tulla mikrokontrolleri töötaktist ja sel juhul on võimalik selle sagedust sagedusjaguriga (inglise keeles //prescaler//) ka vähendada. Mõnel AVR-il on sisemine eraldiseisev taktsignaali generaator, mille sagedust saab sageduskordistiga tõsta. Sageduskordistiga on näiteks USB liidesega AVR-id. Loendurid erinevad ka rakendusvõimaluste ja töörežiimide poolest.+Loendurid (inglise keeles //counter//), teatud mõttes taimerid (inglise keeles //timer//), on mikrokontrollerite ühed oluliseimad lisafunktsioonid. Nende abil saab protsesse täpselt ajastada, signaale genereerida ja sündmusi loendada. Loenduri tööpõhimõte seisneb sisendtaktide arvu trigerite ahela abil binaarväärtuseks teisendamises. Ahela pikkusest oleneb maksimaalne loendatavate taktide arv, mida tähistatakse kahendkoodi pikkusega. AVR mikrokontrolleril on loendurid 8- ja 16-bitised. Kui loendur omab maksimaalset väärtust (8-bitiste puhul 255, 16-bitiste puhul 65535), tekib järgmise taktiga ületäitumine (inglise keeles //overflow//) ja loendur alustab uuesti nullist. Loenduri taktsignaal saab tulla mikrokontrolleri töötaktist ja sel juhul on võimalik selle sagedust sagedusjaguriga (inglise keeles //prescaler//) ka vähendada. Mõnel AVR-il on sisemine eraldiseisev taktsignaali generaator, mille sagedust saab sageduskordistiga tõsta. Loendurid erinevad ka rakendusvõimaluste ja töörežiimide poolest
 + ~~CL~~  
 +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 liidestatudvõib nimetada üldiseks loenduriks (inglise keeles //general purpose//)Sel loenduril on lisaks hetkeväärtuse lugemisele vaid üks lisavõimalus katkestuse tekitamine loenduri ületäitumisel. Üldist loendurit või loendurit üldises režiimis kasutatakse tavaliselt kindlate ajaintervallide järel mingi programmilõigu täitmiseks.+Normaalrežiimis ei täida loendur muud funktsioonikui pidevat järjestikulist arvude loendamistLoenduri väärtust saab igal hetkel programmis muidugi ka lugeda ja muuta. Ainuke lisavõimalus normaalrežiimis on katkestuse tekitamine loenduri ületäitumisel. Normaalrežiimi kasutatakse tavaliselt mingi programmilõigu täitmiseks kindlate ajaintervallide järel.
  
 <box 100% round #EEEEEE|Näide> <box 100% round #EEEEEE|Näide>
Line 14: Line 16:
 #include <avr/interrupt.h> #include <avr/interrupt.h>
  
-// 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 saabuks 10 ms pärast.+ // et järgmine ületäitumine tekiks 10 ms pärast
  // 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 ületäitumise katkestus tekiks 10 ms pärast, 
- // Kui esimest ületäitumise katkestust soovitakse ka 10 ms + // tuleb ka siinkohal loendur algväärtustada
- // pärast, tuleb loendur enne käivitamist algväärtustada.+
  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.
- 
 </box> </box>
- 
-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 60: Line 52:
  
 <box 100% round #EEEEEE|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 69: 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 92: Line 82:
 } }
  
-int main() +int main(void) {
-{+
  // Tõusva frondi registreerimine, sagedusjaguri tegur 1  // Tõusva frondi registreerimine, sagedusjaguri tegur 1
  TCCR1B = (1 << ICES1) | (1 << CS10);  TCCR1B = (1 << ICES1) | (1 << CS10);
Line 109: Line 98:
  
 Programmis tekib välise signaali tõusva frondi ajal sündmuse katkestus. Katkestuse jooksul kontrollitakse, ega loenduri ületäitumine pole toimunud - see saab juhtuda, kui signaali sagedus on alla 122 Hz (8 MHz / 2<sup>16</sup>), ja sel juhul ei kajasta loenduri väärtus reaalset perioodi. Sagedus arvutatakse 32-bitiste arvudega pöördväärtusena perioodist. Esimese asjana aga nullitakse loendur, sest taimer töötab samal taktil mis protsessor ja iga instruktsiooni täitmine, mis toimub pärast välist sündmust, lühendab mõõdetavat perioodi ning sellest tulenevalt rikub ka mõõtetulemust. Maksimaalsele mõõdetavale sagedusele seab piiri katkestuse programmiosa tööaeg. Programmis tekib välise signaali tõusva frondi ajal sündmuse katkestus. Katkestuse jooksul kontrollitakse, ega loenduri ületäitumine pole toimunud - see saab juhtuda, kui signaali sagedus on alla 122 Hz (8 MHz / 2<sup>16</sup>), ja sel juhul ei kajasta loenduri väärtus reaalset perioodi. Sagedus arvutatakse 32-bitiste arvudega pöördväärtusena perioodist. Esimese asjana aga nullitakse loendur, sest taimer töötab samal taktil mis protsessor ja iga instruktsiooni täitmine, mis toimub pärast välist sündmust, lühendab mõõdetavat perioodi ning sellest tulenevalt rikub ka mõõtetulemust. Maksimaalsele mõõdetavale sagedusele seab piiri katkestuse programmiosa tööaeg.
- 
 </box> </box>
  
Line 116: 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, saab tekitada katkestuse ja spetsiaalsete väljundviikude oleku muutuse. Väljundviigu oleku muutused tekitavadki signaali. +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äärtusi võrreldakse loenduri väärtusega selle töö ajal. Hetkel, mil loenduri väärtus saab võrdseks võrdlusüksuse registri väärtusega, saab tekitada katkestuse ja spetsiaalsete väljundviikude oleku muutuse. Valida on võrdusmomendil viigu kõrgeks muutumise, madalaks muutumise ja ümbermuutumise vahel. Väljundviigu oleku muutused tekitavadki signaali.
- +
-Väljastusüksuses on võimalik seadistada väljundviikude käitumist võrdusmomendil. Valida on viigu kõrgeks muutmise, madalaks muutmise ja ümbermuutumise vahel. Nende täpsem toime aga sõltub sellest, millist signaali genereerimise režiimi kasutada. Kui kasutusel on PWM signaali tekitamise režiim (lähemalt järgmises peatükis), siis viik muutub loenduri täitumisel? __madalaks või kõrgeks__, vastupidiselt sellele, mida viik teeb võrdusmomendil.+
  
 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, mille väärtust ületades loendur nullitakse. Seda võimalust kasutades saab eespool toodud ülesandeid täpse ajalise katkestuse tekitamise kohta lahendada, kuid mõeldud on see pigem signaali perioodi muutmiseks. Lisaks sellele on võimalik loendurit seadistada režiimi, kus see toimib nii juurde- kui mahalugemisel. 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, mille väärtust ületades loendur nullitakse. Seda võimalust kasutades saab eespool toodud ülesandeid täpse ajalise katkestuse tekitamise kohta lahendada, kuid mõeldud on see pigem signaali perioodi muutmiseks. Lisaks sellele on võimalik loendurit seadistada režiimi, kus see toimib nii juurde- kui mahalugemisel.
  
-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 vaja 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.
  
 ==== Pulsilaius-modulatsioon ==== ==== Pulsilaius-modulatsioon ====
Line 135: Line 121:
 #include <avr/io.h> #include <avr/io.h>
  
-int main() +int main(void) {
-{+
  // Viigud väljundiks  // Viigud väljundiks
  DDRB |= (1 << PIN5) | (1 << PIN6);  DDRB |= (1 << PIN5) | (1 << PIN6);
et/avr/timers.1265899915.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