Dreh- Encoder

Grandpa

Aktives Mitglied
24. Juli 2008
1.038
1
38
Hannover
Sprachen
  1. BascomAVR
Hallo Zusammen,

gestern bekam ich von Cassio einen Encoder mit Pushbutton (Reichelt, STEC 12E06) mit dem Hinweis, daß immer 4 Takte ausgegeben werden.
Ha, Micha nicht dumm, hat das Geheimnis des Encoders gleich decodiert. Und nach Datenblatt je ein RC-Glied (10K/10nF) und einen 10K für den Push-Button nach Vcc angelötet.
Die Taktfolge 2-0-1-3 muss nur richtig abgefragt werden, dann geht's ohne Probleme (siehe Code). Die Null in der Zuweisung "_encoder = Encoder(pinb.1 , Pinb.2 , L , R , 0)" ist wichtig um über "if PINB.3=0" wieder rauszukommen.
Der Aufbau wie immer: Atmega8 - Master, Attiny85 1 + 2 - Slaves, je ein 7-Segment. Zur Kolntrolle wie immer die terminal- Ausgabe. In der Hauptschleife werden alle Pins abgefragt. Jedoch mit "if PINx.y..."; geht recht schnell und ohne Fehldrücke. Debounce gefiel mir nicht so gut. Die Funktion:
  • 1 x drücken: Routine aufrufen
  • Die Rundenanzahl -/+ (links/rechts) für bei Slots gleichzeitig einstellen
  • Gleichzeitig serielle Übertragung zu den Tinys
  • Nochmal drücken - Beenden bei gewünschter Einstellung
Die Tinys erhalten also bei jeder "Raste" ein Instruktionsbyte, gefolgt von einem Datenbyte mit der Rundenanzahl. Dabei ist Bit 0=0 der Tiny 1, Bit 0=1 der Tiny 2. Sind Bits 1-7 = 0, dann wissen die Tinys über Select...Case, daß sie die Ziffern an die 7-Segmente des Runden-Counters weiterleiten müssen. Bei dem Code &B0000_0010 würde Tiny 1 die erste Sektorzeit anzeigen, bei &B0000_0100 die 2. und so weiter. Da die Anzeige 2 ein klein wenig hängt (bedingt durch den Encoder), wäre &B1111_1111 für beide Slaves vielleicht etwas schneller, da ja nur 1 x über "Printbin #1" ausgegeben wird. Muss ich gleich mal probieren.

Wenn alle Instruktionen programmiert sind, wird nach dem Instruktionsbyte nur noch ein Datenfeld mit allen Variableninhalten (Counter, Sektor-/ Rundenzeit, schnellste Runde, Anzahl der Eeprom- Schreibzugriffe, etc. gesendet.

An dieser Stelle eine kurze Erklärung: Cassio wies mich darauf hin, daß viele vielleicht nicht wissen, was gemeint ist, wenn ich von "Slot" oder "Slotracer" spreche. Nun, Slotracer sind die Fahrzeuge meiner Rennbahn in 1/43 (Ja,ja - der berühmte, deutsche Sportwagen) und "Slots" die Fahrspuren. Die Fahrzeuge werden über einen Sitft in dem Fahrbahnschlitz geführt (Schlitz = Slot). In diesem Fall habe ich nichts gegen Anglizismen und ist bei uns Hobbyisten allgemein üblich.


Doch zurück zum Encoder. Da ich ja selbst weiss, daß sich µC- Anfänger immer etwas schwer tun, hier der Code-Auszug zum Dreh- Encoder:



CodeBox BASCOM

set_counter: ' Anzahl der Runden für Slot 1+2 einstellen
waitms 250
Print "Runden einstellen, " ; "Anzahl alt: " ; runden
open "comc.5:19200, 8 , n , 1" for output as #1
do
_encoder = Encoder(pinb.1 , Pinb.2 , L , R , 0)
_status = &B0000_0000
Printbin #1 , _status ; runden ' Instruktionsbyte/Datenbyte an Tinys 1
_status = &B0000_0001
Printbin #1 , _status ; runden ' Instruktionsbyte/Datenbyte an Tinys 2
loop until pinb.3 = 0 ' und wieder in die Mainloop
close #1
Print "Neue Anzahl Runden: " ; runden
waitms 250
return
''
R: ' Runden ++ (Rechtsdrehung)
while runden < 10 and _encoder = 2 'Encoder gedreht?
incr runden
_encoder = 0 ' Encoder nicht gedreht, sonst wird in einem Rutsch
'' hochgezählt '
Print "Encoder rechts, Runden: " ; runden
waitms 150 ' kleine Pause, sonst wird zu schnell
'' weitergezählt
wend
return
''
L: ' Runden -- (Linksdrehung)
while runden > 1 and _encoder = 1 '' s.o.
decr runden
_encoder = 3
Print "Encoder links, Runden: " ; runden
waitms 150
wend
return




Grüsse,

Michael
 
Hi Michael,

An dieser Stelle eine kurze Erklärung: Cassio wies mich darauf hin, daß viele vielleicht nicht wissen, was gemeint ist, wenn ich von "Slot" oder "Slotracer" spreche. Nun, Slotracer sind die Fahrzeuge meiner Rennbahn in 1/43 (Ja,ja - der berühmte, deutsche Sportwagen) und "Slots" die Fahrspuren. Die Fahrzeuge werden über einen Sitft in dem Fahrbahnschlitz geführt (Schlitz = Slot). In diesem Fall habe ich nichts gegen Anglizismen und ist bei uns Hobbyisten allgemein üblich.
sag doch einfach : Funktionsprinzip - Carrera-Bahn :D

Gruß
Dino
 
Hi Dino,

der berühmte, deutsche Sportwagen
war doch nur ein Scherz:D

Doch Cassio hat schon recht - nicht jeder weiss, was ein Slotracer ist. Aber gut, ich gelobe Besserung.


Grüsse,

Michael
 
Hi,

Da die Anzeige 2 ein klein wenig hängt (bedingt durch den Encoder), wäre &B1111_1111 für beide Slaves vielleicht etwas schneller, da ja nur 1 x über "Printbin #1" ausgegeben wird. Muss ich gleich mal probieren.
Wie erwartet - kein Hängen der Anzeige 2 mehr. Was so eine kleine Änderung doch ausmacht. Noch a bissel dran rumfeilen, dann brauch ich erstmal die schon erwähnte Erweiterung mit den 7-Segmenten und LCD's. An die geht's dann morgen - Kombination mit den 7ern

Grüsse, einen schönen Ostermontag und gute Nacht,

Michael
 
Hi Grandpa!

Dein Script wäre genau das was ich auch suchen würde.
Ich möchte mittels Drehencoder ein LCD-Menü realisieren und mich durch die einzelnen Menüpunkte schalten. Dazu habe ich das ganze folgend angepasst:

Code:
$regfile = "m8def.dat"
$crystal = 3686400

Config Portc = Output
Config Portd = Output
Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 ,
Config Lcdpin = Pin , Db7 = Portd.7 , E = Portd.3 , Rs = Portd.2
Config Lcd = 16 * 2
Cursor Off

Dim Auswahl As Byte
Dim _encoder As Byte

Portb = &B001110
Portc = &B000000
Auswahl = 1

Cls
Do
   _encoder = Encoder(pinb.1 , Pinb.2 , L , R , 0)

   Select Case Auswahl
      Case 1:
         Locate 1 , 1
         Lcd "1. 1541 ID      "
      Case 2:
         Locate 1 , 1
         Lcd "2. SD2IEC ID    "
      Case 3:
         Locate 1 , 1
         Lcd "3. TEST 1       "
      Case 4:
         Locate 1 , 1
         Lcd "4. TEST 2       "
      Case Else:
   End Select

   Locate 2 , 1
   Lcd _encoder
   If Pinb.3 = 0 Then Gosub Taste

Loop

R:
While Auswahl < 5 And _encoder = 2
   Incr Auswahl
   _encoder = 3
   Waitms 10
Wend
Return

L:
While Auswahl > 1 And _encoder = 1
   Decr Auswahl
   _encoder = 3
   Waitms 1
Wend
Return

Taste:
   Select Case Auswahl
      Case 1:
         Portc = &B000001
      Case 2:
         Portc = &B000010
      Case 3:
         Portc = &B000100
      Case 4:
         Portc = &B000111
      Case Else:
   End Select
Return

Grundsätzlich funktioniert das ganze auch bei mir wunderbar. Jedoch hackt das Menü etwas. Stell ich beim Encoder-Befehl statt 0 eine 1 ein, scrollt er besser, akzeptiert jedoch keine zusätzliche Taste mehr.

Hast du einen Tip für mich wie ich das verbessern könnte?
 
Hi DerSchatten,


Ändere mal im Sub R: _encoder=0 statt 3, so hatte ich es. Also 2 und 0, bei L: = 1 und 3
Eventuell die Wartezeit erhöhen.
Dann könntest Du versuchen, wie ich, die Menüauswahl erst durch Drücken des Knopfes zu aktivierten, geht gut mit einer Pause von 250ms bei der If-Abfrage, stört auch nicht.
Bei der "1" wird ja auf Drehen gewartet, das lief bei mir auch schlecht.

Der Durchlauf der Ziffern lief bei mir recht flüssig.


Grüsse,

Michael
 
Hi,

wenn ich den rechten Encoderwert auf 0 setze dann geht das drehen nach Rechts sehr mühsam.

0 ist ja der Zustand wenn der Encoder zwischen links und rechts steht.
2 wenn er nach rechts gedreht wird
1 wenn er nach links gedreht wird
3 wenn er still steht

Ich hab das ganze momentan so gelöst:

Code:
R:
If Auswahl < 5 And _encoder = 2 Then
   Incr Auswahl
   _encoder = 3
   Waitms 50
End If
Return

L:
If Auswahl > 1 And _encoder = 1 Then
   Decr Auswahl
   _encoder = 3
   Waitms 50
End If
Return

Also mit IF statt der WHILE-Abfrage. Damit gehts halbwegs, aber noch immer nicht flüssig. Ich muß erst 3 mal einrasten lassen bis er zum nächsten Menü springt. Die Pausen hab ich auch durchprobiert. Jeh höher umso länger muß ich drehen bis er weiterspringt. Im Grunde springt das Teil aber auch sporadisch unmotiviert herum.

Vielleicht fällt dir ja noch etwas dazu ein.
 
Hi,

hmm, ich war der Meinung, 0 und 3 wären jeweils Stillstand. Ich hatte mir die Werte der Variablen _encoder über Print im Terminalfenster anzeigen lassen.

Vielleicht fällt dir ja noch etwas dazu ein.
Ehrlich gesagt: Nicht mehr viel. Bei mir wird flüssig bei jeder Raste um eins erhöht oder erniedrigt; mit der eingestellten Programmversion.
Hast Du die empfohlenen Kondensatoren und Widerstände angelötet? Ich habe zwischen den Pins und Masse je einen 10nF und an den Pins zum Atmel je einen 10K, ebenso einen 10K vom Button- Pin zum Atmel.


Grüsse,

Michael
 
Hi,

anbei 2 Bilder des Encoders. Nicht sehr professionell gelötet; war ein Schnellschuss. Und mit Lochraster mach ich eh nichts. Zwischenzeitlich habe ich einen Vertikalen bestellt, ist besser auf dem Steckbrett.

- Cassio

Deine Leihgabe kommt auch mit.


Grüsse,

Michael
 

Anhänge

  • encoder 1.jpg
    encoder 1.jpg
    89,8 KB · Aufrufe: 68
  • encoder 2.jpg
    encoder 2.jpg
    75,9 KB · Aufrufe: 58
Hallo alle,

es machen denn nicht alle Encoder bei 30 Rastungen auch 30 Phasendurchläufe.
Manche machen auch 15 Phasendurchläufe bei 30 Rastungen. Also so, als ob
du bei einem mit 30/30 zwischen den Rastungen stehen bleiben würdest. Sieh
dir mal das Datenblatt zu deinem an. Meiner, den ich hier habe, macht 24/24
und ist ein EC12E von Alps (Reichelt). Datenblatt ist hier ...
Anhang anzeigen STEC12E_Alps_Encoder.pdf
Ich hab den ohne Gewinde und mit langer Achse und Drucktaste.

Mit nem selbst gestricktem Assembler Programm und hardwareseitiger
Mini-Entprellung läuft das Teil relativ gut. Ich bin soweit zufrieden.
100nF über den Kontakten und 5,6k nach Plus.

Gruß
Dino
 
Hi Dino,

meiner ist ein STEC12 E06, 24/24, von Reichelt. Ich kann nur sagen, daß ich gleich nach Datenblatt angeschlossen und die 4 Codes rausgefunden habe. Dann hat's sofort flüssig gefunzt. Eventuell fehlen bei DerSchatten nur die Bauteile am Encoder. Mal abwarten, bis er antwortet.


Grüsse,

Michael
 
Hallo,

aus dem Datenblatt werde ich leider nicht sehr schlau.
Ich habe diesen hier: Drehimpulsgeber EC12E2 , ebenfalls von ALPS.

Die von euch vorgeschlagenen Widerstände und Kondensatoren habe ich noch nicht dazwischengesetzt. Muß mir erst diese Teile besorgen. Aber macht denn das wirklich so einen gravierenden Unterschied?

Grandpa, hättest du denn die Möglichkeit das ganze bei dir nachzustellen?
 
Hi,

Die von euch vorgeschlagenen Widerstände und Kondensatoren habe ich noch nicht dazwischengesetzt. Muß mir erst diese Teile besorgen. Aber macht denn das wirklich so einen gravierenden Unterschied?
Ich habe es ohne die RC-Glieder gar nicht erst probiert. Vermutlich schon, die müssen wie eine Entprellung wirken oder das beschriebene "Chattering", Rattern, rausfiltern. Ich werde einen Encoder mal ohne die Bauteile ausprobieren. Ehrlich gesagt, wollte ich da nicht so tief einsteigen. Wenn eine Idee funktioniert, wird das Breadboard gesäubert für die Nächste.
Grandpa, hättest du denn die Möglichkeit das ganze bei dir nachzustellen?
Schon, da müßte ich aber erst ein LCD vorbereiten. Hat's ein paar Tage Zeit? Wenn ja, Deinen Code bitte anhängen. Copy und Paste ist Murks.


Grüsse,

Michael
 
Hi,

so geht's. Flüssig ein Menupunkt +/- pro Raste. Einen Encoder ohne RC- Glieder habe ich nicht mehr probiert.


Grüsse,

Michael
 

Anhänge

  • encoder_test.BAS
    1,8 KB · Aufrufe: 102
Probleme mit Dreh-Encodern bei BASCOM

Hallo zusammen ,

da ab und zu mal wieder Probleme mit den Encodern auftreten und ich
zwischendurch beim stöbern zufällig was gefunden habe möchte ich es euch
natürlich nicht vorenthalten :D

Im RoboterNETZ :
RN-Wissen / Bascom Inside-Code / (Quadratur-) ENCODER

Da steht unter anderem folgendes ...
ADD r24,r20 ' OLD + NEW
'------------------------------------------------------------------------------
' jetzt stehen in r24 alter UND neuer Wert
' &B00ab00AB
'------------------------------------------------------------------------------
' Aus Alt & Neu läßt sich eindeutig aus allen 4 Phasen die Drehrichtung ermitteln
' Bascom checkt nur explizit auf die eine Richtung. Denn wenn's die nicht ist, muß es
' ja wohl die andere sein.
'------------------------------------------------------------------------------
' Achtung: daraus folgt: wenn die Impulse zu schnell kommen, stimmen
' die Ergebnisse u.U. NICHT !
' Was vielleicht schlimmer ist: Man merkt es auch nicht
'------------------------------------------------------------------------------
CPI r24,0x02

Das erklärt auch einige Ungereimtheiten bei Programmen die immer mal wieder
hier im Forum auftreten. Evtl sollte man also eine andere Bibliothek für den
Dreh-Encoder benutzen (wenn es denn eine gibt) oder eine Kontrolle auf
Plausibilität der Ergebnisse durchführen (wenn es denn geht).

Das letzte Problem, das in der Richtung sein könnte, war von crischan.
Siehe hier ...
ab einer gewissen U/min kann mein atmega32 die drehrichtung nicht mehr richtig ausgeben
im Thread "Kondensatoren frage" (Elektronik / Allgemeines).

Gruß
Dino
 
Hallo,

ich habe einige Zeit mit Wartezeiten rumgespielt, dann hat's irgendwann mit WAITMS 150 sauber funktioniert (nach Drücken des Buttons und vor der Drehung nochmals WAITMS 250). Ich habe echt keine Probleme mit dem Encoder. Das mag mit einem anderen Produkt vielleicht anders aussehen; vielleicht liegt's auch an dem Einen oder Anderen LCD, weiss ich nicht.


:offtopic:
Und da ich grade online bin: Pfingstmontag wird noch mal ausgeruht, ab Dienstag begebe ich mich dann in den Umzugs- und Renovierungsstress.
D. h., der Rechner bleibt dann immer öfter aus bis zur Netztrennung (wann genau weiss ich noch nicht), die wohl so bis Anfang August dauern wird.


Grüsse,

Michael
 
Hi Michael,

ich habe einige Zeit mit Wartezeiten rumgespielt, dann hat's irgendwann mit WAITMS 150 sauber funktioniert (nach Drücken des Buttons und vor der Drehung nochmals WAITMS 250). Ich habe echt keine Probleme mit dem Encoder. Das mag mit einem anderen Produkt vielleicht anders aussehen; vielleicht liegt's auch an dem Einen oder Anderen LCD, weiss ich nicht.
ich hab mir ja ne eigene Encoder-Routine in ASM gebaut. In Bascom hab ich
da also noch nix getestet. Wer weiß was da tlw alles zusammen kommt.

:offtopic:
Und da ich grade online bin: Pfingstmontag wird noch mal ausgeruht, ab Dienstag begebe ich mich dann in den Umzugs- und Renovierungsstress.
D. h., der Rechner bleibt dann immer öfter aus bis zur Netztrennung (wann genau weiss ich noch nicht), die wohl so bis Anfang August dauern wird.
Denn man viel Spaß :eek: :rolleyes:
Umzug mußte ich noch nicht machen. Aber Renovierung ist echt ätzend.
Vor allem dieser Kleinkram wo man nicht sieht das da wirklich Stunden drin
stecken.

Gruß
Dino
 
Hi Dino,

Aber Renovierung ist echt ätzend.
Stimmt. Ich möchte mich jetzt nicht über die typische Murkserei der Vormieter auslassen. 'nen Hals hab ich jetzt schon, wir haben am Samstag doch schon angefangen. Ich könnte k...
Da werden 6 Wochen aber knapp, hab ja auch nicht jeden Tag Zeit. Das wir sowas wie eine Mini- Grundrenovierung. 3 Etagen plus (Hobby-:D:D)Keller...


Grüsse,

Michael.
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)