Здравствуйте!
Необходимо организовать двух-канальный ШИМ (вообще-то трёх-канальный, но для начала - двух-канальный).
256 градаций хватит.
Активный уровень - низкий (управление драйвером MBI1801 светодиодов).
Решил это осуществить на 8-битном таймере T0.
Выходы обоих каналов ШИМ - выводы OC0 (OC0A, OC0B).
Алгоритм следующий.
Загружаем в регистры сравнения соответствующие длительностям ШИМ значения.
Настраиваем таймер в режиме Normal, разрешаем прерывание по переполнению, режим работы блока сравнения (управление выводами OC0) - "состояние выводов меняется на противоположное".
Т. е., при равенстве счётного регистра и регистра сравнения состояние вывода OC0 меняется на противоположное. Далее, при переполнении таймера (период ШИМ) - состояние опять меняется на противоположное. Т. о., получается ШИМ,
Вкратце, код тестовой программы такой:
Код
...
void TIMER0_OVF_vect(void)
{
TCCR0B |= (1 << FOC0A) | (1 << FOC0B);
sei();
return;
};
...
int main (void)
{
...
OCR0A = n_red;
OCR0B = n_green;
TCNT0 = 0x00;
TIMSK0 |= 1 << TOIE0;
TCCR0A = 0b01010000;
sei();
TCCR0B = 0b00000011;
...
};
Всё просто, код маленький, работает.
Изначально выводы OC0 настраиваю как выходы и перевожу в состояние "1".
Но заметил странную особенность, которую никак объяснить не могу!
При выполнении команды TCCR0A = 0b01010000 состояние выводов OC0 меняется на противоположное, т. е., на "0".
Вопрос. Почему?
Ни в Евстифееве, ни в даташите на контроллер я ответа на свой вопрос не нашёл...
Обидно... несколько пугает и обескураживает

Помогите разобраться, пожалуйста!
Спасибо заранее!