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!
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.
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
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.
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.
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?
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.
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
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?
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).
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?
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.