Страница 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

Действие при нажатии на кнопку:

Код: Выделить всё

lighting_mode =  SOLID_MODE;