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
en:avr:timers [2010/02/08 12:56] mikk.leinien:avr:timers [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Counters/Timers ====== ====== Counters/Timers ======
  
-Loendurid (inglise keeles //counter//)teatud mõttes taimerid (inglise keeles //timer//)on mikrokontrollerite ühed vajalikuimad lisafunktsioonidNende abil saab protsesse täpselt ajastadasignaale genereerida ja sündmusi loendadaLoenduri tööpõhimõte seisneb sisendtaktide arvu trigerite ahela abil binaarväärtuseks teisendamisesAhela pikkusest oleneb maksimaalne loendatavate taktide arvmida tähistatakse kahendkoodi pikkusega. AVR mikrokontrolleril on loendurid 8- ja 16-bitisedKui 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 nullistLoenduri taktsignaal saab tulla mikrokontrolleri töötaktist ja sel juhul on võimalik selle sagedust sagedusjaguriga (inglise keeles //prescaler//) ka vähendadaMõnel AVR-il on ka sisemine eraldiseisev taktsignaali generaatormille sagedust saab sageduskordistiga tõsta. Sageduskordistiga on näiteks USB liidesega AVR-idLoendurid erinevad ka rakendusvõimaluste ja töörežiimide poolest.+Counterswhich in some sense can be called timersare one of the most important sub-functions of a microcontrollerThese enable to precisely time processesgenerate signals and count eventsA counter converts the number of input cycles to a binary value using an array of triggersThe maximum number of counted cycles depends on the length of this arrayand this is marked by the length of the binary code. AVR has 8- and 16-bit countersIf a timer has reached its maximum value (255 in 8-bit and 65535 in 16-bit counters), the next cycle will generate an overflow and the counter resets back to 0A counter's clock signal can come from the clock signal of the microcontroller, and in this case it is possible to decrease its value using a prescaler. Some AVRs have an internal independent clock signal generatorwhich can be modified to run faster using a frequency multiplierCounters also differ in application cases and work modes.
  
-===== Tüüpiline loendur =====+===== Counter's Default Mode =====
  
-Loenduritmille taktsignaal tuleb töötaktist ja mis ei ole väliselt millegagi liidestatudvõib nimetada tüüpiliseks loenduriksSel loenduril on lisaks hetkeväärtuse lugemisele vaid üks lisavõimalus - katkestuse tekitamine loenduri ületäitumiselTüüpilist loendurit või loendurit tüüpilises režiimis kasutatakse tavaliselt kindlate ajaintervallide järel mingi programmilõigu täitmiseks.+In the default modea counter does nothing more than continually count sequential numbers. Its value can, of coursebe read and changed from the program at any timeThe only additional function in the default mode is to cause an interrupt on counter overflowThe default mode is typically used to execute a section of the program at certain intervals.
  
-==== Näide ====+<box 100% round #EEEEEE|Example>
  
-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.+Task: Make an 8 MHz ATmega128 fire an interrupt every 10 ms (frequency 100 Hz). For this task, the 8-bit counter is suitable.
  
 <code c> <code c>
 #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, + // Give the counter such a value 
- // et järgmine ületäitumine saabuks 10 ms pärast+ // that the next overflow occurs in 10 ms. 
- // Valem: 256 - 8 MHz / 1024 / 100 Hz = 177,785 = ~178+ // Formula: 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()
 { {
- // Kui esimest ületäitumise katkestust soovitakse ka 10 ms + // To make the first overflow interrupt fire in 10 ms as well, 
- // pärast, tuleb loendur enne käivitamist algväärtustada.+ // the counter needs to be initialized here.
  TCNT0 = 178;  TCNT0 = 178;
  
- // Sagedusjaguri teguriks 1024 + // Prescaler value 1024 
- TCCR0 = 0x05;+ TCCR0 = 0x07;
  
- // Loenduri täitumise katkestuse lubamine+ // Allow overflow interrupts
  TIMSK |= (1 << TOIE0);  TIMSK |= (1 << TOIE0);
  
- // Globaalne katkestuste lubamine+ // Allow interrupts globally
  sei();  sei();
  
- // Lõputu programmitsükkel+ // Endless loop
  while (1) continue;  while (1) continue;
 } }
 </code> </code>
  
-Näites toodud loendurile omistatava väärtusega siiski täpselt 10 ms järel katkestust ei tekitatasest vaja oleks loendurile omistada komakohaga väärtuskuid see pole võimalikEt täpset katkestuse intervalli saadatuleb nii sagedusjaguri tegur kui loendurile täitumisel omistatav väärtus valida nii, et taktsagedus jaguks täpseltParaku pole see alati võimalik ja eriti just 8-bitise loenduri puhul, sest selle väärtuste skaala on üsna väikeTäpsema ja suurema intervalli tekitamiseks saab kasutada 16-bitist loendurit.+The counter in this example will not generate the interrupt in exactly 10 ms, thoughin order to do that it would require giving the counter a decimal value, and this is not possibleTo achieve a precise interval between the interruptsboth the prescaler value and the initial value of the counter have to be chosen so that their division results in an exact numberThis is not always possible, especially with 8-bit counters as their value range is quite smallTo achieve a more precise or larger interval, a 16-bit counter can be used.
  
-Kõik muud loendurid täiendavad tüüpilist loendurit. Seega kõigil loenduritel on tüüpilise loenduri tunnusjoon - ületäitumise katkestus.+</box>
  
-==== Välise taktika loendur ====+==== External Clock Counter ====
  
-Loenduri taktsignaalina saab kasutada ka mikrokontrollerivälist signaali (inglise keeles //external clock source//)Selleks on AVR mikrokontrolleril Tn viikkus tähistab loenduri numbritVälist taktsignaali ja polaarsust saab valida sagedusjaguri registriga. Välise taktika loenduril on muus osas samasugused omadused kui tüüpilisel loenduril.+It is also possible to use an external clock source as a counter's clock signal. AVR has a pin called Tn for this purpose, n marking the number of the counterExternal clock signal and the polarity can be selected using the prescaler register.
  
-==== Sündmuste mõõtmine ====+==== Timing Events ====
  
-Kuna loendurid võimaldavad mõõta aegaon keerukamatel AVR mikrokontrolleritel võimalus riistvaraliselt mõõta ka aega, mil toimus mingi sündmusSeda loenduri osa nimetatakse sündmuse püüdjaks (inglise keeles //input capture unit//)AVR-is on valida kahe sündmuse vahelspetsiaalse sisendviigu või analoogkomparaatori võrdlustulemuse loogilise väärtuse muutusKui toimub valitud sündmuskirjutatakse loenduri väärtus spetsiaalsesse registrissekust selle võib soovitud ajal välja lugedaKui sündmuse toimumise aeg on pikem kui loenduri ületäitumise aegtuleb tarkvaraliselt lugeda ka loenduri ületäitumisi (näiteks ületäitumise katkestusega) ja need lõpptulemusse arvestada.+Since the counters allow timing operationsmore complex AVR microcontrollers have an option to time specific events on a hardware levelThis part of the counter is called an input capture unit. There is a choice between two eventsthe logical change in the value of a special input pin or in the value of the analog comparator resultIf the selected event occursthe counter's value is written to a special registerfrom where it can be read at any timeIf the event is longer than the overflow time of the counterthe program has to count the overflows as well and take them into account when calculating the final result.
  
-=== Näide ===+<box 100% round #EEEEEE|Example>
  
-Vaja on 8 MHz taktsagedusel töötava ATmega128-ga mõõta välise 122 Hz - 100 kHz loogilise nelinurksignaali sagedust 1 Hz täpsusegaProgramm on tehtud 16-bitise loendur sündmuste püüdjaga.+Task: Measure the frequency of an external 122 Hz - 100 kHz logical square signal using an 8 MHz ATmega128. The measurement has to be at 1 Hz precisionThe program uses a 16-bit counter with input capture unit.
  
 <code c> <code c>
Line 66: Line 63:
 unsigned long frequency; unsigned long frequency;
  
-// Sündmuse toimumise katkestus+// Interrupt for the event
 ISR(TIMER1_CAPT_vect) ISR(TIMER1_CAPT_vect)
 { {
- // Loenduri nullimine esimese asjana+ // Counter to 0
  TCNT1 = 0;  TCNT1 = 0;
  
- // Tulemus on ainult siis arvestatav, kui + // The result is valid only if the counter 
- // loendur pole vahepeal üle täitunud+ // has not overflowed yet
  if (!(TIFR & (1 << TOV1)))  if (!(TIFR & (1 << TOV1)))
  {  {
- // Sageduse arvutamine perioodi pöördväärtusest.+ // Calculating the frequency from the period
  frequency = (unsigned long)8000000 /  frequency = (unsigned long)8000000 /
              (unsigned long)ICR1;              (unsigned long)ICR1;
Line 82: Line 79:
  else  else
  {  {
- // Sagedus on vähem kui 122 Hz+ // Frequency is less than 122 Hz
  frequency = 0;  frequency = 0;
  
- // Loenduri ületäitumise lipukese nullimine+ // Set the counter's overflow flag to 0
  TIFR &= ~(1 << TOV1);  TIFR &= ~(1 << TOV1);
  }  }
Line 92: Line 89:
 int main() int main()
 { {
- // Tõusva frondi registreeriminesagedusjaguri tegur 1+ // Register a rising frontprescaler value 1
  TCCR1B = (1 << ICES1) | (1 << CS10);  TCCR1B = (1 << ICES1) | (1 << CS10);
  
- // Sündmuse toimumise katkestuse lubamine+ // Allow event interrupts
  TIMSK = (1 << TICIE1);  TIMSK = (1 << TICIE1);
  
- // Globaalne katkestuste lubamine+ // Allow interrupts globally
  sei();  sei();
  
- // Lõputu programmitsükkel+ // Endless loop
  while (1) continue;  while (1) continue;
 } }
 </code> </code>
  
-Programmis tekib välise signaali tõusva frondi ajal sündmuse katkestusKatkestuse jooksul kontrollitakseega 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 perioodiSagedus arvutatakse 32-bitiste arvudega pöördväärtusena perioodistEsimese asjana aga nullitakse loendursest 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õõtetulemustMaksimaalsele mõõdetavale sagedusele seab piiri katkestuse programmiosa tööaeg.+The program fires an interrupt each time a rising front occurs in the external signalDuring the interruptthe counter is checked for overflows this can happen if the frequency of the signal is below 122 Hz (8 MHz / 2<sup>16</sup>and in this case the value of the counter doesn't reflect a real period anymoreThe frequency is calculated using 32-bit numbers to get the inverse of the periodThe first thing is to set the counter to 0because the timer works on the same clock signal as the processor and each instruction execution occurring after the external event shortens the measured period corrupting the resultThe maximum measured frequency is limited by the time spent in the interrupt program.
  
-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äärtuse. Kuid riistvaraline sündmuste püüdmine on mõeldud eeskätt siiski programmist sõltumatuks töötamiseks ja suhteliselt lühiajaliste (või tihedate) sündmuste mõõtmiseks.+</box>
  
-===== Signaali genereerimine =====+Catching events and registering the time it took for them to occur can also be resolved at the software level. It is possible to use external or other interrupts and read the value of the counter during these events. The hardware-level event catching is meant to run independently from the main program and time relatively short (or frequent) events.
  
-Peale signaali pikkuse mõõtmise saab keerukamate loenduritega 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 mille 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.+===== Signal Generating =====
  
-Väljastusüksuses on võimalik seadistada väljundviikude käitumist võrdusmomendil. Valida on viigu kõrgeks muutmisemadalaks muutmise ja ümbermuutumise vahelNende täpsem toime aga sõltub sellestmillist signaali genereerimise režiimi kasutadaKui kasutusel on PWM signaali tekitamise režiim (järgmine peatükk), siis viik muutub loenduri täitumisel kas madalaks või kõrgeks, vastupidiselt sellele, mida viik teeb võrdusmomendil.+More complex counters can generate a signalin addition to timing the length of oneFor this purpose the counter has an output compare unit and a compare match output unit. The output compare unit has registers with the same bit-width as the counter and the values of these registers are compared to the value of the counter while it is running. An interrupt can be generated and special pins' values can be changed each time the counter's value is equal to the value in the compare unit register. At this moment a pin can either be set highlow or inversedThe signal is generated by changes in the value of the output pin.
  
-Mõnedel signaali genereerimise režiimidel on määratav ka loenduri suurim väärtus - loenduri füüsiline suurus jääb küll samakskuid mängus on võrdlusregistermille väärtust ületades loendur nullitakseSeda võimalust kasutades saab eespool toodud ülesandeid täpse ajalise katkestuse tekitamise kohta lahendadakuid mõeldud on see pigem signaali perioodi muutmiseksVähe sellest - mõnes režiimis toimib loendur juurde ja maha lugedes.+In some signal generating modesthe counter's maximum value can be altered. The counter's physical size will remain the samebut a comparison register is used to reset the counter at a specific countThe previous examples could also be solved by using this methodbut the function is rather for changing the period of the signalIn addition to this, a counter can be configured to a mode where it works with both incrementing and decrementing.
  
-Loendurid ja eriti just nende signaali genereerimise režiimid on ühed keerulisemad perifeeriamoodulid AVR-ilKõigist neist kirjutamine läheks pikaks ja enamasti pole nende juures vaja ka kõike teadaSeetõttu on järgnevalt kirjeldatud vaid üht levinuimat PWM signaali robootikasÜlejäänut saab juba AVR dokumentatsioonist järgi uurida.+The counters and the signal generating modes using them are one of the most complex peripheral modules in an AVR. Writing about all of them here is beyond the scope of this text, and typically there is no need to know all aspects in order to use themThe following describes one of the most common PWM signals in roboticsThe rest can be read from the AVR documentation.
  
-==== Pulsilaius-modulatsioon ====+==== Pulse Width Modulation ====
  
-Pulsilaius-modulatsioon (inglise keeles //pulse width modulation//, lühend PWM) on signaali tüüpmille sagedus ja ühtlasi ka perioodid on konstantne (enamasti), kuid mõlema poolperioodi pikkus on muutuv. PWM signaale kasutatakse elektromehaanilisteoptiliste jmsseadmete juhtimiseks. Näiteks mudelismist tuntud servomootorite PWM signaal on 50 Hz sagedusega ja ms kuni 2 ms pikkuse kõrge poolperioodiga.+Pulse width modulation (PWM) is a type of signalwhere the frequency and period (typicallyare both constantbut the length of the half-periods changes. PWM signals are used for controlling electromechanicaloptical and other devicesFor example, the servo motors known from modeling use a PWM signal of 50 Hz and have a high half-period of to 2 ms.
  
-=== Näide ===+<box 100% round #EEEEEE|Example>
  
-Vaja on 8 MHz taktsagedusel töötava ATmega128-ga genereerida kaks kiirusreguleeritavate servomootorite signaaliViiguga PB5 (OC1A) tuleb genereerida pulsipikkus 1 ms ja viiguga PB6 (OC1B) pulsipikkus 2 ms.+Task: Using an 8MHz ATmega128, generate two speed regulating servo motor signalsUse pin PB5 (OC1A) to generate a pulse width of 1 ms and pin PB6 (OC1B) to generate pulse width of 2 ms.
  
 <code c> <code c>
Line 133: Line 130:
 int main() int main()
 { {
- // Viigud väljundiks+ // Set pins as outputs
  DDRB |= (1 << PIN5) | (1 << PIN6);  DDRB |= (1 << PIN5) | (1 << PIN6);
  
- // Väljundid ja võrdusmomendil madalaks+ // Set outputs and low for comparison
- // "Fast PWM" režiimsagedusjagur 8+ // "Fast PWM" modeprescaler value 8
  TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);  TCCR1A = (1 << COM1A1) | (1 << COM1B1) | (1 << WGM11);
  TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);  TCCR1B = (1 << WGM13) | (1 << WGM12) | (1 << CS11);
  
- // Suurim loenduri väärtusValem:+ // Maximum value of the counterFormula:
  //   TOP = 8 MHz / 8 / 50 Hz  //   TOP = 8 MHz / 8 / 50 Hz
  ICR1 = 20000;  ICR1 = 20000;
  
- // Esimese mootori poolperiood 1 ms, teisel 2 ms+ // Half-period of the first motor is 1 ms, and second 2 ms
  OCR1A = 1000;  OCR1A = 1000;
  OCR1B = 2000;  OCR1B = 2000;
  
- // Lõputu programmitsükkel+ // Endless loop
  while (1) continue;  while (1) continue;
 } }
 </code> </code>
 +
 +</box>
en/avr/timers.1265633819.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