PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Anfänger braucht Hilfe



harry2212
13.03.2008, 23:17
Hallo an Alle erstmal, ich hätte eine Frage an die Speziallisten in diesem Forum. Zunächst zum Hintergrund. Ich habe einen quasi Software PWM zusammengebaut mit Bascom 8051 und auf einem AT89S8252 mit dem flashboard von Elektor laufen. Das Programm läuft auch sehr gut. Die Zeiten sind über Tasten einzustellen. Die Zeiten sind zum teil sehr lang. Z.B. Arbeitszeit 2 Min Pausenzeit 5 Min, können aber auch viel länger sein.
Das Problem ist nun, daß das Programm irgendwann, meist erst nach Stunden , sporadisch stehenbleibt. Ich habe es schon mit watchdog probiert, ist aber nicht die richtige Lösung. Denn zum Beginn des Programms muß der User die Zeiten eingeben. Also geht das Programm nach einem reset in die Sub für die Eingabe der Zeiten.
Nun die Frage. Ist es möglich nach einem watchdog reset eine bestimmte Stelle des Programms anzuspringen?
Vorab schon vielen Dank für Eure Hilfe.
Gruß, Harald

Sauerbruch
15.03.2008, 09:57
Vielleicht gäbe es doch eine Watchdog-Lösung, wenn Du ein Bit als Flag benutzt, das nach erfolgter Eingabe der Zeiten auf 1 gesetzt wird. Dann müsstest Du zum Programmstart nur abfragen ob das Bit 1 ist und das Programm in diesem Fall an die gewünschte Stelle springen lassen, ansonsten geht´s zur Zeiteingabe weiter

Aber dass das Programm stehenbleibt ist ja schon irgendwie merkwürdig. Gibt´s dafür denn eine plausible Ursache?

harry2212
15.03.2008, 11:42
Hallo erst mal,
danke für Deine schnelle Antwort. Also ich habe das schon probiert indem ich eine If Anweisung an den Anfang des Programms gestellt habe. Falls verschiedene Variablen nicht -0- sind soll das Programm quasi dort hinspringen wo es unterbrochen hat. Allerdings ohne Erfolg.
Das komische ist, ich habe das Programm nun längere Zeit beobachtet, dass das Programm immer an der gleichen Stelle stehenbleibt. Obwohl es sich um zwei gleiche Schleifen handelt bleibt es in der ersten hängen. Aber wie gesagt erst nach einiger Zeit. Ich habe mal den betreffenden Code als Textdatei angehängt. Störe Dich bitte nicht um diesen Spagetti code, ist alles noch im Aufbau.
Nochmals Danke, dass Du Dir die Zeit nimmst.
Gruß, Harald

harry2212
15.03.2008, 11:45
Sorry, hab vergessen die Datei anzuhängen.

Sauerbruch
15.03.2008, 18:54
hmm.. das sieht aber nicht wie original Bascom aus. Oft steckt der Fehler in ganz blöden, klitzekleinen details - deshalb wäre es hilfreich, wenn Du den Code absolut 1:1 reinstellst, genau so wie Du ihn kompilieren lässt.

Am besten geht das mit dem "Code"-Button (rechts neben der Horde Smilies), dann sieht das nämlich für alle so hübsch aus:



Code...
Code...
Code...

Also - lass mal alles sehen, vielleicht findet sich ja dann des Lösels Rätsung :-)

harry2212
15.03.2008, 20:33
Hallo,
wie meinst Du das. Den Code als bas Datei?
Also es ist Code geschrieben in Bascom 8051 nicht Bascom AVR. Da gibt es einige kleine Unterschiede.
Also wie gesagt beim Controller handelt es sich um einen 8051er Kern.
Nochmals schau bitte nicht so genau auf die Struktur, wenn ich fertig bin bringe ich das Ganze in die richtige Form.
Gruß, Harald

harry2212
15.03.2008, 20:45
Ach sooo, so funktioniert das. Sorry ich mußte erst einmal ausprobieren wie das geht. Ich hoffe so ist es o.k.


'Tasten Aufwärts und Abwärts

$regfile = "89s8252.dat"
Config Lcd = 20 * 4
$lcd = &H8000
$lcdrs = &H8002
'$Sim
Cls Lcd
Cursor Off Noblink




Dim A As Integer 'Variable A = Arbeitszeit
Dim E As Byte 'Variable zum ein und ausschalten Hindergrundbeleuchtung, LED Anzeige und Relai
Dim D As Byte 'Varible D wird P1 für LED's
Dim N As Integer 'Varible N = Counter
Dim P As Integer 'Varible P = Pausenzeit
Dim Ba As Integer 'Variable für Basis PWM
Declare Sub Auf(a As Integer)
Declare Sub Aufb(a As Integer)
Config Watchdog = 2048

E = 255
P3 = E
D = 255
P1 = D
A = 0



If Ba > 0 And A > 0 Then Goto Ausgabe

While 1 = 1
While P1.4 = 0 '
Call Aufb()
Cls Lcd
Locate 1 , 1
Lcd "Basiszeit"
Locate 1 , 12
Lcd Ba
Wend

While P1.5 = 0 '
Call Abb()
Cls Lcd
Locate 1 , 1
Lcd "Basiszeit"
Locate 1 , 12
Lcd Ba
Wend

While P1.0 = 0 '
Call Auf()
Cls Lcd
Locate 1 , 1
Lcd "Arbeitszeit"
Locate 1 , 13
Lcd A

Wend

While P1.1 = 0 '
Call Ab()
Cls Lcd
Locate 1 , 1
Lcd "Arbeitszeit"
Locate 1 , 13
Lcd A
Wend
If P1.2 = 0 Then Gosub Ausgabe 'Nach Eingabe der Zeiten springe zu Ausgabe
Wend



Ausgabe:
For N = A Downto 1
'Start Watchdog
P3.0 = 0 'Einschalten der Anzeige LED
P3.2 = 0 'Einschalten des Relais
Stop Watchdog
Wait 1 'Warte eine Sekunde
Start Watchdog
Cls Lcd
Locate 1 , 1
Lcd "Sollarbeit" 'Also genau hier bleibt das Programm stehen. Der Text Sollarbeit wird noch angezeigt
Delay
Locate 1 , 13
Lcd A
Locate 3 , 1
Lcd "Arbeit"
Locate 3 , 11
'Reset Watchdog
Lcd N
If P1.3 = 0 Then Goto Abbruch ' Ist Taste an P1.3 gedrückt wird die Ausgabe abgebrochen

Next N

P = Ba - A 'Hier wird die Pausenzeit aus Basisizeit und Arbeitszeit gebildet

For N = P Downto 1
'Start Watchdog
P3.0 = 1 'Ausschalten der Anzeige LED
P3.2 = 1 'Ausschalten des Relais
Stop Watchdog
Wait 1
Cls Lcd
Locate 1 , 1
Lcd "Sollpause"
Locate 1 , 13
Lcd P
Locate 3 , 1
Lcd "Pause"
Locate 3 , 11
Lcd N
If P1.3 = 0 Then Goto Abbruch
Next N
If A <> 0 Then Gosub Ausgabe 'Endlosschleife für Ausgabe zum verlassen muß die Taste P1.3 gedrückt werden '

Return


Sub Aufb()
'If Ba = 600 Then Goto Fertigb
'If Ba > A Then Goto Fertigb
Incr Ba 'Aufwärtszählen der Basiszeit
Waitms 500
P3.1 = 0
Fertigb:
End Sub

Sub Abb()
'If A = 0 Then Goto Endeb
Decr Ba 'Abwärtszählen der Basiszeit
Waitms 500
Endeb:
End Sub


Sub Auf()
'If A > Ba Then Goto Fertig
Incr A 'Aufwärtszählen der Arbeitszeit
Waitms 500
Fertig:
End Sub

Sub Ab()
If A = 0 Then Goto Ende 'Abbruchbedingung dass bis 0 und nicht bis minus abwärts gezählt wird
Decr A 'Abwärtszählen der Arbeitszeit
Waitms 500
Ende:
End Sub


Abbruch:
Do
Cls Lcd
Locate 1 , 1
Lcd "Abbruch"
Wait 1
Cls Lcd
P3.0 = 1
P3.1 = 1
P3.2 = 1
Loop Until P1.4 = 0
Return

Vieleicht kannst Du mir auch etwas feedback geben, ob ich mit dem programmieren auf der richtigen Spur bin. Das ist mein erstes Projekt in Bascom.
Gruß, Harald
Was ich noch vergessen habe, nicht stören an den auskommentierten Stellen, die sind noch zum testen. Auch den Watchdog habe ich normalerweise nicht aktiviert.

Sauerbruch
15.03.2008, 21:23
Also, mit 8051 und dem dazugehörigen bascom kenne ich mich so gar nicht aus. Und mit Gosubs nur wenig, habe ich bisher praktisch nie benutzt. Ich habe mich aber auch bei weitem noch nicht durch alles durchgearbeitet, was Bascom zu bieten hat. Es gibt also noch viel zu entdecken :-)

Ich glaube aber, dass bei jedem Gosub neue Werte in den Stack geschrieben werden (man möge mich bitte verbessern, senn dem nicht so ist). Und das könnte Dein Problem sein, weil Du mit der Zeile


If A <> 0 Then Gosub Ausgabe

aus der Gosub-Routine in die gleiche Routine springst, und dadurch ständig neue Daten in den Stack dazukommen, ohne dass die vorhergehenden abgearbeitet und gelöscht werden. Das soll irgendwann zum Stack-Overflow führen - und dann bleibt das Ding stehen.

Probier´s doch mal mit ´nem GOTO...

Dirk
16.03.2008, 09:07
Ja, ich denke auch, dass die Zeile:
If A <> 0 Then Gosub Ausgabe
... einen Stacküberlauf produziert.

Auch die Zeile:
If Ba > 0 And A > 0 Then Goto Ausgabe
... ist nicht ok.

Regel:
Ein Unterprogramm, das mit Return endet, darf nur mit Gosub aufgerufen werden. Der Gosub-Aufruf muss auch von außerhalb des Unterprogramms kommen.

Gruß Dirk

harry2212
16.03.2008, 18:19
hey =P~
es funzt, danke Mann. Deine Vermutung war absolut richtig. Jetzt funktioniert das Programm wunderbar. Habe es die ganze Nacht durchlaufen lassen.
Jetzt kann ich endlich weitermachen.
War wahrscheinlich ein absoluter Anfänger Fehler.
Jetzt müßt Ihr mich nur noch aufklären, was steckt hinter den Mechanismen von Goto vs. Gosub. damit mir das nicht wieder passiert.
In diesem Sinne also vielen Dank.
Gruß, Harald

for_ro
16.03.2008, 19:33
Der Unterschied ist eigentlich ganz einfach.

GOTO ist eine Synonym für:
höre-hier-auf-und-mache-stattdessen-an-einer-anderen-Stelle-im-Programm-weiter

während GOSUB eine Abkürzung ist für:
merke-dir-diese-Stelle-unterbreche-dann-mache-woanders-weiter-und-wenn-du-fertig-bist-(Return)-komme-hierhin-zurück

Klar?
Das merke-dir-diese-Stelle war dein Problem.

Gruß

Rolf

harry2212
17.03.2008, 08:13
Ist gespeichert !
Danke nochmals für Eure Hilfe.
Gruß, Harald