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]
David ... schrieb: > Der AVR mag aber keine Taktumschaltung zur Laufzeit. Warum nicht? Man darf den Takt sogar abschalten (min Oszillator Frequenz ist 0 Hz).
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.'
Hm, nicht ganz das Feedback, was ich erhofft habe - was fehlt meiner Frage fuer ne Antwort? ;)
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
@ sascha-w: das heisst ja man kann aus dem rfm auslesen welche frequenz er ausgibt?
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
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.
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
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 :)
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...
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?
vielleicht musst du mal an deiner Spannungsversorgung ansetzen. Ansonsten kannst du höchstens noch einen IC zur Spannungsüberwachung einbauen, der mit seinem Freigabesignal dann die Versorung des RFM einschaltet. Wird aber sicher nicht kleiner als ein Quarz am AVR. Sascha
Sascha Weber schrieb: > vielleicht musst du mal an deiner Spannungsversorgung ansetzen. Hm. Die Pufferelkos scheinen nötig, um die Spannung glatt genug zu halten. Sascha Weber schrieb: > Wird aber sicher nicht kleiner als ein Quarz am AVR. Und gewiss nicht unkomplizierter ;-)
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.