This shows you the differences between two versions of the page.
| Next revision | Previous revision | ||
| de:avr:timers [2010/07/26 18:15] – angelegt Wember | de:avr:timers [2020/07/20 09:00] (current) – external edit 127.0.0.1 | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| ====== Counters/ | ====== Counters/ | ||
| - | 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 | + | 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 |
| 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, | + | Um einen präzisen Intervall zwischen den Interrupts zu verwirklichen, |
| </ | </ | ||
| - | ==== External clock counter | + | ==== Externer Taktgeber |
| - | It is also possible to use an external clock source as a counter' | + | Es ist auch möglich einen externen Taktgeber als das Taktsignals eines Counters zu nutzen. |
| + | Der AVR hat einen Pin "Tn" dafür. Das n 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 operations, more complex | + | Da die Counter zeitlich abgestimmte Operationen ermöglichen, haben komplexe |
| + | Der Teil des Counter heißt "Input Capture Unit". Es gibt eine Auswahl zwischen zwei Ereignissen: | ||
| <box 100% round # | <box 100% round # | ||
| - | Task: Measure the frequency of an external 122 Hz - 100 kHz logical square signal using an 8 MHz ATmega128. | + | Aufgabe: Miss die Frequenz eines Externen 122Hz - 100kHz logischen Rechtecksignals mit einem 8MHz ATmega128. |
| <code c> | <code c> | ||
| Line 68: | Line 71: | ||
| unsigned long frequency; | unsigned long frequency; | ||
| - | // Interrupt | + | // Interrupt |
| 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' | + | // 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, | + | // 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; | ||
| } | } | ||
| </ | </ | ||
| - | The program fires an interrupt each time a rising front occurs in the external signal. During the interrupt, the counter is checked for overflows | + | Das Programm löst jedes mal bei einer " |
| + | Während des Interrupts, überprüft das Programm den Counter auf einen Overflow | ||
| </ | </ | ||
| - | 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 form the main program and time relatively short (or frequent) events. | + | Events erfassen und die Zeit registrieren die es brauchte damit das Event auftrat kann auf Software Level abgehandelt werden. Es ist möglich einen externen oder andere Interrupts zu nutzen und den Wert des Counters während des Events auszulesen. Das Erfassen auf Hardwarelevel wird genutzt um unabhängig vom Hauptprogramm zu arbeiten und sehr kurze (oder häufige) Events zu timen. |
| - | ===== Signal generating | + | ===== Taktsignal generieren |
| - | More complex counters can generate a signal, in addition to timing the length of one. For 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' | + | Komplexere Counter können ein Taktsignal generieren, zusätzlich zum Timen eines Signals. Dafür hat der Counter eine " |
| + | Ein Interrupt kann generiert werden und spezielle Pin Werte können geändert werden wenn der Counter Wert gleich der des Compare Unit Registers ist. In diesem Moment kann ein Pin entweder High oder low gesetzt oder invertiert werden. Das Signal wird durch Änderungen im Wert des Output-Pins generiert. | ||
| - | In some signal generating modes, the counter' | + | In einigen Signal-generierenden Modi, kann der maximale Wert des Counters verändert werden. |
| + | Die physikalische Größe bleibt die gleiche, aber ein Vergleichsregister wird benutzt um den Counter bei einem bestimmten Wert zu resetten. | ||
| + | Das vorherige Beispiel kann auch mit dieser Methode gelöst werden, aber die Funktion ist eher für das Ändern der Periode des Signals gedacht. Zusätzlich kann ein Counter so eingestellt werden, dass er mit auf- oder absteigenden Werten arbeitet. | ||
| - | The counters and the signal generating modes using them are one of the most complex peripheral modules | + | Der Counter und die Signal-generierenden Modi die diese nutzten sind einer der komplexesten Peripheriemodule |
| ==== Pulse Width Modulation ==== | ==== Pulse Width Modulation ==== | ||
| - | Pulse width modulation | + | Pulsweitenmodulation |
| + | Zum Beispiel, ein Servomotor nutzt ein ein 50Hz PWM Signal und haben einen hohe Halbperiode von 1 - 2 ms. | ||
| <box 100% round # | <box 100% round # | ||
| - | Task: using an 8MHz ATmega128, | + | Aufgabe: Generiere mit einem 8Mhz ATmega128, |
| <code c> | <code c> | ||