interprete encoder quadrature signals correctly

master
Eggert Jung 6 years ago
parent c151a7bb67
commit 3dafc11535

@ -0,0 +1,69 @@
#include <avr/io.h>
#include <avr/interrupt.h>
#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);
}
}
}

@ -41,6 +41,20 @@ int8_t parse_nmea_gps(char input_string[RX_INPUT_BUFFER_SIZE], uint8_t output_bu
return -1; 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){ int main(void){
setup(); setup();
printf("Moin\n\r"); printf("Moin\n\r");
@ -134,14 +148,18 @@ void setup(){
//-------------------------- //--------------------------
//External Interrupt Mask Register //External Interrupt Mask Register
EIMSK |= (1 << INT0) | //Aktiviere Interrupt INT0 EIMSK |= (1 << INT0) //Aktiviere Interrupt INT0
(1 << INT1); //Aktiviere Interrupt INT1 | (1 << INT1); //Aktiviere Interrupt INT1
//External Interrupt Control Register A //External Interrupt Control Register A
EICRA |= (0 << ISC10) | //Interrupt bei jedem Pegelwechsel auf INT1 EICRA |= (0 << ISC10) //Interrupt bei jedem Pegelwechsel auf INT1
(1 << ISC11) | | (1 << ISC11)
(1 << ISC00) | //Interrupt bei jedem Pegelwechsel auf INT0 | (1 << ISC00) //Interrupt bei jedem Pegelwechsel auf INT0
(1 << ISC01); | (0 << ISC01);
// PCINT for ENCODER_B
PCICR |= (1 << PCIE3);
PCMSK3 |= (1 << PCINT28);
//-------------------------- //--------------------------
// Timer + Zeitinterrupts // 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 //Encoder Button
ISR(INT1_vect) { ISR(INT1_vect) {
printf("button\n\r");
enter_menu(); enter_menu();
} }

@ -10,13 +10,6 @@ int8_t menu_val_timezone;
uint8_t menu_val_format_ee EEMEM; uint8_t menu_val_format_ee EEMEM;
uint8_t menu_val_format; 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(){ uint8_t get_menu_active(){
if(state != OFF) if(state != OFF)
return 1; return 1;

Loading…
Cancel
Save