Форум РадиоКот https://radiokot.ru/forum/ |
|
Прошу в помощи в объединении кодов для RGB контроллера https://radiokot.ru/forum/viewtopic.php?f=57&t=96374 |
Страница 1 из 3 |
Автор: | fevcomp [ Пн ноя 04, 2013 01:16:05 ] |
Заголовок сообщения: | Прошу в помощи в объединении кодов для RGB контроллера |
Прошу Вас помочь мне. Решил сделать приборную панель с полноцветной подсветкой. До этого с программированием не имел ни какого дела. Посидел, по читал по программированию на языке Си в CAVR. И найдя в сети учебный код по управлению RGB светодиодами от энкодера, решил попробовать. написал три раздельных кода (чтоб каждый код было проще проверить на работо способность в протеусе) для плавного включения светодиодов, регулировки яркости с помощью энкодера и выбор политры цвета также на энкодоре но с применением кнопки. Раздельно коды работают как и должны, а вот начал объеденять все в единый код и начался хаос. плавное включение и регулировка яркости при объединении работает нормально, но стоит добавить выбор политры и полная ерунда с кнопкой и энкодером. Вот код для плавного включения и регулировки яркости: СпойлерКод: Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega8.h> #include <delay.h> volatile int pwm_counter,R,G,B,scena=1,i; interrupt [EXT_INT0] void ext_int0_isr(void) { //Обработка событий вращения экодера delay_us(50); if((PIND&(1 << PORTD2))==0) { delay_us(50); if((PIND&(1 << PORTD0))==0) { //Уменьшение яркости LED RGB R-=17; if(R < 1) R = 1; G-=17; if(G < 1) G = 1; B-=17; if(B < 1) B = 1; } else { //Увеличение яркости LED RGB R+=17; if(R > 255) R = 255; G+=17; if(G > 255) G = 255; B+=17; if(B > 255) B = 255; } } GIFR = (1<<INTF0); // очищаем флаг внешнего прерывания return; } // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // программный ШИМ if (pwm_counter++ > 255) { PORTB = 0x00; pwm_counter = 0; } if (pwm_counter > R) PORTB |= (1 << PORTB0); if (pwm_counter > G) PORTB |= (1 << PORTB1); if (pwm_counter > B) PORTB |= (1 << PORTB2); } // Declare your global variables here void main(void) { //Инициализация портов DDRB |= (1 << PORTB5)|(1 << PORTB4)|(1 << PORTB3)|(1 << PORTB2)|(1 << PORTB1)|(1 << PORTB0);// выходы PORTB = 0x00; DDRD |= (0 << PORTD2)|(0 << PORTD1)|(0 << PORTD0); // входы PORTD |= (1 << PORTD2)|(1 << PORTD1)|(1 << PORTD0); // подключаем подтягивающие резисторы TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0 TCCR0 |= (1 << CS00); MCUCR |= (0 << ISC00)|(1 << ISC01); GIFR |= (1 << INTF0); GICR |= (1 << INT0); #asm("sei") while (1) { //Плавное включение RGB LED в течении 6,5 сек при вкл. питания if (i<255) { R=i; G=i; B=i; delay_ms(10); i++; } // Присвоение выходам портов переменных значений для отображения PORTB |= (1 << PORTB3); PORTB |= (1 << PORTB4); PORTB |= (1 << PORTB5); } } Вот код где дополнительно добавил выбор политры: Код: Chip type : ATmega8 Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega8.h> #include <delay.h> volatile int pwm_counter,R,G,B,scena=1,i,button; interrupt [EXT_INT0] void ext_int0_isr(void) { //Обработка событий вращения экодера delay_us(50); if((PIND&(1 << PORTD2))==0) { delay_us(50); if((PIND&(1 << PORTD0))==0) { //Уменьшение яркости LED RGB R-=17; if(R < 1) R = 1; G-=17; if(G < 1) G = 1; B-=17; if(B < 1) B = 1; if(button==0) { if (scena == 1) {if(G<255) G+=15; else scena = 2;} if (scena == 2) {if(R>0) R-=15; else scena = 3;} if (scena == 3) {if(B<255) B+=15; else scena = 4;} if (scena == 4) {if(G>0) G-=17; else scena = 5;} if (scena == 5) {if(R<255) R+=17; else scena = 6;} if (scena == 6) {if(B>0) B-=17; else scena = 1;} } } else { //Увеличение яркости LED RGB R+=17; if(R > 255) R = 255; G+=17; if(G > 255) G = 255; B+=17; if(B > 255) B = 255; if(button==1) { if (scena == 1) {if(G>0) G-=15; else scena = 6;} if (scena == 2) {if(R<255) R+=15; else scena = 1;} if (scena == 3) {if(B>0) B=R-15; else scena = 2;} if (scena == 4) {if(G<255) G+=15; else scena = 3;} if (scena == 5) {if(R>0) R-=15; else scena = 4;} if (scena == 6) {if(B<255) B=R+15; else scena = 5;} } } } GIFR = (1<<INTF0); // очищаем флаг внешнего прерывания return; } // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // программный ШИМ if (pwm_counter++ > 255) { PORTB = 0x00; pwm_counter = 0; } if (pwm_counter > R) PORTB |= (1 << PORTB0); if (pwm_counter > G) PORTB |= (1 << PORTB1); if (pwm_counter > B) PORTB |= (1 << PORTB2); } // Declare your global variables here void main(void) { //Инициализация портов DDRB |= (1 << PORTB5)|(1 << PORTB4)|(1 << PORTB3)|(1 << PORTB2)|(1 << PORTB1)|(1 << PORTB0);// выходы PORTB = 0x00; DDRD |= (0 << PORTD2)|(0 << PORTD1)|(0 << PORTD0); // входы PORTD |= (1 << PORTD2)|(1 << PORTD1)|(1 << PORTD0); // подключаем подтягивающие резисторы TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0 TCCR0 |= (1 << CS00); MCUCR |= (0 << ISC00)|(1 << ISC01); GIFR |= (1 << INTF0); GICR |= (1 << INT0); #asm("sei") while (1) { //Плавное включение RGB LED при вкл. питания if (i<255) { R=i; G=i; B=i; delay_ms(10); i++; } //Обработка события нажатия кнопки энкодера if((PIND&(1 << PORTD1))==0) // если нажата кнопка { button=0; while((PIND&(1 << PORTD1))==0){} // ждем отпускания кнопки button++; delay_ms(100); if(button == 10) button = 0; } //Выбор сцены цветовой политры if((PIND&(1 << PORTD2)|(1 << PORTD0))==0) { scena++; if (scena==6) scena=1; } // Присвоение выходам портов переменных значений для отображения PORTB |= (1 << PORTB3); PORTB |= (1 << PORTB4); PORTB |= (1 << PORTB5); } } За написание кода не ругайте. Как писал ранее я первый раз пишу программным языком, да ещё для мк. Я не электронщик и много в этой области не знаю, могу толко собрать готовую схему в DIP Trace развести для этого плату, да лутом её сделать, ну пару раз недавно прошил два мк. Да прошу к Datasheet не отсылать с англиским полный ноль, помогите с кодом или примерами кода, думую, что голова не совсем дурная, как нибуть разбирусь. И ещё подскажите, как реализовать плавного гашение светодиодов при выключении питания и занесение данных в память при выключении питания при условии что были сделаны изменения в настроках политры и яркости и они отличаются от тех, что уже имеются в памяти мк. На форуме я уже читал по поводу отслеживания напряжения на порте AIN, но не совсем все понял, если можно пример кода на основе моего примера выше. ![]() ![]() |
Автор: | vek [ Пн ноя 04, 2013 02:01:44 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
Чего-то со скобками напутано 100 пудов. Покажите пожалуйста отдельно все 3 куска,а то чего-то недопонимаю,куда какая скобка должна относиться |
Автор: | Аlex [ Пн ноя 04, 2013 12:21:12 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
Протеус не умеет менять яркость светодиодов. У него он может либо светиться, либо не светиться. |
Автор: | zero648 [ Пн ноя 04, 2013 15:15:49 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
Еще как может! ![]() |
Автор: | fevcomp [ Пн ноя 04, 2013 15:37:24 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
В протеусе вместо светодиодов у меня стоит осцилограф на выходах. Что касается скобок проверка синтаксиса в CAVR дает отсутствие ошибок. Т.к. рабочий код для плавного включения и регулировки яркости я ранее выкладывал, то вод отдельный рабочий код по выбору политры цвета: Код: Chip type : ATmega8
Program type : Application AVR Core Clock frequency: 8,000000 MHz Memory model : Small External RAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega8.h> #include <delay.h> volatile int pwm_counter,R,G,B,scena=1; // External Interrupt 0 service routine interrupt [EXT_INT0] void ext_int0_isr(void) { delay_us(50); if((PIND&(1 << PORTD2))==0) { delay_us(50); if((PIND&(1 << PORTD0))==0) { if (scena == 1) {if(G<255) G=G+15; else scena = 2;} if (scena == 2) {if(R>0) R=R-15; else scena = 3;} if (scena == 3) {if(B<255) B=B+15; else scena = 4;} if (scena == 4) {if(G>0) G=G-17; else scena = 5;} if (scena == 5) {if(R<255) R=R+17; else scena = 6;} if (scena == 6) {if(B>0) B=B-17; else scena = 1;} } else { if (scena == 1) {if(G>0) G=G-15; else scena = 6;} if (scena == 2) {if(R<255) R=R+15; else scena = 1;} if (scena == 3) {if(B>0) B=R-15; else scena = 2;} if (scena == 4) {if(G<255) G=G+15; else scena = 3;} if (scena == 5) {if(R>0) R=R-15; else scena = 4;} if (scena == 6) {if(B<255) B=R+15; else scena = 5;} } } GIFR = (1<<INTF0); // очищаем флаг внешнего прерывания return; } // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void timer0_ovf_isr(void) { // Place your code here if (pwm_counter++ > 255) { PORTB = 0x00; pwm_counter = 0; } if (pwm_counter > R) PORTB |= (1 << PORTB0); if (pwm_counter > G) PORTB |= (1 << PORTB1); if (pwm_counter > B) PORTB |= (1 << PORTB2); } // Declare your global variables here void main(void) { DDRB |= (1 << PORTB5)|(1 << PORTB4)|(1 << PORTB3)|(1 << PORTB2)|(1 << PORTB1)|(1 << PORTB0);// выходы PORTB = 0x00; DDRD |= (0 << PORTD2)|(0 << PORTD1)|(0 << PORTD0); // входы PORTD |= (1 << PORTD2)|(1 << PORTD1)|(1 << PORTD0); // подключаем подтягивающие резисторы TIMSK |= (1 << TOIE0); // разрешение прерывания по таймеру0 TCCR0 |= (1 << CS00); MCUCR |= (0 << ISC00)|(1 << ISC01); GIFR |= (1 << INTF0); GICR |= (1 << INT0); #asm("sei") R = 255; // начальные установки цветов, яркость G = 255; B = 255; while (1) { // Place your code here if((PIND&(1 << PORTD2)|(1 << PORTD0))==0) { scena++; } PORTB |= (1 << PORTB3); PORTB |= (1 << PORTB4); PORTB |= (1 << PORTB5); } } |
Автор: | phanis [ Пн ноя 04, 2013 16:41:27 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
Код: //Обработка события нажатия кнопки энкодера if((PIND&(1 << PORTD1))==0) // если нажата кнопка { button=0; while((PIND&(1 << PORTD1))==0){} // ждем отпускания кнопки button++; delay_ms(100); if(button == 10) button = 0; } Дело наверное в переменной button, пока держим нажатым переменная равна нулю button=0; отпускаем равна единице button++; никаких 2345678910 нет |
Автор: | fevcomp [ Пн ноя 04, 2013 17:23:30 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
И в чем, в коде не правельно с обработкой нажатия кнопки т.к. вы описывакте так и реализовано, а то, что стоит кол-во нажатий 10, то просто код писал с дальнейшим развитием программы для других операций. А вобще мои не да чет, наверно я не правильно поставил вопрос. Как обеденить выбор политры и регулировку яркости на одном энкодоре, а именно при вращении энкодера влево-вправо регулируется яркость при нажатии кнопку вращение энкодера влево-вправо позволет выбирать политру цвета, повторное нажатие на кнопку запоминает выбраный цвет в ОЗУ. Так вот по раздельности код регулировки яркости энкодером работает и выбор политры отдельно работает. а как объеденяю вместе происходит хаос.Вот в чем основная проблема. А остальное кол-во количество нажатия кнопки - это для будущей функции выбора предворительно настроенных настроенных цветов. |
Автор: | eess9 [ Пн ноя 04, 2013 17:39:25 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
А если держать кнопку при установке энкодером палитры? Тогда при обработке энкодера проверяйте состояние переменной button. Если она 0 - меняем палитру, если 1 - меняем цвет. У Вас эта переменная может принимать значения только 0 и 1 (при такой обработке нажатия кнопки). И вопрос: а зачем это в прерывании? Код: GIFR = (1<<INTF0); // очищаем флаг внешнего прерывания флаг же сбрасывается аппаратно |
Автор: | fevcomp [ Пн ноя 04, 2013 20:07:11 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
Насчёт нажатия кнопки и вращения энкодера, вообщето не совсем удобно т.к. кнопка встоена в энкодер и попытатся нажать и удерживать кнопку и вращать одновременно энкодер, я боюсь мне придется стать "виртуозом" ![]() Код: [color=#FF0000]GIFR = (1<<INTF0);[/color] [color=#0000BF]// очищаем флаг внешнего прерывания[/color] не знаю так стояло в учебном коде по управлению энкодером RGB светодиодами, я ещё не очень разбираюсь в этом, толко начал пытася разбиратся во всем этом. Вот только что попробовал изменить расположение выполнение операций регулировки яркости и политры цветаinterrupt [EXT_INT0] void ext_int0_isr(void) Код: { //Обработка событий вращения экодера delay_us(50); if((PIND&(1 << PORTD2))==0) { delay_us(50); if((PIND&(1 << PORTD0))==0) { //Выбор политры цвета if (button==0) { if (scena == 1) {if(G<255) G+=15; else scena = 2;} if (scena == 2) {if(R>0) R-=15; else scena = 3;} if (scena == 3) {if(B<255) B+=15; else scena = 4;} if (scena == 4) {if(G>0) G-=17; else scena = 5;} if (scena == 5) {if(R<255) R+=17; else scena = 6;} if (scena == 6) {if(B>0) B-=17; else scena = 1;} } else //Увеличение яркости LED RGB, всех каналов { R-=17; if(R < 1) R = 1; G-=17; if(G < 1) G = 1; B-=17; if(B < 1) B = 1; } } else { //Выбор политры цвета if(button==0) { if (scena == 1) {if(G>0) G-=15; else scena = 6;} if (scena == 2) {if(R<255) R+=15; else scena = 1;} if (scena == 3) {if(B>0) B=R-15; else scena = 2;} if (scena == 4) {if(G<255) G+=15; else scena = 3;} if (scena == 5) {if(R>0) R-=15; else scena = 4;} if (scena == 6) {if(B<255) B=R+15; else scena = 5;} } else //Увеличение яркости LED RGB, всех каналов { R+=17; if(R > 255) R = 255; G+=17; if(G > 255) G = 255; B+=17; if(B > 255) B = 255; } } } GIFR = (1<<INTF0); // очищаем флаг внешнего прерывания return; } так вот яркость стала регулировться нормально, а палитра меняется только если удерживать кнопку не трогая вращения энкодером, но это опять не то, как я писал ранее необходимо, чтобы вращая энкодер Влево-Вправо регулировалась яркость, после нажатия на кнопку и отпускания ее, снова вращая энкодер изменялась политра цвета и повторное нажатие на кнопку возвращала бы энкодеру функцию регулятора яркости. |
Автор: | phanis [ Вт ноя 05, 2013 09:46:46 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
Как то так Код: //Обработка события нажатия кнопки энкодера if((PIND&(1 << PORTD1))==0) // если нажата кнопка { while((PIND&(1 << PORTD1))==0){} // ждем отпускания кнопки button ^= 1; delay_ms(100); } если нужно более 2 режимов Код: //Обработка события нажатия кнопки энкодера
if((PIND&(1 << PORTD1))==0) // если нажата кнопка { // button=0; while((PIND&(1 << PORTD1))==0){} // ждем отпускания кнопки button++; delay_ms(100); if(button >= 10) // 10 режимов button = 0; } |
Автор: | fevcomp [ Вт ноя 05, 2013 17:06:31 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
Спасибо phanis, но код реализован у меня вот так: Код: //Обработка события нажатия кнопки энкодера if((PIND&(1 << PORTD1))==0) // если нажата кнопка { button=0; while((PIND&(1 << PORTD1))==0){} // ждем отпускания кнопки button++; delay_ms(100); if(button == 10) button = 0; } Вы предлагаете: Код: //Обработка события нажатия кнопки энкодера if((PIND&(1 << PORTD1))==0) // если нажата кнопка { // button=0; while((PIND&(1 << PORTD1))==0){} // ждем отпускания кнопки button++; delay_ms(100); if(button >= 10) // 10 режимов button = 0; } Разница только в операндах сравнения, но проблема в том , что даже с такой обработкой нажатия кнопки программа не работает как должна, не до чёт мне кажется у обработке после нажатия кнопки события, которое должно произойти после нажатия и потом вернуться в преждее состояние по регулировке яркости. это описать я ни как не могу понять как это сделать. |
Автор: | phanis [ Вт ноя 05, 2013 18:52:10 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
Не только, вот еще один момент не маловажный { // button=0; |
Автор: | fevcomp [ Вт ноя 05, 2013 20:35:20 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
Спасибо phanis, пришел с работы и наскорую руку не заметил попробую. ![]() |
Автор: | fevcomp [ Пт ноя 22, 2013 23:48:27 ] | ||
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера | ||
phanis. все кто может помогите, голова совсем опухла , что-то получается, но не все, знаний таких как у вас в этой области у меня нет. Еще раз хочу напомнить алгорит программы котую я пытаюсь воплотить. 1. При включении питания (зажигания) rgb светодиоды плано зажигаются до установленной ранее яркости и уровня ранее выбранного цвета. 2.Вращая экодер мы регулируем яркость общую яркость вех каналов цвета. 3.При нажатии на кнопу цвет меняется на заранее заданные цвета (в моем случае сейчас это 4 цвета, красный зеленный. синий и белый, после того как получится реализовать хотя бы 4 цвета в планах добавить 14 настроек цвета) 4. При последующем нажатии кнопки мы можем выберать произвольно цвет из спектра вращая энкодер. 5.нажатие еще раз кнопки сохраняет настройки и передает управление энкодером от спектра к регуляции яркости. 6 При выключении питания светодиоды плавно гаснут. И данные о настройки цвета с яркостью записываются в EEPROM (этого пока я не совсем понимаю как сделать. хотя пробывал) Ну как то так. Есть еще один канал для монохромного светодиода но сним у меня проблем не возникло. он для плавного включения и выключения подсветки стрелок. И еще у меня почему то получилась инверсия значения цвета, т.е. вместо максимального значения яркости 255 у меня 0, и наоборот для выключенного состояния вместо 0, получается 255. Не могу понять почему. Это очень неудобно. Свой поправленный и сведенный код со схемой эмуляции в протеусе (версия ![]() Код: #include <mega8.h> #include <delay.h> //=========Обявление переменных====================== volatile unsigned int pwm_counter,R,G,B,C,scena=0,button; //==========Обявление функций===== void min (void); void max (void); void color (unsigned int cRi,unsigned int cGi,unsigned int cBi); void btn_color (unsigned int button); void bright_max (void); void bright_min (void); void on_rgb_led (void); void off_rgb_led (void); void on_red_led (void); void off_red_led (void); interrupt [EXT_INT0] void Encoder(void) { //==================Обработка событий вращения экодера вправо - влево==================== delay_us(50); if((PIND&(1 << PORTD2))==0) { delay_us(50); if((PIND&(1 << PORTD0))==0) { if (button==4) { //Регулировка каналов по спектру min (); } else { //Уменьшение яркости LED RGB bright_min (); } } else { //Регулировка каналов по спектру if (button==4) { max (); } else { //Увеличение яркости LED RGB bright_max (); } } } // очищаем флаг внешнего прерывания GIFR = (1<<INTF0); return; } // Timer 0 overflow interrupt service routine interrupt [TIM0_OVF] void Prog_pwm(void) { //===Реализация программного ШИМ на 4 канала========= if (pwm_counter++ > 255) { PORTB = 0x00; pwm_counter = 0; } if (pwm_counter > R) PORTB |= (1 << PORTB0); //ШИМ канал для красного канала RGB LED if (pwm_counter > G) PORTB |= (1 << PORTB1); //ШИМ канал для зеленого канала RGB LED if (pwm_counter > B) PORTB |= (1 << PORTB2); //ШИМ канал для синего канала RGB LED if (pwm_counter > C) PORTB |= (1 << PORTB3); //ШИМ канал для красного монохромного LED } //===Функция выбора политры цвета из спектра======== void min (void) { if (scena == 0) {if(G<255) G=G+15; else scena = 1;} if (scena == 1) {if(R>0) R=R-15; else scena = 2;} if (scena == 2) {if(B<255) B=B+15; else scena = 3;} if (scena == 3) {if(G>0) G=G-15; else scena = 4;} if (scena == 4) {if(R<255) R=R+15; else scena = 5;} if (scena == 5) {if(B>0) B=B-15; else scena = 0;} } void max (void) { if (scena == 0) {if(G>0) G=G-15; else scena = 5;} if (scena == 1) {if(R<255) R=R+15; else scena = 0;} if (scena == 2) {if(B>0) B=B-15; else scena = 1;} if (scena == 3) {if(G<255) G=G+15; else scena = 2;} if (scena == 4) {if(R>0) R=R-15; else scena = 3;} if (scena == 5) {if(B<255) B=B+15; else scena = 4;} } //===Функция предворительно настроенных цветов======== void color (unsigned int cRi,unsigned int cGi,unsigned int cBi) { R=cRi; G=cGi; B=cBi; } //=============Функция выбора преднастроенного цвета по нажатию на кнопку================= void btn_color (unsigned int button) { switch (button) { case 1: color (0,255,255);break; case 2: color (255,0,255);break; case 3: color (255,255,0);break; case 0: color (0,0,0);break; } } //====Функция увеличения яркости======= void bright_min (void) { if ((R<255)&&(G<255)&&(B<255)) { R=R+15; G=G+15; B=B+15; } } //=====Функция уменьшения яркости======== void bright_max (void) { if ((R>0)&&(G>0)&&(B>0)) { R=R-15; G=G-15; B=B-15; } } //====Функция плавного включение RGB LED======= void on_rgb_led (void) { { for (((R=255)&&(G=255)&&(B=255));((R>0)&&(G>0)&&(B>0));((R--)&&(G--)&&(B--))) delay_ms(10);return; } } //======Функция плавного выключения RGB LED===================== void off_rgb_led (void) { { for (((R=0)&&(G=0)&&(B=0));((R<255)&&(G<255)&&(B<255));((R++)&&(G++)&&(B++))) delay_ms(10); } } //====Функция плавного включение RED LED======= void on_red_led (void) { { for (C=255;C>0;C--) delay_ms(5); } } //=====Функция плавного выключение RED LED======= void off_red_led (void) { { for (C=0;C<255;C++) delay_ms(5); } } void main(void) { // Инициализация портов. // Инициализация выходов DDRB |= (1 << PORTB5)|(1 << PORTB4)|(1 << PORTB3)|(1 << PORTB2)|(1 << PORTB1)|(1 << PORTB0); PORTB = 0x00; // Инициализация входов DDRD |= (0 << PORTD2)|(0 << PORTD1)|(0 << PORTD0)|(0<<PORTD7); // Подключаем подтягивающие резисторы PORTD |= (1 << PORTD2)|(1 << PORTD1)|(1 << PORTD0)|(1<<PORTD7); PORTD=0x00; // подтяжка к Vcc PORTD |= (1<<7); DDRD=0x00; // Разрешение прерывания по таймеру0 TIMSK |= (1 << TOIE0); TCCR0 |= (1 << CS00); MCUCR |= (0 << ISC00)|(1 << ISC01); GIFR |= (1 << INTF0); GICR |= (1 << INT0); #asm("sei") //===================Плавное включение RED LED при вкл. питания========= on_red_led(); //===================Плавное включение RGB LED при вкл. питания========= delay_ms(5); on_rgb_led(); while (1) { //========Выбор сцены спектра политры цветов=========== if((PIND&(1 << PORTD2)|(1 << PORTD0))==0) { scena++; if (scena>=5) scena=0; } //=====Обработка события нажатия кнопки энкодера======= if((PIND&(1 << PORTD1))==0)// если нажата кнопка { while((PIND&(1 << PORTD1))==0){} //ждем отпускания кнопки button++; delay_ms(50); if(button > 4) button = 0; //==================Выбор преднастроенных цветов политры по нажатию кнопки================= btn_color (button); } } //== выключение RGB LED при выкл. питания====== off_rgb_led(); delay_ms(5); //== выключение RED LED при выкл. питания====== off_red_led(); } Понимаю, что большенство профессионалов как вы работают либо с асамблером либо в AtmelStudio или IAR, а не CVAVR, но все равно прошу не отказать в помощи т.к. на данном мизирно начпльном этапе в этой программе мне лично проще и понятней.
|
Автор: | fevcomp [ Пт ноя 22, 2013 23:53:02 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
Вместо смайлека (который сейчас не уместа) в посте выше я писал восьмая версия протеуса. Но почемуто вышел смайлик. Видимо цифра восемь и скобка обозначают этот смайл. извините за офтоп. Но я обязан был поправится. |
Автор: | Unreal_2009 [ Сб ноя 23, 2013 00:19:55 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
Первое что нужно сделать - выучить русский язык. пОлитра - нет такоВослова. |
Автор: | Аlex [ Сб ноя 23, 2013 00:30:02 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
zero648 писал(а): Вы только в железе так ёмкости не вешайте ![]() Я имел ввиду - протеус не меняет яркость при подачи на него цифрового сигнала (ШИМ) напрямую, а не аналогового ![]() |
Автор: | zero648 [ Сб ноя 23, 2013 10:33:36 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
Все правильно ![]() |
Автор: | Unreal_2009 [ Сб ноя 23, 2013 11:01:29 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
По поводу инверсии Насколько я понял из кода -ШИМ реализован относительно питания. Т.е. на схеме нужно перевернуть светодиоды- катоды подключить в портам микроконтроллера, а аноды к питанию. Остальное посмотрю как доберусь до компа где есть протеус. |
Автор: | Unreal_2009 [ Сб ноя 23, 2013 20:26:17 ] |
Заголовок сообщения: | Re: Прошу в помощи в объединении кодов для RGB контроллера |
А что за версия протеуса? |
Страница 1 из 3 | Часовой пояс: UTC + 3 часа |
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group http://www.phpbb.com/ |