From e526b4dd4d8859187db23d89b2c6d20dc78391a5 Mon Sep 17 00:00:00 2001 From: Christian Kroll Date: Wed, 10 Dec 2014 06:02:48 +0100 Subject: [PATCH] borg_hw_led_tester.c etc.: adjustable power consumption --- config.in | 18 ++++++---- src/borg_hw/borg_hw_led_tester.c | 49 +++++++++++++++------------ src/borg_hw/config_borg_led_tester.in | 2 ++ src/uart/uart_commands.c | 39 ++++++++++++++++----- 4 files changed, 72 insertions(+), 36 deletions(-) diff --git a/config.in b/config.in index a583334..832c0b6 100644 --- a/config.in +++ b/config.in @@ -7,23 +7,27 @@ comment "General Setup" choice 'Target MCU' \ "ATmega8 atmega8 \ - ATmega16 atmega16 \ - ATmega164 atmega164 \ - ATmega164P atmega164p \ + ATmega48 atmega48 \ + ATmega48P atmega48p \ + ATmega88 atmega88 \ + ATmega88P atmega88p \ ATmega168 atmega168 \ ATmega168P atmega168p \ + ATmega328 atmega328 \ + ATmega328P atmega328p \ + ATmega16 atmega16 \ ATmega32 atmega32 \ + ATmega164 atmega164 \ + ATmega164P atmega164p \ ATmega324 atmega324 \ ATmega324P atmega324p \ - ATmega32U4 atmega32u4 \ - ATmega328 atmega328 \ - ATmega328P atmega328p \ ATmega644 atmega644 \ ATmega644P atmega644p \ - ATmega1280 atmega1280 \ ATmega1284 atmega1284 \ ATmega1284P atmega1284p \ + ATmega1280 atmega1280 \ ATmega2560 atmega2560 \ + ATmega32U4 atmega32u4 \ ATmega8515 atmega8515" \ 'ATmega32' MCU diff --git a/src/borg_hw/borg_hw_led_tester.c b/src/borg_hw/borg_hw_led_tester.c index 8795b83..81a1b88 100644 --- a/src/borg_hw/borg_hw_led_tester.c +++ b/src/borg_hw/borg_hw_led_tester.c @@ -1,6 +1,7 @@ #include "../config.h" #include "../makros.h" +#include #include #include #include @@ -21,23 +22,27 @@ # define TIMER0_COMPARE(t) OCR0A = t # define TIMER0_INT_ENABLE() TIMSK0 = _BV(OCIE0A) # define TIMER0_ISR TIMER0_COMPA_vect -#else // ATmega8 +#elif defined(__AVR_ATmega8__) || \ + defined(__AVR_ATmega8A__) // ATmega8 # define TIMER0_OFF() TCCR0 = 0 # define TIMER0_MODE_CS256() TCCR0 = _BV(CS02) # define TIMER0_RESET() TCNT0 = 0 # define TIMER0_COMPARE(t) TCNT0 = (0xff - t) # define TIMER0_INT_ENABLE() TIMSK = _BV(TOIE0) # define TIMER0_ISR TIMER0_OVF_vect +#else +# error MCU not supported by LED Tester. #endif +bool g_highpower = false; /* Output data of the current row to the column drivers: * Column: 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0 * Pin: PD2 PD3 PC5 PC4 PC3 PC2 PC1 PC0 PD7 PD6 PB5 PB4 PB3 PB2 PB1 PB0 */ -#define DISPLAY_PINS_B (_BV(PB5)|_BV(PB4)|_BV(PB3)|_BV(PB2)|_BV(PB1)|_BV(PB0)) -#define DISPLAY_PINS_C (_BV(PC5)|_BV(PC4)|_BV(PC3)|_BV(PC2)|_BV(PC1)|_BV(PC0)) -#define DISPLAY_PINS_D (_BV(PD7)|_BV(PD6)|_BV(PD3)|_BV(PD2)) +#define DISPLAY_B (_BV(PB5)|_BV(PB4)|_BV(PB3)|_BV(PB2)|_BV(PB1)|_BV(PB0)) +#define DISPLAY_C (_BV(PC5)|_BV(PC4)|_BV(PC3)|_BV(PC2)|_BV(PC1)|_BV(PC0)) +#define DISPLAY_D (_BV(PD7)|_BV(PD6)|_BV(PD3)|_BV(PD2)) #define ROW_DUMMY_PORT PORTB #define ROW_DUMMY_DDR DDRB @@ -53,9 +58,9 @@ unsigned char pixmap[NUMPLANE][NUM_ROWS][LINEBYTES]; // switch to next row static void nextrow(uint8_t row) { // switch off all columns for now - PORTB &= ~(DISPLAY_PINS_B); - PORTC &= ~(DISPLAY_PINS_C); - PORTD &= ~(DISPLAY_PINS_D); + PORTB &= ~(DISPLAY_B); + PORTC &= ~(DISPLAY_C); + PORTD &= ~(DISPLAY_D); // short delay loop, to ensure proper deactivation of the drivers unsigned char i; @@ -69,8 +74,10 @@ static void nextrow(uint8_t row) { ROW_LED_PORT |= _BV(ROW_LED_PIN); // unblock LED MOSFET } else { /* fake rows simulated by resistors */ // remaining rows: unblock resistor MOSFET, block LED MOSFET - ROW_LED_PORT &= ~_BV(ROW_LED_PIN); // block LED MOSFET - ROW_DUMMY_PORT |= _BV(ROW_DUMMY_PIN); // block resistor MOSFET + ROW_LED_PORT &= ~_BV(ROW_LED_PIN); // block LED MOSFET + if (g_highpower) { + ROW_DUMMY_PORT |= _BV(ROW_DUMMY_PIN); // unblock resistor MOSFET + } } // another delay loop, to ensure that the drivers are ready @@ -92,9 +99,9 @@ static void rowshow(unsigned char row, unsigned char plane) { TIMER0_COMPARE(ocr_table[plane]); - uint8_t port_b = (PORTB & ~DISPLAY_PINS_B) | (0x3f & pixmap[plane][row][0]); - uint8_t port_c = (PORTC & ~DISPLAY_PINS_C) | (0x3f & pixmap[plane][row][1]); - uint8_t port_d = (PORTD & ~DISPLAY_PINS_D) | (0xc0 & pixmap[plane][row][0]); + uint8_t port_b = (PORTB & ~DISPLAY_B) | (DISPLAY_B & pixmap[plane][row][0]); + uint8_t port_c = (PORTC & ~DISPLAY_C) | (DISPLAY_C & pixmap[plane][row][1]); + uint8_t port_d = (PORTD & ~DISPLAY_D) | (0xc0 & pixmap[plane][row][0]); if (0x40u & pixmap[plane][row][1]) port_d |= _BV(PD3); if (0x80u & pixmap[plane][row][1]) port_d |= _BV(PD2); @@ -130,9 +137,9 @@ ISR(TIMER0_ISR) { void timer0_off() { cli(); // switch off all columns - PORTB &= ~(DISPLAY_PINS_B); - PORTC &= ~(DISPLAY_PINS_C); - PORTD &= ~(DISPLAY_PINS_D); + PORTB &= ~(DISPLAY_B); + PORTC &= ~(DISPLAY_C); + PORTD &= ~(DISPLAY_D); TIMER0_OFF(); sei(); } @@ -149,16 +156,16 @@ static void timer0_on() { void borg_hw_init() { // switch column and row ports to output mode - DDRB |= DISPLAY_PINS_B; - DDRC |= DISPLAY_PINS_C; - DDRD |= DISPLAY_PINS_D; + DDRB |= DISPLAY_B; + DDRC |= DISPLAY_C; + DDRD |= DISPLAY_D; ROW_DUMMY_DDR |= _BV(ROW_DUMMY_PIN); ROW_LED_DDR |= _BV(ROW_LED_PIN); // switch off all columns for now - PORTB &= ~(DISPLAY_PINS_B); - PORTC &= ~(DISPLAY_PINS_C); - PORTD &= ~(DISPLAY_PINS_D); + PORTB &= ~(DISPLAY_B); + PORTC &= ~(DISPLAY_C); + PORTD &= ~(DISPLAY_D); // switch off all rows ROW_DUMMY_PORT &= ~_BV(ROW_DUMMY_PIN); diff --git a/src/borg_hw/config_borg_led_tester.in b/src/borg_hw/config_borg_led_tester.in index f30fa7e..3396838 100644 --- a/src/borg_hw/config_borg_led_tester.in +++ b/src/borg_hw/config_borg_led_tester.in @@ -1,6 +1,8 @@ mainmenu_option next_comment comment "LED Tester Setup" +define_int LED_TESTER 1 + bool "Higher Contrast" HIGH_CONTRAST n bool "UART Support" UART_SUPPORT n diff --git a/src/uart/uart_commands.c b/src/uart/uart_commands.c index 56dff1f..6f64d3f 100644 --- a/src/uart/uart_commands.c +++ b/src/uart/uart_commands.c @@ -19,6 +19,10 @@ #include "uart.h" #include "uart_commands.h" +#ifdef LED_TESTER + extern bool g_highpower; +#endif + #ifndef USE_UART1 # define UART_PUTS(STR) uart_puts(STR) # define UART_PUTS_P(STR) uart_puts_p(STR) @@ -34,7 +38,7 @@ #ifdef SCROLLTEXT_BUFFER_SIZE # define UART_BUFFER_SIZE (SCROLLTEXT_BUFFER_SIZE + 8) #else -# define UART_BUFFER_SIZE 136 +# define UART_BUFFER_SIZE 32 #endif char g_rx_buffer[UART_BUFFER_SIZE]; @@ -48,7 +52,7 @@ extern volatile unsigned char reverseMode; #if (!(defined(eeprom_update_block) && \ ((E2PAGESIZE == 2) || (E2PAGESIZE == 4) || (E2PAGESIZE == 8)))) || \ - !(defined(ANIMATION_TESTS)) + !defined(ANIMATION_TESTS) || !(defined(SCROLLTEXT_SUPPORT)) char const UART_STR_NOTIMPL[] PROGMEM = "Not implemented."CR; #endif @@ -62,9 +66,14 @@ char const UART_STR_GAMETX_ERR[] PROGMEM = "No text messages during games."CR; char const UART_STR_UART_ERR[] PROGMEM = "Transmission error."CR; char const UART_STR_UNKNOWN[] PROGMEM = "Unknown command or syntax error."CR; char const UART_STR_TOOLONG[] PROGMEM = CR"Command is too long."CR; +#ifdef LED_TESTER +char const UART_STR_HELP[] PROGMEM = "Allowed commands: erase help mode " + "msg next power_lo power_hi prev " + "reset scroll test"CR; +#else char const UART_STR_HELP[] PROGMEM = "Allowed commands: erase help mode " "msg next prev reset scroll test"CR; - +#endif char const UART_CMD_ERASE[] PROGMEM = "erase"; char const UART_CMD_HELP[] PROGMEM = "help"; char const UART_CMD_MODE[] PROGMEM = "mode"; @@ -74,6 +83,10 @@ char const UART_CMD_PREV[] PROGMEM = "prev"; char const UART_CMD_RESET[] PROGMEM = "reset"; char const UART_CMD_SCROLL[] PROGMEM = "scroll "; char const UART_CMD_TEST[] PROGMEM = "test"; +#ifdef LED_TESTER +char const UART_CMD_PWRLO[] PROGMEM = "power_lo"; +char const UART_CMD_PWRHI[] PROGMEM = "power_hi"; +#endif #ifdef ANIMATION_TESTS char const UART_STR_TEST_EXIT[] PROGMEM = "Press ENTER to exit test."CR; @@ -178,6 +191,8 @@ static void uartcmd_simple_message(void) { #endif uartcmd_permit(); } +#else + UART_PUTS_P(UART_STR_NOTIMPL); #endif } @@ -186,24 +201,26 @@ static void uartcmd_simple_message(void) { * Displays a message which may use the complete range of scrolltext commands. */ static void uartcmd_scroll_message(void) { -#ifdef SCROLLTEXT_SUPPORT +# ifdef SCROLLTEXT_SUPPORT if (uartcmd_processing_allowed()) { uartcmd_forbid(); -#ifdef JOYSTICK_SUPPORT +# ifdef JOYSTICK_SUPPORT if (waitForFire) { waitForFire = 0; -#endif +# endif // text must not be longer than the scroll text buffer g_rx_buffer[7 + SCROLLTEXT_BUFFER_SIZE - 1] = 0; scrolltext(&g_rx_buffer[7]); -#ifdef JOYSTICK_SUPPORT +# ifdef JOYSTICK_SUPPORT waitForFire = 1; } else { UART_PUTS_P(UART_STR_GAMETX_ERR); } -#endif +# endif uartcmd_permit(); } +#else + UART_PUTS_P(UART_STR_NOTIMPL); #endif } @@ -504,6 +521,12 @@ void uartcmd_process(void) { } else if ((!strncmp_P(g_rx_buffer, UART_CMD_TEST, 4)) && (g_rx_buffer[4] <= ' ')) { uartcmd_test(); +#ifdef LED_TESTER + } else if (!strncmp_P(g_rx_buffer, UART_CMD_PWRLO, UART_BUFFER_SIZE)) { + g_highpower = false; + } else if (!strncmp_P(g_rx_buffer, UART_CMD_PWRHI, UART_BUFFER_SIZE)) { + g_highpower = true; +#endif } else if (g_rx_buffer[0] != 0) { UART_PUTS_P(UART_STR_UNKNOWN); }