Добрый день!
Столкнулся с такой проблемой: решил организовать ШИМ на произвольную ногу (atmega16) по следующей схеме - настраиваем быстрый ШИМ на timer2, настраиваем таймер по перепонению timer1. В прерывании таймера по переполнению отслеживаем, когда счётный регистр TCCNT2 равен регистру сравнения OCR2 и меняем уровень напряжения на произвольной ноге.
Однако не могу обиться работоспособности такого способа.
Возможно регистр TCCNT2 был выбран неверно, надеюсь на ваши подсказки и помощь.
Раздел: AVR
Столкнулся с такой проблемой: решил организовать ШИМ на произвольную ногу (atmega16) по следующей схеме - настраиваем быстрый ШИМ на timer2, настраиваем таймер по перепонению timer1. В прерывании таймера по переполнению отслеживаем, когда счётный регистр TCCNT2 равен регистру сравнения OCR2 и меняем уровень напряжения на произвольной ноге.
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
int main(void)
{
DDRA|=(1<<1); //вывод ШИМа произвольной ноги
volatile int ii=0;
volatile stop=0;
int8_t a;
a|=(1<<0);
a&=~(1<<1);
DDRA|=(1<<1)|(1<<2);
DDRD|=(1<<7)|(1<<6);
MCUCR|=(1<<ISC11);
GICR|=(1<<INT0);
TCCR1B|=(1<<CS10); //таймер по переполнению без предделителя
TIMSK=(1<<TOIE1);
TCCR2|=(1<<WGM21)|(1<<WGM20)|(1<<COM21)|(0<<CS22)|(0<<CS21)|(1<<CS20);
TCNT0 = 0;
OCR2=255; //настройка FastPWM
sei();
while(1) //бесконечный цикл
{
for(int i=0;i<255;i++)
{
//устанавливаем яркость ШИМ
OCR2=i;
//Now Wait For Some Time
_delay_ms(10);
PORTA&=~(1<<1); //устанавливаем низкий уровень напр
}
// уменьшаем яркость
for(i=255;i>0;i--)
{
//Now Set The Brighness using PWM
OCR2=i;
//Now Wait For Some Time
_delay_ms(10);
PORTA&=~(1<<1);
}
}
}
ISR (TIMER1_OVF_vect)
{
if (TCNT2==OCR2)
{
PORTA|=(1<<1); //устанавливаем высокий ур-нь напряжения
}
}
Однако не могу обиться работоспособности такого способа.
Возможно регистр TCCNT2 был выбран неверно, надеюсь на ваши подсказки и помощь.
Раздел: AVR