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
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.
Hallo Karl, welche Prescaler gibt es denn noch? Und was genau bedeutet hier "Familie"? Stefan
Stefan schrieb: > Ich kann keinen festen Zusammenhang zwischen Timernummer und der > verwendeten Reihe sehen Der Zusammenhang ist, dass der Timer, der als RTC dienen kann (also asynchron durch den externen 32768-Hz-Quarz getaktet werden kann) die umfangreicheren Prescaler besitzt. Bei den ganz alten AVRs war das Timer 0, später dann Timer 2.
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
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
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.
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.
Ja genau, ich meinte pro Timer prüfen ob dieser ein ASx Bit hat, dann müsste es passen. Stefan
Stefan schrieb: > Ja genau, ich meinte pro Timer prüfen ob dieser ein ASx Bit hat, dann > müsste es passen. Nein, nicht immer. Beim Timer 0 des Attiny25/45/85 würde es auch passen. Bei dessen Timer 1 geht es mit 4 CS-Bits in Zweierpotenzschritten bis 16384.
Oh jeh :-( gut, dann muss man auch noch prüfen ob es ein CS3 Bit gibt...
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.
:
Bearbeitet durch Moderator
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.