Допустим начальное значение в OCR2 заносит АЦП.vda67 писал(а):...
Так вот значение OCR2 меняется от 255 до 0 с дискретностью 1. ...
запуск таймера должно дать прерывание
Что и с каким интервалом вызывает изменение значения OCR2?
и так далее...
Допустим начальное значение в OCR2 заносит АЦП.vda67 писал(а):...
Так вот значение OCR2 меняется от 255 до 0 с дискретностью 1. ...
Код: Выделить всё
#define F_CPU 8000000UL
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>// подключаем библиотеку
void init_interrupt(char YROVEN) // настройка прерывания
{
GICR|=(1<<INT0); // включаем прерывания
MCUCR|=((YROVEN & 1)<<ISC00)|((YROVEN >>1 & 1)<<ISC01);//устанавливаем тип срабатывания
// 1-Любое изменение уровня на выводе INT0, 2-Нисходящий фронт сигнала (смена 1 на 0) на выводе INT0
//3-Восходящий фронт сигнала (смена 0 на 1) на выводе INT0, 0- Нижний уровень на выводе INT0
}
void int_StopTimerT2(void)
{
TCCR2 = 0b00000000;
}
void int_TimerT2(char delitel, char rejim_taim,char rejim_OC2,char rejim_foc2)
// Настройка таймера
{
TCNT2 = 0x00;//обнуляем счетчик таймера Т2
TCCR2 = 0x00; // Сброс регистра конфигурации таймера Т2
TCCR2|=((delitel >>2 & 1)<<CS22)|((delitel >>1 & 1)<<CS21)|((delitel & 1)<<CS20)
// Установка делителя: 0-Источника тактирования нет таймер остановлен,
// 1-Тактовая частота МК, 2-Тактовая частота МК/8, 3-тактовая частота МК/32,
// 4-Тактовая частота МК/64, 5-Тактовая частота МК/128, 6-Тактовая частота МК/256,
// 7-Тактовая частота МК/1024.
|((rejim_taim >>1 & 1)<<WGM21)|((rejim_taim & 1)<<WGM20)//Режим работы таймера/счётчика
// 0-Нормальный режим счётчика, 1-ШИМ с коррекцией фазы,
//2- Сброс таймера при совпадении регистров OCR2 и TCNT2 (CTC) и 3-Быстрая ШИМ (Fast PWM).
|((rejim_OC2 >>1 & 1)<<COM21)|((rejim_OC2 & 1)<<COM20)
// Режим работы вывода OC2: 0-Вывод ОС2 отключён от таймера/счётчика,
//1- Состояние вывода меняется на противоположное при совпадении TCNT2 и OCR2
//(только в режимах Normal и CTC)
//2-На OC2 устанавливается "0" при совпадении TCNT2 и OCR2
// и устанавливается "1" при сбросе счётчика,
//3-На OC2 устанавливается "1" при совпадении TCNT2 и OCR2
//и устанавливается "0" при сбросе счётчика.
|((rejim_foc2 & 1)<<FOC2);//устанавливаем тип срабатывания
// предназначен для принудительной установки логического уровня на выходе OC2.
// Он работает только для режимов Normal и CTC. При установке бита FOC2 в единицу
//состояние выхода меняется в соответствии со значениями битов COM21 и COM20.
}
void int_RazPrerT2(char Kakoe)//разрешения прерываний
{
TIMSK &=0b00111111;// сброс прерываний таймера Т2
TIMSK|=((Kakoe >>1 & 1)<<OCIE2)|((Kakoe & 1)<<TOIE2);
//0-Все прерывания запрещены, 1-Разрешает прерывание по событию переполнение,
//2-Разрешает прерывание по событию совпадение, 3-Разрешает прерывания по обоим событиям
// sei();// Разрешение работу прерываниям
}
void int_pcb(void)
{
DDRD = 0b11110011;//PD0 PD1 PD4 PD5 PD6 PD7 — настраиваем ножки на выход PD2 PD3 - Вход
PORTD = 0b00001100;//РD2 PD3 — подключаем подтягивающие резисторы
DDRC = 0b00110000; // Конфигурируем вывод порта PC0-PC3 как вход и PC4 PC5 как выход
}
ISR(INT0_vect)// прерывание по ножке PD2
{
PORTC &= ~(1 << PC4);// Устанавливаем 0 на его выходе на линии 4 порта C
_delay_ms(0.6);
int_TimerT2(6,2,0,0);//запукаем таймер Т2
OCR2 -=1;
}
ISR (TIMER2_COMP_vect) // Если произошло прерывание по совпадению таймера Т2
{
if(OCR2 <1)
{
PORTC &= ~(1 << PC4);// Устанавливаем 0 на его выходе на линии 4 порта C
}
else
{
PORTC |=_BV (PC4); //Устанавливаем 1 на выходе PC4
}
}
int main(void)
{
int_pcb(); //Настройка портов
sei();// Разрешение работу прерываниям
init_interrupt(3); // Включение прерывания по входу PD2
int_RazPrerT2(2);//разрешения прерываний от таймера Т2
while(1)
{
_delay_ms(50); // ждем 0.005 сек.
}
}