Forum: Mikrocontroller und Digitale Elektronik IDLE-Modus trotz Timer1-Overflow-Interrupt?


von The SphereX (Gast)


Lesenswert?

Hi Leute !!!

In meinem Programm ist durch den Timer1 eine Uhr integriert, die während 
der gesamten Programmlaufzeit im Hintergrund mitläuft.

-------------------------------------
....

Config Timer1 = Timer , Prescale = 64
On Timer1 Uhrzeit
Enable Timer1
Enable Interrupts
Start Timer1

.....

Uhrzeit:
Incr Timer_counter
If Timer_counter = 2 Then
  Timer_counter = 0
  Incr Sekunde
  If Sekunde = 60 Then
    Sekunde = 0
    Incr Minute
    If Minute = 60 Then
      Minute = 0
      Incr Stunde
      If Stunde = 24 Then Stunde = 0
    End If
  End If
End If
Return

-------------------------------------

Nun wird der ATTiny45 an einer bestimmten Programmstelle in den 
IDLE-Modus vesetzt, der ausschließlich durch das Betätigen eines Tasters 
an PortB.2 wieder beendet werden soll. Die Uhr soll währenddessen aber 
weiterlaufen, was ja im IDLE-Modus möglich ist.

-----------------------
....

Config Int0 = Low Level
On Int0 Wakeup
Enable Int0

....

Wakeup:
return

-----------------------

Das funktioniert aber leider nicht, da der IDLE-Modus ja sofort wieder 
durch den Overflow-Interrupt vom Timer1 beendet wird.

Gibt es evtl. eine Möglichkeit festzulegen, welche Interrupts den 
jeweiligen Sleep-Modus, also in meinem Fall den IDLE-Modus, beenden 
dürfen? Oder anders ausgedrückt, kann ich den Timer1-Overflow-Interrupt 
als Trigger für das Beenden des IDLE-Modus irgendwie "verbieten"?

Grüße,
The SphereX

von Bastler (Gast)


Lesenswert?

Der "bestimmte Programmteil", der für IDLE sorgt, wird nach einem INT 
einfach fortgesetzt. Wenn die Uhr weiterlaufen soll, dann darf man ihr 
nicht DIN INT verbieten, sondern das Sleep muß in einer Schleife 
passieren, solange die "Sleep-Bedingung" erfüllt ist. Also z.B. Immer, 
falls alle Funktion in den Interrupt-Routinen steckt.

von The SphereX (Gast)


Lesenswert?

D. h. ich muß den µC nach jedem Timer1-Overflow, also jede 500 ms, 
wieder in den IDLE-Modus versetzen, bis der Taster gedrückt wurde? Also 
anstatt einfach nur:

Config Powermode = Idle

das Ganze z. B. so aufbauen?

While Taster = 1
  Config Powermode = Idle
Wend


Grüße,
The SphereX

von Bastler (Gast)


Lesenswert?

Wenn "Config Powermode=IDLE" das Äquivalent zu SLeep(); ist, dann ja.
Ich bin halt mehr ein C-Fan und damit BASCOM-hater.
Die CPU wird per Sleep Befehl angehalten und wacht beim ersten INT 
wieder auf. Je nach Sleepmode nicht bei jedem, aber im IDLE-Mode schon. 
Danach geht's einfach nach dem Sleep weiter. In der BASCOM-Watte 
verpackt ist das vielleicht nicht so gut zu erkennen.
Hab grad bei Dr. Gugl gesehen, das macht auch Sleep. Es ist also nicht 
nur Config, sondern richtig Äkschen.

von The SphereX (Gast)


Lesenswert?

Ich hab's gerade mal probiert. Funktioniert tatsächlich so :-)

Dann DANKE für den Hinweis, auch wenn dieser von einem BASCOM-Hater 
kommt ;-)

Grüße,
The SphereX

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.