Tehnic
Простой пример использования прерываний, для вывода программного ШИМ на PD0.
CODE:
#include <avr/io.h>
#include <avr/interrupt.h>
int __vector_3() //прерывание по совпадению таймера с OCR2
{
PORTD |= 1; //Установить младший бит порта D
sei(); //Глобальное разрешение прерываний
return(0);
}
int __vector_4() //прерывание по переполнению таймера
{
PORTD &= 0xfe; //Сбросить младший бит порта D
sei(); //Глобальное разрешение прерываний
return(0);
}
int main()
{
DDRD |= 1; //Сконфигурировать младший бит порта D как выход
TIMSK |= (1 << OCIE2) | (1 << TOIE2); //Разрешить вызов процедур прерывания по переполнению и совпадению для таймера 2
sei(); //Глобалное разрешение прерываний
OCR2 = 128; //Регистр сравнения таймера 2
TCCR2 = 2; //Запуск таймера 2 с делением тактовой частоты на 8
while(1); //Бесконечный цикл
return(0);
}
(Добавление)
sound
Простой пример аппаратного ШИМ (в данном случае, так называемый "Быстрый ШИМ"/Fast PWM) с выводом на OC2 (для ATmega8 - PB3):
CODE:
#include <avr/io.h>
int main()
{
TCNT2 = 0; //Сброс таймера
OCR2 = 128; //Количество тактов из 256, в течение которых на OC2 будет уровень логической единицы
TCCR2 |= (1 << WGM20) | (1 << WGM21) | (1 << COM21) | (1 << CS20); //Режим 3: быстрый ШИМ, установить лог. "0" на OC2, при совпадении, установить лог. "1" при минимальном значении
while(1); //Бесконечный цикл
}
|