D
Daniel Schramm
Guest
Hallo,
ich stehe gerade vor dem Problem, dass ich einen Alps Drehimpulsgeber nicht
ordentlich ausgewertet kriege.
Bei einem Exemplar von Grayhill habe ich dagegen keine Probleme.
Der Grayhill zeigt exakt das Verhalten, das auch in der DSE-FAQ beschrieben
ist. Der von Alps dagegen hat nur folgende moegliche Stellungen:
Rechtsdrehung: 00->10->01
Linksdrehung: 00->01->10
Die 11 fehlt also komplett. Die Stellung 00 ist zwischen 2 Rastungen
untergebracht, soll also beim durchlaufen ueberhoert werden.
Der Fehler aeussert sich so, dass in Drehrichtung links nur jede 2.
Rasterstellung gezaehlt wird und bei Rechtsdrehung wilde Spruenge in sowohl
positive, als auch negative Richtung auftreten... *verzweifel*
Das ganze steckt mal wieder an einem Atmel Mega128 und soll
Interrupt-gesteuert ausgewertet werden. Mein Quellcode fuer den
Alps-Encoder sieht wie folgt aus:
(AVR-GCC)
Danke fuer Eure Hilfe
Daniel
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include "src/global.h"
#include "src/common/enc.h"
s08 encTable[16]={0,-1,+1,0,0,0,-1,0,0,+1,0,0,0,0,0,0};
s16 encPosition=0;
u08 status=0;
u08 quadrature_value = 0;
s16 encMin=1;
s16 encMax=6;
s16 encoderGetPosition(void) {
return ( encPosition );
}
void encoderSetPosition(s16 position) {
encPosition = position;
}
void encoderInit(void) {
// configure encoder direction pins for input
cbi(DDRE, 6);
cbi(DDRE, 7);
// apply pullup resistors to direction inputs
sbi(PORTE, 6);
sbi(PORTE, 7);
cbi(EICRB, ISC61);
cbi(EICRB, ISC71);
sbi(EICRB, ISC60);
sbi(EICRB, ISC70);
quadrature_value=inp(PINE)>>6;
//enable interrupts
outp((1<<INT6)|(1<<INT7), EIMSK);
sei();
}
void encoderRange(s16 min, s16 max) {
encMin = min;
encMax = max;
}
SIGNAL (SIG_INTERRUPT6) {
quadrature_value=( (quadrature_value << 2) | ( inp(PINE) >> 6 ) ) &
0x0f;
encPosition+=encTable[quadrature_value];
if ( encPosition > encMax ) {
encPosition = encMin;
} else if (encPosition < encMin)
encPosition = encMax;
}
SIGNAL (SIG_INTERRUPT7) {
quadrature_value=( (quadrature_value << 2) | ( inp(PINE) >> 6 ) ) &
0x0f;
encPosition+=encTable[quadrature_value];
if ( encPosition > encMax ) {
encPosition = encMin;
} else if (encPosition < encMin)
encPosition = encMax;
}
--
.~. Daniel Schramm Phone: +49 231 6108112 Mail:daniel.schramm@gmx.de
/V\ Bruehlweg 36 Mobile:+49 178 8839848 ICQ: 35816985
// \\ 44379 Dortmund Fax: +49 231 96989961 WWW: pinguin.sauerland.de
/( )\ Germany
^`~'^
ich stehe gerade vor dem Problem, dass ich einen Alps Drehimpulsgeber nicht
ordentlich ausgewertet kriege.
Bei einem Exemplar von Grayhill habe ich dagegen keine Probleme.
Der Grayhill zeigt exakt das Verhalten, das auch in der DSE-FAQ beschrieben
ist. Der von Alps dagegen hat nur folgende moegliche Stellungen:
Rechtsdrehung: 00->10->01
Linksdrehung: 00->01->10
Die 11 fehlt also komplett. Die Stellung 00 ist zwischen 2 Rastungen
untergebracht, soll also beim durchlaufen ueberhoert werden.
Der Fehler aeussert sich so, dass in Drehrichtung links nur jede 2.
Rasterstellung gezaehlt wird und bei Rechtsdrehung wilde Spruenge in sowohl
positive, als auch negative Richtung auftreten... *verzweifel*
Das ganze steckt mal wieder an einem Atmel Mega128 und soll
Interrupt-gesteuert ausgewertet werden. Mein Quellcode fuer den
Alps-Encoder sieht wie folgt aus:
(AVR-GCC)
Danke fuer Eure Hilfe
Daniel
#include <avr/signal.h>
#include <avr/interrupt.h>
#include <avr/io.h>
#include "src/global.h"
#include "src/common/enc.h"
s08 encTable[16]={0,-1,+1,0,0,0,-1,0,0,+1,0,0,0,0,0,0};
s16 encPosition=0;
u08 status=0;
u08 quadrature_value = 0;
s16 encMin=1;
s16 encMax=6;
s16 encoderGetPosition(void) {
return ( encPosition );
}
void encoderSetPosition(s16 position) {
encPosition = position;
}
void encoderInit(void) {
// configure encoder direction pins for input
cbi(DDRE, 6);
cbi(DDRE, 7);
// apply pullup resistors to direction inputs
sbi(PORTE, 6);
sbi(PORTE, 7);
cbi(EICRB, ISC61);
cbi(EICRB, ISC71);
sbi(EICRB, ISC60);
sbi(EICRB, ISC70);
quadrature_value=inp(PINE)>>6;
//enable interrupts
outp((1<<INT6)|(1<<INT7), EIMSK);
sei();
}
void encoderRange(s16 min, s16 max) {
encMin = min;
encMax = max;
}
SIGNAL (SIG_INTERRUPT6) {
quadrature_value=( (quadrature_value << 2) | ( inp(PINE) >> 6 ) ) &
0x0f;
encPosition+=encTable[quadrature_value];
if ( encPosition > encMax ) {
encPosition = encMin;
} else if (encPosition < encMin)
encPosition = encMax;
}
SIGNAL (SIG_INTERRUPT7) {
quadrature_value=( (quadrature_value << 2) | ( inp(PINE) >> 6 ) ) &
0x0f;
encPosition+=encTable[quadrature_value];
if ( encPosition > encMax ) {
encPosition = encMin;
} else if (encPosition < encMin)
encPosition = encMax;
}
--
.~. Daniel Schramm Phone: +49 231 6108112 Mail:daniel.schramm@gmx.de
/V\ Bruehlweg 36 Mobile:+49 178 8839848 ICQ: 35816985
// \\ 44379 Dortmund Fax: +49 231 96989961 WWW: pinguin.sauerland.de
/( )\ Germany
^`~'^