- 3D-Druck Einstieg und Tipps         
Seite 1 von 2 12 LetzteLetzte
Ergebnis 1 bis 10 von 12

Thema: Code über Taster

  1. #1
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178

    Code über Taster

    Anzeige

    LiFePo4 Akku selber bauen - Video
    Hey,

    ich möchte gerne das, wenn man einen Code über einen Taster eingibt ein Pin am Uc auf high geht.

    z.B kurz, lang, lang, kurz, kurz

    Wobei kurz unter einer Sekunde liegt und lang über einer Sekunde.

    Kann mir vielleicht jemand sagen wie ich das hinbekomme?

    Danke schonmal!

  2. #2
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Entweder mit Wait oder Timerint.

    Wenn nach 1000ms der Taster immer noch gedrückt wurde, war es lang. Wenn nicht, war es kurz.

  3. #3
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    Habs nun mal versucht, aber er spuckt imemr Fehlermeldungen beim Compilieren aus.

    Wäre nett wenn mir jemand sagen kann was an dem Code falsch ist.

    Code:
    $regfile = M8def.dat
    $crystal = 3686400
    
    Ddrb = &B0000001                                    'Pin PD3 Ausgang, Rest Eingang
    Portd = &B00000100                                  'Pullup von Pind.2 Aktivieren
    
    
    
    Led Alias Portb.0                                         'Portb.2 als LED deklarieren
    Taster Alias Pind.2                                       'Pind.2 als Taster deklarieren
    
    Declare Sub Stelle1                                  'Stelle1 als Subroutine deklarieren
    Declare Sub Stelle2                                   'Stelle2 als Subroutine deklarieren
    Declare Sub Stelle3                                   'Stelle3 als Subroutine deklarieren
    Declare Sub Stelle4                                   'Stelle4 als Subroutine deklarieren
    Declare Sub Stelle5                                   'Stelle5 als Subroutine deklarieren
    Declare Sub Ledan                                     'Ledan als Subroutine Deklarieren
    
    
    
    Do                                                        'Starte Hauptschleife
    Debounce Taster , 0 , Stelle1 , Sub                    'Taster entprellen
    Loop
    
    
    
    Stelle1:                                              'Wenn Taster unter 1sek. betätigt wird zu stelle2 Springen
     If Taster = 0 Then
      Waitms 1000
     If Taster = 1 Then
      Gosub Stelle2
     End If
    
    Stelle2                                               'Wenn Taster über 1sek. betätigt wird zu stelle3 Springen
     If Taster = 0 Then
      Waitms 1000
     If Taster = 0 Then
      Gosub Stelle2
     End If
    
    Stelle3:                                              'Wenn Taster über 1sek. betätigt wird zu stelle4 Springen
     If Taster = 0 Then
      Waitms 1000
     If Taster = 0 Then
      Gosub Stelle4
     End If
    
    Stelle4:                                              'Wenn Taster unter 1sek. betätigt wird zu stelle5 Springen
     If Taster = 0 Then
      Waitms 1000
     If Taster = 1 Then
      Gosub Stelle5
     End If
    
    Stelle5:                                              'Wenn Taster unter 1sek. betätigt wird zu Ledan Springen
     If Taster = 0 Then
      Waitms 1000
     If Taster = 1 Then
      Gosub Ledan Led
     End If
    
    
    Ledan:
    Toggle Led                                            'LED togglen
    
    End

  4. #4
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Hi,

    da war so einiges, ich hab´s Dir überarbeitet und kommentiert, diesen Code solltest Du fehlerfrei kompilieren können:

    Code:
    $regfile = M8def.dat
    $crystal = 3686400
    
    Ddrb = &B0000001                                    'Pin PD3 Ausgang, Rest Eingang
    Portd = &B00000100                                  'Pullup von Pind.2 Aktivieren
    
    
    
    Led Alias Portb.0                                         'Portb.2 als LED deklarieren
    Taster Alias Pind.2                                       'Pind.2 als Taster deklarieren
    
    Declare Sub Stelle1                                  'Stelle1 als Subroutine deklarieren
    Declare Sub Stelle2                                   'Stelle2 als Subroutine deklarieren
    Declare Sub Stelle3                                   'Stelle3 als Subroutine deklarieren
    Declare Sub Stelle4                                   'Stelle4 als Subroutine deklarieren
    Declare Sub Stelle5                                   'Stelle5 als Subroutine deklarieren
    Declare Sub Ledan                                     'Ledan als Subroutine Deklarieren
    
    
    
    Do                                                        'Starte Hauptschleife
    Debounce Taster , 0 , Stelle1 , Sub                    'Taster entprellen
    Loop
    
    
    
    Stelle1:                                              'Wenn Taster unter 1sek. betätigt wird zu stelle2 Springen
     If Taster = 0 Then
      Waitms 1000
     End If
     '**FEHLTE!
     If Taster = 1 Then
      Gosub Stelle2
     End If
    
    Stelle2:
    '**Doppelpunkt vergessen!                            'Wenn Taster über 1sek. betätigt wird zu stelle3 Springen
     If Taster = 0 Then
      Waitms 1000
     End If
     '**FEHLTE!
     If Taster = 0 Then
      Gosub Stelle2
     End If
    
    Stelle3:                                              'Wenn Taster über 1sek. betätigt wird zu stelle4 Springen
     If Taster = 0 Then
      Waitms 1000
     End If
     '**FEHLTE!
     If Taster = 0 Then
      Gosub Stelle4
     End If
    
    Stelle4:                                              'Wenn Taster unter 1sek. betätigt wird zu stelle5 Springen
     If Taster = 0 Then
      Waitms 1000
     End If
     '**FEHLTE!
     If Taster = 1 Then
      Gosub Stelle5
     End If
    
    Stelle5:                                              'Wenn Taster unter 1sek. betätigt wird zu Ledan Springen
     If Taster = 0 Then
      Waitms 1000
     End If
     '**FEHLTE!
     If Taster = 1 Then
      Gosub Ledan
      '**Ledan Led gibt´s nicht!
     End If
    
    
    Ledan:
    Toggle Led                                            'LED togglen
    
    End
    Die Kommentare mit dem führenden "**" sind von mir...

    Viele Grüße

    Torsten

  5. #5
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    Vielen Dank, werde es nachm essen gleich mal testen. Die ganzen End Ifs waren der fehler.. da wär ich nie drauf gekommen =D>

  6. #6
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    25.02.2005
    Beiträge
    175
    Nicht nur - es fehlte auch ein Doppelpunkt und ein Subroutine-Label war falsch benannt...

    Bei If-then gibt es folgende Möglichkeiten:

    If ... then

    end if

    oder

    If ... then

    else

    end if

    oder auch verschachtelt

    If ... then

    If ...then

    End if

    End if

    Also, ohne End if wird´s nix - aber vom Bascom-Compiler wird man auch nicht grade dolle bei der Fehlersuche unterstützt...

    Viele Grüße

    Torsten

  7. #7
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    Also ich kanns nun Compilieren aber funktionieren tut das Programm trotzdem nicht
    Ich drücke den Taster einmal kurz und nach 1sek geht die LED an.

    Wo liegt der Fehler?

  8. #8
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Ich würde es auch anders machen. Ist evtl aber etwas komplizierter. Mag sein das es auch einfacher geht!

    For I = 1 To 5

    Loop Until Taster = 0
    Waitms 900 'taster entprellen und etwa die Sekunde einhalten
    Do

    If Taster = 1 then
    kurz = kruz + 1
    Else lang = lang + 1
    End if

    next i

    So wird alles was nicht kurz war automatisch zu lang.
    Später muss ausgewertet werden, wie oft kurz oder lang gedrückt wurde.
    Ist die Reihenfolge noch wichtig müsste sie mit abgespeichert werden.
    Nachteil, diese Routine läuft sturr ihre fast 5 Sekunden ab, bevor etwas passieren kann. auch wenn es 5 X kurz werden sollte. Die kurz werden dann ggf. auch nicht wirklich erkannt.

    Eleganter wäre es mit einem Timer.

    Die Timer-ISR läuft alle 20ms ab.
    Sie könnte auch dir einen externen INT aktiviert werden, damit sie nicht dauerhaft läuft.

    In der ISR wir jedesmal geprüft, ob der Taster noch gedrückt ist. Wenn ja, wir eine Variable hochgezählt, so lange bis er nicht mehr gedrückt ist.
    Ist die Variable über 50 wird ein Merke für lang gesetzt und die Variable auf 0 gesetzt.
    Ist sie unter 50 war es ein kurzer Tastendruck.
    Eine zweite Variable wird bis 5 hochgezählt (sofern alle Codes aus 5 mal drücken bestehen).
    Dann wird das Bitmuster ausgewertet.

    Vorteil: nach einnam kurz muss nicht gewartet werden bis die Sekunde vorbei ist und es kann direkt nochmal gedrückt werden. So geht kein Tastendruck verloren.

    In Abhänigkeit der Taktfrequenz muss noch abgeschätzt werden ob die ISR mit 20ms den restlichen Code noch ausführen lassen kann.

    Um den ganzen Code zu schreiben ist es mir jetzt schon zu spät. Ich bin auch erst Ende der Woche wieder Zuhause. Entweder so lange warten, es selbst probieren oder hoffen das dir jemand anders die Arbeit abnimmt.

    Aber wenn du es schon selber probierst und man den guten Willen sieht wird man dir sicherlich helfen!

  9. #9
    Erfahrener Benutzer Fleißiges Mitglied
    Registriert seit
    19.07.2004
    Beiträge
    178
    Hallo,

    danke für deine Versuche mir das zu erklären. Blos bin ich gerade erst am Anfang und habe mit Timern noch nichts gemacht. Bei dem was du geschrieben hast verstehe ich auch ehrlichgesagt recht wenig.

    Hat jemand vielelicht eine leichtere Lösung?

  10. #10
    Erfahrener Benutzer Robotik Einstein
    Registriert seit
    06.11.2004
    Beiträge
    1.693
    Etwas leichter wäre das erste Beispiel was ich geschrieben habe. Aber da gehen einige Tasten sicherlich bei unter.

    Zum Thema Timer findest du in der Hilfe und hier im Forum einige Beispiele. Die werden dir schomal ein wenig helfen. Du kannst ja damit anfangen eine LED jede Sekunde umschalten zu lassen. So siehst du die Zusammenhänge.

    Dann musst du nachvollziehen, das das Progamm immer schritt für Schritt abläuft und evtl nur durch Interrupt unterbrochen wird.
    Jede Unterbrechung durch den Timer bedeutet dann 20ms sind vorbei. Das 50 mal und eine Sekunde ist vorbei.
    Probier es erstmal das die LED an geht wenn die eine Sekunde drückst und ausgeht wenn du nur kurz drückst.
    Weiteres kommt dann schon fast von alleine.

Seite 1 von 2 12 LetzteLetzte

Berechtigungen

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

12V Akku bauen