Bascom - Powermode IDLE merkt sich keine Variablen

Gast #4922552
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
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.
Gast
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
> ...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
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
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
Gast
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
> 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?
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
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 9 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.