From 3dafc11535fe98137aee6f82695e4551cc797a53 Mon Sep 17 00:00:00 2001 From: Eggert Jung Date: Sun, 1 Dec 2019 20:54:24 +0100 Subject: [PATCH] interprete encoder quadrature signals correctly --- code/src/encoder.c | 69 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ code/src/main.c | 46 +++++++++++++++++++----------------- code/src/menu.c | 7 ------ 3 files changed, 93 insertions(+), 29 deletions(-) create mode 100644 code/src/encoder.c diff --git a/code/src/encoder.c b/code/src/encoder.c new file mode 100644 index 0000000..d717439 --- /dev/null +++ b/code/src/encoder.c @@ -0,0 +1,69 @@ +#include +#include + +#define ENC_PORT PORTD +#define ENC_DDR DDRD +#define ENC_A PIND&(1<<2) +#define ENC_B PIND&(1<<4) +#define ENC_CCW 0 +#define ENC_CW 1 + +void encoder_action(uint8_t dir); + +volatile uint8_t encoder_direction; + +ISR(INT0_vect) +{ + if (ENC_B) + { + if (ENC_A) + { + encoder_direction = ENC_CCW; + encoder_action(0); + } + else + { + encoder_direction = ENC_CW; + } + } + else + { + if (ENC_A) + { + encoder_direction = ENC_CW; + } + else + { + encoder_direction = ENC_CCW; + encoder_action(0); + } + } +} + +ISR (PCINT3_vect){ + if (ENC_B) + { + if (ENC_A) + { + encoder_direction = ENC_CW; + encoder_action(1); + } + else + { + encoder_direction = ENC_CCW; + } + } + else + { + if (ENC_A) + { + encoder_direction = ENC_CCW; + } + else + { + encoder_direction = ENC_CW; + encoder_action(1); + } + } +} + diff --git a/code/src/main.c b/code/src/main.c index c4505c5..23b8ce9 100644 --- a/code/src/main.c +++ b/code/src/main.c @@ -41,6 +41,20 @@ int8_t parse_nmea_gps(char input_string[RX_INPUT_BUFFER_SIZE], uint8_t output_bu return -1; } +void encoder_action(uint8_t dir){ + if (dir) { + if(get_menu_active()) + menu_up_down(1); + else + OCR2A++; + } else { + if(get_menu_active()) + menu_up_down(-1); + else + OCR2A--; + } +} + int main(void){ setup(); printf("Moin\n\r"); @@ -134,14 +148,18 @@ void setup(){ //-------------------------- //External Interrupt Mask Register - EIMSK |= (1 << INT0) | //Aktiviere Interrupt INT0 - (1 << INT1); //Aktiviere Interrupt INT1 + EIMSK |= (1 << INT0) //Aktiviere Interrupt INT0 + | (1 << INT1); //Aktiviere Interrupt INT1 //External Interrupt Control Register A - EICRA |= (0 << ISC10) | //Interrupt bei jedem Pegelwechsel auf INT1 - (1 << ISC11) | - (1 << ISC00) | //Interrupt bei jedem Pegelwechsel auf INT0 - (1 << ISC01); + EICRA |= (0 << ISC10) //Interrupt bei jedem Pegelwechsel auf INT1 + | (1 << ISC11) + | (1 << ISC00) //Interrupt bei jedem Pegelwechsel auf INT0 + | (0 << ISC01); + + // PCINT for ENCODER_B + PCICR |= (1 << PCIE3); + PCMSK3 |= (1 << PCINT28); //-------------------------- // Timer + Zeitinterrupts @@ -168,24 +186,8 @@ void setup(){ } -//Encoder rotate -ISR(INT0_vect) { - if (PIND & ENCODER_B) { - if(get_menu_active()) - menu_up_down(1); - else - OCR2A++; - } else { - if(get_menu_active()) - menu_up_down(-1); - else - OCR2A--; - } -} - //Encoder Button ISR(INT1_vect) { - printf("button\n\r"); enter_menu(); } diff --git a/code/src/menu.c b/code/src/menu.c index d42cd42..24e9c1b 100644 --- a/code/src/menu.c +++ b/code/src/menu.c @@ -10,13 +10,6 @@ int8_t menu_val_timezone; uint8_t menu_val_format_ee EEMEM; uint8_t menu_val_format; -//void debug_menu(){ -// printf("state: %d\r\n", state); -// printf("selected: %d\r\n", selected); -// printf("timezone: %d\r\n", menu_val_timezone); -// printf("\r\n"); -//} - uint8_t get_menu_active(){ if(state != OFF) return 1;