Compare commits
2 Commits
e614e47d4a
...
010eeae72f
Author | SHA1 | Date |
---|---|---|
|
010eeae72f | |
|
0ac7f4e7e2 |
|
@ -8,33 +8,29 @@ extern uint8_t run_rgbprog;
|
|||
// TCB0 general interrupt
|
||||
ISR(TCB0_INT_vect)
|
||||
{
|
||||
// reset the INTFLAGS - necessary on this series
|
||||
uint8_t intflags = TCB0.INTFLAGS;
|
||||
TCB0.INTFLAGS = intflags;
|
||||
uint8_t intflags = TCB0.INTFLAGS;
|
||||
|
||||
// in this program, this interrupt is only used for timing.
|
||||
// we'll now return to executing loop()
|
||||
|
||||
// reset the INTFLAGS - necessary on this series
|
||||
TCB0.INTFLAGS = intflags;
|
||||
}
|
||||
|
||||
// button interrupt
|
||||
ISR(PORTA_PORT_vect)
|
||||
{
|
||||
// reset the INTFLAGS - necessary on this series
|
||||
uint8_t intflags = PORTA.INTFLAGS;
|
||||
PORTA.INTFLAGS = intflags;
|
||||
|
||||
// shitty debounce; this is bad practice
|
||||
delay(5);
|
||||
|
||||
// was our pin changed?
|
||||
if (intflags & PIN3_bm) {
|
||||
// is the pin low?
|
||||
if (!digitalRead(PIN_PA3)) {
|
||||
// start running a program if one isn't running already
|
||||
if (!run_rgbprog) {
|
||||
run_rgbprog = 1; // run a program
|
||||
}
|
||||
} else if (run_rgbprog == 2) {
|
||||
// if we're running a program when the button is released (likely),
|
||||
// then skip this interrupt
|
||||
run_rgbprog++;
|
||||
}
|
||||
// start or re-start running a program
|
||||
run_rgbprog = 1; // run a new program
|
||||
}
|
||||
|
||||
// reset the INTFLAGS - necessary on this series
|
||||
PORTA.INTFLAGS = intflags;
|
||||
}
|
|
@ -48,12 +48,14 @@
|
|||
#include "rgbled.h"
|
||||
|
||||
|
||||
#define PIN_LED_PWRENA PIN_PA6
|
||||
|
||||
|
||||
|
||||
enum {
|
||||
RGB_PROG_IDLE,
|
||||
RGB_PROG_INIT,
|
||||
RGB_PROG_RUNNING,
|
||||
RGB_PROG_BTN_RELEASE
|
||||
RGB_IDLE,
|
||||
RGB_INIT,
|
||||
RGB_RUNNING
|
||||
};
|
||||
|
||||
enum {
|
||||
|
@ -61,7 +63,7 @@ enum {
|
|||
PROG_INIT = 1
|
||||
};
|
||||
|
||||
uint8_t run_rgbprog = RGB_PROG_IDLE;
|
||||
uint8_t run_rgbprog = RGB_IDLE;
|
||||
uint8_t rgbprog_idx = 0;
|
||||
|
||||
|
||||
|
@ -81,23 +83,22 @@ void sleep_cpu()
|
|||
|
||||
// mcu init
|
||||
void setup() {
|
||||
// configure PA3 as both edge interrupt input for button
|
||||
// note: only PA2 and PA6 support async wakeup and thus we can't check for
|
||||
// falling edge on PA3. we're not using PA6 for the button as a
|
||||
// future program may use SPI MISO to drive the LEDs.
|
||||
// because of this, we need to wake up on both edges.
|
||||
PORTA.DIRCLR = PIN3_bm;
|
||||
PORTA.PIN3CTRL = PORT_PULLUPEN_bm | PORT_ISC_BOTHEDGES_gc;
|
||||
// configure PA2 as falling edge interrupt for button
|
||||
// note: only PA2 and PA6 support async wakeup.
|
||||
// since we're using PA2, we're good to wakeup from a
|
||||
// falling edge (button pushed) event only.
|
||||
PORTA.DIRCLR = PIN2_bm;
|
||||
PORTA.PIN2CTRL = PORT_PULLUPEN_bm | PORT_ISC_FALLING_gc;
|
||||
|
||||
// configure other hardware pins as appropriate
|
||||
pinMode(PIN_PA1, INPUT_PULLUP); // unused
|
||||
pinMode(PIN_PA7, INPUT_PULLUP); // unused
|
||||
pinMode(PIN_PA3, INPUT_PULLUP); // unused, spare pad on board
|
||||
pinMode(PIN_PA7, INPUT_PULLUP); // unused, voltage passthru
|
||||
|
||||
digitalWrite(PIN_PA6, LOW);
|
||||
pinMode(PIN_PA6, OUTPUT); // LED boost regulator enable
|
||||
|
||||
digitalWrite(PIN_PA2, LOW);
|
||||
pinMode(PIN_PA2, OUTPUT); // LED data
|
||||
digitalWrite(PIN_PA1, LOW);
|
||||
pinMode(PIN_PA1, OUTPUT); // LED data
|
||||
|
||||
// set up the RGB ~61Hz periodic timer
|
||||
conf_rgb_timer();
|
||||
|
@ -109,12 +110,12 @@ void setup() {
|
|||
// mcu program loop
|
||||
void loop() {
|
||||
switch (run_rgbprog) {
|
||||
case RGB_PROG_INIT: { // just started running a program
|
||||
digitalWrite(PIN_PA6, HIGH); // enable LED power supply,
|
||||
delay(10); // wait a moment for LEDs to stabilize,
|
||||
case RGB_INIT: { // just started running a program
|
||||
digitalWrite(PIN_LED_PWRENA, HIGH); // enable LED power supply,
|
||||
delay(20); // wait a moment for LEDs to stabilize,
|
||||
|
||||
rgbprog_idx++; // select the next program in sequence,
|
||||
if (rgbprog_idx > PROG_COUNT) {
|
||||
if (rgbprog_idx >= PROG_COUNT) {
|
||||
rgbprog_idx = 0;
|
||||
}
|
||||
|
||||
|
@ -128,11 +129,11 @@ void loop() {
|
|||
break;
|
||||
}
|
||||
|
||||
case RGB_PROG_RUNNING: { // continuing to run a program
|
||||
case RGB_RUNNING: { // continuing to run a program
|
||||
rgb.show(); // send updates to the led
|
||||
|
||||
if (!rgb_program[0](PROG_RUN)) { // then process the next program frame
|
||||
run_rgbprog = RGB_PROG_IDLE; // until the program says it's done
|
||||
// then process the next program frame
|
||||
if (!rgb_program[rgbprog_idx](PROG_RUN)) {
|
||||
run_rgbprog = RGB_IDLE; // until the program says it's done
|
||||
break;
|
||||
}
|
||||
|
||||
|
@ -141,18 +142,10 @@ void loop() {
|
|||
break;
|
||||
}
|
||||
|
||||
case RGB_PROG_BTN_RELEASE: { // button released wakes MCU, but we're still running a program
|
||||
run_rgbprog = RGB_PROG_RUNNING; // so skip processing this cycle and go back to stage 2
|
||||
|
||||
idle_cpu(); // we can idle the CPU after doing nothing
|
||||
|
||||
break;
|
||||
}
|
||||
|
||||
default: { // no longer running a program
|
||||
disable_rgb_timer(); // disable RGB program timer,
|
||||
digitalWrite(PIN_PA6, LOW); // disable LED power supply,
|
||||
run_rgbprog = RGB_PROG_IDLE; // and clear run_rgbprog.
|
||||
digitalWrite(PIN_LED_PWRENA, LOW); // disable LED power supply,
|
||||
run_rgbprog = RGB_IDLE; // and clear run_rgbprog.
|
||||
|
||||
sleep_cpu(); // finally, go to sleep in standby mode
|
||||
|
||||
|
|
|
@ -110,14 +110,14 @@ uint8_t rgbp_circlefade(uint8_t init)
|
|||
// set our timer when initializing. otherwise every call is identical
|
||||
if (init) {
|
||||
prog_timeout = CF_TIMEOUT;
|
||||
circlefade_idx = 0;
|
||||
circlefade_idx = 4; // top LED
|
||||
}
|
||||
|
||||
if (--prog_timeout) {
|
||||
t = (uint8_t)(CF_TIMEOUT - prog_timeout); // get time elapsed
|
||||
t &= 0x3; // light a new LED every 4th loop
|
||||
|
||||
// fade each LED down every cycle
|
||||
// fade each LED down every frame
|
||||
for (i = 0; i < (sizeof(rgbled) / sizeof(rgbled[0])); i++) {
|
||||
if (rgbled[i] >= CF_FADERATE) {
|
||||
rgbled[i] -= CF_FADERATE;
|
||||
|
@ -131,7 +131,7 @@ uint8_t rgbp_circlefade(uint8_t init)
|
|||
if (!t) { // then on a loop boundary, light the next LED
|
||||
rgb.setPixelColor(circlefade_idx, CF_BRIGHTNESS, CF_BRIGHTNESS, CF_BRIGHTNESS);
|
||||
|
||||
if (++circlefade_idx > RGB_COUNT) { // then work on the next LED in sequence
|
||||
if (++circlefade_idx >= RGB_COUNT) { // then work on the next LED in sequence
|
||||
circlefade_idx = 0;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in New Issue