RFM12 als umschaltbare AVR-Taktquelle?

OP #2637113
Lesenswert?

Der RFM12 kann einen AVR mit Takt versorgen. Der AVR mag aber keine 
Taktumschaltung zur Laufzeit. Der Watchdogtimer hat nen eigenen 
Oszillator, sollte davon also nicht betroffen sein. Ist also folgendes 
Pseudoprogramm moeglich oder ueberseh ich was?

-Watchdog abschalten
-1-bit-Flag einlesen (zB ein geladener Kondensator an einem Pin)
-Wenn Flag high, dann ist die Frequenz vom RFM12 umgeschaltet - Flag low 
setzen, mainloop
-Wenn Flag low, ist die Frequenz noch auf 1MHz - Flag high setzen, 
Watchdog mit passender Zeit scharfschalten, Kommando an RFM12 
rausschreiben, die Frequenz auf 10MHz zu setzen [Frequenz aendert sich, 
AVR kommt aus dem Tritt oder auch nicht, Watchdog schlaegt zu, AVR wird 
resettet]

[mainloop]
OP #2637133
Lesenswert?

Werner schrieb:
> David ... schrieb:
>> Der AVR mag aber keine Taktumschaltung zur Laufzeit.
> Warum nicht? Man darf den Takt sogar abschalten (min Oszillator Frequenz
> ist 0 Hz).

http://www.atmel.com/Images/doc2545.pdf
'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.'
#2637451
Lesenswert?

deinen Kondensator kannst du dir sparen.

Man könnte es so machen ...

            SYS-RESET   <--------------------------
                |                                  |
CLOCK-EINSTELLUNG aus RFM auslesen                 |
                |                                  |
          CLOCK=10MHz ??  [JA] -> Hauptprogramm    |
                |                                  |
              [NEIN]                               |
                |                                  |
       Watchdog aktivieren                         |
                |                                  |
       RFM_SET-CLOCK 10MHz                         |
                |                                  |
           AVR in SLEEP                            |
                |                                  |
     Watchdog löst Reset aus  ---------------------


Sascha
#2637575
Lesenswert?

ok, da war ich wohl etwas zu voreilig, bei der RFM12 kann man doch nicht 
aller Register lesen. Das geht erst bei den neueren (RFM22 z.B.).

Man könnte aber den Watchdog aktivieren, und die 10MHz Einstellung 
senden, sollt er hängenbleiben, dann erfolgt ein Reset, aber beim 
erneuten senden der 10MHz Einstellung passiert ja nicht's, da er ja dann 
schon die 10MHz ausgibt.

Sascha
OP #2637808
Lesenswert?

Sascha Weber schrieb:
> ok, da war ich wohl etwas zu voreilig, bei der RFM12 kann man doch nicht
> aller Register lesen. Das geht erst bei den neueren (RFM22 z.B.).
>
> Man könnte aber den Watchdog aktivieren, und die 10MHz Einstellung
> senden, sollt er hängenbleiben, dann erfolgt ein Reset, aber beim
> erneuten senden der 10MHz Einstellung passiert ja nicht's, da er ja dann
> schon die 10MHz ausgibt.

Ja, das war auch mein Stand, dass man die Register nicht lesen kann. 
Trotzdem danke fuer deine Muehe mit dem Diagramm, Sascha :)
Ich wuerde gerne den Reset erzwingen. Wenn ich die Frequenz so massiv 
umschalte, bewege ich mich auf jeden Fall weit ausserhalb der Specs, 
also wird resettet ;)
Nehmen wir mal an, dass ich ein Flag habe, was ich setzen kann (sei es 
der genannte Kondensator, ein Wert im EEPROM etc) - spricht sonst was 
gegen die Loesung?
Wenn keine weiteren Einwaende kommen, werde ich dann mal pruefen, wie 
schnell der RFM die neue Frequenz stabil hat und ob der Watchdog ne 
passende Zeit dafuer hat usw - waer auf jeden Fall elegant, auf den 2. 
Quarz versichten zu koennen.
#2639054
Lesenswert?

David ... schrieb:
> Ja, das war auch mein Stand, dass man die Register nicht lesen kann.
> Trotzdem danke fuer deine Muehe mit dem Diagramm, Sascha :)
> Ich wuerde gerne den Reset erzwingen. Wenn ich die Frequenz so massiv
> umschalte, bewege ich mich auf jeden Fall weit ausserhalb der Specs,
> also wird resettet ;)
> Nehmen wir mal an, dass ich ein Flag habe, was ich setzen kann (sei es
> der genannte Kondensator, ein Wert im EEPROM etc) - spricht sonst was
> gegen die Loesung?
EEProm würd' ich nicht nehmen - der lässt nur eine Begrenze Anzahl an 
Schreibzyklen zu

du könntest - wie in meinem Ursprünglichen Vorschlag nach dem Umschalten 
durch Sleep den Watchdogreset auslösen lassen. Im MCUCSR kann man 
ablesen was den Reset ausgelöst hat - wars der Watchdog, dann ist die 
Frequenz auf 10MHz und das Hauptprogramm kann starten.

            POWER-ON
    (MCUCSR=0x01) [PowerOnReset]
               \/
            SYS-RESET   <-------------------------------
                |                                       |
     WDRF im MCUCSR gesetzt ??  [JA] -> Hauptprogramm   |
                |                                       |
              [NEIN]                                    |
                |                                       |
       Watchdog aktivieren                              |
                |                                       |
       RFM_SET-CLOCK 10MHz                              |
                |                                       |
           AVR in SLEEP                                 |
                |                                       |
     Watchdog löst Reset aus  --------------------------

Sascha
OP #2639057
Lesenswert?

Sascha Weber schrieb:

> EEProm würd' ich nicht nehmen - der lässt nur eine Begrenze Anzahl an
> Schreibzyklen zu

Das ist mir bewusst, man muesste die Abnutzung ueber alle Zellen 
verteilen - bei ansonsten unbenutztem EEPROM wuerde es recht lange 
dauern, bis es kaputt waer ;)

> du könntest - wie in meinem Ursprünglichen Vorschlag nach dem Umschalten
> durch Sleep den Watchdogreset auslösen lassen. Im MCUCSR kann man
> ablesen was den Reset ausgelöst hat - wars der Watchdog, dann ist die
> Frequenz auf 10MHz und das Hauptprogramm kann starten.


Gute Idee, das verfolg ich mal weiter :)
Gast #2639301
Lesenswert?

Möglich müsste auch sein, die Taktfrequenz über einen Timer gegen die 
Frequenz des Watchdog-Timers zu messen, da ja der Watchdog einen eigenen 
Oszillator hat.


Also beim Start:

Frequenz messen, wenn klein genug:
Auf 10 MHz umschalten und Watchdog-Reset auslösen.

Beim nächsten Start wird dann die höhere Frequenz erkannt und der uC 
startet normal.

Die Frequenzmessung ist zwar nicht besonders genau, aber um zu erkennen, 
ob 1 oder 10MHz reichts allemal...
Persönliche Seite #2642345
Lesenswert?

Scheinbar muss man das RFM12 komplett spannungslos schalten, damit es 
ordentlich "kaltstartet" und funktioniert; dazu versorgt man es aus 
einem Port-Pin und schaltet diesen erst nach einer Sekunde oder so nach 
dem Power-On auf 'High'. Sonst scheinen winzige Restladungen in 
Pufferelkos oder andere mysteriöse Effekte manchmal das Modul davon 
abzuhalten, etwas sinnvolles zu tun... Dummerweise generiert es im 
spannungslosen Zustand kein Clock-Signal. Gibts da einen kreativen 
Lösungsvorschlag?

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