Hallo! Ich habe irgendwie einen Knoten in meinen Gedanken. Ich möchte ein Batterie betriebenen Logger machen der Schalt-Ereignisse loggt. (d.h. die steigende und fallende Flanken von einem Taster) Das soll er in einem 2sekunden Zyklus machen in der Zwischenzeit hätte ich den Controller per IDLE oder POWERDOWN Befehl "schlafen lassen. Um die Flanken erkennen zu können muss ich mir den Zustand vom vorherigen Durchgang merken. Jetzt scheint es aber so als ob er sich die Variable im IDLE/POWERDOWN nicht merkt :-( Muss ich jetzt jedes mal in den EEProm speichern? Das wären bei einem 2sekunden Zyklus eine menge Schreibvorgänge in den EEProm, die ich aber gerne vermeiden möchte. Gibt es andere idle Modes? bzw. kann ich manuell diverse Peripherie vom µControler abschalten, d.h. alles bis auf das merken von Variablen? Wäre wirklich sehr sehr dankbar wenn mir da jemand weiterhelfen könnte! Vielen lieben Dank im Voraus! Hannes
Hannes schrieb: > Wäre wirklich sehr sehr dankbar wenn mir da jemand weiterhelfen könnte! sicher das der µC keine reboot macht? Denn Variablen bleiben in jedem Modus erhalten!
Vielen lieben Dank für deine Antwort, ich habe es gleich getestet und er scheint wirklich einen Reset zu machen. Werde gleich mal meine Schaltung prüfen.
Also wo der Reset herkommt glaube ich jetzt zu wissen: Ich verabschiede den Conroller per: Start Watchdog Idle in den Ruhemodus, der Watchdog löst einen Reset aus und weckt den Controller wieder auf. Gibt es eine andere Möglichkeit aus dem IDLE/POWERDOWM aufzuwachen? Danke & LG Hannes
Hannes schrieb: > Gibt es eine andere Möglichkeit aus dem IDLE/POWERDOWM aufzuwachen? externen Interrupt. Auch kann man den Watchdog umschaltet, damit er keinen reset macht. alles das steht im Datenblatt vom µC.
Ich habe hier einen ATMEGA16L wenn ich das richtig verstanden habe, ist es möglich per TIMER2 aufzuwecken ... leider bis jetzt noch ohne Erfolg :-/ LG Hannes
> ...leider bis jetzt noch ohne Erfolg
Es ist auch nicht ganz trivial, denn der Timer2 muss asynchron laufen,
mit einem 32 KiHz Quarz an TOSC1&2.
Andererseits: vielleicht gibt es schon etwas Fertiges in Bascom, dazu
kann ich nichts sagen bzw. beitragen.
bei mir geht das so: <code> $regfile = "attiny13a.dat" $framesize = 14 : $swstack = 10 : $hwstack = 14 $crystal = 1200000 ' internal clock 9,6 Mhz divide by 8 '----------------------------------------------------------------- 'outputs LED Led Alias Portb.2 Config Led = Output 'inputs Taste Taste1 Alias Pinb.1 : Config Taste1 = Input Config Pinb.0 = Input : Config Pinb.3 = Input : Config Pinb.4 = Input 'INT0 will be the wake-up source for Powerdown Mode On Int0 Wake_up_isr Config Int0 = Low Level 'Config Int0 = Rising Enable Int0 '--------------------------------------------------------------------- ' Variablen '--------------------------------------------------------------------- Dim Wakeup As Bit , I As Word 'Byte '--------------------------------------------------------------------- ' MAIN '---------------------------------------------------------------------'i ntern. Pullup to HI Set Portb.0 : Set Portb.1 : Set Portb.3 : Set Portb.4 Didr0 = Bits(ain1d , Ain0d) 'Disable digital input buffer on the AIN1/0 pin Stop Ac 'Switch off the power to the Analog Comparator Reset Acsr.acbg 'Disable Analog Comparator Bandgap Select Stop Adc 'Switch off ADC Wakeup = 0 Enable Interrupts 'Main loop Do Enable Int0 Config Powermode = Powerdown If Wakeup = 1 Then Disable Int0 For I = 1 To 3600 Set Led : Waitms 20 'Short flash Reset Led : Waitms 1480 Next I Wakeup = 0 End If Loop </code> 'Int0 Interruptservice Routine Wake_up_isr: Wakeup = 1 Return die quelle kenne ich nicht mehr.... cu pie
Vielen lieben Dank für die guten Tipps und Hinweise: Ich denke jetzt gibt es für mich jetzt zwei Möglichkeiten. 1. Ich versuche das Aufwecken mittels Timer und externen Takt an TOSC1&2 Nachteil: ich müsste meine Schaltung umbauen. 2. Ich wechsle den Controller auf einen ATMEGA164 aus. Der hört auf jeden Eingang mit einem Interrupt (das wäre für mich praktisch denn ich möchte 8 Eingänge loggen/überwachen), lt. meiner Recherche erkennt der Interrupt auch einen PIN change. d.h. der Interrupt weckt den Controller bei einer steigenden und einer fallenden Flanke auf. Der Controller müsste nicht Zyklisch geweckt werden sondern wirklich nur dann wenn sich an den Eingängen etwas tut. Das würde glaub ich auch meine Batterielaufzeit erheblich verbessern. Fazit: Ich werde mir mal den MEGA164p besorgen und danach weiter berichten. Vielen Dank! Hannes
Du könntest auch mit je einer Diode von den Eingängen, wo die Taster angeschlossen sind zu dem Pin gehen, der einen externen Interrupt erlaubt. (Kann jetzt nicht suchen, welcher das bei Atmega 16 ist) Dann würde bei jedem Tastendruck der Interrupt ausgelöst und macht den Kontroller wieder munter. MfG Paul
An das hatte ich noch gar nicht gedacht, aber leider geht das bei mir nicht. Anfangs hatte ich geschrieben das ich Taster abfagen will ... leider stimmt das nicht ganz. Es sind Schalter angeschlossen die verschiedene Zustände haben können. Die Dioden-Lösung funktioniert da leider nicht. Sobald einer davon geschalten ist. Blockiert dieser die anderen. So wird dann leider der Interrupt nicht mehr ausgelöst, wenn ein anderer Schalter betätigt wird. LG Hannes
> Nachteil: ich müsste meine Schaltung umbauen Nur, wenn PC6&7 bereits anderweitig verwendet werden; sonst kann man einen kleinen Uhrenquarz normalerweise immer irgendwie dranlöten. > Der Controller müsste nicht Zyklisch geweckt werden... Es wird kein Zeitstempel benötigt?
- Leider hab ich PC6&7 schon anderweitig in Verwendung. - Zeitstempel hole ich mir von einer I2C-RTC (DS1307). LG
Hi Wenn der WDT ausgelöst hat, ist dieser Zustand doch auslesbar?!? So muß doch nur am Anfang des Programm nachgeschaut werden, ob wir einen Start-Up machen, oder 'nur' aufgeweckt wurden. Bei WDT Sprung zur Logger-Routine, den WTD zurück setzen und wieder schlafen legen. Bei Start-Up eben die ganz normale Initialisierung - eben auch mit dem Vorbeireiten der Variablen. Sollte beim ATtiny45 im Register MCUSR (MCU Status Register) das Bit WDRF (Watchdog Reset Flag) sein - denke doch, Ähnliches gibt es auch im ATmega ... und sollte sich auch außerhalb Assembler auslesen lassen ;) MfG
Also ich benutze z.B. einen ATTiny44, den ich alle paar Sekunden zum Messen aufwecke und dann wieder Schlafen lege, die Variablen bleiben alle da: Config Watchdog = 4096 Wdtcsr.wdie = 1 Enable Wdt
Uwe D. schrieb: > Wdtcsr.wdie = 1 Diesen Befehl kennt glaub ich der MEGA16L nicht. Er meckert beim compilieren. Wenn ich das mit einem anderen Controller versuche z.Bsp. "m48def.dat" dann funktioniert das compilieren. LG Hannes
Außerdem benötigt der Watchdog Strom im zweistelligen µA-Bereich, wohingegen der avisierte ATmega164 mit seinem Pin-change-Interrupt unter einem µA liegt.
Hallo Hannes, ja, das ist abhängig vom MC - aber alle neueren Typen können sehr wohl den Prozessor per Interrupt mit Hilfe des WD aufwecken. Der "Befehl" setzt nur das Bit in dem Register WDTCSR. Der angesprochene ATMega16L besitzt das Bit im WD Control Register nicht. Das ist halt der Nachteil der älteren Modelle. Uwe
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.