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:
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
Grüsse,
Michael
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
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