Forum: Mikrocontroller und Digitale Elektronik Brauche Hilfe, Programm hängt nach ca 2-3 Std


von Winne (Gast)


Lesenswert?

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

von Werner (Gast)


Lesenswert?

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
-------

von Winne (Gast)


Lesenswert?

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 ???

von Denis Gérard (Gast)


Lesenswert?

vieleicht läuft der stack iregendwann über

von Tobi (Gast)


Lesenswert?

hatte ich auch gedacht aber sollte ein hochsprachencompiler nicht auf so
was aufpassen?

von Winne (Gast)


Lesenswert?

In dieser Richtung habe ich auch die Vermutung. Wie kann man das im
laufenden Betrieb überprüfen?

von Bernd Schmidt (Gast)


Lesenswert?

Bascom prüft beim compilieren nicht den Stack. Es gibt aber "STCHECK"
zum überprüfen wenn das Programm läuft.

Bernd

von Winne (Gast)


Lesenswert?

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 ?

von Tobi (Gast)


Lesenswert?

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

von Winne (Gast)


Lesenswert?

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?

von Uwe Nagel (Gast)


Lesenswert?

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.
???

von HansHans (Gast)


Lesenswert?

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

von Winne (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.