PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Timer hängt?



MrPower
10.07.2016, 18:20
Hallo liebe Gemeinde,
habe in VB ein Programm geschrieben das mir die Daten von 10 Textboxen seriell an den MC sendet. Das Programm läuft bis es in die Do-Loop Schleife kommt, dort bleibt es dann hängen.Wenn ich einen Einschaltwert von 0 sende schaltet der entsprechende Ausgang sofort ein, aber nach der angegebenen Einschaltdauer nicht wieder aus. Somit habe ich die Vermutung dass der Timer nicht läuft, aber warum?
Kann mir da jemand weiterhelfen???:confused:
LG MrPower




'(++++++++++++++++++++++++++++++++++++++++++++++++ ++++++++++++++++++
+ Programm zum Steuern von einem Magnetventil im ms-Bereich. +
+ Benutzereingaben über GUI in Visual Basic. Alle Werte, werden +
+ als ein String mit " * " von einander getrennt, eingelesen und +
+ mit dem Split Befehl wieder zerlegt.Mit dem Val Befehl werden +
+ die Teilstrings von Text in Zahlen umgewandelt.
')


$regfile = "m2560def.dat"
$crystal = 16000000
$baud = 2400
$hwstack = 32
$swstack = 10
$framesize = 40


Config Serialin = Buffered , Size = 100






Dim Empfangen As String * 100
Dim Daten_ar(10) As String * 6
Dim Daten As String * 6
Dim Gelesen As Byte , N As Byte , V As Byte , S As Byte
Dim Wert1 As Word , Wert2 As Word , Wert3 As Word , Wert4 As Word , Wert5 As Word , Wert6 As Word
Dim Wert7 As Word , Wert8 As Word , Wert9 As Word , Wert10 As Word , Ms As Word , Wert34 As Word
Dim Wert56 As Word , Wert78 As Word , Wert91 As Word


Config Timer0 = Timer , Prescale = 64
On Timer0 Timer0_isr
Const Timerstartwert = 6
Timer0 = Timerstartwert
Enable Timer0
Enable Interrupts


Config Portb.7 = Output 'OnBoard LED
Config Portc = Output
Kamera Alias Portc.0
Blitz Alias Portc.1
Ventil1 Alias Portc.2
Ventil2 Alias Portc.3
Ventil3 Alias Portc.4


'(Config Porta = Output
Config Lcdpin = Pin , Db4 = Porta.4 , Db5 = Porta.5 , Db6 = Porta.6 , Db7 = Porta.7 , E = Porta.3 , Rs = Porta.2
Config Lcd = 16 * 4
Initlcd
Waitms 200
Cursor Off
Cls
')
'Locate 1 , 1
'Lcd "Warte auf Daten "
Print "Warte auf Daten"
Do
Gelesen = Inkey()
Empfangen = Empfangen + Chr(gelesen)
'Locate 2 , 1
'Lcd Empfangen
Print Empfangen


Loop Until Gelesen = " "
'Wait 5


For V = 1 To 10
N = Split(empfangen , Daten_ar(1) , "*" )
Daten = Daten_ar(v)
Wert1 = Val(daten_ar(1)) 'Anzahl Durchläufe
Wert2 = Val(daten_ar(2)) 'Pause zwischen den Durchläufen
Wert3 = Val(daten_ar(3)) 'Anfang Kameraauslösung
Wert4 = Val(daten_ar(4)) 'Dauer der Kameraauslösung
Wert5 = Val(daten_ar(5)) 'Anfang Blitzauslösung
Wert6 = Val(daten_ar(6)) 'Dauer der Blitzauslösung
Wert7 = Val(daten_ar(7)) 'Anfang erste Ventilöffnung
Wert8 = Val(daten_ar(8)) 'Dauer der ersten Ventilöffnung
Wert9 = Val(daten_ar(9)) 'Anfang zweite Ventilöffnung
Wert10 = Val(daten_ar(10)) 'Dauer der zweiten Ventilöffnung


Next
Waitms 200
Cls


For S = 1 To 10
'Locate 1 , 1
'Lcd "Bin in Schleife "
Print "Bin in der For-Next"
'Wait 5


Do
'Locate 1 , 1
'Lcd "Bin im Do-Loop" ; S
Print "Bin im Do-Loop"
Print "Durchlauf Nr. " ; S
Ms = 0
If Ms = Wert3 Then
Gosub Kamera_ein
End If
Wert34 = Wert3 + Wert4
If Ms = Wert34 Then
Gosub Kamera_aus
End If
If Ms = Wert5 Then
Gosub Blitz_ein
End If
Wert56 = Wert5 + Wert6
If Ms = Wert56 Then
Gosub Blitz_aus
End If
If Ms = Wert7 Then
Gosub Ventil_ein
End If
Wert78 = Wert7 + Wert8
If Ms = Wert78 Then
Gosub Ventil_aus
End If
If Ms = Wert9 Then
Gosub Ventil_ein
End If
Wert91 = Wert9 + Wert10
If Ms = Wert91 Then
Gosub Ventil_aus
End If


Loop Until Ms = 2000


Wait Wert2


Next


End


Timer0_isr:
Timer0 = Timerstartwert
Incr Ms
Return


Kamera_ein:
Set Portc.0
Print "Kamera ein"
Return


Kamera_aus:
Reset Portc.0
Return


Blitz_ein:
Set Portc.1
'Locate 3 , 1
Print "Blitz ein "
Return


Blitz_aus:
Reset Portc.1
Return


Ventil_ein:
Set Portc.2
'Locate 4 , 1
Print "Ventil ein "
Return


Ventil_aus:
Reset Portc.2
ReturnG MrPower

MrPower
13.07.2016, 03:28
An den Armin,
Der Beitrag ist anscheinend im falschen Forum, bitte verschieben oder löschen.
Besten Dank

Feuerring
13.07.2016, 08:36
Timer0_isr:
Timer0 = Timerstartwert
Incr Ms
Return

das der Timer auf Start-Wert gesetzt wird ist bestimmt so in Bascom ... bin noch Bascom Anfänger und habe mich mit Timer in Bascom noch nicht befasst ...

dort soll doch der Wert MS um eins erhöht werden um deine DO/LOOP Schleife nach der Zeit MS=2000 zu beenden ...

in der FOR/NEXT Schleife müsste doch nach der DO/LOOP-Schleife der Wert MS wieder zurückgesetzt werden oder ?! ... kann da aber nichts finden ...

- - - Aktualisiert - - -


Loop Until Ms = 2000

schreib mal Loop Until Ms > 2000

den der Timer läuft doch von Programm Anfang an ... bis es in die DO/LOOP geht ist der Wert MS doch schon weit über 2000 ... vor der DO/LOOP den Wert MS=0 setzen ...



Beispiel:




Ms=0
Do
'Locate 1 , 1
'Lcd "Bin im Do-Loop" ; S
Print "Bin im Do-Loop"
Print "Durchlauf Nr. " ; S
' ------ Ms = 0 -----
If Ms = Wert3 Then
Gosub Kamera_ein
End If
Wert34 = Wert3 + Wert4
If Ms = Wert34 Then
Gosub Kamera_aus
End If
If Ms = Wert5 Then
Gosub Blitz_ein
End If
Wert56 = Wert5 + Wert6
If Ms = Wert56 Then
Gosub Blitz_aus
End If
If Ms = Wert7 Then
Gosub Ventil_ein
End If
Wert78 = Wert7 + Wert8
If Ms = Wert78 Then
Gosub Ventil_aus
End If
If Ms = Wert9 Then
Gosub Ventil_ein
End If
Wert91 = Wert9 + Wert10
If Ms = Wert91 Then
Gosub Ventil_aus
End If
Loop Until Ms > 2000

Peter(TOO)
13.07.2016, 08:40
Hallo MrPower,



Do
'Locate 1 , 1
'Lcd "Bin im Do-Loop" ; S
Print "Bin im Do-Loop"
Print "Durchlauf Nr. " ; S
Ms = 0
If Ms = Wert3 Then
Gosub Kamera_ein
End If
Wert34 = Wert3 + Wert4
If Ms = Wert34 Then
Gosub Kamera_aus
End If
If Ms = Wert5 Then
Gosub Blitz_ein
End If
Wert56 = Wert5 + Wert6
If Ms = Wert56 Then
Gosub Blitz_aus
End If
If Ms = Wert7 Then
Gosub Ventil_ein
End If
Wert78 = Wert7 + Wert8
If Ms = Wert78 Then
Gosub Ventil_aus
End If
If Ms = Wert9 Then
Gosub Ventil_ein
End If
Wert91 = Wert9 + Wert10
If Ms = Wert91 Then
Gosub Ventil_aus
End If


Loop Until Ms = 2000


Ms ist immer 0!

Du solltest dich mal etwas mit dem Debugger befassen und das Programm im Einzelschritt-Modus ausführen!


MfG Peter(TOO)

MrPower
13.07.2016, 09:30
Hallo zusammen,
Danke @ Feuerring, das war der entscheidende Tip.
@Peter(TOO) meinst du mit Debugger den Simulator (F2) ?. Ich habe keine Ahnung wie ich die Werte die vom VB Programm kommen dort hineinbekomme.
LG MrPower

Feuerring
13.07.2016, 09:35
Mein Tipp an MrPower

schreibe mit Einrückungen und Absätzen, erleichtert das lesen ungemein

Beispiel:



Ms=0
Do
'Locate 1 , 1
'Lcd "Bin im Do-Loop" ; S
Print "Bin im Do-Loop"
Print "Durchlauf Nr. " ; S
' ------ Ms = 0 -----
If Ms = Wert3 Then
Gosub Kamera_ein
End If

Wert34 = Wert3 + Wert4
If Ms = Wert34 Then
Gosub Kamera_aus
End If

If Ms = Wert5 Then
Gosub Blitz_ein
End If

Wert56 = Wert5 + Wert6
If Ms = Wert56 Then
Gosub Blitz_aus
End If

If Ms = Wert7 Then
Gosub Ventil_ein
End If

Wert78 = Wert7 + Wert8
If Ms = Wert78 Then
Gosub Ventil_aus
End If

If Ms = Wert9 Then
Gosub Ventil_ein
End If

Wert91 = Wert9 + Wert10
If Ms = Wert91 Then
Gosub Ventil_aus
End If
Loop Until Ms > 2000


bei jeder Schleife / Bedingung usw. Beginn um ein nach rechts einrücken und am jeweiligen Ende wieder ein zurück

MrPower
17.07.2016, 14:09
Hallo zusammen.
kann mir einer sagen warum bei dem Code
If Ms = Wert3 Then
Gosub Kamera_ein
End If

das Programm nicht ins Unterprogramm verzweigt. Wenn ich das Gleich durch ein Größer ersetze verzweigt es schon, bzw die am Ausgang angeschlossene LED leuchtet im ersten Fall
nicht, im zweiten Fall schon.

LG MrPower

Feuerring
17.07.2016, 18:51
If Ms = Wert3 Then


Wert3 = Val(daten_ar(3)) 'Anfang Kameraauslösung

welchen Wert hat denn WERT3 ... sollte > 0 aut jeden Fall sein ?!

MrPower
18.07.2016, 10:13
Hallo Feuerring,
die Werte sind variabel, die hängen von der Benutzereingabe ab. Die Frage ist warum geht die LED bei = nicht an. Bei >
funktioniert das doch auch. Die LED bleibt dann solange an bis Wert34 erreicht ist, danach klappert es da beide Werte
> ms sind.

LG MrPower

Feuerring
18.07.2016, 10:37
Die Frage ist warum geht die LED bei = nicht an. Bei >

Die Frage welcher Wert wird übergeben z.B. 0 der wird nicht klappen, aber MS>0 funktioniert natürlich ...

Dann ist die Frage wie lange braucht das Programm bis es in die Do/Loop Schleife geht, in der Zwischenzeit zählt der Timer bereits MS hoch, deswegen auch MS=0 vor der Do/Loop Schleife ...

wenn Deine Do/Loop Schleife z.B. in der Ausführung länger als 1ms dauert, zählt in der Zwischenzeit der Timer MS hoch, da ist es dann Glücksache den genauen ms Wert zu treffen,
dein Programm funktioniert nur wenn die Do/Loop Schleife x fache Durchläufe in einer ms macht ...

Was man auch machen könnte, in der Interrupt Routine, wo derzeit ms hochgezählt wird deine IF - Anweisungen und die Ausgaben zu legen ... dieses sollte aber dann in der Ausführung nicht länger als 1ms dauern ...

MrPower
18.07.2016, 13:48
Hallo Feuerring,
hab alles in die ISR gepackt und es funzt.

LG MrPower

Feuerring
18.07.2016, 14:03
Hallo Feuerring,
hab alles in die ISR gepackt und es funzt.

Super ... bin selber Bascom Neuling, freut mich wenn ich dir mit meinem Halbwissen weiter helfen konnte ...