-         

Seite 1 von 3 123 LetzteLetzte
Ergebnis 1 bis 10 von 26

Thema: Menüsteuerung mit Drehencoder ?

  1. #1
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341

    Menüsteuerung mit Drehencoder ?

    Anzeige

    Hi,

    ich versuche gerade mit diesem Drehencoder:

    http://www.pollin.de/shop/shop.php?c...a=MDY2OTU3OTk=

    eine Menüsteuerung zu programmieren. Mein Code dafür sieht bisher so aus:

    Code:
    Do
    B = Encoder(pinc.7 , Pinc.6 , Links , Rechts , 1)
    
    Select Case M_pointer
    
    Case 1:
    Cls
    Locate 1 , 1
    Lcd "> Programm 1"
    Locate 2 , 1
    Lcd "Programm 2"
    
    Case 2:
    Cls
    Locate 1 , 1
    Lcd "> Programm 2"
    Locate 2 , 1
    Lcd "Programm 3"
    
    Case 3:
    Cls
    Locate 1 , 1
    Lcd "> Programm 3"
    Locate 2 , 1
    Lcd "Programm 4"
    
    Case 4:
    Cls
    Locate 1 , 1
    Lcd "> Programm 4"
    Locate 2 , 1
    Lcd "Programm 1"
    
    End Select
    
    Loop
    
    Rechts:
    If M_pointer < 5 Then
    Incr M_pointer
    Else
    M_pointer = 1
    End If
    
    waitms 10
    Return
    
    Links:
    If M_pointer < 5 Then
    Decr M_pointer
    Else
    M_pointer = 4
    End If
    Waitms 10
    Return
    Mein Problem ist nun, dass der Encoder die Links bzw. Rechts Sub 2x pro Rastpunkt aufruft.

    Wenn ich also nach rechts drehe wird immer jeder 2. Menüpunkt angezeigt, also einer übersprungen.

    Weiß jemand woran das liegt, bzw wie man es beheben kann ?

    mfg Yannic

  2. #2
    Erfahrener Benutzer Roboter-Spezialist
    Registriert seit
    14.04.2008
    Ort
    Esslingen
    Alter
    29
    Beiträge
    235
    Kommt das vllt durch Prellen des Drehcoders? Versuch mal eine längere Waitpause vllt gehts dann. Und musst du nicht beim Linksmenu auf < 1 abfragen?
    Elektronische Bauteile funktionieren mit Rauch. Lässt man den Rauch raus, sind sie kaputt.

  3. #3
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341
    Hi,

    die If Abfrage stimmt so schon.

    Ich habe jetzt die waitms nochmal auf 50 erhöht und auch ein Waitms 50 in die Do Loop Hauptschleife gesetzt.

    Er zählt immernoch doppelt.

  4. #4
    Erfahrener Benutzer Roboter Experte
    Registriert seit
    22.11.2005
    Ort
    Braunschweig
    Alter
    41
    Beiträge
    685
    Moin!
    Zählt er immer doppelt? Dann teil doch durch 2, mach ich bei meinem MiniPanoBot auch, der zählt immer 4 Impulse...
    MfG
    Volker
    Meine kleine Seite
    http://home.arcor.de/volker.klaffehn
    http://vklaffehn.funpic.de/cms
    neuer Avatar, meine geheime Identität

  5. #5
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341
    Jap er zählt soweit ich das richtig sehe immer doppelt. Durch
    teilen möchte ich nur ungern, denn falls mal ein Impuls verloren geht würde das Programm durch ungerade zahlen komplett durcheinanderkommen.

    Ich habe gerade nach etwas suchen noch diesen thread hier gefunden:

    http://www.roboternetz.de/phpBB2/viewtopic.php?p=180862

    Dort schien es um das ähnliche Problem zu geben, nur irgendwie kann ich noch nicht ganz erkennen ob aus diesem Thread nun eine Lösung für das "problem" hervor ging.

  6. #6
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Zitat Zitat von Blamaster
    Hi,

    die If Abfrage stimmt so schon.
    Nein, die If-Abfrage macht nicht das, was du möchtest.
    Stell dir vor, M_pointer steht auf 0 und du drehst links.
    Da M_pointer < 5 ist, wird Decr M_pointer ausgeführt.
    Damit wird M_pointer=-1 oder 255, je nachdem, welcher Typ es ist.
    Egal was, kein Case wird zutreffen.
    Wenn M_pointer=4 ist und du drehst rechts, wird M_pointer auf 5 gesetzt, weil es vorher < 5 war. Auch in diesem Fall trifft kein Fall zu.
    Deine Abfragen müssten also <4 und >1 sein.

    Beides erklärt aber dein 2-fach Problem noch nicht.
    Hast du die PullUps eingeschaltet oder extern welche dran?

    Gruß

    Rolf

  7. #7
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341
    Hi,

    es sind externe 10k Pulldowns dran.

    Stimmt mit der If hast du recht, aber wie schon gesagt löst das leider das eigentliche Problem nicht.

  8. #8
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Laut dem anderen Thread war es zumindest in der damaligen Version so, dass für jede Flanke die Routine zweimal aufgerufen wurde. Dann wäre die Krücke /2 ok.

    Gruß

    Rolf

  9. #9
    Erfahrener Benutzer Begeisterter Techniker
    Registriert seit
    20.02.2007
    Beiträge
    341
    Hm meiner Meinung nach kann die Krückemit /2 aber nicht funktionieren, denn wenn ich das richtig sehe wird die Sub Rechts bzw. Links 2 mal aufgerufen somit würde mal angenommen man startet bei 0 durch einen Rechtsdreh 1. Aufruf 1/2 = 0,5 2. Aufruf 1,5/2 = 0,75 also nur noch "mist" bei rauskommen.

    Gibt es zufällig eine Beschreibung wie man den Drehencoder manuell abfragen könnte um das Problem zu lösen, bzw. andere Lösungsansätze mit denen ich arbeiten könnte ?

    mfg Yannic

    Edit. aus dem Bascom Beispiel hatte ich es so übernommen das man dem byte B die Encoder funktion "zuweist". Was übergibt die Funktion überhaupt an das Byte B ?

  10. #10
    Erfahrener Benutzer Roboter Genie
    Registriert seit
    16.02.2006
    Beiträge
    1.112
    Zitat Zitat von Blamaster
    1. Aufruf 1/2 = 0,5 2. Aufruf 1,5/2 = 0,75 also nur noch "mist" bei rauskommen.
    ich glaube, das war eher so gemeint, dass du nur jeden zweiten Aufruf ausführen sollst.

    Zitat Zitat von Blamaster
    Gibt es zufällig eine Beschreibung wie man den Drehencoder manuell abfragen könnte um das Problem zu lösen, bzw. andere Lösungsansätze mit denen ich arbeiten könnte ?
    Du könntest die beiden Eingänge abfragen.
    Bei 00 und 11 merkst du dir den Zustand.
    Bei 01 und 10 setzt du eine Variable für die entsprechende Richtung, abhängig vom vorher gemerkten Zustand.
    Bei 00 oder 11 und vorher die richtige Variable gesetzt, hast du einen kompletten Wechsel erkannt und führst die zugehörige Bewegung aus.
    Es sind dann Wechsel wie 00-10-00 geblockt, während 00-10-11 erkannt wird.
    Um die Drehung auch etwas schneller machen zu können, kannst du die Eingänge auf externe Interrupts legen und die Abfragen in der ISR machen. Dann kannst du auch noch etwas anderes tun als nur die Pins abfragen.

    Gruß

    Rolf

Seite 1 von 3 123 LetzteLetzte

Berechtigungen

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