Skip to content

Instantly share code, notes, and snippets.

@st3fan
Created April 1, 2011 04:20
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save st3fan/897725 to your computer and use it in GitHub Desktop.
Save st3fan/897725 to your computer and use it in GitHub Desktop.
#include <avr/io.h>
#include <avr/wdt.h>
#include <avr/eeprom.h>
#include <util/delay.h>
uint8_t red = 0;
uint8_t green = 0;
uint8_t blue = 0;
uint16_t ee_program __attribute__((section(".eeprom"))) = 0;
void pulse()
{
if ((PINB & (1 << PB3)) == 0)
{
while ((PINB & (1 << PB3)) == 0) {
// Wait for button up
}
_delay_ms(100);
uint8_t program = eeprom_read_byte(&ee_program);
program++;
if (program == 3) {
program = 0;
}
eeprom_write_byte(&ee_program, program);
wdt_enable(WDTO_15MS);
while (1) {
// Loop until the WDT fails and does a reset
}
}
if (red) {
PORTB |= (1 << PB0);
}
if (green) {
PORTB |= (1 << PB1);
}
if (blue) {
PORTB |= (1 << PB2);
}
for (uint8_t i = 0; i < 100; i++)
{
if (i == red) {
PORTB &= ~(1 << PB0);
}
if (i == green) {
PORTB &= ~(1 << PB1);
}
if (i == blue) {
PORTB &= ~(1 << PB2);
}
_delay_us(5);
}
}
void program0()
{
uint8_t n = 8;
// To red
for (uint8_t i = 0; i < n*8; i++) {
red++;
for (int j = 0; j < n; j++) {
pulse();
}
}
for (uint8_t i = 0; i < n * 8; i++) {
pulse();
}
while (1)
{
// red to blue
for (uint8_t i = 0; i < n*8; i++) {
red--;
blue++;
for (int j = 0; j < n; j++) {
pulse();
}
}
for (uint8_t i = 0; i < n*8; i++) {
pulse();
}
// blue to green
for (uint8_t i = 0; i < n*8; i++) {
blue--;
green++;
for (int j = 0; j < n; j++) {
pulse();
}
}
for (uint8_t i = 0; i < n*8; i++) {
pulse();
}
// green to red
for (uint8_t i = 0; i < n*8; i++) {
green--;
red++;
for (int j = 0; j < n; j++) {
pulse();
}
}
for (uint8_t i = 0; i < n*8; i++) {
pulse();
}
}
}
void program1()
{
while (1) {
for (uint8_t i = 0; i < 255; i++) {
red = 99; green = 0; blue = 0;
pulse();
}
for (uint8_t i = 0; i < 255; i++) {
red = 0; green = 99; blue = 0;
pulse();
}
for (uint8_t i = 0; i < 255; i++) {
red = 0; green = 0; blue = 99;
pulse();
}
}
}
void program2()
{
red = green = blue = 0;
while (1) {
for (uint8_t i = 0; i < 100; i++) {
red++;
pulse();
}
for (uint8_t i = 0; i < 100; i++) {
red--;
pulse();
}
}
}
int main(void)
{
DDRB = (1 << PB0) | (1 << PB1) | (1 << PB2);
MCUSR = 0;
wdt_disable();
uint8_t program = eeprom_read_byte(&ee_program);
if (program > 2) {
program = 0;
eeprom_write_byte(&ee_program, program);
}
switch (program) {
case 0:
program0();
break;
case 1:
program1();
break;
case 2:
program2();
break;
}
return 0;
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment