Set up an initial sk9822 library

i2c
Savanni D'Gerinel 2022-05-07 19:49:54 -04:00
parent 5487c27c50
commit 565036547c
7 changed files with 150 additions and 0 deletions

View File

@ -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

12
base/src/base.c Normal file
View File

@ -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;
}

View File

@ -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}";
};
};
}

23
sk9822/Makefile Normal file
View File

@ -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

51
sk9822/main.c Normal file
View File

@ -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);
}
}

36
sk9822/sk9822.c Normal file
View File

@ -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);
}

10
sk9822/sk9822.h Normal file
View File

@ -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);