[Решено]TIMER1 - прерывание по совпадению

Обсуждаем контроллеры компании Atmel.
Ответить
Встал на лапы
Аватара пользователя
Сообщения: 83
Зарегистрирован: Чт дек 29, 2011 16:25:56

Сообщение gruffi »

Добрый день, Форумчане! Помогите пожалуйста разобраться с таймером1. Необходимо после отлавливания внешнего прерывания INT0 запустить таймер1 с прерыванием по совпадению. Период таймера от 200 до 20000. Внешнее прерывание я отлавливаю и запускаю таймер1, но прерывания нет, хотя таймер тикает и при совпадении обнуляется и идет дальше по кругу - в отладчике смотрел...Помогите найти, где я накосячил...Работаю в avr studio, мк atmega16. Вот код:

Код: Выделить всё

void INCUBATOR_Init()
{
	//TIME_Init();
	
	DDRB  &= (1 << 0) | (1 << 1);
	PORTB |= (1 << 0) | (1 << 1);
	
	DDRC |= (1 << 0);
	PORTC &= ~(1 << 0);
	
	DDRD  &= ~(1 << 2);
	PORTD |= (1 << 2);
	
	GICR  |= (1 << INT0); //разрешили прерывание
	MCUCR = 0x00;
	
	SREG |= (1 << 7);
}
//------------
ISR(INT0_vect)
{
	if(!enableZeroCross)
	{
		enableZeroCross = true;
		
		OCR1A   = delay_dimmer; // Значение для сравнения
		TCNT1   = 0;     // счетчик в ноль
		TCCR1B |= (1 << CS10) | ( 1<< WGM12);  // без предделителя и режим СТС по совпадению
		TIMSK  = (1 << OCIE1A); // Разрешить прерывание при совпадении TCNT1 и OCR1A
	}
}
//--------------------
ISR(TIMER1_COMPA_vect)
{
	if(enableZeroCross)
	{
		TCNT1 = 0;
		TCCR1B = 0x00;
		
		PORTC |= (1 << 0); // включить симмистор
		_delay_us(50);
		PORTC &= ~(1 << 0);
		enableZeroCross = false;	
	}
}
Реклама
Ответить

Вернуться в «AVR»