Вот собственно то что я нашел здесь управление rgb лентой с помощью энкодора
Код: Выделить всё
// Принцип работы энкодера. Управляем RGB светодиодом с помощью энкодера
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
volatile char pwm_counter,pwm_r,pwm_g,pwm_b, button = 0;
// Обработчик прерывания int0
ISR(SIG_INTERRUPT0)
{_delay_us(50);
if((PIND & (1 << PD2))==0)
{_delay_us(50);
if((PIND & (1 << PD0))==0)
{
if(button == 0) // уменьшаем красный цвет
{ pwm_r--; if(pwm_r < 1) pwm_r = 1; }
if(button == 1) // уменьшаем зеленый цвет
{ pwm_g--; if(pwm_g < 1) pwm_g = 1;}
if(button == 2) // уменьшаем синий цвет
{ pwm_b--; if(pwm_b < 1) pwm_b = 1; }
}
else
{
if(button == 0) // увеличиваем красный цвет
{ pwm_r++; if(pwm_r > 64) pwm_r = 64; }
if(button == 1) // увеличиваем зеленый цвет
{ pwm_g++; if(pwm_g > 64) pwm_g = 64; }
if(button == 2) // увеличиваем синий цвет
{ pwm_b++; if(pwm_b > 64) pwm_b = 64; }
}
}
GIFR = (1< 63)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > pwm_r) PORTB |= (1 << PB0);
if (pwm_counter > pwm_g) PORTB |= (1 << PB1);
if (pwm_counter > pwm_b) PORTB |= (1 << PB2);
}
// Главная функция
int main (void)
{
DDRB |= (1 << PB5)|(1 << PB4)|(1 << PB3)|(1 << PB2)|(1 << PB1)|(1 << PB0); // выходы
PORTB = 0x00;
DDRD |= (0 << PD2)|(0 << PD1)|(0 << PD0); // входы
PORTD |= (1 << PD2)|(1 << PD1)|(1 << PD0); // подключаем подтягивающие резисторы
TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0
TCCR0 |= (1 << CS00);
MCUCR |= (0 << ISC00)|(1 << ISC01); // прерывание по заднему фронту INT0(по спаду импульса)
GIFR |= (1 << INTF0); // очищаем флаг внешнего прерывания
GICR |= (1 << INT0); // разрешаем внешние прерывания INT0
sei(); //глобально разрешаем прерывания
pwm_r = 64; // начальные установки цветов, min яркость
pwm_g = 64;
pwm_b = 64;
while(1)
{
if((PIND & (1 << PD1))==0) // если нажата кнопка
{
while((PIND & (1 << PD1))==0){} // ждем отпускания кнопки
button++;
_delay_ms(100);
if(button == 3)
button = 0;
}
if(button == 0)
PORTB |= (1 << PB3);
if(button == 1)
PORTB |= (1 << PB4);
if(button == 2)
PORTB |= (1 << PB5);
}
}
Ну я хочу сделать так чтобы шим управлял яркостью всего лишь одного светодиода, но в двух режимах и чтобы настройки яркости сохранялись при отключении питания.
т.е схемка примерно получается такая Т.е. принцип работы такой при включении питания загорается диод и с помощью энкодера регулируется яркость, при нажатии на энкодер значение записывается, но при замыкании контакта на sb2 переходит в другой режим и тут уже своя яркость и так же настраивается и записывается, при размыкании снова переходит в начальный режим, вот как то так. Начал пытаться править код вот что пока получается
Код: Выделить всё
// Принцип работы энкодера. Управляем светодиодом с помощью энкодера
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include <avr/eeprom.h;
unsigned char z,s;
unsigned char eeprom_var EEMEM; // определяем переменную в EEPROM
volatile char pwm_counter,pwm_r,pwm_g,pwm_b, button = 0;
// Обработчик прерывания int0
ISR(SIG_INTERRUPT0)
{_delay_us(50);
if((PIND & (1 << PD3))==0)
{
if(button == 0) // первый режим убавляем яркость
{ pwm_r--; if(pwm_r < 1) pwm_r = 1; }
if(button == 1) // второй режим убавляем яркость
{ pwm_g--; if(pwm_g < 1) pwm_g = 1;}
}
else
{
if(button == 0) // первый режим прибавляем яркость
{ pwm_r++; if(pwm_r > 64) pwm_r = 64; }
if(button == 1) // второй режим прибавляем яркость
{ pwm_g++; if(pwm_g > 64) pwm_g = 64; }
}
}
GIFR = (1< 63)
{
PORTB = 0x00;
pwm_counter = 0;
}
if (pwm_counter > pwm_r) PORTB |= (1 << PB0);
if (pwm_counter > pwm_g) PORTB |= (1 << PB1);
}
// Главная функция
int main (void)
{
DDRB |= (1 << PB4)|(1 << PB3)|(1 << PB0); // выходы
PORTB = 0x00;
DDRD |= (0 << PD3)|(0 << PD2)|(0 << PD1)|(0 << PD0); // входы
PORTD |= (1 << PD2)|(1 << PD1)|(1 << PD0)|(1 << PD3); // подключаем подтягивающие резисторы
z = eeprom_read_byte(&eeprom_var); // считываем байт из EEPROM и помещаем его в "z"
s = eeprom_read_byte(&eeprom_var); // считываем байт из EEPROM и помещаем его в "s"
TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0
TCCR0 |= (1 << CS00);
MCUCR |= (0 << ISC00)|(1 << ISC01); // прерывание по заднему фронту INT0(по спаду импульса)
GIFR |= (1 << INTF0); // очищаем флаг внешнего прерывания
GICR |= (1 << INT0); // разрешаем внешние прерывания INT0
sei(); //глобально разрешаем прерывания
pwm_r = z; // установки цветов из памяти
pwm_g = s;
while(1)
{
if((PIND & (1 << PD3))==0) // если включен второй режим
{
button++;
_delay_ms(100);
}
if(button == 0)
PORTB |= (1 << PB3);
if(button == 1)
PORTB |= (1 << PB4);
}
while(2)
{
if((PIND & (1 << PD1))==0) // нажатие кнопки
{
while((PIND & (1 << PD1))==0){} // ждем отпускания кнопки
_delay_ms(100);
}
if(button == 0)
eeprom_write_byte(&eeprom_var, z); // записываем "z" в EEPROM
if(button == 0)
eeprom_write_byte(&eeprom_var, s); // записываем "s" в EEPROM
}