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?
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:
Mein Problem ist nun, dass der Encoder die Links bzw. Rechts Sub 2x pro Rastpunkt aufruft.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
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
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.
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.
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
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:
https://www.roboternetz.de/phpBB2/vi...c.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.
Nein, die If-Abfrage macht nicht das, was du möchtest.Zitat von Blamaster
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
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.
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
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 ?
ich glaube, das war eher so gemeint, dass du nur jeden zweiten Aufruf ausführen sollst.Zitat von Blamaster
Du könntest die beiden Eingänge abfragen.Zitat von Blamaster
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
Lesezeichen