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 ???
hatte ich auch gedacht aber sollte ein hochsprachencompiler nicht auf so was aufpassen?
In dieser Richtung habe ich auch die Vermutung. Wie kann man das im laufenden Betrieb überprüfen?
Bascom prüft beim compilieren nicht den Stack. Es gibt aber "STCHECK" zum überprüfen wenn das Programm läuft. Bernd
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.