Timer0 и Atmel Studio 7 Atmega88a

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Сообщение Land »

Приветствую всех. В очередной раз подниму тему с таймерами. Ибо либо лыжи не едут, либо я ни фига не понимаю.
TIMER0 код инициализации:

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

//	Таймер 0 
	// TIMER 0 for interrupt frequency undefined Hz:
	cli(); // stop interrupts
	TCCR0A = 0; // set entire TCCR0A register to 0
	TCCR0B = 0; // same for TCCR0B
	TCNT0  = 0x83; // 0x83 to 16 mS B, 9C to 100 uS A
	// set compare match register for undefined Hz increments
	//OCR0A = 0x63; // to 100 uS A
	OCR0B = 0x53;	// 16 mS B
	TCCR0A |= (1 << WGM01);	// turn on CTC mode	
	TIMSK0 |= (1<<OCIE0B);	// enable timer compare interrupt OCIE0B to 16 mS (1 << OCIE0A)|(1<<OCIE0B)
	// Set CS02, CS01 and CS00 bits for 1 prescaler
	TCCR0B |= (1 << CS02) | (0 << CS01) | (1 << CS00); // CS02|CS00 1024 /16mS/, CS01 8 /100 uS
Выбран режим CTC, прерывание по совпадению OCIE0B (канал В), начальное значение TCNTO= 0x83, счетчик OCR0B = 0x53.
Прерывания:

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

ISR(TIMER0_COMPA_vect)
	{
		flag_SEND_BIT = _ON;
			//	100 uS		
	}

	ISR(TIMER0_COMPB_vect)
	{
		flag_BUTTON = _ON;
		TCNT0  = 0x83; // было ошибочно TCNT2, после исправления ничего не поменялось
	}
Прерывание не генерится и в симуляторе не идет счет TCNT0. В симуляторе постоянно висит флаг OCF0A и TOV0
Изображение
Если тот же таймер перестраиваю на прерывания по совпадению OCIE0A,

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

//	Таймер 0 
	// TIMER 0 for interrupt frequency undefined Hz:
	cli(); // stop interrupts
	TCCR0A = 0; // set entire TCCR0A register to 0
	TCCR0B = 0; // same for TCCR0B
	TCNT0  = 0x83; // 0x83 to 16 mS B, 9C to 100 uS A
	// set compare match register for undefined Hz increments
	OCR0A = 0x63; // to 100 uS A
	//OCR0B = 0x53;	// 16 mS B
	TCCR0A |= (1 << WGM01);	// turn on CTC mode	
	TIMSK0 |= (1<<OCIE0A);	// enable timer compare interrupt OCIE0B to 16 mS (1 << OCIE0A)|(1<<OCIE0B)
	// Set CS02, CS01 and CS00 bits for 1 prescaler
	TCCR0B |= (1 << CS02) | (0 << CS01) | (1 << CS00); // CS02|CS00 1024 /16mS/, CS01 8 /100 uS
т.е. меняю две строчки кода, то прерывание есть и счет TCNT0 идет :shock:
Изображение При этом висит флаг OCF0B и TOV0.
глобальное разрешение прерываний sei в коде есть само-собой.
Ткните пальцем, где туплю :beer:
Реклама
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

Изображение
Вложения
1.png
(26.83 КБ) 386 скачиваний
Реклама
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Сообщение Land »

И как это объясняет отсутствие прерывания по каналу В?
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

А чему у вас равно значение регистра OCR0A в случае, когда прерывание по TIMER0_COMPB не вызывается?
Кроме того, TCNT0 считает от 0 до TOP, присваивание TCNT0 = 0x83 выглядит непонятно.
Здесь есть тема по таймерам AVR; можете поискать документацию на AVR на русском.
Реклама
Эиком - электронные компоненты и радиодетали
Прорезались зубы
Сообщения: 217
Зарегистрирован: Ср янв 11, 2012 11:55:51

Сообщение Land »

Спасибо, дошло. Было достаточно ответа в стиле: у вас TCNT0 сбрасывается по достижении FF и не может досчитать до OCR0B.
Реклама
Опытный кот
Аватара пользователя
Сообщения: 760
Зарегистрирован: Сб окт 22, 2016 17:33:32
Откуда: кг

Сообщение Карбофос »

[uquote="Land",url="/forum/viewtopic.php?p=4204207#p4204207"]TCNT0 сбрасывается по достижении FF[/uquote]
По достижению TOP.
Реклама
Ответить

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