Browse Source

borg_hw_led_tester.c etc.: adjustable power consumption

feature/2015
Christian Kroll 10 years ago
parent
commit
e526b4dd4d
  1. 18
      config.in
  2. 49
      src/borg_hw/borg_hw_led_tester.c
  3. 2
      src/borg_hw/config_borg_led_tester.in
  4. 39
      src/uart/uart_commands.c

18
config.in

@ -7,23 +7,27 @@ comment "General Setup"
choice 'Target MCU' \ choice 'Target MCU' \
"ATmega8 atmega8 \ "ATmega8 atmega8 \
ATmega16 atmega16 \ ATmega48 atmega48 \
ATmega164 atmega164 \ ATmega48P atmega48p \
ATmega164P atmega164p \ ATmega88 atmega88 \
ATmega88P atmega88p \
ATmega168 atmega168 \ ATmega168 atmega168 \
ATmega168P atmega168p \ ATmega168P atmega168p \
ATmega328 atmega328 \
ATmega328P atmega328p \
ATmega16 atmega16 \
ATmega32 atmega32 \ ATmega32 atmega32 \
ATmega164 atmega164 \
ATmega164P atmega164p \
ATmega324 atmega324 \ ATmega324 atmega324 \
ATmega324P atmega324p \ ATmega324P atmega324p \
ATmega32U4 atmega32u4 \
ATmega328 atmega328 \
ATmega328P atmega328p \
ATmega644 atmega644 \ ATmega644 atmega644 \
ATmega644P atmega644p \ ATmega644P atmega644p \
ATmega1280 atmega1280 \
ATmega1284 atmega1284 \ ATmega1284 atmega1284 \
ATmega1284P atmega1284p \ ATmega1284P atmega1284p \
ATmega1280 atmega1280 \
ATmega2560 atmega2560 \ ATmega2560 atmega2560 \
ATmega32U4 atmega32u4 \
ATmega8515 atmega8515" \ ATmega8515 atmega8515" \
'ATmega32' MCU 'ATmega32' MCU

49
src/borg_hw/borg_hw_led_tester.c

@ -1,6 +1,7 @@
#include "../config.h" #include "../config.h"
#include "../makros.h" #include "../makros.h"
#include <stdbool.h>
#include <avr/interrupt.h> #include <avr/interrupt.h>
#include <avr/io.h> #include <avr/io.h>
#include <avr/wdt.h> #include <avr/wdt.h>
@ -21,23 +22,27 @@
# define TIMER0_COMPARE(t) OCR0A = t # define TIMER0_COMPARE(t) OCR0A = t
# define TIMER0_INT_ENABLE() TIMSK0 = _BV(OCIE0A) # define TIMER0_INT_ENABLE() TIMSK0 = _BV(OCIE0A)
# define TIMER0_ISR TIMER0_COMPA_vect # define TIMER0_ISR TIMER0_COMPA_vect
#else // ATmega8 #elif defined(__AVR_ATmega8__) || \
defined(__AVR_ATmega8A__) // ATmega8
# define TIMER0_OFF() TCCR0 = 0 # define TIMER0_OFF() TCCR0 = 0
# define TIMER0_MODE_CS256() TCCR0 = _BV(CS02) # define TIMER0_MODE_CS256() TCCR0 = _BV(CS02)
# define TIMER0_RESET() TCNT0 = 0 # define TIMER0_RESET() TCNT0 = 0
# define TIMER0_COMPARE(t) TCNT0 = (0xff - t) # define TIMER0_COMPARE(t) TCNT0 = (0xff - t)
# define TIMER0_INT_ENABLE() TIMSK = _BV(TOIE0) # define TIMER0_INT_ENABLE() TIMSK = _BV(TOIE0)
# define TIMER0_ISR TIMER0_OVF_vect # define TIMER0_ISR TIMER0_OVF_vect
#else
# error MCU not supported by LED Tester.
#endif #endif
bool g_highpower = false;
/* Output data of the current row to the column drivers: /* 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 * 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 * 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_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_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_D (_BV(PD7)|_BV(PD6)|_BV(PD3)|_BV(PD2))
#define ROW_DUMMY_PORT PORTB #define ROW_DUMMY_PORT PORTB
#define ROW_DUMMY_DDR DDRB #define ROW_DUMMY_DDR DDRB
@ -53,9 +58,9 @@ unsigned char pixmap[NUMPLANE][NUM_ROWS][LINEBYTES];
// switch to next row // switch to next row
static void nextrow(uint8_t row) { static void nextrow(uint8_t row) {
// switch off all columns for now // switch off all columns for now
PORTB &= ~(DISPLAY_PINS_B); PORTB &= ~(DISPLAY_B);
PORTC &= ~(DISPLAY_PINS_C); PORTC &= ~(DISPLAY_C);
PORTD &= ~(DISPLAY_PINS_D); PORTD &= ~(DISPLAY_D);
// short delay loop, to ensure proper deactivation of the drivers // short delay loop, to ensure proper deactivation of the drivers
unsigned char i; unsigned char i;
@ -69,8 +74,10 @@ static void nextrow(uint8_t row) {
ROW_LED_PORT |= _BV(ROW_LED_PIN); // unblock LED MOSFET ROW_LED_PORT |= _BV(ROW_LED_PIN); // unblock LED MOSFET
} else { /* fake rows simulated by resistors */ } else { /* fake rows simulated by resistors */
// remaining rows: unblock resistor MOSFET, block LED MOSFET // remaining rows: unblock resistor MOSFET, block LED MOSFET
ROW_LED_PORT &= ~_BV(ROW_LED_PIN); // block LED MOSFET ROW_LED_PORT &= ~_BV(ROW_LED_PIN); // block LED MOSFET
ROW_DUMMY_PORT |= _BV(ROW_DUMMY_PIN); // block resistor MOSFET if (g_highpower) {
ROW_DUMMY_PORT |= _BV(ROW_DUMMY_PIN); // unblock resistor MOSFET
}
} }
// another delay loop, to ensure that the drivers are ready // 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]); TIMER0_COMPARE(ocr_table[plane]);
uint8_t port_b = (PORTB & ~DISPLAY_PINS_B) | (0x3f & pixmap[plane][row][0]); uint8_t port_b = (PORTB & ~DISPLAY_B) | (DISPLAY_B & pixmap[plane][row][0]);
uint8_t port_c = (PORTC & ~DISPLAY_PINS_C) | (0x3f & pixmap[plane][row][1]); uint8_t port_c = (PORTC & ~DISPLAY_C) | (DISPLAY_C & pixmap[plane][row][1]);
uint8_t port_d = (PORTD & ~DISPLAY_PINS_D) | (0xc0 & pixmap[plane][row][0]); uint8_t port_d = (PORTD & ~DISPLAY_D) | (0xc0 & pixmap[plane][row][0]);
if (0x40u & pixmap[plane][row][1]) port_d |= _BV(PD3); if (0x40u & pixmap[plane][row][1]) port_d |= _BV(PD3);
if (0x80u & pixmap[plane][row][1]) port_d |= _BV(PD2); if (0x80u & pixmap[plane][row][1]) port_d |= _BV(PD2);
@ -130,9 +137,9 @@ ISR(TIMER0_ISR) {
void timer0_off() { void timer0_off() {
cli(); cli();
// switch off all columns // switch off all columns
PORTB &= ~(DISPLAY_PINS_B); PORTB &= ~(DISPLAY_B);
PORTC &= ~(DISPLAY_PINS_C); PORTC &= ~(DISPLAY_C);
PORTD &= ~(DISPLAY_PINS_D); PORTD &= ~(DISPLAY_D);
TIMER0_OFF(); TIMER0_OFF();
sei(); sei();
} }
@ -149,16 +156,16 @@ static void timer0_on() {
void borg_hw_init() { void borg_hw_init() {
// switch column and row ports to output mode // switch column and row ports to output mode
DDRB |= DISPLAY_PINS_B; DDRB |= DISPLAY_B;
DDRC |= DISPLAY_PINS_C; DDRC |= DISPLAY_C;
DDRD |= DISPLAY_PINS_D; DDRD |= DISPLAY_D;
ROW_DUMMY_DDR |= _BV(ROW_DUMMY_PIN); ROW_DUMMY_DDR |= _BV(ROW_DUMMY_PIN);
ROW_LED_DDR |= _BV(ROW_LED_PIN); ROW_LED_DDR |= _BV(ROW_LED_PIN);
// switch off all columns for now // switch off all columns for now
PORTB &= ~(DISPLAY_PINS_B); PORTB &= ~(DISPLAY_B);
PORTC &= ~(DISPLAY_PINS_C); PORTC &= ~(DISPLAY_C);
PORTD &= ~(DISPLAY_PINS_D); PORTD &= ~(DISPLAY_D);
// switch off all rows // switch off all rows
ROW_DUMMY_PORT &= ~_BV(ROW_DUMMY_PIN); ROW_DUMMY_PORT &= ~_BV(ROW_DUMMY_PIN);

2
src/borg_hw/config_borg_led_tester.in

@ -1,6 +1,8 @@
mainmenu_option next_comment mainmenu_option next_comment
comment "LED Tester Setup" comment "LED Tester Setup"
define_int LED_TESTER 1
bool "Higher Contrast" HIGH_CONTRAST n bool "Higher Contrast" HIGH_CONTRAST n
bool "UART Support" UART_SUPPORT n bool "UART Support" UART_SUPPORT n

39
src/uart/uart_commands.c

@ -19,6 +19,10 @@
#include "uart.h" #include "uart.h"
#include "uart_commands.h" #include "uart_commands.h"
#ifdef LED_TESTER
extern bool g_highpower;
#endif
#ifndef USE_UART1 #ifndef USE_UART1
# define UART_PUTS(STR) uart_puts(STR) # define UART_PUTS(STR) uart_puts(STR)
# define UART_PUTS_P(STR) uart_puts_p(STR) # define UART_PUTS_P(STR) uart_puts_p(STR)
@ -34,7 +38,7 @@
#ifdef SCROLLTEXT_BUFFER_SIZE #ifdef SCROLLTEXT_BUFFER_SIZE
# define UART_BUFFER_SIZE (SCROLLTEXT_BUFFER_SIZE + 8) # define UART_BUFFER_SIZE (SCROLLTEXT_BUFFER_SIZE + 8)
#else #else
# define UART_BUFFER_SIZE 136 # define UART_BUFFER_SIZE 32
#endif #endif
char g_rx_buffer[UART_BUFFER_SIZE]; char g_rx_buffer[UART_BUFFER_SIZE];
@ -48,7 +52,7 @@ extern volatile unsigned char reverseMode;
#if (!(defined(eeprom_update_block) && \ #if (!(defined(eeprom_update_block) && \
((E2PAGESIZE == 2) || (E2PAGESIZE == 4) || (E2PAGESIZE == 8)))) || \ ((E2PAGESIZE == 2) || (E2PAGESIZE == 4) || (E2PAGESIZE == 8)))) || \
!(defined(ANIMATION_TESTS)) !defined(ANIMATION_TESTS) || !(defined(SCROLLTEXT_SUPPORT))
char const UART_STR_NOTIMPL[] PROGMEM = "Not implemented."CR; char const UART_STR_NOTIMPL[] PROGMEM = "Not implemented."CR;
#endif #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_UART_ERR[] PROGMEM = "Transmission error."CR;
char const UART_STR_UNKNOWN[] PROGMEM = "Unknown command or syntax 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; 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 " char const UART_STR_HELP[] PROGMEM = "Allowed commands: erase help mode "
"msg next prev reset scroll test"CR; "msg next prev reset scroll test"CR;
#endif
char const UART_CMD_ERASE[] PROGMEM = "erase"; char const UART_CMD_ERASE[] PROGMEM = "erase";
char const UART_CMD_HELP[] PROGMEM = "help"; char const UART_CMD_HELP[] PROGMEM = "help";
char const UART_CMD_MODE[] PROGMEM = "mode"; 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_RESET[] PROGMEM = "reset";
char const UART_CMD_SCROLL[] PROGMEM = "scroll "; char const UART_CMD_SCROLL[] PROGMEM = "scroll ";
char const UART_CMD_TEST[] PROGMEM = "test"; 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 #ifdef ANIMATION_TESTS
char const UART_STR_TEST_EXIT[] PROGMEM = "Press ENTER to exit test."CR; char const UART_STR_TEST_EXIT[] PROGMEM = "Press ENTER to exit test."CR;
@ -178,6 +191,8 @@ static void uartcmd_simple_message(void) {
#endif #endif
uartcmd_permit(); uartcmd_permit();
} }
#else
UART_PUTS_P(UART_STR_NOTIMPL);
#endif #endif
} }
@ -186,24 +201,26 @@ static void uartcmd_simple_message(void) {
* Displays a message which may use the complete range of scrolltext commands. * Displays a message which may use the complete range of scrolltext commands.
*/ */
static void uartcmd_scroll_message(void) { static void uartcmd_scroll_message(void) {
#ifdef SCROLLTEXT_SUPPORT # ifdef SCROLLTEXT_SUPPORT
if (uartcmd_processing_allowed()) { if (uartcmd_processing_allowed()) {
uartcmd_forbid(); uartcmd_forbid();
#ifdef JOYSTICK_SUPPORT # ifdef JOYSTICK_SUPPORT
if (waitForFire) { if (waitForFire) {
waitForFire = 0; waitForFire = 0;
#endif # endif
// text must not be longer than the scroll text buffer // text must not be longer than the scroll text buffer
g_rx_buffer[7 + SCROLLTEXT_BUFFER_SIZE - 1] = 0; g_rx_buffer[7 + SCROLLTEXT_BUFFER_SIZE - 1] = 0;
scrolltext(&g_rx_buffer[7]); scrolltext(&g_rx_buffer[7]);
#ifdef JOYSTICK_SUPPORT # ifdef JOYSTICK_SUPPORT
waitForFire = 1; waitForFire = 1;
} else { } else {
UART_PUTS_P(UART_STR_GAMETX_ERR); UART_PUTS_P(UART_STR_GAMETX_ERR);
} }
#endif # endif
uartcmd_permit(); uartcmd_permit();
} }
#else
UART_PUTS_P(UART_STR_NOTIMPL);
#endif #endif
} }
@ -504,6 +521,12 @@ void uartcmd_process(void) {
} else if ((!strncmp_P(g_rx_buffer, UART_CMD_TEST, 4)) && } else if ((!strncmp_P(g_rx_buffer, UART_CMD_TEST, 4)) &&
(g_rx_buffer[4] <= ' ')) { (g_rx_buffer[4] <= ' ')) {
uartcmd_test(); 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) { } else if (g_rx_buffer[0] != 0) {
UART_PUTS_P(UART_STR_UNKNOWN); UART_PUTS_P(UART_STR_UNKNOWN);
} }

Loading…
Cancel
Save