Привет всем)
Не знаю попал ли я в правильную тему, а то тема о микроконтроллерах закрыта.
но пишу сюда, да простят меня модераторы )
Пробую сделать мигалку для рбг светика программным шимом. Взял пример из интернета и немного переделал под себя.
так все в порядке все работает плавно меняются цвета НО если начинаю писать дальше в бесконечном цикле после блока условий например
то ифы не обрабатываться почему то, программа начинает работать сразу с
скажите почему так происходит? почему не работает плавное изминение цвета если в цикле начинаю писать другой код?
спасибо.
Не знаю попал ли я в правильную тему, а то тема о микроконтроллерах закрыта.
но пишу сюда, да простят меня модераторы )
Пробую сделать мигалку для рбг светика программным шимом. Взял пример из интернета и немного переделал под себя.
Код: Выделить всё
#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;
спасибо.

