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

Модератор: boogyman

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

Сообщение:#1  Сообщение Naman » 02 сен 2013, 12:58

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

Вот собственно то что я нашел
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 &lt;avr/io.h&gt;
#include &lt;avr/interrupt.h&gt;
#include &lt;util/delay.h&gt;
#include &lt;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


Это все что я смог сделать, есть ли тут кто может помочь мне с этой задумкой
Аватара пользователя
Naman
Новичок
 
Сообщения: 2
Зарегистрирован: 02 сен 2013, 12:51

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

Сообщение:#2  Сообщение boogyman » 02 сен 2013, 13:43

Предлагаю программу разделить на 2 вечных цикла, в одном условие кнопка SB2 нажата, в другом не нажата. Определить в EEPROM 2 переменных. В одном цикле соответствующая переменная настраивается, при выходе из цикла соответствующая переменная записывается в память, также в другом цикле. При входе в цикл соответствующая переменная считывается.
Аватара пользователя
boogyman
Модератор
 
Сообщения: 183
Зарегистрирован: 25 дек 2011, 21:48
Откуда: Москва

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

Сообщение:#3  Сообщение Naman » 02 сен 2013, 13:59

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


Собственно что то вроде этого и хотел изобразить)))Если сможешь помочь буду благодарен
Аватара пользователя
Naman
Новичок
 
Сообщения: 2
Зарегистрирован: 02 сен 2013, 12:51


Вернуться в Микроконтроллеры AVR

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1

Rambler's Top100