Программный ШИМ для RBG светодиода

Обсуждаем цифровые устройства...
Ответить
Нашел транзистор. Понюхал.
Аватара пользователя
Сообщения: 166
Зарегистрирован: Сб июн 26, 2010 21:03:09

Сообщение BIGGGI »

Привет всем)
Не знаю попал ли я в правильную тему, а то тема о микроконтроллерах закрыта.
но пишу сюда, да простят меня модераторы ) :kill:

Пробую сделать мигалку для рбг светика программным шимом. Взял пример из интернета и немного переделал под себя.

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

#include <mega16.h>
#include <delay.h>

#define RED PORTB.0
#define GREEN PORTB.1
#define BLUE PORTB.2

/*объявляем прерменные***********************************************************************************************************/
unsigned char red=255,   green,     blue;       //переменные, для изменения скважности ШИМ в программе
unsigned char red_b,     green_b,   blue_b;     //переменные, для буферизации значений скважности ШИМ
unsigned char count;                            //переменная- счетчик вызовов обработчика прерываний
unsigned char temp=1;                           //переменная для работы алгоритма смены цветов
/********************************************************************************************************************************/
/*обработчик прерывания**********************************************************************************************************/  
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
count++;
if (count == 0){                                //если счетчик переполнился и принял значение 0
        
        red_b   = red;                          //сохранием значения в буфер
        green_b = green; 
        blue_b  = blue;
        
        RED   = 1;                               //выставляем ноги, отвечающие за ШИМ в логическую 1
       GREEN = 1; 
        BLUE  = 1;           
        }

if (red_b   == count) { RED   = 0;}             //по достижении заданной скважности выводим логический 0 в ножку МК
if (green_b == count) { GREEN = 0;}
if (blue_b  == count) { BLUE  = 0;}   

}
/********************************************************************************************************************************/
void main(void)
{

PORTB=0x00;                                     //конфигурируем порты
DDRB=0xff;

PORTC=0x00;                                     
DDRC=0xff;

PORTA=0x00;                                     
DDRA=0xff;


TCCR0=0x01;
TCNT0=0x00;
OCR0=0x00;

TIMSK=0x01;                                     //разрешаем генерацию прерывания по переполнению таймера T0

#asm("sei")                                     //глобально разрешаем прерывания

/*бесконечный цикл***************************************************************************************************************/ 
while (1)                                       
      {    
      
if (temp==1) {if (green < 255) green += 1; else temp = 2;}
if (temp==2) {if (red > 0) red -= 1; else temp = 3;}
if (temp==3) {if (blue < 255) blue += 1; else temp = 4;}
if (temp==4) {if (green > 0) green -= 1; else temp = 5;}
if (temp==5) {if (red < 255) red += 1; else temp = 6;}
if (temp==6) {if (blue > 0) blue -= 1; else temp = 1;}

delay_ms(3);


      };
}
/********************************************************************************************************************************/
так все в порядке все работает плавно меняются цвета НО если начинаю писать дальше в бесконечном цикле после блока условий например

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

if (temp==1) {if (green < 255) green += 1; else temp = 2;}
if (temp==2) {if (red > 0) red -= 1; else temp = 3;}
if (temp==3) {if (blue < 255) blue += 1; else temp = 4;}
if (temp==4) {if (green > 0) green -= 1; else temp = 5;}
if (temp==5) {if (red < 255) red += 1; else temp = 6;}
if (temp==6) {if (blue > 0) blue -= 1; else temp = 1;}

delay_ms(3);

red=10;
delay_ms(1000); 
red=0; 
green=10;

delay_ms(1000); 
green=0;
blue=10;

delay_ms(1000); 
blue=0; 



red=150;

delay_ms(1000); 
red=0; 
green=150;

delay_ms(1000); 
green=0;
blue=150;

delay_ms(1000); 
blue=0;



red=255;

delay_ms(1000); 
red=0; 
green=255;

delay_ms(1000); 
green=0;
blue=255;

delay_ms(1000); 
blue=0;
      


то ифы не обрабатываться почему то, программа начинает работать сразу с

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


red=10;
delay_ms(1000); 
red=0; 
green=10;
скажите почему так происходит? почему не работает плавное изминение цвета если в цикле начинаю писать другой код?
спасибо.
Реклама
Друг Кота
Аватара пользователя
Сообщения: 6339
Зарегистрирован: Вт апр 24, 2007 07:45:40
Откуда: Minsk

Сообщение Jack_A »

Эх, товарисч .... Тема микроконтроллеров не только не закрыта, а расширена до целого раздела :

http://radiokot.ru/forum/viewforum.php?f=56
Вам с этим вопросом - туда.
Изображение
Реклама
Вымогатель припоя
Аватара пользователя
Сообщения: 557
Зарегистрирован: Пт июл 04, 2008 19:29:15
Откуда: Мурманск

Сообщение Bullet »

А с чего такое предположение что ифы не выполняются? Как по мне так все выполняется. Проверяется temp на равность единице, green инкрементируется, а дальше пошло red=10. Если планировалось, что сначала должен пройти плавный перебор цветов, а только потом мигалка, то надо еще один иф добавить. Вообще по ргб эфектам можешь мою статью покурить http://radiokot.ru/circuit/light/run/78/
Ответить

Вернуться в «Цифровая техника»