Страница 1 из 1
RGB Led attiny13
Добавлено: Ср дек 12, 2012 00:19:50
cujozz
Здравствуйте форумчане, помогите с написанием программы для attiny13 (именно на ней)
алгоритм следующий:
При подаче питания (включение) цвета плавно медленно перетекают,
одно кратковременное нажатие на кнопку ставит цвет на паузу
одно долгое (удерживаемое) нажатие: цвета быстро перетекают (типа перемотка) во время нажатия,
отпустили кнопку и перетекают в обычном режиме
2 нажатия выключается,
1 нажатие включается и цвета перетекают плавно итд
По моему будет очень приятный интерфейс управления "лампой настроения" и не только
Re: RGB Led attiny13
Добавлено: Ср дек 12, 2012 14:41:35
cujozz
Код: Выделить всё
#include <avr/io.h>
#define F_CPU 1200000UL
#define output_low(port,pin) port &= ~(1<<pin)
#define output_high(port,pin) port |= (1<<pin)
#define set_output(portdir,pin) portdir |= (1<<pin)
#define RED PB0
#define GREEN PB1
#define BLUE PB2
typedef struct {
int red;
int green;
int blue;
} rgb;
rgb channels = { 0x00, 0x00, 0x00 };
#define DEBUG_MODE 0
#define RAINBOW_MODE 1
#define SOLID_MODE 2
#define PULSE_MODE 3
int lighting_mode;
void rainbow_step(void) {
if(channels.blue > 0x00 && channels.red == 0xFF && channels.green == 0x00) {
channels.blue--;
}
if(channels.blue == 0xFF && channels.red < 0xFF && channels.green == 0x00) {
channels.red++;
}
if(channels.green > 0x00 && channels.blue == 0xFF && channels.red == 0x00) {
channels.green--;
}
if(channels.green == 0xFF && channels.blue < 0xFF && channels.red == 0x00) {
channels.blue++;
}
if(channels.red > 0x00 && channels.green == 0xFF && channels.blue == 0x00) {
channels.red--;
}
if(channels.red == 0xFF && channels.green < 0xFF && channels.blue == 0x00) {
channels.green++;
}
}
void solid_step(void) {
}
void pulse_step(void) {
}
void do_pwm(int r_duty, int g_duty, int b_duty, int rate) {
int i;
while (rate != 0) {
PORTB |= (1<<RED) | (1<<GREEN) | (1<<BLUE);
for (i=0; i < 255; i++) {
if (i == r_duty)
output_low(PORTB, RED);
if (i == g_duty)
output_low(PORTB, GREEN);
if (i == b_duty)
output_low(PORTB, BLUE);
}
rate--;
}
}
void init(void) {
channels.red = 0xFF;
lighting_mode = RAINBOW_MODE;
set_output(DDRB, RED);
set_output(DDRB, GREEN);
set_output(DDRB, BLUE);
}
int main(void) {
init();
while(1) {
switch (lighting_mode) {
case DEBUG_MODE:
break;
case RAINBOW_MODE:
rainbow_step();
break;
case SOLID_MODE:
solid_step();
break;
case PULSE_MODE:
pulse_step();
break;
default:
lighting_mode = RAINBOW_MODE;
}
do_pwm(channels.red, channels.green, channels.blue, 15);
}
return 0;
}
этот код бесконечно меняет цвета, подскажите как поставить на паузу
Re: RGB Led attiny13
Добавлено: Чт дек 13, 2012 08:23:00
mr_smit
cujozz писал(а):подскажите как поставить на паузу
Перейти в режим solid_step(); или pulse_step(); т.е. просто пустой цикл. Это позволит перестать перебирать цвета и делать шим с постоянными значениями цветов channels.red, channels.green, channels.blue
Действие при нажатии на кнопку: