Страница 1 из 1

Нужна помощь с шим регуляторо яркости светодиодов на atmega8

Добавлено: 02 сен 2013, 13:58
Naman
Вообщем давно хотел сделать шим регулятор, но сам не особо разбираюсь с микроконтроллерами, но вот в интерене нашел что то похожее на то что я хотел и решил переделать это под нужное мне дело. Но только не все понимаю, вот и решил попросить помощи здесь.

Вот собственно то что я нашел
366-03.GIF
здесь управление 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);

}

}
автор так же написал что программа не совсем рабочая.
Ну я хочу сделать так чтобы шим управлял яркостью всего лишь одного светодиода, но в двух режимах и чтобы настройки яркости сохранялись при отключении питания.
т.е схемка примерно получается такая
366-033.gif
Т.е. принцип работы такой при включении питания загорается диод и с помощью энкодера регулируется яркость, при нажатии на энкодер значение записывается, но при замыкании контакта на 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
}  
Это все что я смог сделать, есть ли тут кто может помочь мне с этой задумкой

Re: Нужна помощь с шим регуляторо яркости светодиодов на atm

Добавлено: 02 сен 2013, 14:43
boogyman
Предлагаю программу разделить на 2 вечных цикла, в одном условие кнопка SB2 нажата, в другом не нажата. Определить в EEPROM 2 переменных. В одном цикле соответствующая переменная настраивается, при выходе из цикла соответствующая переменная записывается в память, также в другом цикле. При входе в цикл соответствующая переменная считывается.

Re: Нужна помощь с шим регуляторо яркости светодиодов на atm

Добавлено: 02 сен 2013, 14:59
Naman
boogyman писал(а):Предлагаю программу разделить на 2 вечных цикла, в одном условие кнопка SB2 нажата, в другом не нажата. Определить в EEPROM 2 переменных. В одном цикле соответствующая переменная настраивается, при выходе из цикла соответствующая переменная записывается в память, также в другом цикле. При входе в цикл соответствующая переменная считывается.
Собственно что то вроде этого и хотел изобразить)))Если сможешь помочь буду благодарен