An den Armin,
Der Beitrag ist anscheinend im falschen Forum, bitte verschieben oder löschen.
Besten Dank
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???
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() '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
An den Armin,
Der Beitrag ist anscheinend im falschen Forum, bitte verschieben oder löschen.
Besten Dank
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 ...Code:Timer0_isr: Timer0 = Timerstartwert Incr Ms Return
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 - - -
schreib mal Loop Until Ms > 2000Code: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:
Code: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
Geändert von Feuerring (13.07.2016 um 09:45 Uhr)
Gruß Ralf ... Projekt-Beschreibungen www.greinert-dud.de ... "Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat's gemacht."
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
Mein Tipp an MrPower
schreibe mit Einrückungen und Absätzen, erleichtert das lesen ungemein
Beispiel:
bei jeder Schleife / Bedingung usw. Beginn um ein nach rechts einrücken und am jeweiligen Ende wieder ein zurückCode: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
Geändert von Feuerring (13.07.2016 um 10:40 Uhr)
Gruß Ralf ... Projekt-Beschreibungen www.greinert-dud.de ... "Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat's gemacht."
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
If Ms = Wert3 Thenwelchen Wert hat denn WERT3 ... sollte > 0 aut jeden Fall sein ?!Wert3 = Val(daten_ar(3)) 'Anfang Kameraauslösung
Gruß Ralf ... Projekt-Beschreibungen www.greinert-dud.de ... "Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat's gemacht."
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
Die Frage welcher Wert wird übergeben z.B. 0 der wird nicht klappen, aber MS>0 funktioniert natürlich ...Die Frage ist warum geht die LED bei = nicht an. Bei >
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 ...
Gruß Ralf ... Projekt-Beschreibungen www.greinert-dud.de ... "Alle sagten: Das geht nicht. Dann kam einer, der wusste das nicht und hat's gemacht."
Lesezeichen