// Encoder drift. optical relative encoder
// https://forum.arduino.cc/t/encoder-drift-optical-relative-encoder/1336482
int counter = 0;
// Gestionnaire pour D8 et D9 (port B)
ISR(PCINT0_vect) {
static uint8_t pins = (PINB & 0b00000011) << 2;
static const int8_t offset[] = {0, -1, 1, 0, 1, 0, 0, -1, -1, 0, 0, 1, 0, 1, -1, 0};
// static uint8_t symbolArray[] = {'x', '<', '>', 'x', '>', 'x', 'x', '<', '<', 'x', 'x', '>', 'x', '>', '<', 'x'};
pins |= PINB & 0b00000011;
counter += offset[pins];
// uint8_t symbol = symbolArray[pins];
pins &= 0b00000011;
pins <<= 2;
}
// Gestionnaire pour D3 (INT1)
ISR(INT1_vect) {
Serial.write(' ');
Serial.print(counter);
Serial.write(' ');
}
void setup() {
// Configurer les broches D3, D4 et D5 en entrée avec pull-up
DDRD &= ~(1 << PD3); // Configurer D3 en entrée
PORTD |= 1 << PD3; // Activer la résistance pull-up
// Configurer les broches PB0 et PB1 (D8 et D9) en entrée avec pull-up
DDRB &= ~((1 << PB0) | (1 << PB1)); // Configurer PB0 et PB1 en entrée
PORTB |= (1 << PB0) | (1 << PB1); // Activer les résistances pull-up sur PB0 et PB1
// Configurer les interruptions pour PB0 et PB1 (port B)
PCICR |= (1 << PCIE0); // Activer les interruptions pour le port B
PCMSK0 |= (1 << PCINT0) | (1 << PCINT1); // Activer PB0 (PCINT0) et PB1 (PCINT1)
// Configurer la broche D3 pour interruption sur front descendant
EICRA |= (1 << ISC11); // Configurer INT1 pour front descendant
EICRA &= ~(1 << ISC10); // ISC10 = 0
EIMSK |= (1 << INT1); // Activer INT1
// Initialisation série pour debug
Serial.begin(115200);
Serial.println(F(__FILE__));
Serial.println(F(__DATE__));
Serial.println(F("Appuyer sur le bouton pour afficher Counter !"));
// Appeler la routine ISR(PCINT2_vect) via pointeur
// void (*isrPtr)() = (void (*)())0x0006; // Pointeur vers l'adresse 0x0006
void (*isrPtr)() = (void (*)())0x0006; // Pointeur vers l'adresse 0x0006
isrPtr(); // Appeler la routine à l'adresse 0x0006 pour valider les static
}
void loop() {
// Boucle principale
}