Hallo, ich bin gerade dabei eine Menüsteuerung in Bascom zu erstellen, welches man mit einem Drehencoder bedient. Per Taster klappt die Menüsteuerung schon sehr gut, nur mit dem Drehencoder will das nicht hinhauen. Drehencoder ist ein ALPS von Reichelt (STEC12E08. Dieser wird per Timerinterrupt periodisch abgefragt (ca. jede ms). Alleine bekomme ich den Drehencoder auch schon ganz gut abgefragt, wenn er bloß einen Wert erhöhen bzw. verkleinern soll. Also bei Drehung nach Rechts Incr Zahl und nach links eben Decr Zahl. Jetzt will ich statt den Tastern für das Menü den Drehencoder benutzen (Drehung nach rechts, geht der Cursor nach unten und drehung nach Links geht der Cursor nach oben) Funktioniert in dem Programm, welches im Anhang dabei ist auch schon. Nur eben nicht sauber. Sozusagen nur jede zweite oder dritte Rasterstellung bewirkt eine Änderung des Cursors. Manchmal aber auch schon nach einer Rasterung - So wie es sein soll. Der Fehler liegt wahrscheinlich darin, dass ich bei einem Zustandswechsel des Drehencoders eine Variable setze, die dann in der Menüroutine in eine Aktion (Cursor rauf oder runter) verwandelt wird und dann die Variable wieder Resetet. Da der Interrupt das Programm aber an jeder beliebigen Stelle anhällt um nach dem Drehencoder zu sehen, dann kann es schonmal vorkommen, dass ich den Encoder betätige, die Variable gesetzt wird, aber in der Menüroutine ohne Aktion gleich wieder resettet wird. Also so: Timer fragt Encoder ab... Timerroutine bemerkt Zustandsänderung - Auswertung - Dreencoder nach Rechts gedreht - Variable = 1 Zurück im Programm: Wenn Variable = 1 dannn Cursor hoch Danach Variable = 0 Wenn jetzt aber der Interrupt genau dazwischen einsetzt: Wenn Variable = 1 dannn Cursor hoch Interrupt wird abgefragt und Variable wird auf 1 gesetzt Danach Variable = 0 Dann kann das klar nicht funktionieren. Nur wie bekomme ich es sonst hin. Wahrscheinlich ist es so einfach aber ich steh grad total auf dem Schlauch. Über einen kleinen Gedankenschubs wäre ich sehr Dankbar
Zeile 42 ist im Programm "Enable Interrupts" was soll daran falsch sein?
Hi
>Zeile 42 ist im Programm "Enable Interrupts" was soll daran falsch sein?
Dann sieh dir mal das 'Programm' in deinem Anhang an.
MfG spess
Achso. Jetzt sollte die Datei mit drin sein. Komisch habe doch die .bas Datei ausgewählt, aber nur .bin wird hochgeladen
Florian H. schrieb: > Menue_mit_Encoder_Test.bin So jetzt lachen wir mal ganz laut und herzlich über Deinen Witz. bin != bas Peter
Bei mir werden mehrere Dateien erzeugt. .bin .bas .hex etc. Nur wenn ich jetzt die .bin aus meinem ersten Beitrag herunterlade, dann kann ich diese nicht in Bascom direkt öffnen. Jetzt habe ich diese in einen Zip Ordner rein.
In Bascom gibt es auch den Befehl "ENCODER". Damit kann man sich die Sache sehr vereinfachen, weil gleich auch entprellt wird. MfG Paul
Der Encoder Befehl von Bascom funktioniert mit diesem ALPS Encoder nicht, da dieser mehr als nur einen Tick pro Rasterung bringt. Mit Prellen habe ich eigentlich kein Problem. 10nF Kondensatoren Parallel zu den Ausgängen nach Masse bewirken Wunder ;)
@ Florian H. (heringflorian) >Der Encoder Befehl von Bascom funktioniert mit diesem ALPS Encoder >nicht, da dieser mehr als nur einen Tick pro Rasterung bringt. Auch dieses Problem ist lösbar, auch mit dem Encoderbefehl. >Mit Prellen habe ich eigentlich kein Problem. 10nF Kondensatoren >Parallel zu den Ausgängen nach Masse bewirken Wunder ;) Un verbrutzeln dir langsam aber sicher deine Kontakte. Nicht sinnvoll.
Viele Wege führen nach Rom.... Ich könnte das auch mit dem Bascom Encoder Befehl realisieren. Aber siehe mein erster Satz. Habe ausßerdem gerade festgestellt, das die Kondensatoren eigentlich gar nicht nötig wären. Funktioniert auch ohne genauso gut wie mit. Einerseits hast du recht mit dem Kontakteverbruzeln abere andererseits haben 10nF bei 5 Volt nicht so die Zerstörungswut. Wäre was anderes wenn da ein 1 F Kondensator dran hängen würde. Dann wären die Kontakte beim ersten mal hinüber :D
@ Florian H. (heringflorian)
>haben 10nF bei 5 Volt nicht so die Zerstörungswut.
Woher weißt du das? Selbs wenn man großzügig 1Ohm Widerstand für den
Schalter annimmt, fließen da satte 5A. Und das bei jedem Schaltvorgang!
Und wenn man keinen Widerstand nimmt, dann würde der Entladestrom Theoretisch unendlich hoch sein... (Der für Nano/Picosekunden anliegt) Meine Kontakte bei meinen Tasten müssten eigentlich schon alle hinüber sein. Tausende betätigungen und funktionieren noch tadellos. Mache das so nach Empfehlung von einem Bascom Fachbuch. Aber wie gesagt, habe gerade herausgefunden, dass es auch ohne Kondensator funktioniert und somit wird ohne Kondensator betrieben. Nur hilft das bei meinem Problem nicht weiter...
Hallo, Im zugehörigen Datenblatt gibt es übrigends einen Schaltungsvorschlag, der das Prellen verringern soll und gleichzeitig den Strom stark begrenzt. Nur der Vollständigkeit halber und wenn man unnötig viele Bauteile verbraten will. Gruss
>Mache das so nach Empfehlung von einem Bascom Fachbuch.
darf man fragen, welches?
ich habe jetzt dein Programm nicht angeschaut, aber so wie du beschreibst, setzt du im interrupt ein Flag und resettest in der Main. Nun wird die Durchlaufzeit der Main mit jeder Aktion, die du in Main durchführst länger werden und die Bedienung holperiger. Wieso nicht auf bestehendes zurückgreifen. Ich habe das damals so gemacht: - Als Menü das Bascom State Machine Menü hier aus dem Forum. - die Drehgeberauswertung vom noch lachenden Peter Dannegger, welche hier oder in anderen Forum auch als Bascom-Version vorliegt genommen. - und zusätzlich, falls es um irgendwo um Veränderung von Werten in Größenordnungen geht, einen C-Schnipsel welcher eine "Beschleunigung des Drehgebers" umsetzt nach Bascom portiert. Schlussendlich: Das Menü läuft prima und die beiden Drehgeber damals, welche Pro Umdrehehung 32 Ticks schafften, ließen sich mit einem Handdreh (geschätzte 270°) gut 400 Werte weiterstellen - wobei auch das Zifferngenaue Einstellen nicht verlorenging.
Florian H. schrieb: > Aber wie gesagt, habe gerade herausgefunden, dass es auch ohne > Kondensator funktioniert und somit wird ohne Kondensator betrieben. Das ich nicht lache... Hier mal meine Erfahrung mit Drehimpulsgebern: Ich habe bei meiner Modellbahnanlage eine Mobile Station 1 von Märklin als Fahrgerät im Einsatz (gehabt). Mit dem Drehimpulsgeber steuert man durch die Menüs und regelt die Geschwindigkeit der Züge. Die ersten Monate lief das auch super und ohne Prellen. Aber dann ging es los. Erst prellte es nur ein wenig, dann immer mehr. Und heute prellt es so stark, das die Bewegung um 1 Ritzeel wie eine 3 mal 360° Drehung verarbeitet wird. Das ist besonders lustig, wenn man einen Zug langsam anhalten will und das Ding rast aufeinmal mit Fullspeed los.
Florian H. schrieb: > Und wenn man keinen Widerstand nimmt, dann würde der Entladestrom > Theoretisch unendlich hoch sein... Dann ist deine Theorie falsch und berücksichtigt nicht die Realteil der Impdanz deines Kondensator, die Induktivität deiner Verdrahtung und den gerade in der ersten, erodierenden Phase beim Schließen des Kontakts. Ein Stombegrenzungswiderstand in Serie zum Kontakt würde das Übel des Designs abmildern.
@Werner: Deswegen ja Therotisch ;) Und Theoretisch und Realität haben oft nichts miteinander zu tun. Klar auch die Leitungen haben Widerstand usw. usf. @Frageknoedel Frageknoedel schrieb: >>Mache das so nach Empfehlung von einem Bascom Fachbuch. > > darf man fragen, welches? Das blaue von Stefan Hoffmann. Da wird die Methode mit den Kondensatoren beschrieben. Natürlich auch die mit Softwareentprellung. Komisch jeder hackt hier grad auf meinen Anschluss des Drehgebers an den µC rum aber da komme ich bei meinem (Haupt)Problem nicht weiter. Bascom schrieb: > ich habe jetzt dein Programm nicht angeschaut, aber so wie du > beschreibst, setzt du im interrupt ein Flag und resettest in der Main. > > Nun wird die Durchlaufzeit der Main mit jeder Aktion, die du in Main > durchführst länger werden und die Bedienung holperiger. > > Wieso nicht auf bestehendes zurückgreifen. > > Ich habe das damals so gemacht: > > - Als Menü das Bascom State Machine Menü hier aus dem Forum. > - die Drehgeberauswertung vom noch lachenden Peter Dannegger, welche > hier oder in anderen Forum auch als Bascom-Version vorliegt genommen. > - und zusätzlich, falls es um irgendwo um Veränderung von Werten in > Größenordnungen geht, einen C-Schnipsel welcher eine "Beschleunigung des > Drehgebers" umsetzt nach Bascom portiert. > > Schlussendlich: Das Menü läuft prima und die beiden Drehgeber damals, > welche Pro Umdrehehung 32 Ticks schafften, ließen sich mit einem > Handdreh (geschätzte 270°) gut 400 Werte weiterstellen - wobei auch das > Zifferngenaue Einstellen nicht verlorenging. Endlich mal ein Anhaltspunkt. Würdest du mir dein Programm mal schicken, damit ich mir das anschauen kann?
PS: Die Drehgeberauswertung für den ALPS Encoder habe ich ebenfalls aus diesem Buch
"Das blaue von Stefan Hoffmann. Da wird die Methode mit den Kondensatoren beschrieben." Von Kondensatoren sehe ich da nichts aber es werden erfreulicherweise verschiedene Methoden (Encoder-Befehl, 1 Interrupt, 2 Interrupts, Timer') vorgestellt. Kurz und knackig - so wie man es braucht. Super-Anregungen.
Im Kapitel Tasterprellen steht das. Ja verschiedene Möglichkeiten. Ich hab den Code genommen, der für den ALPS Encoder konzipiert worden ist.
Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.