Forum: HF, Funk und Felder Atmel RZ Raven - Frequenzumschaltung CLKM


von Thomas (Gast)


Lesenswert?

Hallo,
ich beschäftige mich gerade mit dem RZ Raven. Dieser Kit benutzt den 
AT86RF230 (TRX) und den ATmega1284P (µC). Bei dem µC besteht die 
Möglichkeit, dass er duch das CLKM-Signal, das der TRX ausgibt, seinen 
Takt erhält. Dieses CLKM Signal kann durch programmieren unterschiedlich 
geteilt werden. Jetzt habe ich mir mal das Datenblatt des µC 
durchgelesen, dort steht geschrieben:

"When applying an external clock, it is required to avoid sudden changes 
in the applied clock frequency to ensure stable operation of the MCU. A 
variation in frequency of more than 2% from one clock cycle to the next 
can lead to unpredictable behavior. If changes of more than 2% is 
required, ensure that the MCU is kept in Reset during the changes."
Wie soll man denn den MCU im Reset halten?

Ebenso gibt es auch ein Problem wenn man den TRX in den Sleep Mode 
bringt, dann wird das CLKM Signal deaktiviert. Eine Reaktivierung des 
TRX ist aber nur durch ein Signalwechsel an SLP_TR möglich den der µC 
erzeugen soll, aber der µC läuft ja selbst gar nicht, da er kein CLKM 
Signal erhält.

Ich denke, dass man dieses CLKM Signal eigentlich gar nicht gebrauchen 
kann oder hat das schon mal jemand erfolgreich benutzt?

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


Lesenswert?

Thomas schrieb:

> Dieses CLKM Signal kann durch programmieren unterschiedlich
> geteilt werden.

Die reale Möglichkeit dafür wird aber schon dadurch stark
eingeschränkt, dass man im Interesse einer guten HF-Performance
(Vermeidung der Einstreuung von CLKM-Oberwellen in den Empfänger-
eingang) an CLKM ein RC-Filter dran hat.  Wenn das für 1 MHz
dimensioniert ist, kannst du CLKM dann nicht auf 4 MHz hochziehen.

> Wie soll man denn den MCU im Reset halten?

Wird wohl nur mit externer Logik gehen.  Der AT86RF230 hat ja
extra so einen Modus, bei dem die Umschaltung des CLKM erst nach
einem sleep cycle erfolgt, vielleicht könnte man diesen zusammen
mit einem Watchdog-Reset benutzen.  (Eigentlich müsste es auch
funktionieren, wenn man die MCU nur schlafen legt, denn dann ist
ihr der Takt ja auch egal, wird beim Tiefschlaf ja abgeschaltet.
Das geht aber wegen des nächsten Punktes hier ohnehin nicht.)

> Ebenso gibt es auch ein Problem wenn man den TRX in den Sleep Mode
> bringt, dann wird das CLKM Signal deaktiviert. Eine Reaktivierung des
> TRX ist aber nur durch ein Signalwechsel an SLP_TR möglich den der µC
> erzeugen soll, aber der µC läuft ja selbst gar nicht, da er kein CLKM
> Signal erhält.

Mit trickreicher Beschaltung geht das, aber die wurde meines Wissens
auf dem Raven nicht gemacht: wenn man SLP_TR an einen OC2x-Pin legt,
dann kann man den TRX durch einen compare match interrupt des
32-kHz-basierten Timers wieder aufwachen lassen.  Der läuft auch
ohne CPU-Takt weiter.

> Ich denke, dass man dieses CLKM Signal eigentlich gar nicht gebrauchen
> kann oder hat das schon mal jemand erfolgreich benutzt?

Auf dem Raven ist es wahrscheinlich nur nutzbar, wenn man es mit
den standardmäßigen 1 MHz (die ja von Anfang an da sind) benutzt.
Bei einer etwas anderen Beschaltung könnte man auch einen AVR-Timer
damit takten, den AVR selbst dagegen vom RC-Oszillator laufen
lassen.

von Thomas (Gast)


Lesenswert?

Hallo Jörg,
ich habe mir deine Vorschläge mal durchgelesen und mal in den 
Datenblätter nachgelesen. Das mit dem SLP_TR an den OC2x-Pin zu legen 
scheint wirklich eine Möglichkeit zu sein, den CLKM nutzen zu können.

Das mit dem RC-Filter habe ich mir auch mal angeschaut, also im 
Datenblatt vom TRX ist ja eine Apllication Circuit drin. Dort wird der 
Tiefpass mit R2=680 Ohm und C3=2,2pF angegeben und das soll für 1 MHz 
ausgelegt sein.

Mit diesen Werten komme ich auf eine Grenzfrequenz von 106,38 MHz.
Meiner Meinung nach würde dieses Filter auch noch Dicke für CLKM=16MHz 
reichen, oder habe ich jetzt einen Denkfehler.

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


Lesenswert?

Thomas schrieb:

> Mit diesen Werten komme ich auf eine Grenzfrequenz von 106,38 MHz.
> Meiner Meinung nach würde dieses Filter auch noch Dicke für CLKM=16MHz
> reichen, oder habe ich jetzt einen Denkfehler.

Naja, du musst analog denken. ;-)  Der Zweck des Filters ist es
natürlich, die Oberwellen im 2,4-GHz-Bereich hinreichend zu
dämpfen (und zwar, bevor sie an die als Antenne wirkende Leitung
von CLKM zum Controller kommen).  Auch hast du den Einfluss der
Kapazität der Leitung selbst und des Controller-Eingangs nicht
berücksichtigt.

Auch bei einer Frequenz unterhalb der Grenzfrequenz werden jedoch
die Flanken schon verschliffen.  Damit reicht das ankommende Signal
u. U. nicht mehr als sauberer Takt für den AVR aus.  Das Filter auf
dem Raven hat eine etwas höhere Grenzfrequenz (470 Ω und 1,2 pF),
wenn man mal eine Gesamtkapazität von 10 pF annimmt, müsste es wohl
wirklich bis 16 MHz benutzbar sein.

von Thomas (Gast)


Lesenswert?

Die Grenzfrequenz (beim Raven 282,18 MHz; in der Schaltung vom 
Datenblatt 106,38 MHz ) ist minimum ca. 1 Dekade von der Signalfrequenz( 
max. 16 MHz) entfernt, ich denke das dürfte ausreichen, wenn nicht 
könnte man es auch mit 8 MHz probieren und den "Pin-Strom" kann man ja 
auch noch programmieren. Selbst bei deiner Annahme von R=470 Ohm und 10 
pF ergibt sich noch eine Grenzfrequenz von 33,86 MHz.

Jörg, hast Du noch weitere Hard-/ Software "Optimierungs-" Vorschläge 
oder Probleme entdeckt die beim AT86RF230/ AT86RF231 und einem Atmel µC 
auftreten können?

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


Lesenswert?

Thomas schrieb:
> Die Grenzfrequenz (beim Raven 282,18 MHz; in der Schaltung vom
> Datenblatt 106,38 MHz ) ist minimum ca. 1 Dekade von der Signalfrequenz(
> max. 16 MHz) entfernt, ich denke das dürfte ausreichen, wenn nicht
> könnte man es auch mit 8 MHz probieren

16 MHz kannste sowieso knicken, da die hier benutzten AVRs bei >=
2,7 V Versorgungsspannung nur bis 10 MHz spezifiziert sind.

> und den "Pin-Strom" kann man ja
> auch noch programmieren.

Aber nur nach unten, initial dürfte er auf Maximum stehen.

> Jörg, hast Du noch weitere Hard-/ Software "Optimierungs-" Vorschläge
> oder Probleme entdeckt die beim AT86RF230/ AT86RF231 und einem Atmel µC
> auftreten können?

Wenn du den Controller mit CLKM taktest, gibt es eine potenzielle
Deadlock-Gefahr, falls den Controller irgendein Reset außerhalb des
power-on-Resets ereilen kann: dann ,,hebt er die Hufe hoch'', d. h.
alle Pins sind hochohmig.  Wenn der TRX in diesem Moment im TRX_OFF
war und das Pin SLP_TR aus Versehen auf high läuft, dann hast du dich
selbst erschossen.  Gleiches kann dir passieren, wenn du einen Reset
erhälst, während der TRX schlafen war (von dem dich eigentlich der
compare match des timers 2 erlösen sollte, aber der kommt nach dem
Reset natürlich nicht mehr).

Gegen diese Gefahr hilft wohl nur ein Pulldown-Widerstand ans SLP_TR,
der wiederum jedoch zieht permanent Strom, während der TRX schläft.

Am sinnvollsten ist es meiner Meinung nach, den CLKM nur als Referenz-
takt an T1 zu legen und den Timer 1 damit zu takten.  Der Controller
läuft dann vom RC-Oszillator.  Damit hast du eine kürzestmögliche
Startup-Zeit des Controllers, und du kannst den Quarzoszillator des
TRX komplett abschalten, wenn du ihn nicht brauchst.

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


Lesenswert?

Thomas schrieb:

> Wie soll man denn den MCU im Reset halten?

Ein Trick fällt mir dazu noch ein (der allerdings nicht durch das
Datenblatt gedeckt ist).  Meines Wissens resultiert die Bedingung
mit der Änderung <= 2 % aus dem sogenannten "flash sampling" (was
das ist, ist bei der Picopower-Beschreibung kurz erläutert).  Dies
wird bei niedrigen Taktfrequenzen irgendwann aktiviert, um den
Stromverbrauch zu verringern.  Die genaue Frequenz ist nirgends
dokumentiert und sehr wahrscheinlich auch exemplarabhängig.  Was
aber funktionieren müsste, ist dann folgender Fahrplan:

. man aktiviert das flash sampling, indem man mitttels CLKPR eine
  CPU-Frequenz einstellt, die sehr niedrig ist, am besten wirklich
  den Vorteiler auf 256 setzen
. man schaltet die Frequenz von CLKM um; dank des CLKPR befindet
  man sich jetzt immer noch auf einer niedrigen CPU-Frequenz, sodass
  keine Änderung am Status des flash sampling erfolgt (8 MHz / 256 =
  31,25 kHz)
. man schaltet CLKPR wieder auf 1; dabei kann sich nun zwar der
  Status des flash samplings ändern, aber da CLKPR ein definiertes
  Interface ist, bei dem dieses Risiko immer besteht, muss der AVR
  hier Vorkehrungen besitzen, die verhindern, dass beim Umschalten
  Müll aus dem Flash gelesen wird

von Thomas (Gast)


Lesenswert?

Hallo Jörg,
ich hatte nun mal etwas Zeit um über deine Antworten nachzudenken.

Zum Pin-Strom:
Für MISO und IRQ sind 2mA, 4mA, 6mA, 8mA möglich, nach einem Reset sind 
2mA eingestellt.
Für den CLKM sind 2mA, 4mA, 6mA, 8mA möglich, nach einem Reset sind 4mA 
eingestellt.

Auf die Problematik mit dem hochlaufenden SLP_TR Pin bin ich auch schon 
gestoßen. An eine Lösung mit dem Pull-Down hatte ich auch schon gedacht. 
Wenn  man den Pull-Down sehr hochohmig (1 Mega Ohm) wählt, könnte man 
den Strom auf wenige µA drücken.
Auch die Reset-Problematik könnte man damit lösen, indem man den 
RST#-Pin mit einem Pull-Down versieht.

Es gibt noch ein Problem bei einer CLKM-Takt-Versorgung, man kann den 
TRX nicht mit dem RST#-Pin während des Programms resetten, da man sich 
ja dann selbst den Takt abdreht.

Den Sinn, CLKM als Referenz an T1 von Timer1 zu legen sehe ich nicht 
wirklich, hast du eine Beispielsanwendung?

Mir scheint, das sinnvollste ist den TRX mit 16MHz Quarz und den µC mit 
den internen 1MHz/8MHz laufen zulassen und zusätzlich noch einen 
32,768KHz Uhrenquarz für periodisches Aufwachen.

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


Lesenswert?

Thomas schrieb:

> Für den CLKM sind 2mA, 4mA, 6mA, 8mA möglich, nach einem Reset sind 4mA
> eingestellt.

OK, stimmt.

> Es gibt noch ein Problem bei einer CLKM-Takt-Versorgung, man kann den
> TRX nicht mit dem RST#-Pin während des Programms resetten, da man sich
> ja dann selbst den Takt abdreht.

Nö, wenn ich Bild 7-4 im Datenblatt des AT86RF230 richtig deute,
dann ist der Quarzoszillator auch im Reset an.  (Sollte man aber
überprüfen.)  Es gibt aber eigentlich keinen Grund für ein derartiges
Vorgehen.  /RESET des AVR beschaltet man normalerweise nur mit einer
kleinen ESD-Schutzschaltung und führt es zum ISP-Stecker.  Dagegen
sollte man das /RST des '230 auf einen IO-Pin des Controllers führen,
damit man auch im Betrieb ggf. einen Reset auslösen kann (Herstellen
eines definierten Zustands von der Software aus).

> Den Sinn, CLKM als Referenz an T1 von Timer1 zu legen sehe ich nicht
> wirklich, hast du eine Beispielsanwendung?

In dem Falle läuft Timer 1 dann mit einem exakten Takt, der auch
einigermaßen schnell ist, sodass man Zeitgeberfunktionen im
Mikrosekundenbereich damit realisieren kann (das würde mit dem
32-kHz-Timer nicht gehen).  Die anderen Timer kann man ggf. mit
CPU-Takt laufen lassen.  Auch kann man den RC-Oszillator gegen
CLKM kalibrieren auf diese Weise.  (Wenn man einen 32-kHz-Quarz
hat, kann man ihn natürlich auch gegen diesen kalibrieren,
allerdings sollte man berücksichtigen, dass der 32-kHz-Oszillator
eine Anschwingzeit von bis zu 1 s benötigt.)

> Mir scheint, das sinnvollste ist den TRX mit 16MHz Quarz und den µC mit
> den internen 1MHz/8MHz laufen zulassen und zusätzlich noch einen
> 32,768KHz Uhrenquarz für periodisches Aufwachen.

Für Betrieb bis 1,8 V herunter kann man den ATmega1281 aber nur bis
maximal 4 MHz takten.

von Thomas (Gast)


Lesenswert?

Hi Jörg,

du hast recht, der Takt CLKM läuft bei einem Reset weiter. Allerdings 
wird das Register mit dem Teilertakt zurückgesetzt auf 1MHz, so dass bei 
einem nächsten Sleep der TRX dann mit 1MHz läuft sofern man das Register 
nicht mit dem aktuellen Wert beschreibt (Abschnitt 9.6.4 im Datenblatt)

Den /RST an eine I/O-Pin des µC war ja mein gedanke. Wäre dann im 
Betrieb ein Reset des TRX nötig gewesen und der Takt wäre danach weg 
dann wäre man auch in einem Deadlock gewesen, aber das ist ja nicht der 
Fall.

ESD-Schutzbeschaltung? Du meinst einen Widerstand und einen Kondensator 
in Reihe und dazwischen das /RESET Signal für den µC abgreifen.
Irgendwo hab ich auch mal gelesen, dass das gar nicht nötig sei, da das 
intern schon im µC vorhanden sei.

Mit dem 32KHz Quarz denke ich an längere Ruhezeiten die bis in den 
Sekundenbereich gehen können. Mit 32768Hz und einem maximalen Vorteiler 
von 1024 und 8Bit-Timer2 komme ich auf periodische Überlaufzeiten von 8 
Sekunden.

Wenn man den µC bei 1,8V nur bis maximal 4MHz takten kann, kann man dann 
überhaupt den eingebauten 8MHz RC-Takt noch verwenden? Oder muss ich 
dann unbedingt den DIV8-Vorteiler in den FuseBits setzen, dann wäre ich 
wieder bei 1MHz.

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


Lesenswert?

Thomas schrieb:

> ESD-Schutzbeschaltung? Du meinst einen Widerstand und einen Kondensator
> in Reihe und dazwischen das /RESET Signal für den µC abgreifen.

Ja.

> Irgendwo hab ich auch mal gelesen, dass das gar nicht nötig sei, da das
> intern schon im µC vorhanden sei.

Sender Jerewan: ja, aber...  in der Regel hast du /RESET auf den
ISP-Stecker geführt, und dann hast du eine externe Antenne dran.

> Mit dem 32KHz Quarz denke ich an längere Ruhezeiten ...

Schon klar.  Dafür will man den schon haben.

> Wenn man den µC bei 1,8V nur bis maximal 4MHz takten kann, kann man dann
> überhaupt den eingebauten 8MHz RC-Takt noch verwenden?

Nur mit Vorteiler.

> Oder muss ich
> dann unbedingt den DIV8-Vorteiler in den FuseBits setzen, dann wäre ich
> wieder bei 1MHz.

Du musst CKDIV8 setzen, damit du beim Start nicht über der garantiert
nutzbaren Frequenz bist, aber du kannst im Betrieb dann den Prescaler
(CLKPR) auf 1:2 setzen.  Die CKDIV8-Fuse macht ja weiter nichts, als
selbigen auf 1:8 voreinzustellen.

von Thomas (Gast)


Lesenswert?

> Die CKDIV8-Fuse macht ja weiter nichts, als selbigen auf 1:8 voreinzustellen.

Okay, das wusste ich nicht. Ich bin bisher immer davon ausgegangen, dass 
dieser CKDIV8 Vorteiler unabhängig von dem internen Vorteiler ist und 
während des Betriebs nicht geändert werden könnte.

von Thomas (Gast)


Lesenswert?

@Jörg: Was passiert eigentlich mit dem Vorteiler, wenn ich diesen im 
Programm geändert habe und dann plötzlich ein Reset stattfindet? Bleibt 
das CKDIV8-Fuse-Bit gesetzt und der µC startet wieder mit dem gesetzten 
Bit bzw. mit den 1MHz oder bleibt die Vorteilerveränderung erhalten?

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


Lesenswert?

Thomas schrieb:
> @Jörg: Was passiert eigentlich mit dem Vorteiler, wenn ich diesen im
> Programm geändert habe und dann plötzlich ein Reset stattfindet? Bleibt
> das CKDIV8-Fuse-Bit gesetzt und der µC startet wieder mit dem gesetzten
> Bit bzw. mit den 1MHz oder bleibt die Vorteilerveränderung erhalten?

Ja, der sollte mit der CKDIV8-Einstellung wieder starten, zumindest
ist der Reset-Wert des CLKPR-Registers auf diese Weise dokumentiert.

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.