From 86ec90b2024af639576054808108f2eba24625ec Mon Sep 17 00:00:00 2001 From: finga Date: Mon, 1 Mar 2021 16:46:40 +0100 Subject: [PATCH] Minimal encoder input handling It is now possible to act on the encoders input. No effort regarding debouncing and dechattering has been done yet. --- firmware/src/main.c | 75 +++++++++++++++++++++++++++++++++++---------- 1 file changed, 59 insertions(+), 16 deletions(-) diff --git a/firmware/src/main.c b/firmware/src/main.c index 84fd1c6..09087ad 100644 --- a/firmware/src/main.c +++ b/firmware/src/main.c @@ -1,6 +1,7 @@ #define F_CPU 8000000UL #include +#include #include #include @@ -13,6 +14,9 @@ #define LCD_CD PB0 #define LCD_RST PB1 +#define ENC_A (PINB & (1 << PB6)) +#define ENC_B (PINB & (1 << PB7)) + const uint8_t splash[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xC0, 0xE0, 0xF0, 0xF0, 0xF8, 0xFC, 0xFC, 0xFE, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFE, 0xFE, 0xFC, 0xFC, 0xF8, 0xF0, 0xF0, 0xE0, 0xC0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xF0, 0xFC, 0xFE, 0xFF, 0xFF, 0x7F, 0x3F, 0x1F, 0x3F, 0x3F, 0x7F, 0x7F, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0x7F, 0x1F, 0x0F, 0x0F, 0x07, 0x07, 0x07, 0x03, 0xC3, 0xE3, 0x73, 0x37, 0x17, 0x07, 0x0F, 0x1E, 0x3C, 0xF0, 0x80, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xFF, 0xFF, 0xFF, 0xE7, 0xC3, 0x81, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x01, 0xFF, 0xFF, 0xFF, 0xFF, 0x0F, 0x00, 0x00, 0xFC, 0xFE, 0xFE, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFF, 0xFE, 0xFC, 0x30, 0x00, 0x00, 0xFF, 0x00, 0x00, 0x00, 0x00, @@ -21,6 +25,8 @@ const uint8_t splash[] = {0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x80, 0xE0, 0x60, 0xE0, 0x00, 0x00, 0xE0, 0x60, 0xE0, 0x00, 0x00, 0xE0, 0x60, 0xF8, 0x00, 0x00, 0xE0, 0xA0, 0xE0, 0x00, 0x00, 0xE0, 0x20, 0x60, 0x00, 0x00, 0xE0, 0xA0, 0xA0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xE0, 0x60, 0xE0, 0x00, 0x00, 0xE0, 0x20, 0x60, 0x00, 0x00, 0xE0, 0x60, 0xE0, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x03, 0x00, 0x00, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x02, 0x02, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x02, 0x02, 0x03, 0x00, 0x00, 0x00, 0x02, 0x00, 0x00, 0x00, 0x03, 0x02, 0x03, 0x00, 0x00, 0x03, 0x00, 0x00, 0x00, 0x00, 0x0B, 0x0A, 0x0F}; +static uint8_t enc = 0; + void spi_init(void) { SPI_DDR |= (1 << SPI_SCK) | (1 << SPI_MOSI) | (1 << SPI_SS); SPI_PORT |= (1 << SPI_SS); @@ -86,32 +92,69 @@ void lcd_splash() { } } +// Encoder rotation interrupt +ISR(PCINT0_vect) { + cli(); + + switch(enc) { + case 0: + if (ENC_A && !ENC_B) + enc = 1; + else if (!ENC_A && ENC_B) + enc = 3; + break; + case 1: + if (ENC_A && ENC_B) { + enc = 2; + } else if (!ENC_A && !ENC_B) { + enc = 0; + } + break; + case 2: + if (!ENC_A && ENC_B) + enc = 3; + else if (ENC_A && !ENC_B) + enc = 1; + break; + case 3: + if (!ENC_A && !ENC_B) { + enc = 0; + } else if (ENC_A && ENC_B) { + enc = 2; + } + break; + } + + // TODO: proper debounce and dechattering + _delay_us(100); + + sei(); +} + int main(void) { // FastPWM: 1.25kHz + // TODO: Try to get the backlit even more dim TCCR0A = (1 << WGM01) | (1 << WGM00) | (1 << COM0B1); TCCR0B = (1 << CS01) | (1 << WGM02); // prescaler = 8; OCR0A = 100; - OCR0B = 10; + OCR0B = 0; DDRD |= (1 << PD5); - bool reverse = 0; - + // SPI setup spi_init(); lcd_init(); + + // Encoder setup + PORTB |= (1 << PB6) | (1 << PB7); + PCICR |= (1 << PCIE0); + PCMSK0 |= (1 << PCINT6) | (1 << PCINT7); + + // Show splash screen lcd_splash(); - while (1) { - _delay_ms(1); + // Enable interrupts + sei(); - if (OCR0B > 100) - reverse = !reverse; - - if (reverse) - OCR0B++; - else - if (OCR0B > 0) - OCR0B--; - else - reverse = !reverse; - } + // Run... + for (;;); }