Ich wollte mal testen den ATmega mittels Powerdown in den Ruhemodus
und mittels Int0 wieder aufzuwecken. Soweit funktioniert auch alles
aber nach ca 2-3 Std reagiert das Programm nicht mehr.
Könnte sich das mal einer ansehen ? Wo ist da der Bug ?
$lib "mcsbyte.lbx"
$regfile = "m8def.dat"
Config Portc = Output
Config Pind.2 = Input
Config Rc5 = Pind.2
Config Timer1 = Timer , Prescale = 256
Const Timer_start = 1562
Load Timer1 , Timer_start
Config Int0 = Low Level
Enable Timer1
Enable Interrupts
On Timer1 Int_1
On Int0 Int_0
Dim Address As Byte , Command As Byte
Dim Takt As Byte, Led(3) As Byte, Nr As Byte
Led(1) = &B00000001
Led(2) = &B00000010
Led(3) = &B00000100
Nr = 1
Do
Getrc5(address , Command)
Command = Command And &B01111111
If Address = 5 And Command = 53 Then
If Nr < 3 Then Incr Nr Else Nr = 1
Portc = Led(nr)
Takt = 0
Waitms 500
End If
If Takt >= 150 Then 'nach 15 Sekunden
Portc = &B00000111
Disable Timer1
Enable Int0 'Int0 aktivieren zum aufwecken
Powerdown '*** Sleepmodus ***
End If
Loop
'*******************************************************************
Int_1:
Load Timer1 , Timer_start
Incr Takt
Return
Int_0:
Enable Timer1
Disable Int0 'Int0 sperren, da nur zum aufwecken
Waitms 100
Return
End
Wird die erste If-Schleife durch das else geschlossen? Ich denke du
meinst das so:
--------------
Do
Getrc5(address , Command)
Command = Command And &B01111111
If Address = 5 And Command = 53 Then
If Nr < 3 Then
Incr Nr
Else
Nr = 1
Endif
Portc = Led(nr)
Takt = 0
Waitms 500
End If
If Takt >= 150 Then 'nach 15 Sekunden
Portc = &B00000111
Disable Timer1
Enable Int0 'Int0 aktivieren zum aufwecken
Powerdown '*** Sleepmodus ***
End If
Loop
-------
Hallo Werner, es ist in Bascom möglich, if ... then Anweisungen in 1
Zeile zu schreiben, welche dann nicht mit End If abgeschlossen werden
müssen.
Mein Problem liegt wahrscheinlich woanders.
Ich habe mal reproduzierbare Versuche wegen dem Abstürzen des
Programmes unternommen. Vorraussetzung ist ein Neustart.
Wenn ich dann innnerhalb 1-2 Std mittels Int0 den Prozessor mehrfach
aufwecke, funktioniert das problemlos, aber dann irgendwann reagiert
das Programm nicht mehr.
Wenn ich aber den Prozessor nach einem Neustart nicht aufwecke,
reagiert das Programm auch nach 24 Std noch. Dann aber wieder nach 2-3
Std das gleiche Problem.
Ich denke, es hängt irgendwie mit dem Int0 zusammen, habe aber keine
Ahnung warum ???
Hallo Bernd, habe STCHECK gerade mal im Simulator getestet, aber ERROR
ist immer "0".
Kann ich das nicht hardwaremäßig austesten, zumal das ja erst nach
Stunden auftritt ?
...
If Takt >= 150 Then 'nach 15 Sekunden
Portc = &B00000000 'alle LED's aus
Disable Timer1
Enable Int0 'Int0 aktivieren zum aufwecken
Gosub Test
Powerdown '*** Sleepmodus ***
End If
... als letzte Zeilen im Programm ...
Test:
STCHECK
If ERROR > 0 Then Led(Error) 'dann LED1 , 2 oder 3 an
Return
Oder ist es dann schon zu spät, um noch irgendetwas auszuwerten ?
man könnte doch wenn man ein lcd dran hat, zyklisch den wert vom
stackpointer ausgeben lassen um zu schaun, ob der immer weiter steigt.
ohne lcd könnte man eine feste grenze einbauen, ab der ein ausgang
geschaltet wird wenn der sp diese überschreitet
Die Idee mit dem SP finde ich gut, aber wo in etwa ist die Grenze, die
nicht überschritten werden soll?
Und wenn ich dann feststelle der SP läuft über, wie kann ich das
verhindern?
aber der Prozessor schläft doch...
Warum sollte während des Schlafens der SP überlaufen ?
Oder schläft er garnicht?
Wie macht BASCOM das mit dem RC5-Empfang, wohl irgendwie im Hintergrund
über einen Interrupt? Weckt der die CPU gleich wieder auf?
Ausserdem ist an dem Programm doch nichts zu sehen, was irgendwelche
Leichen auf dem Stack zurücklassen könnte.
???
Hallo,
auf Compiler / Chip -
Einstellungen achten und nicht zu wenig Speicher reservieren
sonst bekommst du die selben Probleme wie ich Sie auch schon hatte ...
ich habe gute Erfarungen mit :
HW Stack 64
Soft Stack 16
Framesize 32
und einfach mal erhöhen wenn es problemme ohne erklärung
gibt
Hallo Uwe,
>aber der Prozessor schläft doch...>Warum sollte während des Schlafens der SP überlaufen ?>Oder schläft er garnicht?
Doch tut er, habe ich überprüft. Der SP läuft nicht während des
schlafens über, sondern irgendwann anders. (siehe oben 2.Beitrag von
mir)
>Wie macht BASCOM das mit dem RC5-Empfang, wohl irgendwie im>Hintergrund>über einen Interrupt? Weckt der die CPU gleich wieder auf?
Über die RC5 Routine gibt es nur sehr wenig Hintergrundinfo in Bascom.
Es wird nur der Timer0 benutzt. Sodaß ich zum aufwecken den ext. Int0
zusätzlich einschalte, sonst funzt es nicht. Die Pulse der RC5 sind
lang genug, um ihn über LOW LEVEL INT aufzuwecken.
Hallo HansHans,
>HW Stack 64>Soft Stack 16>Framesize 32
Das finde ich ein wenig übertrieben, werde es aber trotzdem mal
probieren. Habe eben meine Int Routinen nochmal überarbeitet, gehe
jetzt mit NOSAVE hinein und sichere nur benutzte Register. Mal sehen,
ob das was bringt.