parent
e30f2ba0c7
commit
c3201fe3aa
@ -1,145 +0,0 @@ |
|||||||
#include <avr/io.h> |
|
||||||
#include <avr/interrupt.h> |
|
||||||
#include <util/delay.h> |
|
||||||
// #include <stdbool.h>
|
|
||||||
#include <stdint.h> |
|
||||||
|
|
||||||
#include "lib/meta.h" |
|
||||||
#include "lib/arduino_pins.h" |
|
||||||
#include "lib/calc.h" |
|
||||||
#include "lib/colors.h" |
|
||||||
#include "lib/ws2812.h" |
|
||||||
|
|
||||||
#define DEBO_CHANNELS 11 |
|
||||||
#define DEBO_TICKS 1 // 0.01s
|
|
||||||
|
|
||||||
#include "lib/debounce.h" |
|
||||||
|
|
||||||
#define WS1 D10 |
|
||||||
|
|
||||||
#define BTN_LEFT D2 |
|
||||||
#define BTN_RIGHT D3 |
|
||||||
#define BTN_UP D4 |
|
||||||
#define BTN_DOWN D5 |
|
||||||
#define BTN_A D6 |
|
||||||
#define BTN_B D7 |
|
||||||
#define BTN_AA D8 |
|
||||||
#define BTN_BB D9 |
|
||||||
#define BTN_SLOW D14 |
|
||||||
#define BTN_START D15 |
|
||||||
#define BTN_SELECT D16 |
|
||||||
|
|
||||||
void render(); |
|
||||||
|
|
||||||
void SECTION(".init8") init_io() |
|
||||||
{ |
|
||||||
// led strip data
|
|
||||||
as_output(WS1); |
|
||||||
|
|
||||||
// gamepad buttons
|
|
||||||
as_input_pu(BTN_LEFT); |
|
||||||
as_input_pu(BTN_RIGHT); |
|
||||||
as_input_pu(BTN_UP); |
|
||||||
as_input_pu(BTN_DOWN); |
|
||||||
|
|
||||||
as_input_pu(BTN_A); |
|
||||||
as_input_pu(BTN_B); |
|
||||||
as_input_pu(BTN_AA); |
|
||||||
as_input_pu(BTN_BB); |
|
||||||
|
|
||||||
as_input_pu(BTN_SLOW); |
|
||||||
as_input_pu(BTN_START); |
|
||||||
as_input_pu(BTN_SELECT); |
|
||||||
|
|
||||||
// set up debouncers
|
|
||||||
#define BTN_LEFT_D 0 |
|
||||||
debo_add_rev(BTN_LEFT); |
|
||||||
|
|
||||||
#define BTN_RIGHT_D 1 |
|
||||||
debo_add_rev(BTN_RIGHT); |
|
||||||
|
|
||||||
#define BTN_UP_D 2 |
|
||||||
debo_add_rev(BTN_UP); |
|
||||||
|
|
||||||
#define BTN_DOWN_D 3 |
|
||||||
debo_add_rev(BTN_DOWN); |
|
||||||
|
|
||||||
#define BTN_A_D 4 |
|
||||||
debo_add_rev(BTN_A); |
|
||||||
|
|
||||||
#define BTN_B_D 5 |
|
||||||
debo_add_rev(BTN_B); |
|
||||||
|
|
||||||
#define BTN_AA_D 6 |
|
||||||
debo_add_rev(BTN_AA); |
|
||||||
|
|
||||||
#define BTN_BB_D 7 |
|
||||||
debo_add_rev(BTN_BB); |
|
||||||
|
|
||||||
#define BTN_SLOW_D 8 |
|
||||||
debo_add_rev(BTN_SLOW); |
|
||||||
|
|
||||||
#define BTN_START_D 9 |
|
||||||
debo_add_rev(BTN_START); |
|
||||||
|
|
||||||
#define BTN_SELECT_D 10 |
|
||||||
debo_add_rev(BTN_SELECT); |
|
||||||
|
|
||||||
|
|
||||||
// setup timer 10 ms
|
|
||||||
TCCR0A = _BV(WGM01); // CTC
|
|
||||||
TCCR0B = _BV(CS02) | _BV(CS00); // prescaler 512
|
|
||||||
OCR0A = 156; // interrupt every 10 ms
|
|
||||||
sbi(TIMSK0, OCIE0A); |
|
||||||
sei(); |
|
||||||
} |
|
||||||
|
|
||||||
/** timer 0 interrupt vector */ |
|
||||||
ISR(TIMER0_COMPA_vect) |
|
||||||
{ |
|
||||||
debo_tick(); // poll debouncer
|
|
||||||
render(); |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void render() |
|
||||||
{ |
|
||||||
const rgb24_t PINK = 0x970078; |
|
||||||
const rgb24_t BLUE = 0x005397; |
|
||||||
const rgb24_t RED = 0xFF0000; |
|
||||||
const rgb24_t YELLOW = 0xFFFF00; |
|
||||||
const rgb24_t BLACK = 0x000000; |
|
||||||
|
|
||||||
static rgb24_t table[12]; |
|
||||||
|
|
||||||
table[0] = debo_get_pin(BTN_LEFT_D) ? PINK : BLACK; |
|
||||||
table[1] = debo_get_pin(BTN_RIGHT_D) ? PINK : BLACK; |
|
||||||
table[2] = debo_get_pin(BTN_UP_D) ? PINK : BLACK; |
|
||||||
table[3] = debo_get_pin(BTN_DOWN_D) ? PINK : BLACK; |
|
||||||
table[4] = debo_get_pin(BTN_A_D) ? BLUE : BLACK; |
|
||||||
table[5] = debo_get_pin(BTN_B_D) ? BLUE : BLACK; |
|
||||||
table[6] = debo_get_pin(BTN_AA_D) ? BLUE : BLACK; |
|
||||||
table[7] = debo_get_pin(BTN_BB_D) ? BLUE : BLACK; |
|
||||||
table[8] = debo_get_pin(BTN_SELECT_D) ? RED : BLACK; |
|
||||||
table[9] = debo_get_pin(BTN_START_D) ? RED : BLACK; |
|
||||||
table[10] = debo_get_pin(BTN_SLOW_D) ? RED : BLACK; |
|
||||||
table[11] = YELLOW; |
|
||||||
|
|
||||||
rgb24_t c; |
|
||||||
for (uint8_t i=0; i<30; i++) { |
|
||||||
|
|
||||||
if (i < 12) |
|
||||||
c = table[i]; |
|
||||||
else |
|
||||||
c = BLACK; |
|
||||||
|
|
||||||
ws_send_rgb24(WS1, c); |
|
||||||
} |
|
||||||
} |
|
||||||
|
|
||||||
|
|
||||||
void main() |
|
||||||
{ |
|
||||||
// render();
|
|
||||||
while(1) {} |
|
||||||
} |
|
@ -0,0 +1,39 @@ |
|||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <avr/io.h> |
||||||
|
#include <stdbool.h> |
||||||
|
#include "calc.h" |
||||||
|
|
||||||
|
/** Initialize the ADC */ |
||||||
|
void adc_init() |
||||||
|
{ |
||||||
|
ADCSRA |= _BV(ADPS2) | _BV(ADPS1) | _BV(ADPS0); // 128 prescaler -> 125 kHz
|
||||||
|
ADMUX |= _BV(REFS0); // Voltage reference
|
||||||
|
sbi(ADCSRA, ADEN); // Enable ADC
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** Sample analog pin with 8-bit precision */ |
||||||
|
uint8_t adc_read_byte(uint8_t channel) |
||||||
|
{ |
||||||
|
write_low_nibble(ADMUX, channel); // Select channel to sample
|
||||||
|
sbi(ADMUX, ADLAR); // Align result to left
|
||||||
|
sbi(ADCSRA, ADSC); // Start conversion
|
||||||
|
|
||||||
|
while(bit_is_high(ADCSRA, ADSC)); // Wait for it...
|
||||||
|
|
||||||
|
return ADCH; // The upper 8 bits of ADC result
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** Sample analog pin with 10-bit precision */ |
||||||
|
uint16_t adc_read_word(uint8_t channel) |
||||||
|
{ |
||||||
|
write_low_nibble(ADMUX, channel); // Select channel to sample
|
||||||
|
cbi(ADMUX, ADLAR); // Align result to right
|
||||||
|
sbi(ADCSRA, ADSC); // Start conversion
|
||||||
|
|
||||||
|
while(get_bit(ADCSRA, ADSC)); // Wait for it...
|
||||||
|
|
||||||
|
return ADCW; // The whole ADC word (10 bits)
|
||||||
|
} |
@ -0,0 +1,185 @@ |
|||||||
|
#include <avr/io.h> |
||||||
|
#include <avr/interrupt.h> |
||||||
|
#include <util/delay.h> |
||||||
|
// #include <stdbool.h>
|
||||||
|
#include <stdint.h> |
||||||
|
#include <stdlib.h> |
||||||
|
|
||||||
|
#include "lib/meta.h" |
||||||
|
#include "lib/arduino_pins.h" |
||||||
|
#include "lib/calc.h" |
||||||
|
#include "lib/colors.h" |
||||||
|
#include "lib/ws2812.h" |
||||||
|
#include "lib/adc.h" |
||||||
|
|
||||||
|
#define DEBO_CHANNELS 6 |
||||||
|
#define DEBO_TICKS 1 // in 0.01s
|
||||||
|
|
||||||
|
#include "lib/debounce.h" |
||||||
|
|
||||||
|
|
||||||
|
#define BOARD_WIDTH 6 |
||||||
|
#define BOARD_HEIGHT 5 |
||||||
|
#define BOARD_LEN (BOARD_WIDTH * BOARD_HEIGHT) |
||||||
|
#define TILE_COUNT (BOARD_LEN / 2) |
||||||
|
|
||||||
|
const xrgb_t COLORS[] = { |
||||||
|
rgb24_xrgbc(0xB14835), // brick red
|
||||||
|
rgb24_xrgbc(0x4C1661), // indigo
|
||||||
|
rgb24_xrgbc(0xA3268E), // royal purple
|
||||||
|
rgb24_xrgbc(0x009ADA), // cobalt blue
|
||||||
|
rgb24_xrgbc(0x007D8F), // teal
|
||||||
|
rgb24_xrgbc(0x002E5A), // navy blue
|
||||||
|
rgb24_xrgbc(0x56BCC1), // turquoise
|
||||||
|
rgb24_xrgbc(0x01654D), // emerald dark
|
||||||
|
rgb24_xrgbc(0xF5864F), // papaya orange
|
||||||
|
rgb24_xrgbc(0xED1B24), // firetruck red
|
||||||
|
rgb24_xrgbc(0xFDAF17), // tangerine orange
|
||||||
|
rgb24_xrgbc(0xF58F83), // coral
|
||||||
|
rgb24_xrgbc(0xED008C), // magenta
|
||||||
|
rgb24_xrgbc(0xFEF200), // sunshine yellow
|
||||||
|
rgb24_xrgbc(0x6D9346), // treetop green
|
||||||
|
}; |
||||||
|
|
||||||
|
|
||||||
|
// assert valid board size
|
||||||
|
#if BOARD_LEN % 2 == 1 |
||||||
|
# error "Board size is not even!" |
||||||
|
#endif |
||||||
|
|
||||||
|
|
||||||
|
#define WS1 D10 |
||||||
|
|
||||||
|
#define BTN_LEFT D2 |
||||||
|
#define BTN_RIGHT D3 |
||||||
|
#define BTN_UP D4 |
||||||
|
#define BTN_DOWN D5 |
||||||
|
#define BTN_SELECT D6 |
||||||
|
#define BTN_RESTART D7 |
||||||
|
|
||||||
|
// Debouncer channels for buttons
|
||||||
|
// (Must be added in this order to debouncer)
|
||||||
|
#define D_LEFT 0 |
||||||
|
#define D_RIGHT 1 |
||||||
|
#define D_UP 2 |
||||||
|
#define D_DOWN 3 |
||||||
|
#define D_SELECT 4 |
||||||
|
#define D_RESTART 5 |
||||||
|
|
||||||
|
// Pin A0 not connected to anything, used to get
|
||||||
|
// entropy for random number generator
|
||||||
|
|
||||||
|
// Prototypes
|
||||||
|
void render(); |
||||||
|
void update(); |
||||||
|
|
||||||
|
|
||||||
|
void SECTION(".init8") init() |
||||||
|
{ |
||||||
|
adc_init(); // Initialize ADC
|
||||||
|
srand(adc_read_word(0)); // Randomize RNG
|
||||||
|
|
||||||
|
// led strip data
|
||||||
|
as_output(WS1); |
||||||
|
|
||||||
|
// gamepad buttons
|
||||||
|
as_input_pu(BTN_LEFT); |
||||||
|
as_input_pu(BTN_RIGHT); |
||||||
|
as_input_pu(BTN_UP); |
||||||
|
as_input_pu(BTN_DOWN); |
||||||
|
as_input_pu(BTN_SELECT); |
||||||
|
as_input_pu(BTN_RESTART); |
||||||
|
|
||||||
|
// add buttons to debouncer
|
||||||
|
debo_add_rev(BTN_LEFT); |
||||||
|
debo_add_rev(BTN_RIGHT); |
||||||
|
debo_add_rev(BTN_UP); |
||||||
|
debo_add_rev(BTN_DOWN); |
||||||
|
debo_add_rev(BTN_SELECT); |
||||||
|
debo_add_rev(BTN_RESTART); |
||||||
|
|
||||||
|
// setup timer
|
||||||
|
TCCR0A = _BV(WGM01); // CTC
|
||||||
|
TCCR0B = _BV(CS02) | _BV(CS00); // prescaler 1024
|
||||||
|
OCR0A = 156; // interrupt every 10 ms
|
||||||
|
sbi(TIMSK0, OCIE0A); |
||||||
|
|
||||||
|
|
||||||
|
sei(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** timer 0 interrupt vector */ |
||||||
|
ISR(TIMER0_COMPA_vect) |
||||||
|
{ |
||||||
|
//debo_tick(); // poll debouncer
|
||||||
|
update(); // update game state
|
||||||
|
render(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
while(1); // Timer does everything
|
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
/** Tile state enum */ |
||||||
|
typedef enum { |
||||||
|
SECRET, |
||||||
|
REVEALED, |
||||||
|
GONE |
||||||
|
} tilestate_t; |
||||||
|
|
||||||
|
|
||||||
|
/** Tile struct */ |
||||||
|
typedef struct { |
||||||
|
uint8_t color; // color index from COLORS[]
|
||||||
|
tilestate_t state; // state of the tile (used for render)
|
||||||
|
} tile_t; |
||||||
|
|
||||||
|
|
||||||
|
// board tiles
|
||||||
|
tile_t board[BOARD_LEN]; |
||||||
|
|
||||||
|
// player cursor position
|
||||||
|
uint8_t cursor = 0; |
||||||
|
|
||||||
|
uint8_t noise = 0; |
||||||
|
uint8_t xxx = 0; |
||||||
|
|
||||||
|
/** Update game */ |
||||||
|
void update() |
||||||
|
{ |
||||||
|
if(xxx++ >= 10) { |
||||||
|
noise = rand(); |
||||||
|
xxx = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
// colors to be displayed
|
||||||
|
rgb24_t screen[BOARD_LEN]; |
||||||
|
|
||||||
|
/** Update screen[] and send to display */ |
||||||
|
void render() |
||||||
|
{ |
||||||
|
#define BLUE 0x005397 |
||||||
|
#define RED 0xFF0000 |
||||||
|
#define YELLOW 0xFFFF00 |
||||||
|
#define BLACK 0x000000 |
||||||
|
|
||||||
|
for (uint8_t i = 0; i < BOARD_LEN; i++) { |
||||||
|
if (i < 8) { |
||||||
|
screen[i] = get_bit(noise, i) ? RED : BLUE; |
||||||
|
} else { |
||||||
|
screen[i] = YELLOW; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// debo_get_pin(BTN_LEFT_D) ? PINK : BLACK;
|
||||||
|
|
||||||
|
ws_send_rgb24_array(WS1, screen, BOARD_LEN); |
||||||
|
ws_show(); |
||||||
|
} |
||||||
|
|
@ -0,0 +1,973 @@ |
|||||||
|
# 1 "main.c" |
||||||
|
# 1 "/home/ondra/git/avr-projects/devel/memorygame//" |
||||||
|
# 1 "<built-in>" |
||||||
|
# 1 "<command-line>" |
||||||
|
# 1 "main.c" |
||||||
|
# 1 "/usr/avr/include/avr/io.h" 1 3 |
||||||
|
# 99 "/usr/avr/include/avr/io.h" 3 |
||||||
|
# 1 "/usr/avr/include/avr/sfr_defs.h" 1 3 |
||||||
|
# 126 "/usr/avr/include/avr/sfr_defs.h" 3 |
||||||
|
# 1 "/usr/avr/include/inttypes.h" 1 3 |
||||||
|
# 37 "/usr/avr/include/inttypes.h" 3 |
||||||
|
# 1 "/usr/lib/gcc/avr/4.9.2/include/stdint.h" 1 3 4 |
||||||
|
# 9 "/usr/lib/gcc/avr/4.9.2/include/stdint.h" 3 4 |
||||||
|
# 1 "/usr/avr/include/stdint.h" 1 3 4 |
||||||
|
# 122 "/usr/avr/include/stdint.h" 3 4 |
||||||
|
typedef signed int int8_t __attribute__((__mode__(__QI__))); |
||||||
|
typedef unsigned int uint8_t __attribute__((__mode__(__QI__))); |
||||||
|
typedef signed int int16_t __attribute__ ((__mode__ (__HI__))); |
||||||
|
typedef unsigned int uint16_t __attribute__ ((__mode__ (__HI__))); |
||||||
|
typedef signed int int32_t __attribute__ ((__mode__ (__SI__))); |
||||||
|
typedef unsigned int uint32_t __attribute__ ((__mode__ (__SI__))); |
||||||
|
|
||||||
|
typedef signed int int64_t __attribute__((__mode__(__DI__))); |
||||||
|
typedef unsigned int uint64_t __attribute__((__mode__(__DI__))); |
||||||
|
# 143 "/usr/avr/include/stdint.h" 3 4 |
||||||
|
typedef int16_t intptr_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef uint16_t uintptr_t; |
||||||
|
# 160 "/usr/avr/include/stdint.h" 3 4 |
||||||
|
typedef int8_t int_least8_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef uint8_t uint_least8_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef int16_t int_least16_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef uint16_t uint_least16_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef int32_t int_least32_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef uint32_t uint_least32_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef int64_t int_least64_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef uint64_t uint_least64_t; |
||||||
|
# 214 "/usr/avr/include/stdint.h" 3 4 |
||||||
|
typedef int8_t int_fast8_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef uint8_t uint_fast8_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef int16_t int_fast16_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef uint16_t uint_fast16_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef int32_t int_fast32_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef uint32_t uint_fast32_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef int64_t int_fast64_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef uint64_t uint_fast64_t; |
||||||
|
# 274 "/usr/avr/include/stdint.h" 3 4 |
||||||
|
typedef int64_t intmax_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef uint64_t uintmax_t; |
||||||
|
# 10 "/usr/lib/gcc/avr/4.9.2/include/stdint.h" 2 3 4 |
||||||
|
# 38 "/usr/avr/include/inttypes.h" 2 3 |
||||||
|
# 77 "/usr/avr/include/inttypes.h" 3 |
||||||
|
typedef int32_t int_farptr_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef uint32_t uint_farptr_t; |
||||||
|
# 127 "/usr/avr/include/avr/sfr_defs.h" 2 3 |
||||||
|
# 100 "/usr/avr/include/avr/io.h" 2 3 |
||||||
|
# 248 "/usr/avr/include/avr/io.h" 3 |
||||||
|
# 1 "/usr/avr/include/avr/iom328p.h" 1 3 |
||||||
|
# 249 "/usr/avr/include/avr/io.h" 2 3 |
||||||
|
# 534 "/usr/avr/include/avr/io.h" 3 |
||||||
|
# 1 "/usr/avr/include/avr/portpins.h" 1 3 |
||||||
|
# 535 "/usr/avr/include/avr/io.h" 2 3 |
||||||
|
|
||||||
|
# 1 "/usr/avr/include/avr/common.h" 1 3 |
||||||
|
# 537 "/usr/avr/include/avr/io.h" 2 3 |
||||||
|
|
||||||
|
# 1 "/usr/avr/include/avr/version.h" 1 3 |
||||||
|
# 539 "/usr/avr/include/avr/io.h" 2 3 |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 1 "/usr/avr/include/avr/fuse.h" 1 3 |
||||||
|
# 239 "/usr/avr/include/avr/fuse.h" 3 |
||||||
|
typedef struct |
||||||
|
{ |
||||||
|
unsigned char low; |
||||||
|
unsigned char high; |
||||||
|
unsigned char extended; |
||||||
|
} __fuse_t; |
||||||
|
# 546 "/usr/avr/include/avr/io.h" 2 3 |
||||||
|
|
||||||
|
|
||||||
|
# 1 "/usr/avr/include/avr/lock.h" 1 3 |
||||||
|
# 549 "/usr/avr/include/avr/io.h" 2 3 |
||||||
|
# 2 "main.c" 2 |
||||||
|
# 1 "/usr/avr/include/avr/interrupt.h" 1 3 |
||||||
|
# 3 "main.c" 2 |
||||||
|
# 1 "/usr/avr/include/util/delay.h" 1 3 |
||||||
|
# 43 "/usr/avr/include/util/delay.h" 3 |
||||||
|
# 1 "/usr/avr/include/util/delay_basic.h" 1 3 |
||||||
|
# 40 "/usr/avr/include/util/delay_basic.h" 3 |
||||||
|
static inline void _delay_loop_1(uint8_t __count) __attribute__((always_inline)); |
||||||
|
static inline void _delay_loop_2(uint16_t __count) __attribute__((always_inline)); |
||||||
|
# 80 "/usr/avr/include/util/delay_basic.h" 3 |
||||||
|
void |
||||||
|
_delay_loop_1(uint8_t __count) |
||||||
|
{ |
||||||
|
__asm__ volatile ( |
||||||
|
"1: dec %0" "\n\t" |
||||||
|
"brne 1b" |
||||||
|
: "=r" (__count) |
||||||
|
: "0" (__count) |
||||||
|
); |
||||||
|
} |
||||||
|
# 102 "/usr/avr/include/util/delay_basic.h" 3 |
||||||
|
void |
||||||
|
_delay_loop_2(uint16_t __count) |
||||||
|
{ |
||||||
|
__asm__ volatile ( |
||||||
|
"1: sbiw %0,1" "\n\t" |
||||||
|
"brne 1b" |
||||||
|
: "=w" (__count) |
||||||
|
: "0" (__count) |
||||||
|
); |
||||||
|
} |
||||||
|
# 44 "/usr/avr/include/util/delay.h" 2 3 |
||||||
|
# 1 "/usr/avr/include/math.h" 1 3 |
||||||
|
# 127 "/usr/avr/include/math.h" 3 |
||||||
|
extern double cos(double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double sin(double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double tan(double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double fabs(double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double fmod(double __x, double __y) __attribute__((__const__)); |
||||||
|
# 168 "/usr/avr/include/math.h" 3 |
||||||
|
extern double modf(double __x, double *__iptr); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern float modff (float __x, float *__iptr); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double sqrt(double __x) __attribute__((__const__)); |
||||||
|
extern float sqrtf (float) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double cbrt(double __x) __attribute__((__const__)); |
||||||
|
# 194 "/usr/avr/include/math.h" 3 |
||||||
|
extern double hypot (double __x, double __y) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double square(double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double floor(double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double ceil(double __x) __attribute__((__const__)); |
||||||
|
# 234 "/usr/avr/include/math.h" 3 |
||||||
|
extern double frexp(double __x, int *__pexp); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double ldexp(double __x, int __exp) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double exp(double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double cosh(double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double sinh(double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double tanh(double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double acos(double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double asin(double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double atan(double __x) __attribute__((__const__)); |
||||||
|
# 298 "/usr/avr/include/math.h" 3 |
||||||
|
extern double atan2(double __y, double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double log(double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double log10(double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double pow(double __x, double __y) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern int isnan(double __x) __attribute__((__const__)); |
||||||
|
# 333 "/usr/avr/include/math.h" 3 |
||||||
|
extern int isinf(double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__attribute__((__const__)) static inline int isfinite (double __x) |
||||||
|
{ |
||||||
|
unsigned char __exp; |
||||||
|
__asm__ ( |
||||||
|
"mov %0, %C1 \n\t" |
||||||
|
"lsl %0 \n\t" |
||||||
|
"mov %0, %D1 \n\t" |
||||||
|
"rol %0 " |
||||||
|
: "=r" (__exp) |
||||||
|
: "r" (__x) ); |
||||||
|
return __exp != 0xff; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
__attribute__((__const__)) static inline double copysign (double __x, double __y) |
||||||
|
{ |
||||||
|
__asm__ ( |
||||||
|
"bst %D2, 7 \n\t" |
||||||
|
"bld %D0, 7 " |
||||||
|
: "=r" (__x) |
||||||
|
: "0" (__x), "r" (__y) ); |
||||||
|
return __x; |
||||||
|
} |
||||||
|
# 376 "/usr/avr/include/math.h" 3 |
||||||
|
extern int signbit (double __x) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double fdim (double __x, double __y) __attribute__((__const__)); |
||||||
|
# 392 "/usr/avr/include/math.h" 3 |
||||||
|
extern double fma (double __x, double __y, double __z) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double fmax (double __x, double __y) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double fmin (double __x, double __y) __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern double trunc (double __x) __attribute__((__const__)); |
||||||
|
# 426 "/usr/avr/include/math.h" 3 |
||||||
|
extern double round (double __x) __attribute__((__const__)); |
||||||
|
# 439 "/usr/avr/include/math.h" 3 |
||||||
|
extern long lround (double __x) __attribute__((__const__)); |
||||||
|
# 453 "/usr/avr/include/math.h" 3 |
||||||
|
extern long lrint (double __x) __attribute__((__const__)); |
||||||
|
# 45 "/usr/avr/include/util/delay.h" 2 3 |
||||||
|
# 84 "/usr/avr/include/util/delay.h" 3 |
||||||
|
static inline void _delay_us(double __us) __attribute__((always_inline)); |
||||||
|
static inline void _delay_ms(double __ms) __attribute__((always_inline)); |
||||||
|
# 141 "/usr/avr/include/util/delay.h" 3 |
||||||
|
void |
||||||
|
_delay_ms(double __ms) |
||||||
|
{ |
||||||
|
double __tmp ; |
||||||
|
# 166 "/usr/avr/include/util/delay.h" 3 |
||||||
|
uint16_t __ticks; |
||||||
|
__tmp = ((16000000UL) / 4e3) * __ms; |
||||||
|
if (__tmp < 1.0) |
||||||
|
__ticks = 1; |
||||||
|
else if (__tmp > 65535) |
||||||
|
{ |
||||||
|
|
||||||
|
__ticks = (uint16_t) (__ms * 10.0); |
||||||
|
while(__ticks) |
||||||
|
{ |
||||||
|
|
||||||
|
_delay_loop_2(((16000000UL) / 4e3) / 10); |
||||||
|
__ticks --; |
||||||
|
} |
||||||
|
return; |
||||||
|
} |
||||||
|
else |
||||||
|
__ticks = (uint16_t)__tmp; |
||||||
|
_delay_loop_2(__ticks); |
||||||
|
|
||||||
|
} |
||||||
|
# 223 "/usr/avr/include/util/delay.h" 3 |
||||||
|
void |
||||||
|
_delay_us(double __us) |
||||||
|
{ |
||||||
|
double __tmp ; |
||||||
|
# 248 "/usr/avr/include/util/delay.h" 3 |
||||||
|
uint8_t __ticks; |
||||||
|
double __tmp2 ; |
||||||
|
__tmp = ((16000000UL) / 3e6) * __us; |
||||||
|
__tmp2 = ((16000000UL) / 4e6) * __us; |
||||||
|
if (__tmp < 1.0) |
||||||
|
__ticks = 1; |
||||||
|
else if (__tmp2 > 65535) |
||||||
|
{ |
||||||
|
_delay_ms(__us / 1000.0); |
||||||
|
} |
||||||
|
else if (__tmp > 255) |
||||||
|
{ |
||||||
|
uint16_t __ticks=(uint16_t)__tmp2; |
||||||
|
_delay_loop_2(__ticks); |
||||||
|
return; |
||||||
|
} |
||||||
|
else |
||||||
|
__ticks = (uint8_t)__tmp; |
||||||
|
_delay_loop_1(__ticks); |
||||||
|
|
||||||
|
} |
||||||
|
# 4 "main.c" 2 |
||||||
|
|
||||||
|
|
||||||
|
# 1 "/usr/avr/include/stdlib.h" 1 3 |
||||||
|
# 47 "/usr/avr/include/stdlib.h" 3 |
||||||
|
# 1 "/usr/lib/gcc/avr/4.9.2/include/stddef.h" 1 3 4 |
||||||
|
# 212 "/usr/lib/gcc/avr/4.9.2/include/stddef.h" 3 4 |
||||||
|
typedef unsigned int size_t; |
||||||
|
# 324 "/usr/lib/gcc/avr/4.9.2/include/stddef.h" 3 4 |
||||||
|
typedef int wchar_t; |
||||||
|
# 48 "/usr/avr/include/stdlib.h" 2 3 |
||||||
|
# 68 "/usr/avr/include/stdlib.h" 3 |
||||||
|
typedef struct { |
||||||
|
int quot; |
||||||
|
int rem; |
||||||
|
} div_t; |
||||||
|
|
||||||
|
|
||||||
|
typedef struct { |
||||||
|
long quot; |
||||||
|
long rem; |
||||||
|
} ldiv_t; |
||||||
|
|
||||||
|
|
||||||
|
typedef int (*__compar_fn_t)(const void *, const void *); |
||||||
|
# 114 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern void abort(void) __attribute__((__noreturn__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern int abs(int __i) __attribute__((__const__)); |
||||||
|
# 128 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern long labs(long __i) __attribute__((__const__)); |
||||||
|
# 151 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern void *bsearch(const void *__key, const void *__base, size_t __nmemb, |
||||||
|
size_t __size, int (*__compar)(const void *, const void *)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern div_t div(int __num, int __denom) __asm__("__divmodhi4") __attribute__((__const__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern ldiv_t ldiv(long __num, long __denom) __asm__("__divmodsi4") __attribute__((__const__)); |
||||||
|
# 183 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern void qsort(void *__base, size_t __nmemb, size_t __size, |
||||||
|
__compar_fn_t __compar); |
||||||
|
# 216 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern long strtol(const char *__nptr, char **__endptr, int __base); |
||||||
|
# 250 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern unsigned long strtoul(const char *__nptr, char **__endptr, int __base); |
||||||
|
# 262 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern long atol(const char *__s) __attribute__((__pure__)); |
||||||
|
# 274 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern int atoi(const char *__s) __attribute__((__pure__)); |
||||||
|
# 286 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern void exit(int __status) __attribute__((__noreturn__)); |
||||||
|
# 298 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern void *malloc(size_t __size) __attribute__((__malloc__)); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern void free(void *__ptr); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern size_t __malloc_margin; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern char *__malloc_heap_start; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern char *__malloc_heap_end; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern void *calloc(size_t __nele, size_t __size) __attribute__((__malloc__)); |
||||||
|
# 346 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern void *realloc(void *__ptr, size_t __size) __attribute__((__malloc__)); |
||||||
|
|
||||||
|
extern double strtod(const char *__nptr, char **__endptr); |
||||||
|
|
||||||
|
extern double atof(const char *__nptr); |
||||||
|
# 372 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern int rand(void); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern void srand(unsigned int __seed); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern int rand_r(unsigned long *__ctx); |
||||||
|
# 417 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern __inline__ __attribute__((__gnu_inline__)) |
||||||
|
char *itoa (int __val, char *__s, int __radix) |
||||||
|
{ |
||||||
|
if (!__builtin_constant_p (__radix)) { |
||||||
|
extern char *__itoa (int, char *, int); |
||||||
|
return __itoa (__val, __s, __radix); |
||||||
|
} else if (__radix < 2 || __radix > 36) { |
||||||
|
*__s = 0; |
||||||
|
return __s; |
||||||
|
} else { |
||||||
|
extern char *__itoa_ncheck (int, char *, unsigned char); |
||||||
|
return __itoa_ncheck (__val, __s, __radix); |
||||||
|
} |
||||||
|
} |
||||||
|
# 462 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern __inline__ __attribute__((__gnu_inline__)) |
||||||
|
char *ltoa (long __val, char *__s, int __radix) |
||||||
|
{ |
||||||
|
if (!__builtin_constant_p (__radix)) { |
||||||
|
extern char *__ltoa (long, char *, int); |
||||||
|
return __ltoa (__val, __s, __radix); |
||||||
|
} else if (__radix < 2 || __radix > 36) { |
||||||
|
*__s = 0; |
||||||
|
return __s; |
||||||
|
} else { |
||||||
|
extern char *__ltoa_ncheck (long, char *, unsigned char); |
||||||
|
return __ltoa_ncheck (__val, __s, __radix); |
||||||
|
} |
||||||
|
} |
||||||
|
# 505 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern __inline__ __attribute__((__gnu_inline__)) |
||||||
|
char *utoa (unsigned int __val, char *__s, int __radix) |
||||||
|
{ |
||||||
|
if (!__builtin_constant_p (__radix)) { |
||||||
|
extern char *__utoa (unsigned int, char *, int); |
||||||
|
return __utoa (__val, __s, __radix); |
||||||
|
} else if (__radix < 2 || __radix > 36) { |
||||||
|
*__s = 0; |
||||||
|
return __s; |
||||||
|
} else { |
||||||
|
extern char *__utoa_ncheck (unsigned int, char *, unsigned char); |
||||||
|
return __utoa_ncheck (__val, __s, __radix); |
||||||
|
} |
||||||
|
} |
||||||
|
# 547 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern __inline__ __attribute__((__gnu_inline__)) |
||||||
|
char *ultoa (unsigned long __val, char *__s, int __radix) |
||||||
|
{ |
||||||
|
if (!__builtin_constant_p (__radix)) { |
||||||
|
extern char *__ultoa (unsigned long, char *, int); |
||||||
|
return __ultoa (__val, __s, __radix); |
||||||
|
} else if (__radix < 2 || __radix > 36) { |
||||||
|
*__s = 0; |
||||||
|
return __s; |
||||||
|
} else { |
||||||
|
extern char *__ultoa_ncheck (unsigned long, char *, unsigned char); |
||||||
|
return __ultoa_ncheck (__val, __s, __radix); |
||||||
|
} |
||||||
|
} |
||||||
|
# 579 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern long random(void); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern void srandom(unsigned long __seed); |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
extern long random_r(unsigned long *__ctx); |
||||||
|
# 638 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern char *dtostre(double __val, char *__s, unsigned char __prec, |
||||||
|
unsigned char __flags); |
||||||
|
# 655 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern char *dtostrf(double __val, signed char __width, |
||||||
|
unsigned char __prec, char *__s); |
||||||
|
# 672 "/usr/avr/include/stdlib.h" 3 |
||||||
|
extern int atexit(void (*)(void)); |
||||||
|
extern int system (const char *); |
||||||
|
extern char *getenv (const char *); |
||||||
|
# 7 "main.c" 2 |
||||||
|
|
||||||
|
# 1 "lib/meta.h" 1 |
||||||
|
|
||||||
|
# 9 "main.c" 2 |
||||||
|
# 1 "lib/arduino_pins.h" 1 |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 1 "lib/pins.h" 1 |
||||||
|
|
||||||
|
# 30 "lib/pins.h" |
||||||
|
# 1 "lib/calc.h" 1 |
||||||
|
|
||||||
|
# 31 "lib/pins.h" 2 |
||||||
|
# 51 "lib/pins.h" |
||||||
|
typedef volatile uint8_t* PORT_P; |
||||||
|
|
||||||
|
typedef uint8_t BIT_N; |
||||||
|
# 8 "lib/arduino_pins.h" 2 |
||||||
|
# 10 "main.c" 2 |
||||||
|
|
||||||
|
# 1 "lib/colors.h" 1 |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct { |
||||||
|
uint8_t r; |
||||||
|
uint8_t g; |
||||||
|
uint8_t b; |
||||||
|
} xrgb_t; |
||||||
|
|
||||||
|
typedef uint32_t rgb24_t; |
||||||
|
typedef uint16_t rgb16_t; |
||||||
|
typedef uint16_t rgb12_t; |
||||||
|
typedef uint8_t rgb6_t; |
||||||
|
# 12 "main.c" 2 |
||||||
|
# 1 "lib/ws2812.h" 1 |
||||||
|
|
||||||
|
# 15 "lib/ws2812.h" |
||||||
|
# 1 "/usr/avr/include/avr/cpufunc.h" 1 3 |
||||||
|
# 16 "lib/ws2812.h" 2 |
||||||
|
|
||||||
|
|
||||||
|
# 1 "lib/nsdelay.h" 1 |
||||||
|
|
||||||
|
# 19 "lib/ws2812.h" 2 |
||||||
|
# 13 "main.c" 2 |
||||||
|
# 1 "lib/adc.h" 1 |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 1 "/usr/lib/gcc/avr/4.9.2/include/stdbool.h" 1 3 4 |
||||||
|
# 5 "lib/adc.h" 2 |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void adc_init() |
||||||
|
{ |
||||||
|
(*(volatile uint8_t *)(0x7A)) |= (1 << (2)) | (1 << (1)) | (1 << (0)); |
||||||
|
(*(volatile uint8_t *)(0x7C)) |= (1 << (6)); |
||||||
|
do { ((*(volatile uint8_t *)(0x7A))) |= (1 << (uint8_t)(7)); } while(0); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t adc_read_byte(uint8_t channel) |
||||||
|
{ |
||||||
|
do { ((*(volatile uint8_t *)(0x7C))) = (((*(volatile uint8_t *)(0x7C))) & 0xF0) | ((uint8_t)(channel) & 0xF); } while(0); |
||||||
|
do { ((*(volatile uint8_t *)(0x7C))) |= (1 << (uint8_t)(5)); } while(0); |
||||||
|
do { ((*(volatile uint8_t *)(0x7A))) |= (1 << (uint8_t)(6)); } while(0); |
||||||
|
|
||||||
|
while(((((uint8_t)((*(volatile uint8_t *)(0x7A)))) >> (uint8_t)(6)) & 0x1)); |
||||||
|
|
||||||
|
return (*(volatile uint8_t *)(0x79)); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
uint16_t adc_read_word(uint8_t channel) |
||||||
|
{ |
||||||
|
do { ((*(volatile uint8_t *)(0x7C))) = (((*(volatile uint8_t *)(0x7C))) & 0xF0) | ((uint8_t)(channel) & 0xF); } while(0); |
||||||
|
do { ((*(volatile uint8_t *)(0x7C))) &= ~(1 << (uint8_t)(5)); } while(0); |
||||||
|
do { ((*(volatile uint8_t *)(0x7A))) |= (1 << (uint8_t)(6)); } while(0); |
||||||
|
|
||||||
|
while(((((uint8_t)((*(volatile uint8_t *)(0x7A)))) >> (uint8_t)(6)) & 0x1)); |
||||||
|
|
||||||
|
return (*(volatile uint16_t *)(0x78)); |
||||||
|
} |
||||||
|
# 14 "main.c" 2 |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# 1 "lib/debounce.h" 1 |
||||||
|
|
||||||
|
# 51 "lib/debounce.h" |
||||||
|
typedef struct { |
||||||
|
PORT_P reg; |
||||||
|
uint8_t bit; |
||||||
|
uint8_t count; |
||||||
|
} debo_slot_t; |
||||||
|
|
||||||
|
|
||||||
|
debo_slot_t debo_slots[6]; |
||||||
|
uint8_t debo_next_slot = 0; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
uint8_t debo_register(PORT_P reg, uint8_t bit, _Bool invert) |
||||||
|
{ |
||||||
|
debo_slots[debo_next_slot] = (debo_slot_t){ |
||||||
|
.reg = reg, |
||||||
|
.bit = bit | ((invert & 1) << 7) | (((*(reg) >> (uint8_t)(bit)) & 0x1) << 6), |
||||||
|
.count = 0, |
||||||
|
}; |
||||||
|
|
||||||
|
return debo_next_slot++; |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void debo_tick() |
||||||
|
{ |
||||||
|
for (uint8_t i = 0; i < debo_next_slot; i++) { |
||||||
|
|
||||||
|
_Bool value = ((*(debo_slots[i].reg) >> (uint8_t)(debo_slots[i].bit & 0x7)) & 0x1); |
||||||
|
|
||||||
|
if (value != ((((uint8_t)(debo_slots[i].bit)) >> (uint8_t)(6)) & 0x1)) { |
||||||
|
|
||||||
|
|
||||||
|
if (debo_slots[i].count < 1) { |
||||||
|
debo_slots[i].count++; |
||||||
|
} else { |
||||||
|
|
||||||
|
do { (debo_slots[i].bit) = ((debo_slots[i].bit) & ~(1 << (uint8_t)(6))) | (((uint8_t)(value) & 0x1) << (uint8_t)(6)); } while(0); |
||||||
|
debo_slots[i].count = 0; |
||||||
|
} |
||||||
|
} else { |
||||||
|
debo_slots[i].count = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
} |
||||||
|
# 19 "main.c" 2 |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
const xrgb_t COLORS[] = { |
||||||
|
{ .r = ((uint8_t)(((((rgb24_t) (0xB14835)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0xB14835)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0xB14835)) >> 0) & 0xFF))) }, |
||||||
|
{ .r = ((uint8_t)(((((rgb24_t) (0x4C1661)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0x4C1661)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0x4C1661)) >> 0) & 0xFF))) }, |
||||||
|
{ .r = ((uint8_t)(((((rgb24_t) (0xA3268E)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0xA3268E)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0xA3268E)) >> 0) & 0xFF))) }, |
||||||
|
{ .r = ((uint8_t)(((((rgb24_t) (0x009ADA)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0x009ADA)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0x009ADA)) >> 0) & 0xFF))) }, |
||||||
|
{ .r = ((uint8_t)(((((rgb24_t) (0x007D8F)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0x007D8F)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0x007D8F)) >> 0) & 0xFF))) }, |
||||||
|
{ .r = ((uint8_t)(((((rgb24_t) (0x002E5A)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0x002E5A)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0x002E5A)) >> 0) & 0xFF))) }, |
||||||
|
{ .r = ((uint8_t)(((((rgb24_t) (0x56BCC1)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0x56BCC1)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0x56BCC1)) >> 0) & 0xFF))) }, |
||||||
|
{ .r = ((uint8_t)(((((rgb24_t) (0x01654D)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0x01654D)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0x01654D)) >> 0) & 0xFF))) }, |
||||||
|
{ .r = ((uint8_t)(((((rgb24_t) (0xF5864F)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0xF5864F)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0xF5864F)) >> 0) & 0xFF))) }, |
||||||
|
{ .r = ((uint8_t)(((((rgb24_t) (0xED1B24)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0xED1B24)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0xED1B24)) >> 0) & 0xFF))) }, |
||||||
|
{ .r = ((uint8_t)(((((rgb24_t) (0xFDAF17)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0xFDAF17)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0xFDAF17)) >> 0) & 0xFF))) }, |
||||||
|
{ .r = ((uint8_t)(((((rgb24_t) (0xF58F83)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0xF58F83)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0xF58F83)) >> 0) & 0xFF))) }, |
||||||
|
{ .r = ((uint8_t)(((((rgb24_t) (0xED008C)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0xED008C)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0xED008C)) >> 0) & 0xFF))) }, |
||||||
|
{ .r = ((uint8_t)(((((rgb24_t) (0xFEF200)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0xFEF200)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0xFEF200)) >> 0) & 0xFF))) }, |
||||||
|
{ .r = ((uint8_t)(((((rgb24_t) (0x6D9346)) >> 16) & 0xFF))), .g = ((uint8_t)(((((rgb24_t) (0x6D9346)) >> 8) & 0xFF))), .b = ((uint8_t)(((((rgb24_t) (0x6D9346)) >> 0) & 0xFF))) }, |
||||||
|
}; |
||||||
|
# 73 "main.c" |
||||||
|
void render(); |
||||||
|
void update(); |
||||||
|
|
||||||
|
|
||||||
|
void __attribute__((naked, used, section(".init8"))) init() |
||||||
|
{ |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
do { ((*(volatile uint8_t *)((0x04) + 0x20))) |= (1 << (uint8_t)((2))); } while(0); |
||||||
|
|
||||||
|
|
||||||
|
do { do { ((*(volatile uint8_t *)((0x0A) + 0x20))) &= ~(1 << (uint8_t)((2))); } while(0); do { ((*(volatile uint8_t *)((0x0B) + 0x20))) |= (1 << (uint8_t)((2))); } while(0); } while(0); |
||||||
|
do { do { ((*(volatile uint8_t *)((0x0A) + 0x20))) &= ~(1 << (uint8_t)((3))); } while(0); do { ((*(volatile uint8_t *)((0x0B) + 0x20))) |= (1 << (uint8_t)((3))); } while(0); } while(0); |
||||||
|
do { do { ((*(volatile uint8_t *)((0x0A) + 0x20))) &= ~(1 << (uint8_t)((4))); } while(0); do { ((*(volatile uint8_t *)((0x0B) + 0x20))) |= (1 << (uint8_t)((4))); } while(0); } while(0); |
||||||
|
do { do { ((*(volatile uint8_t *)((0x0A) + 0x20))) &= ~(1 << (uint8_t)((5))); } while(0); do { ((*(volatile uint8_t *)((0x0B) + 0x20))) |= (1 << (uint8_t)((5))); } while(0); } while(0); |
||||||
|
do { do { ((*(volatile uint8_t *)((0x0A) + 0x20))) &= ~(1 << (uint8_t)((6))); } while(0); do { ((*(volatile uint8_t *)((0x0B) + 0x20))) |= (1 << (uint8_t)((6))); } while(0); } while(0); |
||||||
|
do { do { ((*(volatile uint8_t *)((0x0A) + 0x20))) &= ~(1 << (uint8_t)((7))); } while(0); do { ((*(volatile uint8_t *)((0x0B) + 0x20))) |= (1 << (uint8_t)((7))); } while(0); } while(0); |
||||||
|
|
||||||
|
|
||||||
|
debo_register(&(*(volatile uint8_t *)((0x09) + 0x20)), 2, 1); |
||||||
|
debo_register(&(*(volatile uint8_t *)((0x09) + 0x20)), 3, 1); |
||||||
|
debo_register(&(*(volatile uint8_t *)((0x09) + 0x20)), 4, 1); |
||||||
|
debo_register(&(*(volatile uint8_t *)((0x09) + 0x20)), 5, 1); |
||||||
|
debo_register(&(*(volatile uint8_t *)((0x09) + 0x20)), 6, 1); |
||||||
|
debo_register(&(*(volatile uint8_t *)((0x09) + 0x20)), 7, 1); |
||||||
|
|
||||||
|
|
||||||
|
(*(volatile uint8_t *)((0x24) + 0x20)) = (1 << (1)); |
||||||
|
(*(volatile uint8_t *)((0x25) + 0x20)) = (1 << (2)) | (1 << (0)); |
||||||
|
(*(volatile uint8_t *)((0x27) + 0x20)) = 156; |
||||||
|
do { ((*(volatile uint8_t *)(0x6E))) |= (1 << (uint8_t)(1)); } while(0); |
||||||
|
|
||||||
|
|
||||||
|
__asm__ __volatile__ ("sei" ::: "memory"); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
void __vector_14 (void) __attribute__ ((signal,used, externally_visible)) ; void __vector_14 (void) |
||||||
|
{ |
||||||
|
|
||||||
|
update(); |
||||||
|
render(); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
void main() |
||||||
|
{ |
||||||
|
while(1); |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef enum { |
||||||
|
SECRET, |
||||||
|
REVEALED, |
||||||
|
GONE |
||||||
|
} tilestate_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
typedef struct { |
||||||
|
uint8_t color; |
||||||
|
tilestate_t state; |
||||||
|
} tile_t; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
tile_t board[(6 * 5)]; |
||||||
|
|
||||||
|
|
||||||
|
uint8_t cursor = 0; |
||||||
|
|
||||||
|
volatile uint8_t noise = 0; |
||||||
|
uint16_t xxx = 0; |
||||||
|
|
||||||
|
void update() |
||||||
|
{ |
||||||
|
if(xxx++ >= 100) { |
||||||
|
noise = adc_read_byte(0); |
||||||
|
xxx = 0; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
xrgb_t screen[(6 * 5)]; |
||||||
|
|
||||||
|
|
||||||
|
void render() |
||||||
|
{ |
||||||
|
const rgb24_t BLUE = 0x005397; |
||||||
|
const rgb24_t RED = 0xFF0000; |
||||||
|
const rgb24_t YELLOW = 0xFFFF00; |
||||||
|
const rgb24_t BLACK = 0x000000; |
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
rgb24_t c; |
||||||
|
for (uint8_t i = 0; i < (6 * 5); i++) { |
||||||
|
|
||||||
|
c = YELLOW; |
||||||
|
|
||||||
|
if (i < 8) { |
||||||
|
c = ((((uint8_t)(noise)) >> (uint8_t)(i)) & 0x1) ? RED : BLUE; |
||||||
|
} |
||||||
|
|
||||||
|
do { do { for (volatile int8_t __wsba_i = 7; __wsba_i >= 0; --__wsba_i) { if ((((((rgb24_t) (c)) >> 8) & 0xFF)) & (1 << __wsba_i)) { __asm__ __volatile__("":::"memory"); do { ((*(volatile uint8_t *)((0x05) + 0x20))) |= (1 << (uint8_t)((2))); } while(0); (((( (700) / (1000000000L / (signed long) 16000000UL) ) + (-2)) > 0) ? __builtin_avr_delay_cycles(( (700) / (1000000000L / (signed long) 16000000UL) ) + (-2)) : __builtin_avr_delay_cycles(0)); __asm__ __volatile__("":::"memory"); do { ((*(volatile uint8_t *)((0x05) + 0x20))) &= ~(1 << (uint8_t)((2))); } while(0); (((( (150) / (1000000000L / (signed long) 16000000UL) ) + (-10)) > 0) ? __builtin_avr_delay_cycles(( (150) / (1000000000L / (signed long) 16000000UL) ) + (-10)) : __builtin_avr_delay_cycles(0)); } else { __asm__ __volatile__("":::"memory"); do { ((*(volatile uint8_t *)((0x05) + 0x20))) |= (1 << (uint8_t)((2))); } while(0); (((( (150) / (1000000000L / (signed long) 16000000UL) ) + (-2)) > 0) ? __builtin_avr_delay_cycles(( (150) / (1000000000L / (signed long) 16000000UL) ) + (-2)) : __builtin_avr_delay_cycles(0)); __asm__ __volatile__("":::"memory"); do { ((*(volatile uint8_t *)((0x05) + 0x20))) &= ~(1 << (uint8_t)((2))); } while(0); (((( (700) / (1000000000L / (signed long) 16000000UL) ) + (-10)) > 0) ? __builtin_avr_delay_cycles(( (700) / (1000000000L / (signed long) 16000000UL) ) + (-10)) : __builtin_avr_delay_cycles(0)); } } } while(0); do { for (volatile int8_t __wsba_i = 7; __wsba_i >= 0; --__wsba_i) { if ((((((rgb24_t) (c)) >> 16) & 0xFF)) & (1 << __wsba_i)) { __asm__ __volatile__("":::"memory"); do { ((*(volatile uint8_t *)((0x05) + 0x20))) |= (1 << (uint8_t)((2))); } while(0); (((( (700) / (1000000000L / (signed long) 16000000UL) ) + (-2)) > 0) ? __builtin_avr_delay_cycles(( (700) / (1000000000L / (signed long) 16000000UL) ) + (-2)) : __builtin_avr_delay_cycles(0)); __asm__ __volatile__("":::"memory"); do { ((*(volatile uint8_t *)((0x05) + 0x20))) &= ~(1 << (uint8_t)((2))); } while(0); (((( (150) / (1000000000L / (signed long) 16000000UL) ) + (-10)) > 0) ? __builtin_avr_delay_cycles(( (150) / (1000000000L / (signed long) 16000000UL) ) + (-10)) : __builtin_avr_delay_cycles(0)); } else { __asm__ __volatile__("":::"memory"); do { ((*(volatile uint8_t *)((0x05) + 0x20))) |= (1 << (uint8_t)((2))); } while(0); (((( (150) / (1000000000L / (signed long) 16000000UL) ) + (-2)) > 0) ? __builtin_avr_delay_cycles(( (150) / (1000000000L / (signed long) 16000000UL) ) + (-2)) : __builtin_avr_delay_cycles(0)); __asm__ __volatile__("":::"memory"); do { ((*(volatile uint8_t *)((0x05) + 0x20))) &= ~(1 << (uint8_t)((2))); } while(0); (((( (700) / (1000000000L / (signed long) 16000000UL) ) + (-10)) > 0) ? __builtin_avr_delay_cycles(( (700) / (1000000000L / (signed long) 16000000UL) ) + (-10)) : __builtin_avr_delay_cycles(0)); } } } while(0); do { for (volatile int8_t __wsba_i = 7; __wsba_i >= 0; --__wsba_i) { if ((((((rgb24_t) (c)) >> 0) & 0xFF)) & (1 << __wsba_i)) { __asm__ __volatile__("":::"memory"); do { ((*(volatile uint8_t *)((0x05) + 0x20))) |= (1 << (uint8_t)((2))); } while(0); (((( (700) / (1000000000L / (signed long) 16000000UL) ) + (-2)) > 0) ? __builtin_avr_delay_cycles(( (700) / (1000000000L / (signed long) 16000000UL) ) + (-2)) : __builtin_avr_delay_cycles(0)); __asm__ __volatile__("":::"memory"); do { ((*(volatile uint8_t *)((0x05) + 0x20))) &= ~(1 << (uint8_t)((2))); } while(0); (((( (150) / (1000000000L / (signed long) 16000000UL) ) + (-10)) > 0) ? __builtin_avr_delay_cycles(( (150) / (1000000000L / (signed long) 16000000UL) ) + (-10)) : __builtin_avr_delay_cycles(0)); } else { __asm__ __volatile__("":::"memory"); do { ((*(volatile uint8_t *)((0x05) + 0x20))) |= (1 << (uint8_t)((2))); } while(0); (((( (150) / (1000000000L / (signed long) 16000000UL) ) + (-2)) > 0) ? __builtin_avr_delay_cycles(( (150) / (1000000000L / (signed long) 16000000UL) ) + (-2)) : __builtin_avr_delay_cycles(0)); __asm__ __volatile__("":::"memory"); do { ((*(volatile uint8_t *)((0x05) + 0x20))) &= ~(1 << (uint8_t)((2))); } while(0); (((( (700) / (1000000000L / (signed long) 16000000UL) ) + (-10)) > 0) ? __builtin_avr_delay_cycles(( (700) / (1000000000L / (signed long) 16000000UL) ) + (-10)) : __builtin_avr_delay_cycles(0)); } } } while(0); } while(0); |
||||||
|
} |
||||||
|
|
||||||
|
do { __asm__ __volatile__("":::"memory"); (((( (7000) / (1000000000L / (signed long) 16000000UL) ) + (0)) > 0) ? __builtin_avr_delay_cycles(( (7000) / (1000000000L / (signed long) 16000000UL) ) + (0)) : __builtin_avr_delay_cycles(0)); } while(0); |
||||||
|
} |
Loading…
Reference in new issue