Forum: HF, Funk und Felder Taktung des ATmega128rfa1


von Chris p. C. (sharth)


Lesenswert?

Hallo zusammen,

ich habe ich ein proprietäres ZigBee-Modul auf dem der ATmega128rfa1 
verbaut ist. Außerdem ist ein externer 16MHz Oszillator vorhanden.
Mir ist aber nicht ganz klar welche Taktreferenz für welche Funktion 
gebraucht wird.
Zunächst verstehe ich das Datenblatt so, dass der Transceiver einen 16 
MHz Oszillator  benötigt. Weiterhin ist auf Seite 147 im Datenblatt ein 
32kHz Oszillator als Referenz an den Anschlüssen TOSC1 und TOSC2 
vorgesehen, der für die Timer genutzt wird. Dieser fehlt auf meinem 
Board.
Besitzt der ATmega128rfa einen internen 32 kHz Oszillator, der die MCU 
taktet? ODer kann die MCU auch mit dem 16 MHz Oszillator getaktet 
werden. Verstehe das Datenblatt an dieser Stelle nicht. Hinzu kommen 
noch Angaben wie 128 kHz für den Watchdog und Calibrated Oszillator (16 
MHz). Je mehr ich im Datenblatt lese desto weniger verstehe ich.

Hintergrund des ganzen ist, dass ich eine Anwendung habe, für die ich 
ein Takt von 8 MHz benötige. Aber wie komme ich auf diese 8MHz.

Vielen Dank schonmal für eure Hilfe!

: Verschoben durch Moderator
von Timmo H. (masterfx)


Lesenswert?

Der 32 kHz Oszillator am TOSC1 brauchst du nur wenn du den Timer 
asynchron Takten willst, also z.B. für eine Echtzeituhr (oder auch für 
den Symbol Counter). Dann könnte man den Atmega immer schlafen lassen 
und er wird kurz beim Timerüberlauf aus dem Sleep-Mode aufgeweckt.
Für dich wird wohl erstmal der 16 MHz an XTAL reichen.
Auf Seite 147 sind ja eigentlich alle Pfade genau aufzeigt. Da kannst du 
ja schon sehen was du brauchst und was nicht.

von Chris p. C. (sharth)


Lesenswert?

Timmo H. schrieb:
> Für dich wird wohl erstmal der 16 MHz an XTAL reichen.

Ich möchte eine Anwendung aus der Atmel Bitcloud verwenden, die mit 8 
MHz betrieben werden soll. Die Beispiele sind auf das Atmel Board 
Atmega128rfa1-EK1 angepasst, das fast identisch zu dem von mir 
verwendeten Board ist. Lediglich der 32 kHz Oszillator fehlt bei mir. 
Nun weiß ich aber nicht wie ich mit 16 MHz und CKDIV8 auf 8 MHz kommen 
soll.

Gruß,
sharth

von Timmo H. (masterfx)


Lesenswert?

Chris p. Chicken schrieb:
> Nun weiß ich aber nicht wie ich mit 16 MHz und CKDIV8 auf 8 MHz kommen
> soll.
>
> Gruß,
> sharth
Mit CKDIV8 kommst du höchstens auf 2 MHz, denn wie der Name schon sagt 
teilt der den Takt durch 8. 16/8 = 2.
Wenn CKDIV8 gesetzt ist wird das CLKPS-Register beim Start auf "0011" 
gesetzt, was in einem Teiler von 8 Resultiert. Wenn du 8 MHz haben 
willst, dann musst du den Teiler eben auf "0001" stellen. Das passiert 
dann aber in der Firmware und nicht per FUSE-Bits (siehe S. 155)
Das machst du am besten mit der Library-Funktion "clock_prescale_set" 
(avr/power.h).
Bedenke, dass die Funktionen wie "_delay_ms" etc. sich auf F_CPU 
beziehen, darum solltest du die CLKPS so früh wie möglich richtig 
einstellen und die F_CPU auf 8MHz setzen, sonst sind deine Wartezyklen 
erstmal doppelt so schnell.

von Chris p. C. (sharth)


Lesenswert?

Das mit den Clock Prescaler Select Bits wusste ich nicht.
Werde das jetzt mal testen.
Danke für die schnelle Hilfe!

von Timmo H. (masterfx)


Lesenswert?

Chris p. Chicken schrieb:
> Das mit den Clock Prescaler Select Bits wusste ich nicht.
Stand ja auch 7 Seiten weiter, also woher hättest du das wissen sollen 
;-) Zumindest das ganz Kapitel sollte man lesen um auch die 
Zusammenhänge zu verstehen.

von Roland H. (batchman)


Lesenswert?

Chris p. Chicken schrieb:
> ich habe ich ein proprietäres ZigBee-Modul auf dem der ATmega128rfa1
> verbaut ist.

Etwas off-topic, aber: Um welches Modul handelt es sich?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Chris p. Chicken schrieb:

> ich habe ich ein proprietäres ZigBee-Modul auf dem der ATmega128rfa1
> verbaut ist. Außerdem ist ein externer 16MHz Oszillator vorhanden.

Wirklich?

Das würde mich wundern.  Vermutlich meinst du, dass ein externer
Quarz von 16 MHz verbaut worden ist; der Oszillator dafür ist
intern.

> Mir ist aber nicht ganz klar welche Taktreferenz für welche Funktion
> gebraucht wird.

Kurz:

. 16 MHz vom Quarz für den Transceiver
. irgendwas für die CPU; kann entweder vom 16-MHz-Quarz des
  Transceivers (per Fuse-Einstellung) abgelitten werden (dann kann
  dieser aber erst abgeschaltet werden, wenn sich sowohl Transceiver
  als auch CPU schlafen legen), kann aber auch vom internen
  16-MHz-RC-Oszillator abgelitten werden; jeweils mit Prescaler zwischen
  1 und 256 (bzw. 512 beim RC-Oszillator)
. 32 kHz optional für den MAC Symbol Counter und (bei Bedarf) Timer/
  Counter 2

> Weiterhin ist auf Seite 147 im Datenblatt ein
> 32kHz Oszillator als Referenz an den Anschlüssen TOSC1 und TOSC2
> vorgesehen, der für die Timer genutzt wird. Dieser fehlt auf meinem
> Board.

Billiges Design.  Wer macht denn sowas?  Damit musst du dir andere
Wege suchen, falls der Controller von selbst zeitgesteuert aus dem
Sleep aufwachen soll.  Außerdem funktioniert dann der automatische
Rückfall des MAC Symbol Counters auf die 32-kHz-Taktquelle natürlich
nicht mehr.

> Besitzt der ATmega128rfa einen internen 32 kHz Oszillator, der die MCU
> taktet?

Oszillator ja, "internen Quarz" nein.  Die 32 kHz ließen sich auch
nicht als CPU-Takt benutzen.  (Der 128-kHz-Oszillator des Watchdogs
ließe sich per Fuse als CPU-Takt benutzen, aber viel Sinn hat das
nicht.)

Der interne RC-Oszillator des ATmega128RFA1 ist etwas `special': er
läuft (anders als beim "Schwester-AVR" ATmega1281) nicht nur mit 8,
sondern mit 16 MHz.  Allerdings sind die clock-prescaler-Werte so
gelegt, dass sie kompatibel zum ATmega1281 arbeiten, d. h. es ist
normalerweise noch ein zusätzlicher 1:2-Vorteiler drin.  Den kann man
nur ausschalten, indem man das Vorteilerregister auf 15 setzt.  Das
ist ein Wert, den es beim ATmega1281 nicht gab, und auch beim
ATmega128RFA1 ist dieser Wert nur bei Benutzung des RC-Oszillators
gültig.

> Hintergrund des ganzen ist, dass ich eine Anwendung habe, für die ich
> ein Takt von 8 MHz benötige. Aber wie komme ich auf diese 8MHz.

Bitcloud kann nicht mit 16 MHz arbeiten?  Schade.  Der Controller
schafft das ja bis 1,8 V herunter.

Wenn du im Auslieferungszustand nur die anfangs gesetzte CKDIV8-Fuse
löschst, dann läuft dein ATmega128RFA1 bereits mit 8 MHz, sofern
niemand was am clock prescaler rumfummelt.  Ob Bitcloud sowas macht,
müsstest du in deren Doku bzw. in den öffentlich zugänglichen Teilen
des Sourcecodes nachlesen.  Gleichfalls müsstest du checken, ob der
Betrieb ohne angeschlossenen 32-kHz-Quarz von Bitcloud auch wirklich
unterstützt ist.  Kann gut sein, dass sie sich entweder auf einen
funktionierenden Timer/Counter 2 mit 32 kHz oder auf den automatischen
Rückfall des MAC Symbol Counters auf die 32-kHz-Ebene verlassen, wenn
sie den Controller schlafen legen.

Als Sleeptimer kann man ersatzsweise den Watchdog benutzen (im
Interrupt-Modus), aber das ist ein wenig tricky.  Wenn du damit nicht
klarkommst, schreib' mir mal 'ne Mail.

von Chris p. C. (sharth)


Lesenswert?

Hallo Jörg,

danke für die umfangreiche Antwort. Jetzt ist mir der Zusammenhang 
endlich klar geworden.

Jörg Wunsch schrieb:
> Als Sleeptimer kann man ersatzsweise den Watchdog benutzen

Die Sleeping-Funktion ist mir zunächst gar nicht so wichtig, da zunächst 
primär die Netzwerkfunktionen getestet werden sollen.

Jörg Wunsch schrieb:
> gleichfalls müsstest du checken, ob der
> Betrieb ohne angeschlossenen 32-kHz-Quarz von Bitcloud auch wirklich
> unterstützt ist.

Die Bitcloud verlangt tatsächlich einen 32 kHz-Quarz, um alle Funktionen 
bereitstellen zu können. Daher muss ich noch einen Weg finden um das 
Board nachzurüsten.

Gruß,
sharth

von Roland H. (batchman)


Lesenswert?

Ich habe ein Dresden Elektronik deRFmega128 22A00. In den FAQs bei 
http://www.dresden-elektronik.de/shop/cont12.html#91007 steht, Zitat:
1
Es stehen zwei unterschiedliche Quarzoszillatoren zu Takterzeugung zur Verfügung:
2
    * 16 MHz Quarz (an XTAL1 und XTAL2)
3
    * 32,768 kHZ Quarz (an TOSC1 und TOSC2)

Momentan setze ich CLKPS auf 0, d. h. beim internen RC 8 MHz. Das passt 
soweit.

Im Handbuch 
http://www.dresden-elektronik.de/shop/media/products/0583009001314272922.4_eng.pdf 
steht auf Seite 28, Zitat:
1
For using the external 32.768kHz oscillator clock, the fuse „SUT_CKSEL‟ have to be changed to „Ext. Clock‟

Das verwirrt mich etwas. Wie kann man den ext. Quarz an XTAL verwenden? 
Ist das der "Transceiver-Quarz"?

Jörg Wunsch schrieb:
> Den [Vorteiler] kann man
> nur ausschalten, indem man das Vorteilerregister auf 15 setzt.  Das
> ist ein Wert, den es beim ATmega1281 nicht gab, und auch beim
> ATmega128RFA1 ist dieser Wert nur bei Benutzung des RC-Oszillators
> gültig.

Da steht ein Zusatz im Datenblatt: "Division factor 1 only permitted for 
RC-Oscillator. Flash and EEPROM programming is not allowed."

Was bedeuten die beiden letzten Einschränkungen? Internes EEPROM kann 
gelesen, aber nicht geschrieben werden? Wofür wäre die mit Flash 
relevant, etwa für einen boot loader?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Roland H. schrieb:

(Es ist unfair, anderer Leute Threads zu kapern für seine eigenen
Dinge.)

> Im Handbuch ...

> Das verwirrt mich etwas.

Mich auch.  Da musst du Dresden Elektronik mal fragen, denn den
Schaltplan kennen nur sie.

Ich kann mir aber, ehrlich gesagt, auch nicht vorstellen, warum
man die CPU mit 32 kHz takten soll.  Das ist ja schnarchlangsam.
Normalerweise ist es sinnvoller, die CPU mit hoher Geschwindigkeit
ihre Arbeit tun zu lassen und danach schlafen zu legen.

> Wie kann man den ext. Quarz an XTAL verwenden?
> Ist das der "Transceiver-Quarz"?

Das wären die Optionen weiter unten im Bild, aber nicht die dort
gezeigt mit dem "external clock".

> Da steht ein Zusatz im Datenblatt: "Division factor 1 only permitted for
> RC-Oscillator. Flash and EEPROM programming is not allowed."
>
> Was bedeuten die beiden letzten Einschränkungen? Internes EEPROM kann
> gelesen, aber nicht geschrieben werden? Wofür wäre die mit Flash
> relevant, etwa für einen boot loader?

Ja, zum Beispiel.  Der SPM-Befehl muss im Bootloaderbereich liegen,
aber man kann natürlich auch Daten im Flash ablegen damit.

Warum das aber für 16 MHz RC-Oszillator nicht zulässig ist, ist mir
auch gerade nicht klar (zumal es keine derartige Einschränkung für
den Betrieb mit 16 MHz Quarztakt gibt).

von Chris p. C. (sharth)


Lesenswert?

Wenn ich den 16 MHz Quarz als Taktquelle für sowohl Transmitter als auch 
Controller nutzen wollte, könnte ich die Sleep-Funktionen nicht nutzen, 
da der Transmitter dann nicht in den Schlafzustand versetzt werden kann, 
richtig?

Falls also der interne RC Oszillator (8 MHz) für die Taktung des 
Controllers verwendet wird, wie kann ich dann sicherstellen, dass USART 
auch bei höheren Baudraten noch zuverlässig funktioniert. Wird der 
interne OSC. durch die externe Taktquelle (16 MHz) kalibriert, falls 
eine vorhanden ist?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Chris p. Chicken schrieb:
> Wenn ich den 16 MHz Quarz als Taktquelle für sowohl Transmitter als auch
> Controller nutzen wollte, könnte ich die Sleep-Funktionen nicht nutzen,
> da der Transmitter dann nicht in den Schlafzustand versetzt werden kann,
> richtig?

Jein.  Schlafenlegen kannst du die Teile schon einzeln, aber der
Quarzoszillator läuft halt dann, sobald entweder der Transceiver
oder die CPU ihren Takt braucht.

Dabei solltest du zusätzlich berücksichtigen, dass Quarzoszillatoren
langsam im Anschwingen sind: während dieser Zeit brauchen sie bereits
Strom, aber die CPU kann noch nicht arbeiten, da der Takt noch nicht
stabil ist.

> Falls also der interne RC Oszillator (8 MHz) für die Taktung des
> Controllers verwendet wird, wie kann ich dann sicherstellen, dass USART
> auch bei höheren Baudraten noch zuverlässig funktioniert.

Ob die Baudrate hoch oder niedrig ist, ist völlig schnuppe.
Entscheidend ist nur, dass die Toleranz von ±2 % nicht überschritten
wird.  Bei einer Taktfrequenz von 8 MHz gibt es aber Baudraten, die
schon einen hohen "natürlichen" Fehler haben und dadurch anfälliger
gegen Frequenzänderungen sind.  Dem kann man aber begegnen, indem man
den RC-Oszillator von 16 MHz auf 14,75 MHz herunterzieht (eine der
bekannten "baudratenfreundlichen Frequenzen").

> Wird der
> interne OSC. durch die externe Taktquelle (16 MHz) kalibriert, falls
> eine vorhanden ist?

Die Hardware kalibriert da nichts, die lädt nur den OSCCAL-Wert aus
der entsprechenden Fuse rein.  Software kann ihn aber kalibrieren,
sowohl gegen den 32-kHz-Oszillator ist denkbar, als auch (via MAC
Symbol Counter) gegen den 16-MHz-Oszillator.

Inwiefern Bitcloud sowas bereits tut, müsstest du in deren Doku
nachlesen.

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
Noch kein Account? Hier anmelden.