Hallo!
Vielen Dank für so schnelle Antworten !!! :)
Dann muss ich bei dem Mausrädchen bleiben (Durchmesser 10mm, Höhe 5mm).
MfG
Druckbare Version
Hallo!
Vielen Dank für so schnelle Antworten !!! :)
Dann muss ich bei dem Mausrädchen bleiben (Durchmesser 10mm, Höhe 5mm).
MfG
Zitat:
Zitat von Manf
Wie kommt ihr beiden auf unterschiedliche Größen??Zitat:
Zitat von Johannes G.
jon
Ich habe nachgemessen ;)
Und die Höhe hab ich mit den Pins gemessen...
Zitat:
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.
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
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 ;-)
uwegw, danke für den Code ;)