www.mikrocontroller.net

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


Autor: Winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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
-------

Autor: Winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ???

Autor: Denis Gérard (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
vieleicht läuft der stack iregendwann über

Autor: Tobi (Gast)
Datum:

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

Autor: Winne (Gast)
Datum:

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

Autor: Bernd Schmidt (Gast)
Datum:

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

Bernd

Autor: Winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ?

Autor: Tobi (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Uwe Nagel (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.
???

Autor: HansHans (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Winne (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.