Шим регулятор яркости светодиодов на atmega8

Обсуждаем контроллеры компании Atmel.
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

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

Вот собственно то что я нашел
366-03.GIF
(34.84 КБ) 1961 скачивание
здесь управление 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
(27.59 КБ) 1311 скачиваний


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


Это все что я пока смог сделать
Аватара пользователя
Eugene.Negrobov
Мучитель микросхем
Сообщения: 472
Зарегистрирован: Ср фев 15, 2012 09:00:34
Откуда: Киев

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Eugene.Negrobov »

Обязательно на энкодере и обязательно не на CVAVR?
Если нужен конкретно работающий девайс, то можно было бы сделать на ATtiny13(Мега8 уж слишком жирная для такого дела) и потенциометре, оцифровывающимся АЦП... Ну или на кнопках на худой конец.
Хотя, если нужен конкретно аппарат, то можно и на tl494, и на генераторе пилы на трех транзисторах и компараторе. :))

Помочь могу только с кодом под Codevision(под энкодер тоже), за помощью с тем ужасом на кральях ночи из шапки обращайся к юзеру "YS", он у нас фанат пацановских компиляторов с вырвиглазным кодом. :)))
I'm on a huge rock, flying through space!
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение COKPOWEHEU »

А обязательно на программном ШИМе городить, может аппаратные все же удобнее?
С энкодером дела не имел поэтому именно в его опросе помочь не могу, разве что идеей. Хранить и изменять можно только текущую мощность (в случае аппаратного ШИМа прямо в регистре OCRxy), по нажатию кнопки сохранять эту мощность в ПЗУ, изменять адрес и загружать оттуда другую.
Грубо говоря, так

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

#define addr1 0x0000 //адрес первой программы
#define addr2 0x0002 //адрес второй программы

unsigned char modeaddr=addr1;

OnChangeValue(){ //событие при изменении яркости
 OCRxy=value;
}
OnKeyPress{ //событие при нажатии на кноку
 eeprom_write_word(modeaddr00000,OCRxy);
 if(modeaddr==addr1) modeaddr=addr2; else modeaddr=addr1;
 OCRxy=eeprom_read_word(modeaddr);
}
Аватара пользователя
blackx
Говорящий с текстолитом
Сообщения: 1518
Зарегистрирован: Пт дек 28, 2012 21:56:46
Откуда: St. Petersburg

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение blackx »

Eugene.Negrobov, никому, никому не нужен тут ваш CVAVR :)))
Изображение only pure true norwegian blackx Изображение
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

Когда то пробовал attiny тоже что то подобное делал, мне показалось что ним все как то по сложнее. Да именно на энкодоре нужно, потенциометр это совсем не то, а по поводу шима городить начал на программном потому что изначально эту схемку делали на нем, я просто решил под себя переделать
Аватара пользователя
Eugene.Negrobov
Мучитель микросхем
Сообщения: 472
Зарегистрирован: Ср фев 15, 2012 09:00:34
Откуда: Киев

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Eugene.Negrobov »

blackx писал(а):Eugene.Negrobov, никому, никому не нужен тут ваш CVAVR

Воу, воу, я просто хотел помочь, полегче будь с человеками. :shock:
I'm on a huge rock, flying through space!
pcb
Опытный кот
Сообщения: 833
Зарегистрирован: Пт авг 12, 2011 09:14:27
Откуда: Млечный путь/Земля/РФ/Екатеринбург

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение pcb »

По схеме предложение:
Сдвинуть виры с 2.3.4 ног на 5.6.11
Разработал:
-BLDC
-ФУОЗ/МПСЗ
-SMART BMS
-ECU/EDC на STM32F4(43%)+CPLD(57%)
-Моноинжектор на ATSAMD20G16
-контроллер эффектов для RGB LED ленты
-умные часы/обратный счет/секундомер
-устройство измерения емкости АКБ
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

pcb писал(а):По схеме предложение:
Сдвинуть виры с 2.3.4 ног на 5.6.11


зачем?
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение YS »

за помощью с тем ужасом на кральях ночи из шапки обращайся к юзеру "YS"


Привет-привет, звали? Я уже тут. :)))

***

Naman_S, про энкодер можно почитать тут.

Про ШИМ можно почитать тут.

Дерзайте. :beer: :)
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

YS где почитать про все это я давно нашел, сюда обратился именно за помощью, со всем этим чтением я могу и год разбираться.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение YS »

со всем этим чтением я могу и год разбираться


Мои ссылки, видимо, не смотрели.

По первой ссылке есть подробное описание того, как преобразовать угол поворота энкодера в значение переменной, с примером. По второй ссылке подробное руководство по настройке ШИМа, с демопрограммой. Вам осталось только совместить их - в демопрограмме по второй ссылке заменить обработку переменной ШИМ для плавного мигания на опрос энкодера с присвоением полученного с него значения регистру ШИМа.

Или и код за Вас написать? :dont_know:
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

YS Я уже просмотрел кучу подобных программ в том числе и ваши ссылки, где то есть одно где то другое, но чтобы все что нужно мне совместить нужно разбираться в этом поболее чем я, повторяюсь но именно поэтому я здесь и написал чтобы хоть кто нибудь помог а не показал как пользоваться гуглом, я специально выложил код который я уже попытался хоть как то видоизменить под свои нужды, но пока никто и нигде не подсказал иду я хотя бы в правильном направлении или нет.
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение vitalik_1984 »

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

не слишком совпадает со схемой, которую вы предоставили. И вот этим кодом.

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

 volatile char pwm_counter,pwm_r,pwm_g,pwm_b, 


Прежде всего внесите ясность в техническое задание, и уже потом можно будет разбирать код и вообще делать что либо. Лично мне мало интересно разбираться с кодом, который не соответствует формулировке задания. Это аналогично написанию нового кода, только дольше.
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

Вы посмотрели верхнюю часть моего поста, там я указал что я нашел в интернете, а дальше я уже добавил схему которую я перерисовал немного под то что мне нужно, и строку кода Вы посмотрели тоже из того что было изначально, я оставил только. pwm_r и pwm_g, хотя уже понимаю что зря, думаю нужно оставить только pwm_r и изменять двух. разных режимах, только не знаю как это реализовать, а по поводу программного и аппаратного уровня тоже уже писал, что мне без разницы, я просто использую то что уже нашел в интернете
Последний раз редактировалось Аlex Вт сен 03, 2013 21:34:56, всего редактировалось 2 раза.
Причина: -
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение vitalik_1984 »

Как же так? Я один прочитал вот это
Naman_S писал(а):Начал пытаться править код вот что пока получается
Код:
// Принцип работы энкодера. Управляем  светодиодом с помощью энкодера
#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;

Или у вас еще до этого места руки не дошли?(вроде самое начало текста и с этого должно начинаться написание программы.)
Желательно показывать действующий проект,в котором вы работаете, а не то что якобы уже поменяли, а на самом деле все как было в прототипе так и показываете.

Если всего лишь один светодиод, то есть уже прекрасная тема c примером рабочим для tiny 13 и нужно всего лишь прикрутить туда енкодер, если так нужно. Кнопки очень легко в два режима назначить.
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

vitalik_1984 это да мой косяк, просмотрел, но думаю это тот случай когда эта ошибка ни на что не влияет. И хотел бы попросить пожалуйста не нужно всяких ссылок на разные проекты, где можно что то взять или уже к тому прикрутить что то, если бы для меня это было все так просто я бы не стал создавать тему. Мне именно нужна помощь людей разбирающихся. в коде, потому что проектов я просмотрел кучу, но в большинстве отсутствует запись переменных в память, а это основная моя загвоздка. Грубо говоря моя программа должна состоять из двух циклов, один из которых это когда нажата кнопка и это я еще более менее могу сделать, но вот с парой вопросов так никак и не разберусь: 1 это то что в изначальном коде три переменных со значением яркости и каждая выводится на свой порт вывода, мне же на сколько я понимаю нужно оставить только одну переменную и брать ее значение из памяти.
Пока писал ответ дотумкал как это примерно сделать, но все таки остался тогда вопрос правильно ли в коде описан опрос энкодера и работа шим?
Аватара пользователя
vitalik_1984
Поставщик валерьянки для Кота
Сообщения: 2482
Зарегистрирован: Пт авг 27, 2010 05:57:06
Откуда: Тюмень
Контактная информация:

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение vitalik_1984 »

Я не разбирался с кодом, хотел, чтобы вы самостоятельно что то сказали что вам нужно и возможно выложили более свежий проект. Желательно дополнив проектом протеуса.
И не нужно отказываться читать разные примеры. иногда они составляют основу кода. Не нужно зацикливаться на одном варианте.
titoFF
Встал на лапы
Сообщения: 100
Зарегистрирован: Пт авг 02, 2013 07:20:04

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение titoFF »

На скорую руку сваял в CVAVR для tiny13. Аппаратный шим, обработка энкодера по прерыванию.

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

#include <tiny13.h>
#include <delay.h>
#define BRIGHT OCR0A

interrupt [EXT_INT0] void ext_int0_isr(void)
{
        if (PINB.4==0)
                {
                BRIGHT++;
                }
        else
                {
                BRIGHT--;
                }

}


void main(void)
{
#pragma optsize-
CLKPR=0x80;
CLKPR=0x00;
#ifdef _OPTIMIZE_SIZE_
#pragma optsize+
#endif


PORTB=0x10;
DDRB=0x01;


TCCR0A=0x83;
TCCR0B=0x01;
TCNT0=0x00;
OCR0A=0x00;
OCR0B=0x00;


GIMSK=0x40;
MCUCR=0x02;
GIFR=0x40;


#asm("sei")

while (1)
      {
     

      };
}
Naman_S
Открыл глаза
Сообщения: 60
Зарегистрирован: Пн авг 26, 2013 23:24:01

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение Naman_S »

titoFF писал(а):На скорую руку сваял в CVAVR для tiny13. Аппаратный шим, обработка энкодера по прерыванию.

только не tiny13, по двум причинам первая это потому что уже все куплено для схемы на меги и вторая это потому что при предыдущем опыте с мегой я просто замучался, возможно тогда брак попался или он сам по себе такой, но я замучался его прошивать.
titoFF
Встал на лапы
Сообщения: 100
Зарегистрирован: Пт авг 02, 2013 07:20:04

Re: Шим регулятор яркости светодиодов на atmega8

Сообщение titoFF »

код легко портировать на мегу. Немного инициализацию изменить. Просто для таких целей мегу использовать слишком шикарно. Это как асфальтоукладчиком тесто на пельмени раскатывать.
Ответить

Вернуться в «AVR»