PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : ..blöder Drehknopf, jemand ne Idee?



sebastian.heyn
11.01.2005, 20:53
Hi, also folgendes Problem:

ich versuche die impulse von nem drehknopf zu entschlüsseln, das sollte eigentlich ganz einfach sein: er hat 3 pins:

1) zb: Masse
2) wenn drehung links dann wird dieser pin erst geändert von 1) nach OPEN und dann wieder nach 1)
3) wenn drehung rechts dann wird dieser pin erst geändert von 1) nach OPEN und dann wieder nach 1)
also je nach dem in welche richtung du das teil drehst wechselt der zustand an Pin 2 oder 3 zuerst (wenn ich das ding richtig verstanden habe)

jemand ne idee? ich habs mit 2 interrupts probiert (je nachdem welcher zuerst auslöst) aber das geht irgendwie nicht.

Felix G
11.01.2005, 21:26
Ich hab Drehimpulsgeber von Conrad, und dafür gibt es ein ganz ordentliches Datenblatt (http://www.produktinfo.conrad.com/datenblaetter/700000-724999/705538-da-01-ml-Drehimpulsgeber_Serie_427_DIL_de-en.pdf)

Auf Seite 6 steht nicht nur wie man das Ding anschliessen sollte, sondern auch wie man die Impulse auswerten kann

martin
11.01.2005, 21:32
Eigentlich reicht dafür ein Interrupt aus. Eines der Signale schließt du an einen Interrupt-Eingang (am besten mit Flanken-Erkennung), das andere an einen ganz gewöhnlichen Eingang. Bei Eintreten des Interrupts schaust du in der Interrupt-Routine nach, ob der andere schon High, bzw. Low ist. Daraus kannst du die Drehrichtung bestimmen.

Ich habe das bisher nur in C Programmiert, sollte aber in Basic nicht anders gehen.

Grüsse, Martin

sebastian.heyn
11.01.2005, 21:32
hatte das teil ausgeschlachtet und nur gesehen wie es vorher angeschlossen war. hast du einen bascom code dafür? funktioniert er? ich werd morgen mal probieren wie das beispiel mit dem 1 interrupt geht. ich muss mir angewöhnen nich so kompliziert zu denken.

JanB
12.01.2005, 06:43
Hallo,

Eigentlich reicht dafür ein Interrupt aus. Eines der Signale schließt du an einen Interrupt-Eingang (am besten mit Flanken-Erkennung), das andere an einen ganz gewöhnlichen Eingang. Bei Eintreten des Interrupts schaust du in der Interrupt-Routine nach, ob der andere schon High, bzw. Low ist. Daraus kannst du die Drehrichtung bestimmen.Diese Methode ist schön einfach und funktioniert einwandfrei.
Aber man erhält damit nur ein Viertel der möglichen Auflösung des Drehgebers.
Eine "volle" Auswertung der Drehgebersignale erfordert etwas mehr Aufwand.
Das lässt sich mir einem AVR am einfachsten und mit der geringsten Rechenzeit
mit einer kleinen State-Machine realisieren.

Gruß Jan


;für Atmel AtMega8
;Codebeispiel für vollständige Drehgehberauswertung.
;Die Signale A und B des Drehgebers
;sind an PortD Bit0 und Bit1 angeschlossen.
;in dgpos (R17) steht die aktuelle Drehgeberposition (8-Bit weit) .


.NOLIST
.INCLUDE "m8def.inc"
.LIST

.DEF temp = r16
.DEF dgpos = r17 ;Drehgeberposition
.DEF ast = r18 ;alter Zustand Drehgeber


dgstart:
ldi temp,0b00000011
out ddrd,temp ;Portd 0 und 1 auf Ouput setzen, Rest Input
in ast,portd ;einmal den aktuellen PortZustand holen
andi ast,0b00000011 ;Drehgeber-Bits maskieren
clr dgpos ;Drehgeber-Position auf 0 setzen

dgloop: in temp,portd ;aktuellen PortZustand holen
andi temp, 0b00000011 ;Drehgeber-Bits maskieren
lsl ast ;*2
lsl ast ;*2
add ast,temp ;alter Zustand mal 4 plus neuer Zustand
ldi ZL,low(dgtab<<1) ;Zeiger Z auf Tabellenanfang setzen
ldi ZH,high(dgtab<<1)
add ZL,ast ;zum Zeiger addieren
clr ast
adc ZH,ast
lpm ;Tabelleneintrag holen
add dgpos,r0 ;auf Position draufaddieren
mov ast,temp ;neuer Zustand wird alter Zustand
rjmp dgloop ;fertig


;Diese Tabelle enthält die Positionsänderungen
;des Drehgebers entsprechend der Zustandsänderungen
;der Drehgebersignale.
dgtab: .db 0,1,-1,0
.db -1,0,0,1
.db 1,0,0,-1
.db 0,-1,1,0


;Ende

Meissner
13.01.2005, 10:21
Es gibt dafür eine neue Funktion im BASCOM-AVR. Diese und einige anderen werden im meinem Buch BASCOM-AVR Sprachbefehle beschrieben.

Beispeil für dein Preblem habe ich nachfollgend aufgeführt.


ENCODER (>=1.11.7.7)

Beschreibung:
Liest den Pulse von einem Drehencoder aus.


Syntax:
Var = ENCODER(pin1, pin2, LeftLabel, RightLabel, wait)


Bemerkungen:
Var Die Zielvariable, die mit dem Ergebnis zugeordntet wird
Pin1 und Pin2 Das sind die Namen der PINs des Drehencoders deren Ausgänge verbunden werden.Beide Pins müssen an dem Selben PIN Register verbunden sein. Z.B. Pinb.0 und Pinb.7 ist korrekt, wogegen Pinb.0 und Pina.0 falsch ist.
LeftLabel Der Name des Bezeichners, das aufgerufen wird, wenn eine Drehung nach links ausgeführt wird.
RightLabel Der Name des Bezeichners, das aufgerufen wird, wenn eine Drehung nach rechts ausgeführt wird.
wait Der Wert 0 wird nur für Drehung/Puls überprüft. Der Wert 1 hält das Programm an bis der Benutzer an den Drehencoder wieder dreht.

· Der Bezeichner wird durch den Encoder aufgerufen und muss mit einer RETURN Anweisung abgeschlossen werden.
· Der Pin muss in Eingabe Modus definiert sein. Wird der Pin nicht explizit gesetzt arbeiten alle Pins in Eingabe Modus.
· Die Pull Up Wiederstände müssen durch das schreiben einer logischen 1 an den Portregistern, wie in dem Beispiel gezeigt, aktiviert werden.

Die Drehencoder werden in vielen Schaltungen eingesetzt. Einige Drehendoder werden auch als Schalter benützt. Ein Beispiel eines Drehencoders:

Seitdem die Mikroprozessoren interne Pull up wiederstände besitzen, werden keine Externe Pull up Wiederstände bei den meisten Encoders mehr gebraucht.


Beispiel:



'Ein Encoden hat 2 Ausgangspins und ein Massepin.
'Es werden die Ausgangspins mit Pinb.0 und Pinb.1 verbunden.
'Es können verschiedene Pins gewählt werden, solange sie an demselben 'Port sind.
'Die Pins müssen als Eingangspins konfiguriert sein.
'Diese Funktion arbeitet mit allen Pinregistern (Ports)

$regfile = "m128def.dat"
$baud = 19200
$crystal = 4000000

Print "Encoder Test"
Dim B As Byte
'wir haben ein Byte gedimmt, weil wir den Zustand des encoder aufrechterhalten möchten.

Portb = &B11 ' Aktivierung des Pull up Registers

Do
B = Encoder(pinb.0 , Pinb.1 , Links , Rechts , 1)
' ^--- 1 warte auf eine
Drehung
' ^--------^--------- Bezeichner die
aufgerufen werden
' ^-------^--------------------------- Port PINs
Print B
Waitms 10
Loop

End

'so, während Sie PINB0 und PINB7 wählen können, müssen beide Pins demselben Port angehören. Diese Funktion arbeitet mit allen Ports der PIN Registern.

Links:
Print "Drehung nach links"
Return

Rechts:
Print " Drehung nach rechts"
Return

End



Ansonsten viel Spass mit der Programmierung.

Gruß
Meissner

Otti20vt
28.05.2008, 10:02
Es gibt dafür eine neue Funktion im BASCOM-AVR. Diese und einige anderen werden im meinem Buch BASCOM-AVR Sprachbefehle beschrieben.

Beispeil für dein Preblem habe ich nachfollgend aufgeführt.


ENCODER (>=1.11.7.7)

Beschreibung:
Liest den Pulse von einem Drehencoder aus.


Syntax:
Var = ENCODER(pin1, pin2, LeftLabel, RightLabel, wait)


Bemerkungen:
Var Die Zielvariable, die mit dem Ergebnis zugeordntet wird
Pin1 und Pin2 Das sind die Namen der PINs des Drehencoders deren Ausgänge verbunden werden.Beide Pins müssen an dem Selben PIN Register verbunden sein. Z.B. Pinb.0 und Pinb.7 ist korrekt, wogegen Pinb.0 und Pina.0 falsch ist.
LeftLabel Der Name des Bezeichners, das aufgerufen wird, wenn eine Drehung nach links ausgeführt wird.
RightLabel Der Name des Bezeichners, das aufgerufen wird, wenn eine Drehung nach rechts ausgeführt wird.
wait Der Wert 0 wird nur für Drehung/Puls überprüft. Der Wert 1 hält das Programm an bis der Benutzer an den Drehencoder wieder dreht.

· Der Bezeichner wird durch den Encoder aufgerufen und muss mit einer RETURN Anweisung abgeschlossen werden.
· Der Pin muss in Eingabe Modus definiert sein. Wird der Pin nicht explizit gesetzt arbeiten alle Pins in Eingabe Modus.
· Die Pull Up Wiederstände müssen durch das schreiben einer logischen 1 an den Portregistern, wie in dem Beispiel gezeigt, aktiviert werden.

Die Drehencoder werden in vielen Schaltungen eingesetzt. Einige Drehendoder werden auch als Schalter benützt. Ein Beispiel eines Drehencoders:

Seitdem die Mikroprozessoren interne Pull up wiederstände besitzen, werden keine Externe Pull up Wiederstände bei den meisten Encoders mehr gebraucht.


Beispiel:



'Ein Encoden hat 2 Ausgangspins und ein Massepin.
'Es werden die Ausgangspins mit Pinb.0 und Pinb.1 verbunden.
'Es können verschiedene Pins gewählt werden, solange sie an demselben 'Port sind.
'Die Pins müssen als Eingangspins konfiguriert sein.
'Diese Funktion arbeitet mit allen Pinregistern (Ports)

$regfile = "m128def.dat"
$baud = 19200
$crystal = 4000000

Print "Encoder Test"
Dim B As Byte
'wir haben ein Byte gedimmt, weil wir den Zustand des encoder aufrechterhalten möchten.

Portb = &B11 ' Aktivierung des Pull up Registers

Do
B = Encoder(pinb.0 , Pinb.1 , Links , Rechts , 1)
' ^--- 1 warte auf eine
Drehung
' ^--------^--------- Bezeichner die
aufgerufen werden
' ^-------^--------------------------- Port PINs
Print B
Waitms 10
Loop

End

'so, während Sie PINB0 und PINB7 wählen können, müssen beide Pins demselben Port angehören. Diese Funktion arbeitet mit allen Ports der PIN Registern.

Links:
Print "Drehung nach links"
Return

Rechts:
Print " Drehung nach rechts"
Return

End



Ansonsten viel Spass mit der Programmierung.

Gruß
Meissner


Super! Danke für die Info =D>