Проблема с таймером 2 на AtMega16

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
Закрыто
cvid
Родился
Сообщения: 9
Зарегистрирован: Вт сен 09, 2008 12:03:19

Проблема с таймером 2 на AtMega16

Сообщение cvid »

Вот пишу простенький код для atmega16

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

#include<avr>
#include<util> 
#include<avr>

unsigned char flag=0;

//==============timer===================//
SIGNAL(TIMER2_COMP_vect)
{
	
	flag = 1;
	
}
void init_Timer()
{

  OCR2 = 200;
  TCCR2 = (1 << WGM21) | (1 << CS22);
  TIMSK = (1 << 7);
	
 
 }
//===================//


int main(void)
{
DDRD = 0xFF;
	
	init_Timer();
	
	while(flag!=1){}
	
	while(1)
	{
	
	PORTD = 0xFF;
	_delay_ms(20);
	PORTD = 0x00;
	
	
	}
	
	return 0;
}
Проверяю AvrStudio - все нормально, прерывание есть, флаг становится 1, но прога не выходит из бесконечного цикла

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

while(flag!=1){}
В чем же дело?
Реклама
BerZerK-ku
Мучитель микросхем
Сообщения: 492
Зарегистрирован: Вт июл 22, 2008 08:10:54

Сообщение BerZerK-ku »

Не установлен глобальный бит разрешения прерываний.
Реклама
Аватара пользователя
ikarab
Опытный кот
Сообщения: 828
Зарегистрирован: Пн мар 16, 2009 21:40:57
Контактная информация:

Re: Проблема с таймером 2 на AtMega16

Сообщение ikarab »

cvid писал(а):все нормально, прерывание есть, флаг становится 1, но прога не выходит из бесконечного цикла
Установка флага означает наличие события вызывающего прерывание, но не само прерывание - прерывание это переход программы по адресу соответствующего прерывания.

Если интересно - почитайте "Прерывания в AVR"
cvid писал(а): SIGNAL(TIMER2_COMP_vect)


Там же посмотрите что в WinAVR обновился формат описания обработчиков прерываний:

Прерывание в компиляторе WinAVR
#include <avr>

ISR(прерывание_vect)
{
код выполняемый при возникновении
разрешенного локально и глобально прерывания
}

слово "прерывание" нужно заменить на название прерывания из ДатаШита либо из заголовочного файла *.h для вашего МК AVR.

============

Если вы хотель только отдельные биты установить, то вот так не верно - вы еще и нули пишите :

TCCR2 = (1 << WGM21) | (1 << CS22);
TIMSK = (1 << 7);

верно так:

TCCR2 |= (1 << WGM21) | (1 << CS22);
TIMSK |= (1 << 7);
Александр777
Первый раз сказал Мяу!
Сообщения: 21
Зарегистрирован: Ср мар 25, 2009 15:57:59
Откуда: Тула

Сообщение Александр777 »

Попробуй вместо unsigned char flag=0; написать int flag=0;,
возможно несоответствие типов.
Не установлен глобальный бит разрешения прерываний.
Проверяю AvrStudio - все нормально, прерывание есть, флаг становится 1
Действительно непонятно как оно работаетнормально, если нет команды sei().
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
ARV
Ум, честь и совесть. И скромность.
Сообщения: 18647
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск
Контактная информация:

Сообщение ARV »

уж сколько раз твердили миру... а воз и ныне там...

все переменные, которые изменяются в обработчиках прерываний и затем используются в прочих функциях должны быть объявлены volatile
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Реклама
cvid
Родился
Сообщения: 9
Зарегистрирован: Вт сен 09, 2008 12:03:19

Сообщение cvid »

Спасибо всем, разобрался. sei() был, просто код скопировал не полностью :) А вот volatile - действительно моя ошибка, чё-то совсем запамятовал, спс ARV.
Реклама
Закрыто

Вернуться в «Микроконтроллеры и ПЛИС»