Как изменить значение в регистре сравнения OCR2
Добавлено: Сб май 23, 2020 00:23:48
Всем привет!
Хочу в основном цикле менять значение в регистре сравнения второго таймера (атмега8) для изменения скваженности, например нажимая на кнопку (PIN2 C) хочу чтобы таймер досчитывал до 250 и входил в прерывание, а если кнопка отжата, то досчитывал до 50 и входил в прерывание.
Сейчас по факту ничего не меняется при нажатии, где у меня ошибка?
#define F_CPU 1000000L // частота процессора
#include <avr/io.h>
#include <util/delay.h> // без этой библиотеки не работают часы задержки
#include <avr/interrupt.h>
ISR(INT0_vect) // внешнее прерывание по входу INT0
{
TCNT2=0x00; //обнуляем таймер
TCCR2&=~(1<<CS22);
TCCR2|=(1<<CS20)|(1<<CS21);
PORTB&=~(1<<0);
PORTB&=~(1<<1);
}
ISR(TIMER2_COMP_vect) // настройка прерывания по совпадению таймера счетчика 2
{
PORTB|=(1<<0);
PORTB|=(1<<1);
TCCR2=0;
}
int main(void)
{
DDRB = 0xFF; // инициирование портов B на работу на выход
DDRD = 0x00;
DDRC = 0x00; // инициирование портов C на работу на вход
PORTC = 0b11111111;
TIMSK|=(1<<OCIE2);
//================ ИНИЦ. таймера 2 ====//
TCCR2|=(1<<WGM21);
TCCR2&=~(1<<CS22);
TCCR2|=(1<<CS20)|(1<<CS21);
TCNT2=0x00;
OCR2=100; // регистр сравнения, сюда будем записывать скорость вентилятора
//================ настройка внешнего прерывания 0 по восходящему фронту====================//
MCUCR|=(1<<ISC01)|(1<<ISC00);
GICR|=(1<<INT0);
sei(); //разрешаем прерывания глобальные
while (1)
{
if (~PINC & (1<<2))
{
OCR2=250;
}
else OCR2=50;
}
}
Хочу в основном цикле менять значение в регистре сравнения второго таймера (атмега8) для изменения скваженности, например нажимая на кнопку (PIN2 C) хочу чтобы таймер досчитывал до 250 и входил в прерывание, а если кнопка отжата, то досчитывал до 50 и входил в прерывание.
Сейчас по факту ничего не меняется при нажатии, где у меня ошибка?
#define F_CPU 1000000L // частота процессора
#include <avr/io.h>
#include <util/delay.h> // без этой библиотеки не работают часы задержки
#include <avr/interrupt.h>
ISR(INT0_vect) // внешнее прерывание по входу INT0
{
TCNT2=0x00; //обнуляем таймер
TCCR2&=~(1<<CS22);
TCCR2|=(1<<CS20)|(1<<CS21);
PORTB&=~(1<<0);
PORTB&=~(1<<1);
}
ISR(TIMER2_COMP_vect) // настройка прерывания по совпадению таймера счетчика 2
{
PORTB|=(1<<0);
PORTB|=(1<<1);
TCCR2=0;
}
int main(void)
{
DDRB = 0xFF; // инициирование портов B на работу на выход
DDRD = 0x00;
DDRC = 0x00; // инициирование портов C на работу на вход
PORTC = 0b11111111;
TIMSK|=(1<<OCIE2);
//================ ИНИЦ. таймера 2 ====//
TCCR2|=(1<<WGM21);
TCCR2&=~(1<<CS22);
TCCR2|=(1<<CS20)|(1<<CS21);
TCNT2=0x00;
OCR2=100; // регистр сравнения, сюда будем записывать скорость вентилятора
//================ настройка внешнего прерывания 0 по восходящему фронту====================//
MCUCR|=(1<<ISC01)|(1<<ISC00);
GICR|=(1<<INT0);
sei(); //разрешаем прерывания глобальные
while (1)
{
if (~PINC & (1<<2))
{
OCR2=250;
}
else OCR2=50;
}
}