Differences

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

Link to this comparison view

Next revision
Previous revision
de:avr:timers [2010/07/26 18:15] – angelegt Wemberde:avr:timers [2020/07/20 09:00] (current) – external edit 127.0.0.1
Line 1: Line 1:
 ====== Counters/Timers ====== ====== Counters/Timers ======
  
-Counter, welche man auch in einigen Fällen Taktgeber nennen kann, sind einer der wichtigsten Unterfunktionen eines Microcontrollers. Diese ermöglichen es Prozesse exakt zu timen, Signale zu generieren und Ereignisse zu zählen. Ein Zähler konvertiert die Nummer der Inputzyklen in einen binären Wert mit Hilfe eines Arrays an Triggern. Die maximale Nummer der gezählten Zyklen hängt von der Länge des Arrays ab und diese ist markiert von der Länge des binären Codes. Der AVR hat 8- und 16- Bit Counter. Wenn ein Timer seinen  maximalen Wert erreicht hat(255 bei 8-Bit und 65535 bei 16-Bit), generiert der nächste Zyklus ein Overflow und der Zähler macht ein Reset auf 0. Das Taktsignal eines Counters kann vom Taktsignal des Microcontrollers kommen und in diesem Fall ist es möglich den Wert mit einem Prescaler herunterzusetzen. Einige AVRs haben einen internen unabhängigen Taktgeber, welcher mit einem Frequenzmultiplikator modifiziert werden kann, um schneller zu laufen.+Counter, welche man auch in einigen Fällen Taktgeber nennen kann, sind einer der wichtigsten Unterfunktionen eines Microcontrollers. Diese ermöglichen es Prozesse exakt zu timen, Signale zu generieren und Ereignisse zu zählen. Ein Zähler konvertiert die Nummer der Inputzyklen in einen binären Wert mit Hilfe eines Arrays an Triggern. Die maximale Nummer der gezählten Zyklen hängt von der Länge des Arrays ab und diese ist markiert von der Länge des binären Codes. Der AVR hat 8- und 16- Bit Counter. Wenn ein Timer seinen  maximalen Wert erreicht hat(255 bei 8-Bit und 65535 bei 16-Bit), generiert der nächste Zyklus ein Overflow und der Zähler macht ein Reset auf 0. Das Taktsignal eines Counters kann vom Taktsignal des Microcontrollers kommen und in diesem Fall ist es möglich den Wert mit einem Prescaler herunter zusetzen. Einige AVRs haben einen internen unabhängigen Taktgeber, welcher mit einem Frequenzmultiplikator modifiziert werden kann, um schneller zu laufen.
 Counter unterscheiden sich auch in Applikationsfällen und Arbeitsmodi. Counter unterscheiden sich auch in Applikationsfällen und Arbeitsmodi.
  
Line 46: Line 46:
  
 Der Counter in diesem Beispiel wird den Interrupt nicht in exakt 10 ms generieren, dafür müsste man dem Counter einen Dezimalwert geben, das ist aber nicht möglich. Der Counter in diesem Beispiel wird den Interrupt nicht in exakt 10 ms generieren, dafür müsste man dem Counter einen Dezimalwert geben, das ist aber nicht möglich.
-Um einen präzisen Intervall zwischen den Interrupts zu verwirklichen, wird sowohl der Prescaler Wert, als auch der Wert des Counter müssen so ausgesucht werden, dass ihre Division in einer exakten Nummer endet. Das ist nicht immer möglich, vor allem mit 8-Bit Countern, da ihr Wertebereich sehr klein ist. Um einen präziseren oder größeren Intervall zu bekommen, kann ein 16-Bit counter gewählt werden.+Um einen präzisen Intervall zwischen den Interrupts zu verwirklichen, wird sowohl der Prescaler Wert, als auch der Wert des Counter müssen so ausgesucht werden, dass ihre Division in einer exakten Nummer endet. Das ist nicht immer möglich, vor allem mit 8-Bit Countern, da ihr Wertebereich sehr klein ist. Um einen präziseren oder größeren Intervall zu bekommen, kann ein 16-Bit Counter gewählt werden.
  
  
 </box> </box>
  
-==== External clock counter ====+==== Externer Taktgeber ====
  
-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, marking the number of the counterExternal clock signal and the polarity can be selected using the prescaler register.+Es ist auch möglich einen externen Taktgeber als das Taktsignals eines Counters zu nutzen. 
 +Der AVR hat einen Pin "Tn" dafür. Das ist Platzhalter für die Nummer des Counters. 
 +Das Externe Taktsignal und die Polarität kann man im Prescaler Register auswählen.
  
 ==== Timing events ==== ==== Timing events ====
  
-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 unitThere is a choice between two events: the logical change in the value of a special input pin or in the value of the analog comparator result. If the selected event occurs, the 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.+Da die Counter zeitlich abgestimmte Operationen ermöglichenhaben komplexe AVR Microcontroller eine Option auf Hardware-Level für zeit spezifische Ereignisse. 
 +Der Teil des Counter heißt "Input Capture Unit". Es gibt eine Auswahl zwischen zwei Ereignissen: Die logische Änderung eines Werts an einem speziellen Input Pins oder im Wert des analogen Komparator ErgebnissesWenn das gewählte Ereignis eintritt wird der Wert des Counters in ein spezielles Register geschriebenwelches man jederzeit auslesen kannWenn das Event länger ist als die Overflowzeit des Countermuss das Programm die Overflow mit zählen und beim Endergebnis mitberechnen.
  
 <box 100% round #EEEEEE|Example> <box 100% round #EEEEEE|Example>
  
-TaskMeasure 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 1 input capture unit.+AufgabeMiss die Frequenz eines Externen 122Hz 100kHz logischen Rechtecksignals mit einem 8MHz ATmega128. Die Messung soll mit einer 1 Hz-Präzision erfolgenDas Programm nutzt einen 16-Bit Counter mit einer Input Capture Unit.
  
 <code c> <code c>
Line 68: Line 71:
 unsigned long frequency; unsigned long frequency;
  
-// Interrupt for the event+// Interrupt für das Ereignis
 ISR(TIMER1_CAPT_vect) ISR(TIMER1_CAPT_vect)
 { {
Line 74: Line 77:
  TCNT1 = 0;  TCNT1 = 0;
  
- // The result is valid only if the counter + // Das Ergebnis ist nur gültig wenn der Counter 
- // has not overflown yet+ // noch kein Overflow hatte.
  if (!(TIFR & (1 << TOV1)))  if (!(TIFR & (1 << TOV1)))
  {  {
- // Calculating the frequency from the period+ // Berechnen der Frequenz von der Periode
  frequency = (unsigned long)8000000 /  frequency = (unsigned long)8000000 /
              (unsigned long)ICR1;              (unsigned long)ICR1;
Line 84: Line 87:
  else  else
  {  {
- // Frequency is less than 122 Hz+ // Frequenz ist weniger als 122Hz
  frequency = 0;  frequency = 0;
  
- // Set the counter's overflow flag to 0+ // Setzt die Counter Overflow Flagge auf 0
  TIFR &= ~(1 << TOV1);  TIFR &= ~(1 << TOV1);
  }  }
Line 94: Line 97:
 int main() int main()
 { {
- // Register a rising front, prescaler value 1+ // Registriert eine "rising front"Prescaler Wert auf 1
  TCCR1B = (1 << ICES1) | (1 << CS10);  TCCR1B = (1 << ICES1) | (1 << CS10);
  
- // Allow event interrupts+ // Erlaubt Ereignis-Interrupts
  TIMSK = (1 << TICIE1);  TIMSK = (1 << TICIE1);
  
- // Allow interrupts globally+ // Erlaubt global Interrupts
  sei();  sei();
  
- // Endless loop+ // Endlosschleife
  while (1) continue;  while (1) continue;
 } }
 </code> </code>
  
-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 any moreThe frequency is calculated using 32-bit numbers to get the inverse of the periodFirst thing is to set the counter to 0, because 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. +Das Programm löst jedes mal bei einer "Rising Front" im externen Signal einen Interrupt aus. 
 +Während des Interruptsüberprüft das Programm den Counter auf einen Overflow dass kann passieren wenn die Frequenz des Signals unter 122Hz (8 MHz / 2<sup>16</sup>ist und in so einem Fall spiegelt der Wert des Counters die echte Periode nicht mehr wiederDie Frequenz wird berechnent indem man mit 32-Bit Nummern die Inverse der Periode bekommtAls erstes setzt man den Counter auf 0, weil der Timer mit dem gleichen Taktsignal wie der Prozessors arbeitet und jede Befehlsausführung nach dem externen Event die zu messende Periode verkürzt und damit das Ergebnis verfälschtDie maixmale gemessene Frequenz wird durch die Zeit die das Interrupt benötigt limitiert.
 </box> </box>
  
-Catching events and registering the time it took for them to occur can also be resolved at the software levelIt is possible to use external or other interrupts and read the value of the counter during these eventsThe hardware-level event catching is meant to run independently form the main program and time relatively short (or frequentevents.+Events erfassen und die Zeit registrieren die es brauchte damit das Event auftrat kann auf Software Level abgehandelt werdenEs ist möglich einen externen oder andere Interrupts zu nutzen und den Wert des Counters während des Events auszulesenDas Erfassen auf Hardwarelevel wird genutzt um unabhängig vom Hauptprogramm zu arbeiten und sehr kurze (oder häufigeEvents zu timen. 
  
-===== Signal generating =====+===== Taktsignal generieren =====
  
-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 unitThe 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 runningAn 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 registerAt this moment a pin can either be set high or low or inversedThe signal is generated by changes in the value of the output pin.+Komplexere Counter können ein Taktsignal generierenzusätzlich zum Timen eines SignalsDafür hat der Counter eine "Output Compare Unit" und eine "Compare Match Output Unit"Die Output-Compare-Unit hat Register mit der gleichen Bit-Weite wie der Counter und die Werte dieser Register werden mit den Werten des Counters verglichen während dieser läuft. 
 +Ein Interrupt kann generiert werden und spezielle Pin Werte können geändert werden wenn der Counter Wert gleich der des Compare Unit Registers istIn diesem Moment kann ein Pin entweder High oder low gesetzt oder invertiert werdenDas Signal wird durch Änderungen im Wert des Output-Pins generiert.
  
-In some signal generating modesthe counter's maximum value can be alteredThe 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 thata counter can be configured to a mode where it works with both incrementing and decrementing.+In einigen Signal-generierenden Modikann der maximale Wert des Counters verändert werden. 
 +Die physikalische Größe bleibt die gleicheaber ein Vergleichsregister wird benutzt um den Counter bei einem bestimmten Wert zu resetten. 
 +Das vorherige Beispiel kann auch mit dieser Methode gelöst werdenaber die Funktion ist eher für das Ändern der Periode des Signals gedachtZusätzlich kann ein Counter so eingestellt werdendass er mit auf- oder absteigenden Werten arbeitet.
  
-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 would be a huge waste of time and typically there is no need to know everything in order to use themThe following describes one of the most common PWM signals in roboticsThe rest can be read from the AVR documentation.+Der Counter und die Signal-generierenden Modi die diese nutzten sind einer der komplexesten Peripheriemodule in einem AVR. Über jeden hier zu schreiben würde eine große Zeitverschwendung sein, normalerweise gibt es keinen Grund alles zu wissen, um sie zu nutzenDer folgende Absatz beschreibt einer der üblichen PWM Signale in den RoboticsDer Rest kann den AVR Dokumentationen entnommen werden.
  
 ==== Pulse Width Modulation ==== ==== Pulse Width Modulation ====
  
-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 examplethe servo motors known from modeling use a PWM signal of 50 Hz and have a high half-period of to 2 ms.+Pulsweitenmodulation (PWM) ist ein Typ eines Signalswo die Frequenz und die Periode(normalerweisekonstant sindaber die Länge der Halb-Periode ändert sich. PWM Signale werden benutzt um elektromechanischeoptische und andere Geräte zu kontrollieren. 
 +Zum Beispielein Servomotor nutzt ein ein 50Hz PWM Signal und haben einen hohe Halbperiode von 2 ms.
  
 <box 100% round #EEEEEE|Example> <box 100% round #EEEEEE|Example>
  
-Taskusing 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.+AufgabeGeneriere mit einem 8Mhz ATmega128, zwei Geschwindigkeits-regulierende Servomotor SignaleNutze Pin PB5 (OC1A) um eine Pulsweite von 1ms zu generieren und Pin PB6 (OC1B) um eine Pulsweite von 2ms zu generieren.
  
 <code c> <code c>
de/avr/timers.1280168157.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