AVR Timer Prescaler Reihe?

Gast #4751833
Lesenswert?

Hallo,

die AVR Reihe hat für die Timer die Prescaler Bits CSx2..CSx0. Je nach 
Timer und Model entsprechen die Werte der Reihe nach entweder der Reihe 
1, 8, 32, 64, 128, 256, 1024 oder der Reihe 1, 8, 64, 256, 1024. Ich 
kann keinen festen Zusammenhang zwischen Timernummer und der verwendeten 
Reihe sehen; Timer 2 hat z.B. beim Mega128 und Mega2560 unterschiedliche 
Reihen. Ich möchte aber den Prescaler in einem Define bestimmen und muss 
daher die richtige Reihe wissen wenn die Timernummer gegeben ist. Gibt 
es irgendein Symbol oder ähnliches, an dem die richtige Reihe 
ersichtlich ist?

Stefan
Gast #4751843
Lesenswert?

Stefan,

dein Grundannahme ist schon Falsch.

Es gibt noch weiterer Prescaler für die unterschiedlichen TimerX.

Also muss man für jede AVR µC Familie die Prescaler TimerX-Zuordnung 
getrennt aufstellen.

Ich mache das schon lange so und kann damit dann einen passenden 
Prescaler für z.B. den CTC- oder TOV-Modus berechnen lassen.
Gast #4752206
Lesenswert?

Guten Morgen Stefan,

schau Dir bitte die Familie der attiny85/tn25/tn45, die Familie 
attiny841/tn441 und die Familie attiny861/tn461/tn261 an.

Insbesondere muss ich bei meinen Anwendungen auch immer die 
Zählerbreite, d.h. 8, 10 oder 16Bit oder was auch immer gültig ist 
beachten.

Bei Atmel kann man sich alle Datenblätter zu allen Atmel AVR µC der 8Bit 
Generation ansehen:

http://www.atmel.com/products/microcontrollers/avr/megaavr.aspx

http://www.atmel.com/products/microcontrollers/avr/tinyavr.aspx
Gast #4752207
Lesenswert?

Danke Jörg,

es scheint dass man am Vorhandensein des ASx Bits feststellen kann 
welche Reihe verwendet wird.
1
#ifdef AS2
2
  #define PRESCALER_ROW 2
3
#else
4
  #define PRESCALER_ROW 1
5
#endif

Jetzt muss ich nur noch eroieren ob sich das, wenn die Timernummer 
vorher definiert wird, noch allgemeiner schreiben lässt, etwa
1
#define TIMERNUM 2
2
ifdef MEIN_AS_MACRO(TIMERNUM)
3
...

Gibt es sowas?

Stefan
Gast #4752218
Lesenswert?

Man kann auch die möglichen Prescaler zur Laufzeit ermitteln indem man 
den Timer gegen einen delay_ laufen lässt. Ist fcpu unabhängig.
Ob man das auch so machen will, ist jedem selbst überlassen.
Moderator Persönliche Seite #4752274
Lesenswert?

Stefan schrieb:

> es scheint dass man am Vorhandensein des ASx Bits feststellen kann
> welche Reihe verwendet wird.

Jein.  Das Bit kann auch AS0 heißen, wenn es (wie beim ATmega128)
der Timer 0 ist, der die erweiterte Prescaler-Reihe hat.  Außerdem
hat nur der Timer mit den Asynchronfähigkeiten die erweiterte
Reihe, die anderen im gleichen Controller haben sie nicht.
Moderator Persönliche Seite #4754781
Lesenswert?

Kurzer Check in der avr-libc:
1
$ grep ' CS[0-4]3' include/avr/io*
2
include/avr/iom16u4.h:#define CS43 3
3
include/avr/iom32u4.h:#define CS43 3
4
include/avr/iotn15.h:#define CS13       3
5
include/avr/iotn261a.h:#define CS13 3
6
include/avr/iotn26.h:#define CS13    3
7
include/avr/iotn461a.h:#define CS13 3
8
include/avr/iotn861a.h:#define CS13 3
9
include/avr/iotnx5.h:#define CS13    3
10
include/avr/iotnx61.h:#define CS13    3

Also ATmega16U4/32U4, ATtiny15/25/45/85, ATtiny461A/861A und
ATtiny261/461/861 (einschließlich der A-Derivate).  Schau dir die
Datenblätter mal an, ob sie das alle gleichermaßen behandeln,
insbesondere hier die beiden U4-Atmegas im Vergleich zu den Tinys.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren