- Labornetzteil AliExpress         
Seite 2 von 2 ErsteErste 12
Ergebnis 11 bis 18 von 18

Thema: Tastatur einbinden und Werte hochzählen

  1. #11
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.08.2005
    Alter
    40
    Beiträge
    685
    Anzeige

    LiFePo4 Akku selber bauen - Video
    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

  2. #12
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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 ?
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  3. #13
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.08.2005
    Alter
    40
    Beiträge
    685
    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

  4. #14
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    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
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  5. #15
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.08.2005
    Alter
    40
    Beiträge
    685
    Danke dir vielmals,
    es funktioniert \/

    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.

  6. #16
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.08.2005
    Alter
    40
    Beiträge
    685
    Danke dir vielmals,
    es funktioniert \/

    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.

  7. #17
    Super-Moderator Robotik Visionär Avatar von PicNick
    Registriert seit
    23.11.2004
    Ort
    Wien
    Beiträge
    6.842
    Einmal hätt's auch genügt.

    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.
    mfg robert
    Wer glaubt zu wissen, muß wissen, er glaubt.

  8. #18
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    17.08.2005
    Alter
    40
    Beiträge
    685
    Danke vielmals

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

Seite 2 von 2 ErsteErste 12

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •  

Labornetzteil AliExpress