Bascom - Powermode IDLE merkt sich keine Variablen

Gast #4922552
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
Gast #4922585
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
Gast #4922637
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.
Gast #4922657
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
Gast #4922839
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
#4922845
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
Gast #4922857
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
Gast #4922862
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?
#4922903
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
#4923398
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

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