Работа с таймерами и прерываниями в Mega8

Вопросы настройки, программирования, прошивки микроконтроллеров и микросхем программируемой логики
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Работа с таймерами и прерываниями в Mega8

Сообщение king-live »

Доброго времени соток. Изучаю таймеры и прерывания и начал с таймера T/C0. И вот вопрос. в функции White() вместо while(TCNT0<250) хочу использовать флаг прерывания TOV0, для выхода из цикла по переполнению TCNT0. Но как это написать не знаю. Вернее много написал. но ничего не работает. Спасибо.

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

#include <avr/io.h>
#define F_CPU 4000000UL
#include <avr/interrupt.h>

White()
{
TCNT0=0;
while(TCNT0<250){}
}

int main(void) 
{
TIMSK=0b01000001;
SREG=0b10000000;
DDRD=0xff;  
TCCR0=5;
while(1)
	{

PORTD |= _BV(PD0);
White();
PORTD &=~_BV(PD0);
White();
	}
}
Реклама
codenamehawk
Вымогатель припоя
Сообщения: 528
Зарегистрирован: Вт фев 09, 2010 17:52:26

Re: Работа с таймерами и прерываниями в Mega8

Сообщение codenamehawk »

Надежней, да и проще использовать прерывания.
Реклама
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Работа с таймерами и прерываниями в Mega8

Сообщение king-live »

Прерывания это надёжно, но как этот код написать или подправить на моём примере?
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Работа с таймерами и прерываниями в Mega8

Сообщение ibiza11 »

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

while(!(TOV0)){}
TOV0 = 0;
Ставим плюсы: )
Реклама
Эиком - электронные компоненты и радиодетали
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Работа с таймерами и прерываниями в Mega8

Сообщение king-live »

AVRStudio ругается на строчку TOV0=0;

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

#include <avr/io.h>
#define F_CPU 4000000UL
#include <avr/interrupt.h>


White()
{
TCNT0=0;
//while(TCNT0<250){}
while(!(TOV0)){}
TOV0=0;
}

int main(void) 
{
TIMSK=0b01000001;
SREG=0b10000000;
DDRD=0xff;  
TCCR0=1;
while(1)
	{

PORTD |= _BV(PD0);
White();
PORTD &=~_BV(PD0);
White();
	}
}

Реклама
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Работа с таймерами и прерываниями в Mega8

Сообщение YS »

Так ясен пень, TOV0 это константа-номер бита, расположенного в TIFR.

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

//while(TCNT0<250){}
while(!(TOV0)){}
TOV0=0;
- дико.

Вот:

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

while (!(TIFR & (1<<TOV0)));
А присваивать в TOV0 вообще бессмысленно. Можно очистить этот бит:

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

TIFR&=~(1<<TOV0);
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Реклама
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Работа с таймерами и прерываниями в Mega8

Сообщение Мастер Ломастер »

YS писал(а): Можно очистить этот бит:

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

TIFR&=~(1<<TOV0);
очистка битов в регистре TIFR осуществляется ЗАПИСЬЮ ЕДИНИЦ в соответствующие биты, поэтому это неправильный код, правильно будет так: TIFR = (1<<TOV0);
битва с дураками проиграна, победители торжествуют. слава победителям!
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Работа с таймерами и прерываниями в Mega8

Сообщение king-live »

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

[b]while(!(TIFR & (1<<TOV0)))[/b]
Можете мне расписать по подробнее эту строчку? Мне нужно разбить эту строку на части на последовательность операции. Иначе не понятно, и буду опять возвращаться к теме. Спасибо.
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Работа с таймерами и прерываниями в Mega8

Сообщение king-live »

Код аппаратно, и программно не работает. После выхода из цикла программа начинает работать с самого начало.

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

#include <avr/io.h>
#define F_CPU 4000000UL
#include <avr/interrupt.h>


White()
{
TCNT0=0;
//while(TCNT0<250){}
while(!(TIFR & (1<<TOV0))){}
//TIFR=(1<<TOV0);
}

int main(void) 
{
TIMSK=0b01000001;
SREG=0b10000000;
DDRD=0xff;  
TCCR0=1;
while(1)
	{

PORTD |= _BV(PD0);
White();
PORTD &=~_BV(PD0);
White();
	}
}
Аватара пользователя
ibiza11
Поставщик валерьянки для Кота
Сообщения: 1900
Зарегистрирован: Сб фев 21, 2009 13:11:40
Откуда: Москва

Re: Работа с таймерами и прерываниями в Mega8

Сообщение ibiza11 »

YS писал(а):... - дико.
Если уж начали про дикости, то прошу заметить, что дикости начались с начала темы с проверки флага прерывания вместо написания обработчика прерывания.
Ставим плюсы: )
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Работа с таймерами и прерываниями в Mega8

Сообщение king-live »

Как правильно написать обработчик прерывания? Я ни разу не писал и это тема у меня первая с таймерами и прерываниями.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Работа с таймерами и прерываниями в Mega8

Сообщение YS »

После выхода из цикла программа начинает работать с самого начало.
Ибо Вы включили прерывание, и не описали обработчик. По умолчанию AVR-GCC генерирует код, перезагружающий МК при возникновении неописанного прерывания.
очистка битов в регистре TIFR осуществляется ЗАПИСЬЮ ЕДИНИЦ
Фу блин, точно. Тогда

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

TIFR|=(1<<TOV0);
Можете мне расписать по подробнее эту строчку?
Курите битовые операции.
Как правильно написать обработчик прерывания?

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

ISR (<vector>)
{
}
Названия векторов можно найти в документации. Например,

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

ISR (TIM0_COMPA_vect)
{
}
Разница между теорией и практикой на практике гораздо больше, чем в теории.
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Работа с таймерами и прерываниями в Mega8

Сообщение king-live »

спасибо, попробую поработать с обработчиком прерываний. А на счёт строчки я так понял while(!(TIFR & (1<<TOV0))) цикл работает пока TIFR не равно единице. Это правильно я понял?
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Работа с таймерами и прерываниями в Mega8

Сообщение YS »

А на счёт строчки я так понял while(!(TIFR & (1<<TOV0))) цикл работает пока TIFR не равно единице.
Именно.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Работа с таймерами и прерываниями в Mega8

Сообщение king-live »

А для чего нужно TIFR обнулять. Я так понял это происходит аппаратно. или только после вызова обработчика прерывания он может обнулиться?
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Работа с таймерами и прерываниями в Mega8

Сообщение Мастер Ломастер »

YS писал(а):Фу блин, точно. Тогда

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

TIFR|=(1<<TOV0);
так тоже можно, но по объему кода и скорости неоптимально. самый эффективный вариант я привел ранее.
битва с дураками проиграна, победители торжествуют. слава победителям!
Мастер Ломастер
Поставщик валерьянки для Кота
Сообщения: 1995
Зарегистрирован: Ср май 11, 2011 21:37:45
Откуда: Цветочный город
Контактная информация:

Re: Работа с таймерами и прерываниями в Mega8

Сообщение Мастер Ломастер »

king-live писал(а):А для чего нужно TIFR обнулять. Я так понял это происходит аппаратно. или только после вызова обработчика прерывания он может обнулиться?
обнулять его нужно, если вы его опрашиваете без работы с прерываниями - раз нет обработчика, некому аппаратно его сбрасывать, надо вручную.
битва с дураками проиграна, победители торжествуют. слава победителям!
king-live
Прорезались зубы
Сообщения: 238
Зарегистрирован: Сб янв 29, 2011 20:26:48

Re: Работа с таймерами и прерываниями в Mega8

Сообщение king-live »

Спасибо! Понял. осталось понять как вызывать прерывания.
Аватара пользователя
YS
Друг Кота
Сообщения: 7518
Зарегистрирован: Вс мар 29, 2009 22:09:05
Контактная информация:

Re: Работа с таймерами и прерываниями в Mega8

Сообщение YS »

так тоже можно, но по объему кода и скорости неоптимально.
Зато не затрагивает остальные биты.
Разница между теорией и практикой на практике гораздо больше, чем в теории.
Совесть
Встал на лапы
Сообщения: 106
Зарегистрирован: Пн мар 26, 2012 05:25:06

Re: Работа с таймерами и прерываниями в Mega8

Сообщение Совесть »

Мастер Ломастер писал(а):очистка битов в регистре TIFR осуществляется ЗАПИСЬЮ ЕДИНИЦ в соответствующие биты, поэтому это неправильный код, правильно будет так: TIFR = (1<<TOV0);
Это верно.
YS : Фу блин, точно. Тогда TIFR|=(1<<TOV0);
Мастер Ломастер: так тоже можно, но по объему кода и скорости неоптимально. самый эффективный вариант я привел ранее.
YS: Зато не затрагивает остальные биты.
Диалог опытных программистов :facepalm: Если сбрасываете конкретный флаг, ответ выше. А если хотите сбросить все активные флаги в данном регистре, то не мудрите, делайте проще

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

TIFR = TIFR;
Закрыто

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