Zitat von ManfWie kommt ihr beiden auf unterschiedliche Größen??Zitat von Johannes G.
jon
Hallo!
Vielen Dank für so schnelle Antworten !!!
Dann muss ich bei dem Mausrädchen bleiben (Durchmesser 10mm, Höhe 5mm).
MfG
Zitat von ManfWie kommt ihr beiden auf unterschiedliche Größen??Zitat von Johannes G.
jon
Nice to be back after two years
www.roboterfreak.de
Ich habe nachgemessen
Und die Höhe hab ich mit den Pins gemessen...
Zitat von Johannes G.
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.
Gruß
Ratber
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:
Code: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:
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.Code://int1 (encoder): both edges MCUCR|=(1<<ISC10);
Die ganze Pina als Eingänge mit Pullups einzustellen und das Auswerten des Tasters überlasse ich euch!
Und für die Bascom-Fetischisten auch was einfaches zum Testen.
Nix weltbewegendes aber zum Ausprobieren reicht es ja.Code:'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
Gruß
Ratber
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!
Code:/* 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; }
... und beachtet, daß nicht jeder INT auch beide Flanken auswerten kann -> Prozessorhandbuch
Ich kann mir keine Signatur leisten - bin selbständig!
uwegw, danke für den Code
Lesezeichen