Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Аватара пользователя
wixa
Открыл глаза
Сообщения: 52
Зарегистрирован: Вс ноя 27, 2011 17:44:34

Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение wixa »

Всем привет. Я новичок. Пытаюсь сейчас реализовать Супер-пупер Мега-таймер.
На один из каналов таймера хочу повесить Attiny13 и по внешнему прерыванию изменения логического уровня (с основного МК на Attiny 13) включать (в зависимости от логического уровня 1 или 0) одну из двух подпрограмм записанных в Attiny13.
Эти две подпрограммы, это "Рассветы" и "Закаты", для рыб. Но так как я новичок, и своих мозгов у меня не хватает для реализации этого прошу у Вас помощи. Попытаюсь расписать нужный алгоритм работы.

1.Включается МК13 (Attiny13), запускается обработчик прерывания, проверяется уровень на ножке, если уровень высокий (+5V) запускается Подпрограмма 1, Если низкий - Подпрограмма 2.

2.Подпрограмма 1:
2.1 Плавно от (R=0 G=0 B=0 -темно) до (R=255 G=255 B=0 - желтый на max яркости) (изменение должно быть от неяркого желтого до желтого на max яркости) в течении 15 мин, происходит рассвет.
2.2 Желтый быстро но плавно переходит в красный (R=255 G=0 B=0) (красный нужен для того чтобы активно росли в аквариуме растения, основной свет не от светодиодов, а от ламп дневного света они подключены совсем другому каналу)
2.3 Горит Красный (R=255 G=0 B=0) пока не изменится уровень на ножке МК13

3. Подпрограмма 2:
3.1 Быстро, но плавно красный (R=255 G=0 B=0) переходит в желтый на максимоальной яркости (R=255 G=255 B=0)
3.2 Плавно от (R=255 G=255 B=0 - вечер ) до (R=0 G=0 B=0 - темно) (изменение должно быть от ярко желтого до желтого на min яркости) в течении 15 мин, происходит закат.
3.3 Плавно от (R=0 G=0 B=0 - темно ) до (R=0 G=0 B=255 - ночь)в течении 15 мин, происходит выход луны на небосвод.
3.4 Горит Синий (R=0 G=0 B=255) пока не изменится уровень на ножке МК13

Вот примерно такой алгоритм хотелось бы организовать с помощью Attiny 13 и програмного ШИМ.
Плата уже почти разведена. В качестве управляющей ноги выбрана нога 3 (PB4), каналы по цветам ( 7,6,5 (PB2,PB1,PB0))

Буду рад любой помощи. На С еще что-то пытаюсь понять, от асма голова идёт кругом...:)
Кот заболел Ринотрахиитом :( (тот что на фото)
Реклама
Аватара пользователя
Shapa
Встал на лапы
Сообщения: 127
Зарегистрирован: Пт июн 20, 2008 09:38:05
Откуда: Харьков
Контактная информация:

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение Shapa »

Здравствуйте! Ну вот скажите пожалуйста, ну почему, почему именно tiny13? ну их же скоро с производства снимут... есть же следующее поколение (даже два) контроллеров с расширенной функциональностью тини 13 - ATtiny25/45/85 (с буквой А - сл. поколение кристала). у них есть PLL, 3 канала аппаратного шима, шим можно даже 16 битным сделать ( тогда частота несущей будет порядка 985 герц). Давайте возьмем 45-ую? В моих краях она стоит на 30% дороже 13-ой.
wixa писал(а):
1.Включается МК13 (Attiny13), запускается обработчик прерывания, проверяется уровень на ножке, если уровень высокий (+5V) запускается Подпрограмма 1, Если низкий - Подпрограмма 2.

2.Подпрограмма 1:
2.1 Плавно от (R=0 G=0 B=0 -темно) до (R=255 G=255 B=0 - желтый на max яркости) (изменение должно быть от неяркого желтого до желтого на max яркости) в течении 15 мин, происходит рассвет.
2.2 Желтый быстро но плавно переходит в красный (R=255 G=0 B=0) (красный нужен для того чтобы активно росли в аквариуме растения, основной свет не от светодиодов, а от ламп дневного света они подключены совсем другому каналу)
2.3 Горит Красный (R=255 G=0 B=0) пока не изменится уровень на ножке МК13

3. Подпрограмма 2:
3.1 Быстро, но плавно красный (R=255 G=0 B=0) переходит в желтый на максимоальной яркости (R=255 G=255 B=0)
3.2 Плавно от (R=255 G=255 B=0 - вечер ) до (R=0 G=0 B=0 - темно) (изменение должно быть от ярко желтого до желтого на min яркости) в течении 15 мин, происходит закат.
3.3 Плавно от (R=0 G=0 B=0 - темно ) до (R=0 G=0 B=255 - ночь)в течении 15 мин, происходит выход луны на небосвод.
3.4 Горит Синий (R=0 G=0 B=255) пока не изменится уровень на ножке МК13

Вот примерно такой алгоритм хотелось бы организовать с помощью Attiny 13 и програмного ШИМ.
Плата уже почти разведена. В качестве управляющей ноги выбрана нога 3 (PB4), каналы по цветам ( 7,6,5 (PB2,PB1,PB0))

Буду рад любой помощи. На С еще что-то пытаюсь понять, от асма голова идёт кругом...:)
Если вы будете использовать аппаратный шим, это немного упростит программу. Я вам напишу пример именно с аппаратным шимом (используем OC1B,OC0A,OC0B:
1.Включается МК13 (Attiny13), запускается обработчик прерывания, проверяется уровень на ножке, если уровень высокий (+5V) запускается Подпрограмма 1, Если низкий - Подпрограмма 2.

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

switch(PIN_State)
{
case 1: dawn(); break;
case 0: sunset(); break;
} 
2.Подпрограмма 1:
2.1 Плавно от (R=0 G=0 B=0 -темно) до (R=255 G=255 B=0 - желтый на max яркости) (изменение должно быть от неяркого желтого до желтого на max яркости) в течении 15 мин, происходит рассвет.
2.2 Желтый быстро но плавно переходит в красный (R=255 G=0 B=0) (красный нужен для того чтобы активно росли в аквариуме растения, основной свет не от светодиодов, а от ламп дневного света они подключены совсем другому каналу)
2.3 Горит Красный (R=255 G=0 B=0) пока не изменится уровень на ножке МК13
У нас 15 минут. это 900 секунд. макс значние Шима - 255. значит 900/255 = 3.5. Каждые 3.5 секунды увеличиваем регистры.

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

void dawn()
{
OC1B=0;
OC0A=0;
while(OC0A < 255)
{
OC0A++;
OC1B++;
_delay_ms(3500);
}
OC1B=255;
OC0A=255;
// первая часть

while(--OC0A != 0)
_delay_ms(300); // этой задержкой регулируйте плавность 1.2. пункта
}
susnet по аналаогии напишите. Ну и не забудьте всю переферию настроить! Успехов!
Реклама
Аватара пользователя
wixa
Открыл глаза
Сообщения: 52
Зарегистрирован: Вс ноя 27, 2011 17:44:34

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение wixa »

O!!! Спасибо, первый дельный совет :) Я просто не знал о существовании таких 8ми ногих друзей. Посмотрел сейчас у знакомого в магазине, есть Attiny25... буду пробовать писать по Вашим заготовочкам. Надеюсь на Ваше сопровождение :)
Кот заболел Ринотрахиитом :( (тот что на фото)
Аватара пользователя
wixa
Открыл глаза
Сообщения: 52
Зарегистрирован: Вс ноя 27, 2011 17:44:34

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение wixa »

Начали возникать вопросы... :) Показываю пока то что написал:

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

#include <avr/io.h>
#include <interrupt.h>
#define nop() {asm("nop");}
#define PIN_State PB3 //ПРИСВАЕВАЕМ ПЕРЕМЕНОЙ ПОРТ PB3 ДЛЯ МОНИТОРИНГА УРОВНЯ НА НЁМ
unsigned int x;//перечисление переменных	

// Функция задержки(пауза)
void delay(int t)
{
for (x=t; x>0 ;x--)
nop (); 
}

SIGNAL(PCINT3)//обработка прерываний
//программа, которая должна выполнятся при срабатывании PCINT3 (PB3)
{
	switch(PIN_State)
	{
	case 1: dawn(); break;
	case 0: sunset(); break;
	}
}

void init_pwm (void)//Програма инициализации ШИМ

{
  TCCR0A=(1<<COM0A1)|(0<<COM0A0)|(1<<COM0B1)|(0<<COM0B0)|(1<<WGM00); //На выводе OC0A,OC0B единица, когда OCR0A(OCR0B)==TCNT0, восьмибитный ШИМ (Phase Correct)
  TCCR0B=(1<<CS00);		 //Делитель= /1
  OCR0A=0x00;			//Начальная яркость нулевая
  OCR0B=0x00;
}

void sunset()//ПОДПРОГРАММА расвета
{
OC1B=0;
OC0A=0;
while(OC0A < 255)
{
OC0A++;
OC1B++;
_delay_ms(3500);
}
OC1B=255;
OC0A=255;
// первая часть

while(--OC0A != 0)
_delay_ms(300); // этой задержкой регулируйте плавность 1.2. пункта
}

void dawn()//ПОДПРОГРАММА ЗАКАТА
{
OC1B=255;
OC0A=255;
while(OC0A < 0)
{
OC0A--;
OC1B--;
_delay_ms(3500);
}
OC1B=0;
OC0A=0;
// вторая часть

while(--OC0A != 0)
_delay_ms(300); // этой задержкой регулируйте плавность 1.2. пункта
}
int main(void)
{
  DDRB &= ~(1<<PIN_State);//настраиваем вывод на вход
  GIMSK |= (1<<PCIE);//РАЗРЕШАЕМ ВНЕШНИЕ ПРЕРЫВАНИЯ ГЛОБАЛЬНО
  PCMSK |= (1<<PCINT3);//РАЗРЕШАЕМ ВНЕШНИЕ ПРЕРЫВАНИЯ PCINT3 ПО ИЗМЕНЕНИЮ УРОВНЯ
  switch(PIN_State) //ПРОВЕРЯTV УРОВЕНЬ НА PB3
	{
	case 1: dawn(); break; //ЕСЛИ 1 ТО ВКЛЮЧАЕМ ЗАКАТ
	case 0: sunset(); break;//ЕСЛИ 0 ТО ВКЛЮЧАЕМ РАССВЕТ
	}
}
Вопросы:
1.Не могу понять как настроить OC1B?
2.
while(--OC0A != 0)
_delay_ms(300); // этой задержкой регулируйте плавность 1.2. пункта
- непонятно ?
3.

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

void dawn()//ПОДПРОГРАММА ЗАКАТА
{
OC1B=255;
OC0A=255;
while(OC0A < 0)
{
OC0A--;
OC1B--;
_delay_ms(3500);
}
OC1B=0;
OC0A=0;
// вторая часть

while(--OC0A != 0)
_delay_ms(300); // этой задержкой регулируйте плавность 1.2. пункта
}
- это же только пункт 2.1 и 3.2, пункты 2.2 и 3.1 идентичны этип пунктам, только период их будет допустим 1 минута, 60/255=0,235с (задержка вообщем понятно), непонятно только как заставить поочерёдно работать подпункты 2.1 и 2.2 и 2.3 и соответственно для пункта 3 идентично???
4.Еще не вижу структуру программы.... что, где долно быть, что в основной функции, что в дополнительных, где должны быть настройки....

Вообщем до понимания еще далеко, радует только то что "Лёд тронулся" :)
Кот заболел Ринотрахиитом :( (тот что на фото)
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение Engineer_Keen »

Частота ШИМ сильно критична? Можно сделать 180Гц, при этом таймеры вообще не используются :P
Реклама
Аватара пользователя
wixa
Открыл глаза
Сообщения: 52
Зарегистрирован: Вс ноя 27, 2011 17:44:34

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение wixa »

Engineer_Keen писал(а):Частота ШИМ сильно критична? Можно сделать 180Гц, при этом таймеры вообще не используются :P
Лампы дневного света в аквариуме горят с частотой 50 ГЦ если я не ошибаюсь :) Рыбы пока не жаловались :) Думаю не кретична частота :)
Кот заболел Ринотрахиитом :( (тот что на фото)
Реклама
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение Engineer_Keen »

Тогда попробуйте это. Пойдет?
Вложения
PWM_3.hex
(681 байт) 613 скачиваний
Аватара пользователя
wixa
Открыл глаза
Сообщения: 52
Зарегистрирован: Вс ноя 27, 2011 17:44:34

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение wixa »

Engineer_Keen писал(а):Тогда попробуйте это. Пойдет?
Это на какой МК прошивка? Что в ней реалезованно?
Кот заболел Ринотрахиитом :( (тот что на фото)
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение Engineer_Keen »

Все как в первом посте, МК - 13-я тинька.
Аватара пользователя
wixa
Открыл глаза
Сообщения: 52
Зарегистрирован: Вс ноя 27, 2011 17:44:34

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение wixa »

Engineer_Keen писал(а):Тогда попробуйте это. Пойдет?
Спасибо :) Всё работает. Вы добрый человек :) но есть несколько моментов :):
1.Исходником не поделитесь? :)
2. Если не сложно (если сложно то не надо), нужно сделать так, чтобы внутри самих расветов и закатов при смене уровня на PB4, начинала выполнятся соответствующая подпрограмма.
3.П2.2 и П3.1 должны выполнятся не в течении 15 мин, а в течении 1мин.

А так всё классно.... Хотел бы я так писать быстро как Вы :)
Кот заболел Ринотрахиитом :( (тот что на фото)
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение Engineer_Keen »

Вот исходный код, без учета последнего поста. Правится легко.
Вложения
PWM_3_src.asm
(2.28 КБ) 671 скачивание
Alexeyslav
Друг Кота
Сообщения: 4550
Зарегистрирован: Чт май 05, 2011 21:26:34
Откуда: Украина, Славутич
Контактная информация:

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение Alexeyslav »

Лампы дневного света не моргают вообще. По крайней мере с электронным балластом.

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

Ваша задача лучше всего описывается при помощи теории конечного автомата - т.е. системы с заранее определенными состояниями и связями между ними. состояния можно пронумеровать и хранить в одной переменной, из каждого состояния может быть осуществлен переход только в другие определенные, и скажем так на каждое состояние будет работать свой обработчик(подпрограмма) которая в результате на выходе даст новое состояние.

Например, подпрограмма перехода одного цвета в другой - будет вызываться каждую секунду если состояние равно 5 и делать свою работу - постепенно менять состояние светодиодов с заданной скоростью, и когда дойдет до конца - просто сменит состояние системы, и каждую секунду будет вызываться уже другая подпрограмма определяемая другим состоянием.

Одна из подпрограмм может просто ожидать логического состояния на выводе, и начинать цепочку изменений состояния.
Аватара пользователя
wixa
Открыл глаза
Сообщения: 52
Зарегистрирован: Вс ноя 27, 2011 17:44:34

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение wixa »

Engineer_Keen писал(а):Вот исходный код, без учета последнего поста. Правится легко.
Спасибо большое :) Код впечатляет, компактный, с коментариями..... :)

Благодаря коментариями время исправил быстро. А вот чтоб разрешить прерывания внутри рассветов и закатов не понял как сделать, попробовал добавить строку

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

WFI		;wait for pin change
в конце SEQ1, SEQ2, и LOOP3... но это ничего не дало ....

Может намекнёте, как исправить ;)

И вот еще что, печальная недопечатка получилась, у меня то не 13 а 13A, попробовал скомпилировать под 13A код, не получилось, повылазило куча ошибок.

Как вы считаете, если я прошивку скомпилированую под 13 залью в 13А, будет ли она работать???
(до этого работоспособность проверял в Протеусе)

А вообще наверно на С код получился бы гораздо больше (мне кажется), помотрев на этот код, очень захотелось научится писать в ассме :)
Кот заболел Ринотрахиитом :( (тот что на фото)
Аватара пользователя
wixa
Открыл глаза
Сообщения: 52
Зарегистрирован: Вс ноя 27, 2011 17:44:34

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение wixa »

Alexeyslav писал(а):Лампы дневного света не моргают вообще. По крайней мере с электронным балластом.

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

Ваша задача лучше всего описывается при помощи теории конечного автомата - т.е. системы с заранее определенными состояниями и связями между ними. состояния можно пронумеровать и хранить в одной переменной, из каждого состояния может быть осуществлен переход только в другие определенные, и скажем так на каждое состояние будет работать свой обработчик(подпрограмма) которая в результате на выходе даст новое состояние.

Например, подпрограмма перехода одного цвета в другой - будет вызываться каждую секунду если состояние равно 5 и делать свою работу - постепенно менять состояние светодиодов с заданной скоростью, и когда дойдет до конца - просто сменит состояние системы, и каждую секунду будет вызываться уже другая подпрограмма определяемая другим состоянием.

Одна из подпрограмм может просто ожидать логического состояния на выводе, и начинать цепочку изменений состояния.
Нет не опыта, не друзей, которые бы показали как делают это всё гуру электроники и программирования, имею ввиду от идеи в голове, до конечной реализации, так сказать весь алгоритм :)
Может если знать полный алгоритм, то и осуществление задуманого было бы реальней... Покак учусь (мучаюсь) как могу :)

Спасибо за ответ.
Кот заболел Ринотрахиитом :( (тот что на фото)
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение Engineer_Keen »

wixa писал(а):Спасибо большое :) Код впечатляет, компактный, с коментариями..... :)
Макросы позволяют сделать код чуть ли не компактнее чем языки высокого уровня :)
wixa писал(а): Благодаря коментариями время исправил быстро. А вот чтоб разрешить прерывания внутри рассветов и закатов не понял как сделать, попробовал добавить строку

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

WFI		;wait for pin change
в конце SEQ1, SEQ2, и LOOP3... но это ничего не дало ....
Может намекнёте, как исправить ;)
Верно, макрос WFI просто затормаживает выполнение основной программы пока не изменится состояние на входе PB4. Переделывать надо немного иначе. Во-первых в самом макросе после BREQ WAIT добавить CLR R18, чтобы после его выполнения регистр все равно был обнулен. Во вторых добавить метку после SEI:

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

	SEI
RES:	CLR	BRI
	CLR	R18
	SBIS	PINB,CONT
	RJMP	SEQ2
Таким образом попав из любого места основной программы на эту метку, можно сразу начинать первую или вторую программу действий (в зависимости от входа). Ну а проверку надо добавить во все циклы после строк с установкой цвета (SetColor): CPI R18,0 BRNE RES. Тогда любое изменение на входе (прерывание выставляет R18 в 0xFF) практически сразу переведет программу на метку RES.
wixa писал(а):И вот еще что, печальная недопечатка получилась, у меня то не 13 а 13A, попробовал скомпилировать под 13A код, не получилось, повылазило куча ошибок.
С точки зрения программирования 13 и 13А это одно и то-же. Прошивка должна работать
wixa писал(а):А вообще наверно на С код получился бы гораздо больше (мне кажется), помотрев на этот код, очень захотелось научится писать в ассме :)
Не знаю насчет кода, но размер прошивки точно был бы больше :)))
Аватара пользователя
wixa
Открыл глаза
Сообщения: 52
Зарегистрирован: Вс ноя 27, 2011 17:44:34

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение wixa »

to Engineer_Keen

Спасибо, сделал всё как вы сказали, получилось... Домой приду, буду в железе испытывать :) Чуствую местом на котором сижу, что еще будет проблема с MOSFET IRFZ48N, через котрорые будет подключатся лента на 12V к МК, но как говорится, будем решать проблемы по мере их возникновения :)

Может посоветутете, источник, по которому вообще нулёвый новичек, может обучится программированию на асме AVR ??? Так чтоб от простого к сложному, и дотупно рассписанно для новичка :)
Кот заболел Ринотрахиитом :( (тот что на фото)
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение Engineer_Keen »

Для начала сдешняя обучалка сгодится. А вообще весь ассемблер расписан тут (последняя пара книг)
Аватара пользователя
wixa
Открыл глаза
Сообщения: 52
Зарегистрирован: Вс ноя 27, 2011 17:44:34

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение wixa »

Ну что дорогие Коты :) Отписываюсь :)

1.Вообщем в железе работает, конечно не так плавно как хотелось, так как у IRFZ48N совсем не большой Gate Threshold Voltage от 2 до 4 V. Но для домашней подсветки аквариума думаю сойдёт...

2.Заметил такую особенность, что после того как один цвет, пройдёт допустим от 0 до 255 (макс яркости) то на максимальной яркости Скважность не 100%, а 99 %, на максимальной яркости, вринципе всё равно, а вот на минимальной прослеживается тот же эфект, и из-за этого один кристалик на RGB светодиоде продолжает гореть... впринципе на общий свет это не влияет, но всё же :)

3.По ходу эксперементов, понял что провтыкал один пункт: 2.0 - от (R=0 G=0 B=255) уменьшение синего до (R=0 G=0 B=0), так сказать перед рассветом луна должна зайти :)

4. И вот назрел такой еще вопрос: Как регулировать максимальную яркость? (а то лунный свет в виде B=255, как то ярковато ....

Прошу еще помощи, так как разобратся в коде пока, еще не получается :)

P.S.А вообще еще интерестно как заставить например одновременно допустим в пункте 2.1 R увеличиватся допустим от 0 до 255 а G увеличиватся от 0 до 128 , но за одно и тоже время ( скважность R увеличивается допустим раз в 1 сек, а G раз в 2 секунды, и тогда по истичению 256 секунд, яркость R будет 255 а яркость G - 128)

Заранее спасибо, извините что отбираю у Вас, Ваше драгоценное время :)
Кот заболел Ринотрахиитом :( (тот что на фото)
Аватара пользователя
Engineer_Keen
Друг Кота
Сообщения: 3872
Зарегистрирован: Пт янв 29, 2010 10:27:40
Откуда: Москва

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение Engineer_Keen »

wixa писал(а):Ну что дорогие Коты :) Отписываюсь :)
2.Заметил такую особенность, что после того как один цвет, пройдёт допустим от 0 до 255 (макс яркости) то на максимальной яркости Скважность не 100%, а 99 %, на максимальной яркости, вринципе всё равно, а вот на минимальной прослеживается тот же эфект, и из-за этого один кристалик на RGB светодиоде продолжает гореть... впринципе на общий свет это не влияет, но всё же :)
На максимуме яркости скважность действительно не 100%, это особенность такой компактной реализации ШИМ. При сравнении счетчика со значением яркости "1" на выходе получается только пока яркость>счетчика, а по хорошему должно быть при яркость>=счетчика. В принципе можно поставить дополнительное условие, если бы это было критично.
wixa писал(а): 3.По ходу эксперементов, понял что провтыкал один пункт: 2.0 - от (R=0 G=0 B=255) уменьшение синего до (R=0 G=0 B=0), так сказать перед рассветом луна должна зайти :)
Просто добавить еще один цикл перед последним WFI

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

LOOP5:	Delay_d100s Interval
	SetColor ZERO,ZERO,BRI
	CJNE	R18,0,RES
	DJNZ	BRI,LOOP5
wixa писал(а): 4. И вот назрел такой еще вопрос: Как регулировать максимальную яркость? (а то лунный свет в виде B=255, как то ярковато ....
Нужно вместо макросов DJNZ-IJNZ написать соответственно

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

DEC/INC BRI
CPI BRI,требуемая яркость
BRNE на начало текущего цикла
wixa писал(а): P.S.А вообще еще интерестно как заставить например одновременно допустим в пункте 2.1 R увеличиватся допустим от 0 до 255 а G увеличиватся от 0 до 128 , но за одно и тоже время ( скважность R увеличивается допустим раз в 1 сек, а G раз в 2 секунды, и тогда по истичению 256 секунд, яркость R будет 255 а яркость G - 128)
Можно просто перед SetColor взять какой-нибудь неиспользуемый регистр (R2 например), скопировать в него регистр яркости (BRI, он же R17) и сдвинуть вправо (эквивалент деления на 2), а в SetColor написать BRI,R2,ZERO, правда в конце цикла яркость G будет не 128, а 127 (целое от 255>>1), но на цвет это не сильно повлияет.
Аватара пользователя
wixa
Открыл глаза
Сообщения: 52
Зарегистрирован: Вс ноя 27, 2011 17:44:34

Re: Attiny13 : 3х канальный ШИМ по внешниму прерыванию

Сообщение wixa »

Спасибо. Сейчас будем разбираться :)
Engineer_Keen писал(а): Можно просто перед SetColor взять какой-нибудь неиспользуемый регистр (R2 например), скопировать в него регистр яркости (BRI, он же R17) и сдвинуть вправо (эквивалент деления на 2), а в SetColor написать BRI,R2,ZERO, правда в конце цикла яркость G будет не 128, а 127 (целое от 255>>1), но на цвет это не сильно повлияет.
А вот тут возникает такой вопрос:
Возьмем например вот этот цикл :

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

SEQ1:	Delay_d100s 351	;Black -> Yellow 15 min (351/100s 256 ~ 15 min) 
	SetColor BRI,R2,ZERO
	IJNZ	BRI,SEQ1
	SER	BRI
Строчка :

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

Delay_d100s 351
для всего цикла, тогда получится что R достигнет своего максимального значения (255) За 15 минут, а вот G достигнет своего максимального значения (127) за 7.5 минут... а нужно чтобы и R и G достигли своих разных максимальных значений, за одно и тоже время - 15 мин....

Хотя может я и неправильно мыслю :) Развейте плз мои сомнения :)
Кот заболел Ринотрахиитом :( (тот что на фото)
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»