-
Hallo,
ich habe da mal ein kleines Programm mit LED's geschrieben und dabei incr benutzt.
Nur arbeitet das Programm nicht alles nacheinander ab, sondern abwechselnd, bin mir sicher, dass es an den < und > liegt
Hier mein Programm:
Code:
$regfile = "m32def.dat"
' $framesize = 32
'$swstack = 32
'$hwstack = 32
$crystal = 16000000
$baud = 9600
'--------LED-----------
Config Porta = Output
'--------Taster--------
Config Pinb.0 = Input
Portb.0 = 1
Declare Sub Lauflicht
Declare Sub Allean
Declare Sub Nacheinander
Declare Sub Startrek
Dim Anzahl As Byte
Do
If Pinb.0 = 1 Then
Incr Anzahl
If Anzahl < 25 Then Gosub Lauflicht
If Anzahl > 25 Then Gosub Allean
If Anzahl > 50 Then Gosub Nacheinander
If Anzahl < 50 Then Gosub Startrek
If Anzahl = 75 Then Anzahl = 0
End If
Loop
Sub Startrek
Print "Star Trek"
Porta.0 = 1
Porta.6 = 1
Waitms 150
Porta.0 = 0
Porta.6 = 0
Porta.1 = 1
Porta.5 = 1
Waitms 150
Porta.1 = 0
Porta.5 = 0
Porta.2 = 1
Porta.4 = 1
Waitms 150
Porta.4 = 0
Porta.2 = 0
Porta.3 = 1
Waitms 150
Porta.3 = 0
Waitms 150
End Sub
Return
Sub Lauflicht
Print "Lauflicht"
Porta.0 = 1
Waitms 40
Porta.0 = 0
Porta.1 = 1
Waitms 40
Porta.1 = 0
Porta.2 = 1
Waitms 40
Porta.2 = 0
Porta.3 = 1
Waitms 40
Porta.3 = 0
Porta.4 = 1
Waitms 40
Porta.4 = 0
Porta.5 = 1
Waitms 40
Porta.5 = 0
Porta.6 = 1
Waitms 40
Porta.6 = 0
Porta.5 = 1
Waitms 40
Porta.5 = 0
Porta.4 = 1
Waitms 40
Porta.4 = 0
Porta.3 = 1
Waitms 40
Porta.3 = 0
Porta.2 = 1
Waitms 40
Porta.2 = 0
Porta.1 = 1
Waitms 40
Porta.1 = 0
End Sub
Return
Sub Allean
Print "alle an"
Porta.0 = 1
Porta.1 = 1
Porta.2 = 1
Porta.3 = 1
Porta.4 = 1
Porta.5 = 1
Porta.6 = 1
Waitms 250
End Sub
Return
Sub Nacheinander
Print "1.Led "
Porta.0 = 1
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
Waitms 100
Print "2.Led "
Porta.0 = 0
Porta.1 = 1
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
Waitms 100
Print "3.Led "
Porta.0 = 0
Porta.1 = 0
Porta.2 = 1
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
Waitms 100
Print "4.Led "
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 1
Porta.4 = 0
Porta.5 = 0
Porta.6 = 0
Waitms 100
Print "5.Led "
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 1
Porta.5 = 0
Porta.6 = 0
Waitms 100
Print "6.Led "
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 1
Porta.6 = 0
Waitms 100
Print "7.Led "
Porta.0 = 0
Porta.1 = 0
Porta.2 = 0
Porta.3 = 0
Porta.4 = 0
Porta.5 = 0
Porta.6 = 1
Waitms 100
End Sub
Return
End
Ich habe es auch mit versch. incr versucht, aber das gleiche Problem erhalten:
Code:
Declare Sub Lauflicht
Declare Sub Allean
Declare Sub Nacheinander
Declare Sub Startrek
Dim A As Byte
Dim B As Byte
Dim C As Byte
Dim D As Byte
Do
If Pinb.0 = 1 Then
Incr A
If A < 10 Then Gosub Lauflicht
Incr B
If B < 10 Then Gosub Allean
Incr C
If C < 10 Then Gosub Nacheinander
Incr D
If D < 10 Then Gosub Startrek
Habt ihr Lösungsvorschläge oder Tipps, was ich falsch gemacht habe, bin echt dankbar.
Ich bekomme es nicht hin, dass das Unterprogramm "Nacheinander" hinter dem "Allean" und dahinter "Startrek" wirklich abgeschlossen für sich läuft.
Das einzigste gute daran: unkontrolliertes Software Multitasking, aber Multitasking :-k
-
Zu meinem Verständnis:
1) Am Anfang tut sich mal nix.
2)Du drückst auf die Taste-->Jetzt läuft ständig "Lauflicht"
3)nochmal drücken --> "alle an"
4)nochmal drücken --> "Nacheinander"
5)nochmal drücken --> "Startrek"
6)nochmal drücken --> --> 1)
Ist das so gemeint ?
-
Ne, wäre aber schön, wenn es so wäre, läuft aber alles ab, obwohl der Taster nicht gedrückt worden ist (=1) und nicht wieder gedrückt wird.
Zum Ablauf:
If Anzahl < 25 Then Gosub Lauflicht
'---------Lauflicht läuft--------------
If Anzahl > 25 Then Gosub Allean
'--------Lauflicht ist aus, doch jetzt läuft alles durcheinander bzw. abwechselnd, denn ich kann nicht eindeutig im Programm schreiben: until = 50 zum Beispiel
If Anzahl > 50 Then Gosub Nacheinander
If Anzahl < 50 Then Gosub Startrek
If Anzahl = 75 Then Anzahl = 0
-
Hab mich schlecht ausgedrückt. Ich meinte, ob es so sein SOLL ?
Ich weiß nicht, wie du das meinst, mit dem Hochzählen von Anzahl bis 75 ?
Du hast doch nur 5 Zustände (=anzahl Tastendruck)
Dann muß deine Schleife aus zwei Teilen bestehen:
1) Soll sich der Zustand ändern ? (Tastenabfrage)
2) das tun, was gerade anliegt.
bei 1) kanst du nicht reagieren, WÄHREND die Taste gedrückt ist, sondern nur, wenn sich was ÄNDERT.
(sonst ratterst du durch alle sub's, solange du den Finger auf der Taste
hast. )
Code:
'du brauchst noch ein Feld
DIM tastealt as byte
' Abfrage in der schleife (Das debouncing ignorier' ich mal)
if pinb.0 = 1 and tastealt.0 = 0 then
incr zustand
' also nur, wenn die Taste von "NICHT GEDRÜCKT" auf "GEDRÜCKT" wechselt
end if
tastealt = pinb ' so oder so merken
2)
Code:
select case zustand
case 0: ' nix
case 1: gosub lauflicht
case 2: gosub allean
case 3: gosub nacheinander
case 4: gosub startrek
case else:
zustand = 0 ' wieder von vorn
end select
Deine Subs dürfen natürlich keine Dauerschleifen sein, sie müssen immer wieder zurückkommen
-
Danke dir vielmals,
es funktioniert \:D/
Code:
Declare Sub Lauflicht
Declare Sub Allean
Declare Sub Nacheinander
Declare Sub Startrek
Dim Zustand As Byte
DIM tastealt as byte
Do
if pinb.0 = 1 and tastealt.0 = 0 then
Incr Zustand
end if
Tastealt = Pinb
select case zustand
case 0: ' nix
Case 1 : Gosub Lauflicht
case 2: gosub allean
case 3: gosub nacheinander
case 4: gosub startrek
case else:
zustand = 0 ' wieder von vorn
end select
Nur werde ich daraus:
Code:
if pinb.0 = 1 and tastealt.0 = 0 then
Incr Zustand
end if
Tastealt = Pinb
nicht richtig schlau.
-
Danke dir vielmals,
es funktioniert \:D/
Code:
Declare Sub Lauflicht
Declare Sub Allean
Declare Sub Nacheinander
Declare Sub Startrek
Dim Zustand As Byte
DIM tastealt as byte
Do
if pinb.0 = 1 and tastealt.0 = 0 then
Incr Zustand
end if
Tastealt = Pinb
select case zustand
case 0: ' nix
Case 1 : Gosub Lauflicht
case 2: gosub allean
case 3: gosub nacheinander
case 4: gosub startrek
case else:
zustand = 0 ' wieder von vorn
end select
Nur werde ich daraus:
Code:
if pinb.0 = 1 and tastealt.0 = 0 then
Incr Zustand
end if
Tastealt = Pinb
nicht richtig schlau.
-
Einmal hätt's auch genügt. :mrgreen:
Schau: tastealt ist immer der Tastenzustand vorher, nach der Prüfung wird der aktuelle Zustand dort reingestellt. beim nächsten mal wird dann damit verglichen
reagiert wird nur in dem Moment, wo die Taste VORHER noch offen war, und JETZT aber gedrückt ist. (=steigende Flanke=rising, =Low-High Übergang)
Alle anderen Zustände
ALT.........................NEU
gedrückt --> gedrückt
gedrückt ---> losgelassen
nicht gedrückt ---> nicht gedrückt
interessieren uns nicht.
-
Danke vielmals O:)
Der Doppelpost ist ungewollt, wenn ich einen Post reinsetze, bekomme ich immer eine Fehlerseite (aber im hintergrund ist immernoch die Option für reinsetzen aktiv), also wenn ich da 2 mal auf return komme.... Ich weiß nicht, ob es an der Seite liegt oder aber am Browser (glaub eher letzteres).