В общем долгое время борюсь с построением ШИМ регулятором светодиодов...проблема в том, что светодиод не тухнет при OCR=0x00, т.е. переменная вроде бы как на 0, а светодиод все равно горит в пол накала...пробовал на Atmega8535, Atmega48 и Atmega168, последние в плане работы мне вообще не нравятся, ШИМ в них то работает то нет и в основном все хаотично моргает глючит и т.д. а если и начинает работать то светодиод полностью не тухнет....
у 8535 дело получше - 2 светодиода тухнут полностью, а один также горит в пол накала, хотя свечение менее интенсивное, можно сказать почти не горит, но все же заметно.
Код вот такой:
Код: Выделить всё
#include <mega8535.h>
#define R_channel OCR1AL //Определяем канал OCR1AL для Красного цвета
#define G_channel OCR1BL //Определяем канал OCR1BL для Зеленого цвета
#define B_channel OCR2 //Определяем канал OCR2 для Синего цвета
#define RGB_pause 2000 //Пауза для задержки
//Программа формирования задержки
void pause (unsigned int a)
{
unsigned int i; //Переменная для задержки
for (i=a;i>0;i--); //Цикл формирования задержки
}
//Программа инициализации ШИМ
void init_pwm (void)
{
//Инициализация порта
DDRD=0xFF; //OC1A,OC1B,OC2 - выхода
TCCR1A=0b10100001; //Конфигурация счетчика OC1A A1
TCCR1B=0b00000001; //Конфигурация счетчика OC1B 01
TCCR2=0b01100001; //Конфигурация счетчика OC2 61
//Установка начальных значений счетчиков
OCR1AL=0xff; //Соответсвует Красному цвету
OCR1BL=0x00; //Выключен 0
OCR2=0x00; //Выключен 0
}
//Основная программа
void main(void)
{
unsigned char i;
init_pwm(); //Инициализация ШИМ каналов
while (1) //Вечный цикл
{
for(i=0;i<255;i++) //Переход от красного к зеленому
{
R_channel--;
G_channel++;
pause(RGB_pause);
}
for(i=0;i<255;i++) //Переход от зеленого к синему
{
G_channel--;
B_channel++;
pause(RGB_pause);
}
for(i=0;i<255;i++)//Переход от синего к красному
{
B_channel--;
R_channel++;
pause(RGB_pause);
}
}
}чтонить с этим можно сделать? Особенно это касается как раз 48 88 168 атмег, которые вообще не хотят работать с ШИМ и выключать светодиод


