Нет, это не способ, которым вы должны делать ШИМ. Например, как вы можете установить для него уровень ШИМ, например, 42%? Кроме того, размер кода большой, это можно сделать гораздо более эффективным способом. Кроме того, вы тратите 16-битный таймер на выполнение 8-битных операций. У вас есть 2x 8-битные таймеры (Таймер / Счетчик 0 и 2) и один 16-битный таймер, Timer/Counter 1
.
Это также плохая идея устанавливать неиспользуемые порты для вывода. Все порты, которые ни к чему не подключены, должны быть оставлены как входы.
ATmega8 имеет встроенный ШИМ-генератор на таймерах 1 и 2, его не нужно моделировать с помощью программного обеспечения. Вам даже не нужно устанавливать свои порты вручную (вам нужно только установить соответствующий порт для вывода)
Вам даже не нужно прерывать.
#define fillrate OCR2A
//...
// main()
PORTB=0x00;
DDRB=0x08; //We use PORTB.3 as output, for OC2A, see the atmega8 reference manual
// Mode: Phase correct PWM top=0xFF
// OC2A output: Non-Inverted PWM
TCCR2A=0x81;
// Set the speed here, it will depend on your clock rate.
TCCR2B=0x02;
// for example, this will alternate between 75% and 42% PWM
while(1)
{
fillrate = 191; // ca. 75% PWM
delay_ms(2000);
fillrate = 107; // ca. 42% PWM
delay_ms(2000);
}
Обратите внимание, что вы можете использовать другой светодиод с другим ШИМ, используя тот же таймер и установив OCR2B вместо OCR2A. Не забудьте настроить TCCR2A для включения OCR2B в качестве выхода для вашего ШИМ, поскольку в этом примере разрешен только OCR2A.