Forum: Mikrocontroller und Digitale Elektronik Bascom - Powermode IDLE merkt sich keine Variablen


von Hannes (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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!

von Hannes (Gast)


Lesenswert?

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.

von Hannes (Gast)


Lesenswert?

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

von Peter II (Gast)


Lesenswert?

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.

von Hannes (Gast)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

> ...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.

von pie (Gast)


Lesenswert?

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

von Hannes (Gast)


Lesenswert?

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

von Paul B. (paul_baumann)


Lesenswert?

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

von Hannes (Gast)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

> 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?

von Hannes (Gast)


Lesenswert?

- Leider hab ich PC6&7 schon anderweitig in Verwendung.

- Zeitstempel hole ich mir von einer I2C-RTC (DS1307).

LG

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

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

von Uwe D. (monkye)


Lesenswert?

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

von Hannes (Gast)


Lesenswert?

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

von S. Landolt (Gast)


Lesenswert?

Außerdem benötigt der Watchdog Strom im zweistelligen µA-Bereich, 
wohingegen der avisierte ATmega164 mit seinem Pin-change-Interrupt unter 
einem µA liegt.

von Uwe D. (monkye)


Lesenswert?

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
Noch kein Account? Hier anmelden.