Commit 616f20d1 authored by Jan Kasprzak's avatar Jan Kasprzak
Browse files

RGB LED string - a new project

Files copied from the step-up project, and slightly modified.
parent 49420b56
PROGRAM=rgbstring
SRC=version.c main.c logging.c
OBJ=$(SRC:.c=.o)
MCU=attiny45
AVRDUDE_MCU=$(MCU)
AVRDUDE_PROGRAMMER=usbasp
CFLAGS=-Wall -Os -mmcu=$(MCU) -DUSE_LOGGING=1 -DF_CPU=1000000UL -std=gnu99
LDFLAGS=
AVRDUDE_FLAGS= -p$(AVRDUDE_MCU) -c $(AVRDUDE_PROGRAMMER)
FORMAT=ihex
CC=avr-gcc
OBJCOPY=avr-objcopy
OBJDUMP=avr-objdump
AVRDUDE=avrdude
all: $(PROGRAM).hex $(PROGRAM).eep
program: $(PROGRAM).hex $(PROGRAM).eep
$(AVRDUDE) $(AVRDUDE_FLAGS) -U flash:w:$(PROGRAM).hex:i -U eeprom:w:$(PROGRAM).eep:i
program_flash: $(PROGRAM).hex
$(AVRDUDE) $(AVRDUDE_FLAGS) -U flash:w:$(PROGRAM).hex:i
program_eeprom: $(PROGRAM).eep
$(AVRDUDE) $(AVRDUDE_FLAGS) eeprom:w:$(PROGRAM).eep:i
dump_eeprom:
$(AVRDUDE) $(AVRDUDE_FLAGS) -U eeprom:r:eeprom.raw:r
od -tx1 eeprom.raw
objdump: $(PROGRAM).elf
$(OBJDUMP) --disassemble $<
.PRECIOUS : $(OBJ) $(PROGRAM).elf
%.hex: %.elf
$(OBJCOPY) -O $(FORMAT) -R .eeprom $< $@
%.eep: %.elf
$(OBJCOPY) -j .eeprom --set-section-flags=.eeprom="alloc,load" \
--change-section-lma .eeprom=0 -O $(FORMAT) $< $@
%.elf: $(OBJ)
$(CC) $(CFLAGS) $(OBJ) -o $@ $(LDFLAGS)
%.o: %.c rgbstring.h Makefile
$(CC) -c $(CFLAGS) $< -o $@
%.s: %.c rgbstring.h Makefile
$(CC) -S -c $(CFLAGS) $< -o $@
%.o: %.S
$(CC) -c $(CFLAGS) $< -o $@
clean:
rm -f $(PROGRAM).hex $(PROGRAM).eep $(PROGRAM).elf *.o *.s eeprom.raw
version.c:
./version.pl > version.c
.PHONY: all clean dump_eeprom program program_flash program_eeprom objdump version.c
Controller for the string of RGB LEDs
CPU: ATtiny45
Bill of materials:
C3 10uF ceramic
U1 ATtiny45-20SU
Pin-out:
PB0 header:
2: CLK
PB2 header:
2: DATA
#ifdef USE_LOGGING
#include <avr/io.h>
#include <avr/eeprom.h>
#include "rgbstring.h"
#define LOG_BUFFER 64
static unsigned char log_buffer_ee[LOG_BUFFER] EEMEM;
static unsigned char log_buffer_count;
static unsigned char log_buffer[LOG_BUFFER];
static unsigned char log_state EEMEM;
/* Upper 4 bits are reset count, lower 4 bits are reset reason from MCUSR */
static unsigned char reboot_count EEMEM = 0;
static unsigned char can_write_eeprom = 0;
static uint16_t flushed_end;
void log_set_state(unsigned char val)
{
if (can_write_eeprom)
eeprom_write_byte(&log_state, val);
}
void init_log()
{
unsigned char r_count;
r_count = eeprom_read_byte(&reboot_count);
r_count >>= 4;
if (r_count < 5) {
r_count++;
eeprom_write_byte(&reboot_count,
(r_count << 4) | (MCUSR & 0xF));
MCUSR = 0;
can_write_eeprom = 1;
} else {
//eeprom_write_byte(&log_state, 0xFF);
can_write_eeprom = 0;
}
log_set_state(1);
log_buffer_count = 0;
flushed_end = 0;
}
void log_byte(unsigned char byte) {
if (log_buffer_count >= LOG_BUFFER)
return;
// eeprom_write_word(&log_buffer[log_buffer_count], word);
log_buffer[log_buffer_count++] = byte;
if (log_buffer_count == LOG_BUFFER)
log_flush();
}
void log_word(uint16_t word) {
log_byte(word & 0xFF);
log_byte(word >> 8);
}
void log_flush() {
unsigned char i;
if (!can_write_eeprom)
return;
for (i=flushed_end; i < log_buffer_count; i++) {
eeprom_write_byte(&log_buffer_ee[i],
log_buffer[i]);
}
flushed_end = i;
if (flushed_end == LOG_BUFFER)
log_set_state(0x42);
}
#endif
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include "rgbstring.h"
int main(void)
{
init_log();
log_set_state(3);
DDRB |= _BV(PB2);
while (1) {
PORTB |= _BV( PB2 );
_delay_ms(200);
PORTB &=~ _BV( PB2 );
_delay_ms(200);
}
}
#ifndef LIGHTS_H__
#define LIGHTS_H__ 1
#define N_PWMLED_MODES 3
/* logging.c */
#ifdef USE_LOGGING
void init_log();
void log_set_state(unsigned char val);
void log_flush();
void log_byte(unsigned char byte);
void log_word(uint16_t word);
#else
void inline init_log() { }
void inline log_set_state(unsigned char val) { }
void inline log_flush() { }
void inline log_byte(unsigned char byte) { }
void inline log_word(uint16_t word) { }
#endif
/* adc.c */
#define PWMLED_ADC_SHIFT 1 /* 1<<1 measurements per single callback */
extern volatile unsigned char need_battery_adc;
extern volatile unsigned char need_pwmled_adc;
extern volatile unsigned char adc_enabled;
void init_adc();
void susp_adc();
void start_next_adc();
/* pwm.c */
#define PWM_MAX 0xFF
extern volatile unsigned char pwm_enabled;
void init_pwm();
void susp_pwm();
void pwm_off();
void pwm_set(uint8_t stride);
/* pwmled.c */
void init_pwmled();
void pwmled_adc(uint16_t adcval);
void pwmled_set_target(unsigned char mode);
void pwmled_on_off(unsigned char on);
/* pattern.c */
void init_pattern();
void patterns_next_tick();
void led_set_pattern(unsigned char led, unsigned char bits_len,
unsigned char bits_start, unsigned char *data);
void led_set_number_pattern(unsigned char led,
unsigned char num, unsigned char inv);
void pattern_reload();
/* buttons.c */
void init_buttons();
void susp_buttons();
void timer_check_buttons();
unsigned char buttons_wait_for_release();
void status_led_on_off(unsigned char on);
/* battery.c */
void battery_adc();
void init_battery();
unsigned char battery_gauge();
/* control.c */
void init_control();
void long_press_start();
void long_press();
void short_press();
void brake_on();
void brake_off();
void pwmled_pattern_select(unsigned char led);
void status_led_pattern_select(unsigned char led);
#define ERR_BATTERY 1
#define ERR_PWMLED 2
void set_error(unsigned char err);
/* wdt.c */
extern volatile uint16_t jiffies;
void init_wdt();
void susp_wdt();
/* main.c */
void power_down();
#endif /* !LIGHTS_H__ */
#!/usr/bin/perl -w
use strict;
use POSIX qw(strftime);
my $git = `git rev-parse --short HEAD`;
chomp $git;
my $now = strftime('%Y%m%d', localtime(time));
print <<EOF;
/* DO NOT EDIT - GENERATED BY $0 */
#include <avr/eeprom.h>
unsigned char version[] EEMEM = {
EOF
print hex2c($git, "git revision");
print hex2c($now, "date");
print "};\n\n/* EOF - this file has not been truncated */\n\n";
sub hex2c {
my ($data, $comment) = @_;
my $data1 = $data;
$data1 .= '0' if (length($data1) & 1 == 1);
$data1 =~ s/(..)/0x$1, /g;
return "\t$data1 /* $comment $data */\n";
}
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment