Set up an initial sk9822 library
This commit is contained in:
parent
5487c27c50
commit
565036547c
|
@ -15,5 +15,15 @@ inline void clear_pin(io_pin_t *pin) {
|
|||
*(pin->port) &= 0xff ^ (1 << pin->pin);
|
||||
}
|
||||
|
||||
typedef struct RNG {
|
||||
uint8_t mod;
|
||||
int8_t a;
|
||||
int8_t c;
|
||||
uint8_t seed;
|
||||
} rng_t;
|
||||
|
||||
rng_t rng_new(uint8_t seed);
|
||||
|
||||
uint8_t rng_sample(rng_t *state);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -0,0 +1,12 @@
|
|||
#include "../base.h"
|
||||
|
||||
|
||||
|
||||
rng_t rng_new(uint8_t seed) {
|
||||
return { .mod = 255, .a = 253, .c = 41, .seed = seed };
|
||||
}
|
||||
|
||||
uint8_t rng_sample(rng_t *state) {
|
||||
state->seed = (state->a * state->seed + state->c) % state->mod;
|
||||
return state->seed;
|
||||
}
|
|
@ -25,6 +25,7 @@
|
|||
};
|
||||
*/
|
||||
|
||||
/*
|
||||
defaultPackage."x86_64-linux" =
|
||||
let
|
||||
pkgs = import nixpkgs { system = "x86_64-linux"; };
|
||||
|
@ -48,6 +49,7 @@
|
|||
cp main.elf main.hex $out
|
||||
'';
|
||||
};
|
||||
*/
|
||||
|
||||
devShell."x86_64-linux" =
|
||||
let
|
||||
|
@ -55,12 +57,18 @@
|
|||
avr = with pkgs.pkgsCross.avr.buildPackages; [
|
||||
binutils
|
||||
gcc
|
||||
gdb
|
||||
avrdude
|
||||
simavr
|
||||
gtkwave
|
||||
];
|
||||
in
|
||||
pkgs.mkShell {
|
||||
name = "Wearables-shell";
|
||||
buildInputs = avr;
|
||||
|
||||
GCC="${pkgs.pkgsCross.avr.buildPackages.gcc}";
|
||||
AVR="${pkgs.avrlibc}";
|
||||
};
|
||||
};
|
||||
}
|
||||
|
|
|
@ -0,0 +1,23 @@
|
|||
MCU=attiny85
|
||||
CHIP_SELECT=AVR_ATtiny85
|
||||
F_CPU=8000000
|
||||
CFLAGS=-O -finline-functions -funsigned-char -funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes -DF_CPU=${F_CPU} -std=gnu99 -D__${CHIP_SELECT}__=1
|
||||
LINKFLAGS=-mmcu=${MCU}
|
||||
|
||||
OBJECTS= main.o \
|
||||
sk9822.o
|
||||
|
||||
.SUFFIXES: .c .o .h
|
||||
|
||||
%.o: %.c %.h
|
||||
${GCC}/bin/avr-gcc ${CFLAGS} ${AVR}/avr/include -I../base/include/ -o $@ -c $<
|
||||
|
||||
main: main.o sk9822.o
|
||||
# ${GCC}/bin/avr-gcc ${CFLAGS} -I../base/include/ -E -o main.E src/main.c
|
||||
# ${GCC}/bin/avr-gcc ${CFLAGS} -I../base/include/ -S -o main.S src/main.c
|
||||
${GCC}/bin/avr-gcc ${CFLAGS} ${LINKFLAGS} -I../base/include/ -o main.elf main.o sk9822.o
|
||||
${OBJCOPY} -O ihex main.elf main.hex
|
||||
|
||||
clean:
|
||||
rm *.o make.elf main.hex main.S main.E
|
||||
|
|
@ -0,0 +1,51 @@
|
|||
#include <avr/io.h>
|
||||
#include <util/delay.h>
|
||||
|
||||
#include <base.h>
|
||||
#include "sk9822.h"
|
||||
|
||||
uint8_t random_step(uint8_t value, uint8_t min, uint8_t max, rng_t *rng) {
|
||||
int8_t step = (rng_sample(rng) % 32) - 16;
|
||||
uint16_t new_value = value + step;
|
||||
if (new_value > max) {
|
||||
return max;
|
||||
} else if (new_value < min) {
|
||||
return min;
|
||||
} else {
|
||||
return new_value;
|
||||
}
|
||||
}
|
||||
|
||||
void flicker(rgb_t *pixel, rng_t *rng) {
|
||||
pixel->r = random_step(pixel->r, 180, 255, rng);
|
||||
pixel->g = random_step(pixel->g, 10, 40, rng);
|
||||
}
|
||||
|
||||
int main (void) {
|
||||
DDRB = _BV(2) | _BV(1) | _BV(0);
|
||||
PORTB = 0;
|
||||
_delay_ms(50);
|
||||
|
||||
io_pin_t data_pin = { .port = &PORTB, .pin = 0 };
|
||||
io_pin_t clock_pin = { .port = &PORTB, .pin = 2 };
|
||||
|
||||
rgb_t lamps[2] = { { .brightness = 9, .r = 212, .g = 50, .b = 0 },
|
||||
{ .brightness = 1, .r = 0, .g = 0, .b = 0 } };
|
||||
|
||||
int8_t step_1 = 1;
|
||||
rng_t rng = rng_new(0);
|
||||
while (1) {
|
||||
send_pixels(data_pin, clock_pin, lamps, 2);
|
||||
|
||||
flicker(&lamps[0], &rng);
|
||||
|
||||
lamps[1].r += step_1;
|
||||
|
||||
if (lamps[1].r == 255) {
|
||||
step_1 = -1;
|
||||
} else if (lamps[1].r == 0) {
|
||||
step_1 = 1;
|
||||
}
|
||||
_delay_ms(16);
|
||||
}
|
||||
}
|
|
@ -0,0 +1,36 @@
|
|||
void send_byte(io_pin_t data_pin, io_pin_t clock_pin, uint8_t byte) {
|
||||
for (int i = 7; i >= 0; i--) {
|
||||
if (byte & _BV(i)) {
|
||||
(*data_pin.port) |= _BV(data_pin.pin);
|
||||
} else {
|
||||
(*data_pin.port) &= ~(_BV(data_pin.pin));
|
||||
}
|
||||
(*clock_pin.port) |= _BV(clock_pin.pin);
|
||||
(*clock_pin.port) &= ~(_BV(clock_pin.pin));
|
||||
}
|
||||
}
|
||||
|
||||
void send_start(io_pin_t data_pin, io_pin_t clock_pin) {
|
||||
send_byte(data_pin, clock_pin, 0);
|
||||
send_byte(data_pin, clock_pin, 0);
|
||||
send_byte(data_pin, clock_pin, 0);
|
||||
send_byte(data_pin, clock_pin, 0);
|
||||
}
|
||||
|
||||
void send_term(io_pin_t data_pin, io_pin_t clock_pin) {
|
||||
send_byte(data_pin, clock_pin, 0xff);
|
||||
send_byte(data_pin, clock_pin, 0xff);
|
||||
send_byte(data_pin, clock_pin, 0xff);
|
||||
send_byte(data_pin, clock_pin, 0xff);
|
||||
}
|
||||
|
||||
void send_pixels(io_pin_t data_pin, io_pin_t clock_pin, rgb_t * pixels, uint8_t count) {
|
||||
send_start(data_pin, clock_pin);
|
||||
for (uint8_t i = 0; i < count; i++) {
|
||||
send_byte(data_pin, clock_pin, 0xe0 + pixels[i].brightness);
|
||||
send_byte(data_pin, clock_pin, pixels[i].r);
|
||||
send_byte(data_pin, clock_pin, pixels[i].b);
|
||||
send_byte(data_pin, clock_pin, pixels[i].g);
|
||||
}
|
||||
send_term(data_pin, clock_pin);
|
||||
}
|
|
@ -0,0 +1,10 @@
|
|||
#include <avr/io.h>
|
||||
|
||||
typedef struct RGB_s {
|
||||
uint8_t brightness;
|
||||
uint8_t r;
|
||||
uint8_t g;
|
||||
uint8_t b;
|
||||
} rgb_t;
|
||||
|
||||
void send_pixels(io_pin_t data_pin, io_pin_t clock_pin, rgb_t *pixels, uint8_t count);
|
Loading…
Reference in New Issue