Forum: Mikrocontroller und Digitale Elektronik Bascom Menüsteuerung mit Drehimpulsgeber


von Florian H. (heringflorian)


Angehängte Dateien:

Lesenswert?

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

von Route_66 H. (route_66)


Lesenswert?

Zeile 42 ist falsch!

von Florian H. (heringflorian)


Lesenswert?

Zeile 42 ist im Programm "Enable Interrupts" was soll daran falsch sein?

von Route_66 H. (route_66)


Lesenswert?

Was in Zeile 42 steht, kennst nur Du!

von spess53 (Gast)


Lesenswert?

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

von Florian H. (heringflorian)


Angehängte Dateien:

Lesenswert?

Achso. Jetzt sollte die Datei mit drin sein. Komisch habe doch die .bas 
Datei ausgewählt, aber nur .bin wird hochgeladen

von Peter D. (peda)


Lesenswert?

Florian H. schrieb:
> Menue_mit_Encoder_Test.bin

So jetzt lachen wir mal ganz laut und herzlich über Deinen Witz.

bin != bas


Peter

von Florian H. (heringflorian)


Lesenswert?

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.

von Paul Baumann (Gast)


Lesenswert?

In Bascom gibt es auch den Befehl "ENCODER". Damit kann man sich die
Sache sehr vereinfachen, weil gleich auch entprellt wird.

MfG Paul

von Florian H. (heringflorian)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

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

von Florian H. (heringflorian)


Lesenswert?

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

von Falk B. (falk)


Lesenswert?

@  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!

von Florian H. (heringflorian)


Lesenswert?

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

von Dideldum42 (Gast)


Lesenswert?

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

von Frageknoedel (Gast)


Lesenswert?

>Mache das so nach Empfehlung von einem Bascom Fachbuch.

darf man fragen, welches?

von Bascom (Gast)


Lesenswert?

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.

von Christian F. (cmf) Benutzerseite


Lesenswert?

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.

von Werner A: (Gast)


Lesenswert?

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.

von Florian H. (heringflorian)


Lesenswert?

@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?

von Florian H. (heringflorian)


Lesenswert?

PS: Die Drehgeberauswertung für den ALPS Encoder habe ich ebenfalls aus 
diesem Buch

von Thorsten L. (Gast)


Lesenswert?

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

von Florian H. (heringflorian)


Lesenswert?

Im Kapitel Tasterprellen steht das. Ja verschiedene Möglichkeiten. Ich 
hab den Code genommen, der für den ALPS Encoder konzipiert worden ist.

von lösungssucher (Gast)


Lesenswert?

s.o.

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
Noch kein Account? Hier anmelden.