.. das ich die Encoder noch nicht vernünftig auslesen kann .. Am Ende sind es doch 2 einfach digitale Eingänge pro Encoder? ..
Genau. Das Arbeiten der Encoder sieht ungefähr so aus - klick. Meine Dokumentation zur Auswertung sieht so aus - nochnklick - die Farbenliste [White] bis [Red] bezieht sich auf das Kabel für den Motoranschluss!!
Mit Java kann ich ja nu nicht helfen, aber vielleicht bietet Dir (m)ein C-Code-Schnippsel ne Hilfe oder zumindest nen Anhaltspunkt ? Wobei hier für Dich eher nur die IencdrX-Werte für die (Teil)Umdrehungen/Drehwinkel und die tmrEx-Werte für die Drehzahlmessung von Interesse sind.
Code:
// ============================================================================= =
// === Initialisierung der externen Interrupts bei m1284, doc 8272D-AVR-05/12
// EXT_INT0 auf PORTD2 Pin 16 -- Encoder IencB0 auf PINC 2 Pin 24 und
// EXT_INT1 auf PORTD3 Pin 17 -- Encoder IencB1 auf PINC 3 Pin 25
// ============================================================================= =
void XTI_0_1_init( void ) // Initialisiere beide Interrupts auf RISING edge
{ // => EICRA ISC00/~01 + ~10/~11 auf 1 doc S68
EICRA |= (1<<ISC01)|(1<<ISC00); // INT0 triggert auf RISING edge
EICRA |= (1<<ISC11)|(1<<ISC10); // INT1 triggert auf RISING edge
EIMSK |= (1<<INT0) | (1<<INT1); // erlaube INT0 und INT1 in EIMSK
// Initialisierung der Zeiten:
Iencdr0 = Iz_diff0 = Iz_yseci0 = Iz_ysecv0 = 0;
Iencdr1 = Iz_diff1 = Iz_yseci1 = Iz_ysecv1 = 0;
tmrE0 = tmrE1 = 0; // Timer für Drehzahlerfassung
} // Ende von void XTI_0_1_init( void )
// ============================================================================= =
// ============================================================================= =
// === Nicht unterbrechbare ISR für EXT_INT0 auf mega1284 ================ =
// Der Timer tmrE0 für Laufzeit des EXT_INT0 wird ausgelesen
ISR(INT0_vect) // INT0 triggert auf RISING edge =>
{ // => Wenn Aufruf, dann PORTD2 = high
// ToggleBit (PTLED, LCr); // rtLED toggeln
// - - - - - - - - - - - - - - - -
// Encoderticks Iencdrx nur hochzählen, IencBx rauf- od runterzählen
Iz_diff0 = tmrE0; // Hier die Zeit (in x 50µs-tupsi) seit letztem ISR-Aufruf
tmrE0 = 0; // Resetten ##>> IN der ISR ohne CLI/SEI möglich
Iencdr0 ++; // Incrementiere Encodercounter, zählt NUR aufwärts
if (IsBitSet (PINC, 2)) IencB0++; // Rad treibt vorwärts, math. negativ
else IencB0--; // Rad treibt rückwärts, math. positiv
} // Ende ISR(INT0_vect)
// ============================================================================= =
// ============================================================================= =
// === Nicht unterbrechbare ISR für EXT_INT1 auf mega1284 ================ =
// Routine setzt einfach einen Zähler hoch.
// Sonst wie ISR für EXT_INT0 für Motor li,re und PWM/Geschw.
ISR(INT1_vect) // hiess mal: ISR(SIG_INTERRUPT1)
{ //
// ToggleBit (PTLED, LCr); // rtLED toggeln
// - - - - - - - - - - - - - - - -
// Encoderticks Iencdrx nur hochzählen, IencBx rauf- od runterzählen
Iz_diff1 = tmrE1; // Hier die Zeit (in x 50µs-tupsi) seit letztem ISR-Aufruf
tmrE1 = 0; // Resetten ##>> IN der ISR ohne CLI/SEI möglich
Iencdr1 ++; // Incrementiere Encodercounter, zählt NUR aufwärts
if (IsBitSet (PINC, 3)) {IencB1--;} // Rad treibt rückwärts (math. positiv)
else {IencB1++;} // Rad treibt vorwärts (math. negativ)
} // Ende ISR(INT1_vect)
// ============================================================================= =
Lesezeichen