Ich hab Drehimpulsgeber von Conrad, und dafür gibt es ein ganz ordentliches Datenblatt
Auf Seite 6 steht nicht nur wie man das Ding anschliessen sollte, sondern auch wie man die Impulse auswerten kann
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.
Ich hab Drehimpulsgeber von Conrad, und dafür gibt es ein ganz ordentliches Datenblatt
Auf Seite 6 steht nicht nur wie man das Ding anschliessen sollte, sondern auch wie man die Impulse auswerten kann
So viele Treppen und so wenig Zeit!
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
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.
Hallo,
Diese Methode ist schön einfach und funktioniert einwandfrei.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.
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
Code:;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
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:
Code:'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
Zitat von Meissner
Super! Danke für die Info =D>
Lesezeichen