- 
	
	
	
	
		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).