From f2a4bb877ca3030704b676d7031e006d6af670f8 Mon Sep 17 00:00:00 2001 From: Stefan Rupp Date: Tue, 18 Mar 2014 01:04:18 +0100 Subject: [PATCH] make led1642 interface more generic --- Makefile | 4 +- led1642gw.c | 173 ++++++++++++++++++++++++++++++++++++++++++++++++ led1642gw.h | 28 ++++++++ ledcontroller.c | 140 +++++++-------------------------------- ledcontroller.h | 7 +- 5 files changed, 228 insertions(+), 124 deletions(-) create mode 100644 led1642gw.c create mode 100644 led1642gw.h diff --git a/Makefile b/Makefile index e3ade60..63a0925 100644 --- a/Makefile +++ b/Makefile @@ -1,5 +1,5 @@ PRG = rgbyteclock -OBJ = rgbyteclock.o timer.o lcd.o main.o rtc.o spi.o ringbuffer.o crc.o ledcontroller.o +OBJ = rgbyteclock.o timer.o lcd.o main.o rtc.o spi.o ringbuffer.o crc.o ledcontroller.o led1642gw.o MCU_TARGET = atmega164a OPTIMIZE = -Os @@ -27,6 +27,8 @@ $(PRG).elf: $(OBJ) # dependency: rgbyteclock.o: timer.o lcd.o rgbyteclock.h rtc.o spi.o ledcontroller.o main.o: rgbyteclock.o lcd.o spi.o ledcontroller.o rtc.o timer.o +ledcontroller.o: led1642gw.o +led1642gw.o: led1642gw.h timer.o: timer.h lcd.o: lcd.h timer.o rtc.o: rtc.h diff --git a/led1642gw.c b/led1642gw.c new file mode 100644 index 0000000..dd7162b --- /dev/null +++ b/led1642gw.c @@ -0,0 +1,173 @@ + + +/* + * ---------------------------------------------------------------------------- + * "THE BEER-WARE LICENSE" (Revision 42): + * wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. + * (c) 2014 Stefan Rupp + * ---------------------------------------------------------------------------- + */ + + +#include +#include "led1642gw.h" +#include + +#define NUM_LED1642GW_CHANNELS (16) +#define NUM_LED_CHANNELS (NUM_LED1642GW_CHANNELS*NUM_LED1642GW_ICs) +#define NUM_LED1642GW_ICs (3) + +static uint16_t ledbuffer[NUM_LED_CHANNELS]; + + +#define DDR_CLK (DDRC) +#define PORT_CLK (PORTC) +#define PIN_CLK (3) +#define SET_CLK_H() ((PORT_CLK) |= (1<<(PIN_CLK))) +#define SET_CLK_L() ((PORT_CLK) &= ~(1<<(PIN_CLK))) + +#define DDR_SDI (DDRC) +#define PORT_SDI (PORTC) +#define PIN_SDI (4) +#define SET_SDI_H() ((PORT_SDI) |= (1<<(PIN_SDI))) +#define SET_SDI_L() ((PORT_SDI) &= ~(1<<(PIN_SDI))) + +#define DDR_LE (DDRC) +#define PORT_LE (PORTC) +#define PIN_LE (2) +#define SET_LE_H() ((PORT_LE) |= (1<<(PIN_LE))) +#define SET_LE_L() ((PORT_LE) &= ~(1<<(PIN_LE))) + + +static void write_data(uint16_t data, uint8_t le_clocks) +{ + uint16_t mask = 0x8000; + int8_t bit; + //PORTC &= ~(1<=le_clocks; bit--) { + //PORTC &= ~(1<>= 1; + } + + //PORTC |= (1<=0; bit--) { + //PORTC &= ~(1<>= 1; + } + + //PORTC &= ~(1< wrote this file. As long as you retain this notice you + * can do whatever you want with this stuff. If we meet some day, and you think + * this stuff is worth it, you can buy me a beer in return. + * (c) 2014 Stefan Rupp + * ---------------------------------------------------------------------------- + */ + + +#ifndef LED1642GW_H_ +#define LED1642GW_H_ + +#include +#include + +void led1642gw_init(void); +void led1642gw_turn_all_on(void); +void led1642gw_turn_all_off(void); +void led1642gw_flush(void); +void led1642gw_set_channel(uint8_t channel, uint16_t value); +void led1642gw_clear(void); + + +#endif // LED1642GW_H_ diff --git a/ledcontroller.c b/ledcontroller.c index 9f20a01..209a7ed 100644 --- a/ledcontroller.c +++ b/ledcontroller.c @@ -17,16 +17,9 @@ */ #include "ledcontroller.h" -#include -#include +#include "led1642gw.h" -#define NUM_LED1642GW_ICs (3) -#define NUM_LED1642GW_CHANNELS (16) -#define NUM_LED_CHANNELS (NUM_LED1642GW_CHANNELS*NUM_LED1642GW_ICs) - -static uint16_t ledbuffer[NUM_LED_CHANNELS]; - static int8_t map_lednum_to_channels(uint8_t lednum, uint8_t *channel_r, uint8_t *channel_g, uint8_t *channel_b) { uint8_t ret=0; @@ -115,125 +108,38 @@ static int8_t map_lednum_to_channels(uint8_t lednum, uint8_t *channel_r, uint8_t } -static void write_data(uint16_t data, uint8_t le_clocks) -{ - uint16_t mask = 0x8000; - int8_t bit; - PORTC &= ~(1<=le_clocks; bit--) { - PORTC &= ~(1<>= 1; - } - - PORTC |= (1<=0; bit--) { - PORTC &= ~(1<>= 1; - } - - PORTC &= ~(1< 0 ) { - ledbuffer[c_r] = red; - ledbuffer[c_g] = green; - ledbuffer[c_b] = blue; - } -} + if ( map_lednum_to_channels(lednum, &c_r, &c_g, &c_b) > 0 ) { + led1642gw_set_channel(c_r, red); + led1642gw_set_channel(c_g, green); + led1642gw_set_channel(c_b, blue); + } +} void led_flush(void) { - uint8_t channel; - for (channel=0; channel -#include // ==> _NOP() #include "timer.h" - void led_init(void); void led_set(uint8_t lednum, uint16_t red, uint16_t green, uint16_t blue); void led_flush(void); -void led_turn_all_on(void); -void led_turn_all_off(void); -void led_set_channel(uint8_t channel, uint16_t value); void led_clear(void); - +void led_turn_all_on(void); #endif // LEDCONTROLLER_H