PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Problem mit Encoder



digitali
12.02.2006, 23:03
Hallo,

ich hab da ein merkwuerdiges Problem. Vielleicht ist es auch keins und ich bin einfach nur zu doof. :)
An einem ATMega8 habe ich einen Drehimpulsgeber angeschlossen. Je nach Drehrichtung wird dann die eine oder andere LED kurz eingeschaltet. Das funktioniert auch soweit bestens.
Durch den Druck auf die Achse des Impulsgebers kann ich noch eine zusaetzliche Schaltfunktion ausloesen (Enter). Und genau da ist mein Problem: Ich schaffe es einfach nicht diese daemliche Taste abzufragen und damit eine LED kurz einzuschalten:

-------------------------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 16000000
Config Portc = Output
Config Portd = Input

Dim B As Byte
Portd = 255

Do
Portc = &B11111111
B = Encoder(pind.1 , Pind.0 , Links , Rechts , 1)

If Pind.2 = 0 Then 'Abfrage der Enter-Taste
Gosub Enter
End If

Waitms 5
Loop

End

Links:
Portc = &B11110111 'LED an Pind.3
Waitms 5
Return

Rechts:
Portc = &B11101111 'LED an Pind.4
Waitms 5
Return

Enter:
Portc = &B11011111 'LED an Pind.5
Waitms 5
Return
-------------------------------------------------------------------------------

Sobald ich die Zeile "B = Encoder(pind.1 , Pind.0 , Links , Rechts , 1)" rausnehme, kann ich komischerweise die Schaltfunktion wunderbar ausloesen. Ist sie wieder aktiv, wird die darunterliegende if-then Schleife nicht mehr abgearbeitet.
Ehrlich gesagt bin ich einwenig ratlos. Hat da jemand ne Idee?

Mit freundlichen Gruessen
Digitali

astro9481
12.02.2006, 23:17
Bin mir da jetzt nicht ganz sicher(habe gerade erst abgefangen mit Bascom)
Aber das problem wird sein das du immer das komplette Ausgangsbyte setzt.
Versuch mal in der Anweisung
links
Portc.3=1 anstatt Portc = &B11110111
rechts
Portc.4=1 anstatt Portc = &B11101111
Enter
Portc.5=1 anstatt Portc = &B11011111

ich denke das dadurch die anderen Werte nicht mehr überschreiben werden. Ich hoffe du verstehst was ich meine.

Da du immer das ganze Ausgangsbyte setzt, werde immer die anderen Werte überschrieben.
Und da wenn diese eineZeile nicht aktiv ist die anderen Werte nicht gesetzt werden, klappt das wenn die Zeile nicht aktiv ist.

Ciao Marco

digitali
12.02.2006, 23:40
Hm, ich hab's mal schnell entsprechend geaendert. Leider kein Erfolg. :(
Irgendwie blockiert die Abfrage des Encoders die nachfolgende if-then Schleife.

-------------------------------------------------------------
$regfile = "m8def.dat"
$crystal = 16000000
Config Portc = Output
Config Portd = Input

Dim B As Byte
Portd = 255
Portc = 255

Do
B = Encoder(pind.1 , Pind.0 , Links , Rechts , 1)

If Pind.2 = 0 Then
Gosub Enter
End If

Waitms 5
Loop

End

Links:
Portc.3 = 0
Waitms 5
Portc.3 = 1
Return

Rechts:
Portc.4 = 0
Waitms 5
Portc.4 = 1
Return

Enter:
Portc.5 = 0
Waitms 5
Portc.5 = 1
Return

astro9481
12.02.2006, 23:52
Mach mal den letzten Befehl beim encode auf 0.

und warum setzt du den jeweligen port erst auf 0 und dann auf 1.
Dann würden die LEds ja die ganze zeit an sein und ausgehen wenn das signal anliegt?
Und sieht man die 5ms überhaupt?

EDIT: Wenn ich das richtig verstanden habe hält das programm solange sich den encoder nicht dreht wenn der letzte Wert auf 1 ist.

digitali
13.02.2006, 00:08
< Mach mal den letzten Befehl beim encode auf 0.

Danke! Das funktioniert! Da muss man erstmal drauf kommen.
Die LED’s haben in meinem Falle eine gemeinsame Anode. Ich ziehe mit Portc.x = 0 die Leitung gegen Masse. Und die LED leuchtet. Die 5ms kann man noch einigermassen sehen. Aber darum geht’s mir eigentlich auch nicht. Spaeter werde ich die Richtungsimpulse mit einem anderen ATMega128 auswerten. Den Drehimpulsgeber brauche ich hier zur Eingabe von Ziffern. Ein kleines GPS mit Eingabe von Koordinaten und Pfeilnavigation soll hieraus entstehen. Ein Tastenfeld wollte ich mir sparen. Nimmt zuviel Platz ein. Daher die Idee mit dem Drehimpulsgeber.

Danke nochmals!

Mit freundlichen Gruessen
Digitali

astro9481
13.02.2006, 00:11
Kein Problem, wenn ich helfen kann mache ich das natürlich. HAbe ja auch schon mehr als einen guten Tip hier erhalten.
Was hast du genau vor? Gibts da schon was vorzeugbares. Mit dem GPS Modul meine ich.
Und welchen Drehgeber hast du benutzt?

digitali
13.02.2006, 00:29
"Digiswitch 427" heisst der Geber. Den gibt’s fuer teures Geld momentan bei Conrad. :)

Was Vorzeigbares gibt's noch nicht. Ich bin momentan dabei die einzelnen Programmteile zu erstellen. Mit nem ATMega128 werde ich eine GPS-Mouse auswerten. Durch Eingabe einer zweiten Zielkoordinate berechnet der AVR dann laufend den Winkel und die Distanz zwischen den Koordinaten. Das ganze wird natuerlich auch auf einem 128x128 GLCD dargestellt.
Distanz und Winkelberechnung:
http://www.speckmann.de/atmel/koordinatenberechnung.htm
Anzeige einer einfachen Pfeilnavigation mit Vorgabe des Winkels:
http://www.speckmann.de/atmel/gps_test.htm

Ich bin aktiver Geocacher ( http://www.geocaching.de ) und das soll vielleicht mal als Festeinbau ins Auto. Zu sehen soll nur das GLCD und dezent der Drehimpulsgeber zur Eingabe der Koordinaten sein. Klar, ich habe auch ein Hand-GPS von Garmin, aber als AVR-Freak kam mir die Idee mit dem Selbstbau. :)

Mit freundlichen Gruessen
Digitali