PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Drehencoder von Pollin



Johannes G.
19.01.2007, 12:44
Hallo,

ich habe mir bei Pollin mal ein paar solche Teile mitbestellt: http://www.pollin.de/shop/shop.php?cf=detail.php&pg=OA==&a=Njg2OTU3OTk=&w=NDk3OTk4&ts=0

Weiß jemand ob und wie man die mit einem AVR benutzen kann?

Ich habe leider kein Oszi um mir das Protokoll genauer anzuschauen...


Viele Grüße,
Johannes

Jon
19.01.2007, 13:29
Ich kenn diese Teile zwar nicht, aber eventuell geht es. Und wenn nicht: das Teil ist nicht soo teuer.

jon

Johannes G.
19.01.2007, 13:32
Hallo,

gehen tut es bestimmt.. Nur wie ;)

Viele Grüße,
Johannes

Felix G
19.01.2007, 13:34
Wirf doch einfach mal nen Blick ins Datenblatt, da steht drin was das Ding für Signale ausgibt.

Andree-HB
19.01.2007, 13:51
Schaue mal hier :
https://www.roboternetz.de/phpBB2/zeigebeitrag.php?t=19220&highlight=drehencoder

vajk
19.01.2007, 14:08
.. Drehcoder haben keine Füße, die gehen nicht :-)
Sie funktionieren immer so, daß an zwei Pins ein zeitversetztes bzw. durch Drehung versetztes Signal rauskommt .. die Reihenfolge gibt die Drehrichtung an - also ein Pin auf Interrupt legen, wenn Interrupt, dann beide Pins auslesen, somit ist in einem Fall einer High oder eben beide, ja nach Drehrichtung .. und gut ... da das Pollinteil noch eine Taste hat, sinds folglich 5 Pins .. ggf. mußt DU noch softwaretechnisch die Tasten entprellen .. und gut is ...

Johannes G.
19.01.2007, 14:11
Andree-HB, danke für den Link ;)

Hat das schonmal jemand mit C versucht?

Viele Grüße,
Johannes

PICture
19.01.2007, 14:20
Hallo!

Ich habe bisher immer ein Scrollrad aus einer billigster Maus ausgeschlachtet. Das hat aber nur 3 Pins und die Grösse von einem Trimmpoti.

Wie gross ist eigentlich der Drehcoder vom Pollin ?

MfG

Manf
19.01.2007, 14:51
http://www.pollin.de/shop/shop.php?cf=detail.php&pg=OA==&a=Njg2OTU3OTk=&w=NDk3OTk4&ts=0

16,5 x 17 x 21,5 mm

Johannes G.
19.01.2007, 14:51
Hallo,

PICture: 16x16x30mm ;)

PICture
19.01.2007, 15:00
Hallo!

Vielen Dank für so schnelle Antworten !!! :)

Dann muss ich bei dem Mausrädchen bleiben (Durchmesser 10mm, Höhe 5mm).

MfG

Jon
19.01.2007, 15:43
16,5 x 17 x 21,5 mm

16x16x30mm ;)
Wie kommt ihr beiden auf unterschiedliche Größen??

jon

Johannes G.
19.01.2007, 15:56
Ich habe nachgemessen ;)
Und die Höhe hab ich mit den Pins gemessen...

Ratber
19.01.2007, 16:00
Hallo,

ich habe mir bei Pollin mal ein paar solche Teile mitbestellt: http://www.pollin.de/shop/shop.php?cf=detail.php&pg=OA==&a=Njg2OTU3OTk=&w=NDk3OTk4&ts=0

Weiß jemand ob und wie man die mit einem AVR benutzen kann?

Ich habe leider kein Oszi um mir das Protokoll genauer anzuschauen...


Viele Grüße,
Johannes


Kurze antwort:

Ja,die funktionieren genau wie alle anderen auch.
Ich hab mir letztes Jahr welche geholt und verbaut.
Die sind aber für spezielle Knöpfe gebaut so das du keine normalen anbringen kannst.

uwegw
19.01.2007, 17:31
Ich hab gerade einen eingebaut und in AVR-GCC programmiert. Der A-Kanal an einem externen Interrupt, der B-Kanal und der Taster auf normalen Eingängen des AVRs.

Das wesentliche läuft in der ISR ab:


ISR(INT1_vect)
{

if bit_is_clear(PIND,PIND3) //falling edge!
{
if bit_is_clear(PINC,encoder_pin) //linksrum
{
enc--;
enc_minus();
}
else
{
enc++;
enc_plus();
}
}
else //rising edge
{
if bit_is_clear(PINC,encoder_pin) //rechtsrum
{
enc++;
enc_plus();
}
else
{
enc--;
enc_minus();
}
}
}



Der Interrupt wird so eingestellt, dass er auf fallende und stegende Flanke auslöst:


//int1 (encoder): both edges
MCUCR|=(1<<ISC10);

Denn nur bei jedem zweiten Schritt gibt es eine fallende (bzw eine steigende) Flanke. In der ISR wird dann geprüft, welche Flanke nun gerade erkannt wurde.

Die ganze Pina als Eingänge mit Pullups einzustellen und das Auswerten des Tasters überlasse ich euch!

Ratber
19.01.2007, 19:09
Und für die Bascom-Fetischisten auch was einfaches zum Testen.


'Kleines Testprogramm für Encoder
'Verwendetes LCD hat 2x24 Zeichen
'Die beiden Leitungen sind mit ca. 200 Ohm als Pullup nach vcc gelegt
'Die Controllerpullups taugen hier nicht viel.
'Wegen der direkten Abfrage und gleichzeitigen LCD-Ausgabe
'ist die maximale erfassbare Geschwindigkeit recht gering.
'Je weniger das LCD genutzt wird desto höher kann man gehen.
'In der Praxis wäre aber ein Interruptbetrieb oder gleich ein externer Zähler Sinvoller.
'Als Demo zum Spielen reicht das aber erstmal aus.
'Gruß Ratber Roboternetz.de 2006
'PS: das ist wärend einer Ziggarette geschrieben also keine Wunder oder sowas erwarten. ;)



$regfile = "m8def.dat"
$crystal = 8000000
$baud = 300

$hwstack = 64
$swstack = 30
$framesize = 120

Dim A As Byte
Dim B As Byte

Config Lcdpin = Pin , Db4 = Portc.2 , Db5 = Portc.3 , Db6 = Portc.0 , Db7 = Portc.1 , E = Portd.7 , Rs = Portb.0
Config Lcd = 24 * 2
Initlcd
Cls
Cursor Off

Config Pind.5 = Input
Config Pind.6 = Input

Cls
Locate 1 , 1
Lcd "Encoder test"
A = 100 'irgendein Startwert
Locate 2 , 1
Lcd A

Main:
B = Encoder(pind.6 , Pind.5 , Rechts , Links , 1)
Goto Main

Links:
Decr A
Locate 1 , 14
Lcd B
Locate 2 , 1
Lcd A ; " Links "
Return

Rechts:
Incr A
Locate 1 , 14
Lcd B
Locate 2 , 1
Lcd A ; " Rechts "
Return

End

Nix weltbewegendes aber zum Ausprobieren reicht es ja.

wkrug
19.01.2007, 19:11
Ich hab sowas in Codevision für 2 Interrupts gemacht und den ATMEGA32. Läuft somit Quasi im Hintergrund.
Die Routine zählt zu einem Wert (li_frequ) entweder eine Variable (ui_increments) dazu oder zieht sie ab, je nach Drehrichtung.
Die Routine ist für einen optischen Drehencoder und hat deshalb keine Entprellung!


/* Called automaticly on INT 0 */
interrupt [2] void int0(void) {
unsigned char uc_port=0,uc_mcucr=0;
uc_port=PIND&0b00001000;
uc_mcucr=MCUCR&0b00000001;
if(uc_mcucr==0)
{
if (uc_port==8){
li_frequ=li_frequ+ui_increments;
}
else{
li_frequ=li_frequ-ui_increments;
}
MCUCR=MCUCR|0b00000011;
}
else{
if (uc_port==8){
li_frequ=li_frequ-ui_increments;
}
else{
li_frequ=li_frequ+ui_increments;
}
MCUCR=MCUCR&0b11111110;

}
refresh=1;
}

/* Called automaticly on INT 1 */
interrupt [3] void int1(void) {
unsigned char uc_port=0,uc_mcucr=0;
uc_port=PIND&0b00000100;
uc_mcucr=MCUCR&0b00000100;
if(uc_mcucr==0)
{
if (uc_port==4){
li_frequ=li_frequ-ui_increments;
}
else{
li_frequ=li_frequ+ui_increments;
}
MCUCR=MCUCR|0b00001100;
}
else{
if (uc_port==4){
li_frequ=li_frequ+ui_increments;
}
else{
li_frequ=li_frequ-ui_increments;
}
MCUCR=MCUCR&0b11111011;
}
refresh=1;
}

vajk
19.01.2007, 20:01
... und beachtet, daß nicht jeder INT auch beide Flanken auswerten kann -> Prozessorhandbuch ;-)

Johannes G.
20.01.2007, 11:02
uwegw, danke für den Code ;)