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.