roboforum.ru

Технический форум по робототехнике.

Нужный интервал для Таймера0 в Atmega8. Не могу установить

Программирование микроконтроллеров AVR, PIC, ARM.
Разработка и изготовление печатных плат для модулей.

Нужный интервал для Таймера0 в Atmega8. Не могу установить

Сообщение Flint » 18 янв 2009, 16:41

Помогите с установкой таймера в atmega8. Нужно сделать задержку в 8мс. И после каждого переполнения вывести в порт некое значение и опять запустить таймер для следующего отсчета, после чего все повторяется аналогично. Вывод в порт и повторный запуск таймера делаю в прерывании.
Имею: тактовая частота 4МГц,
ставлю коэффициент деления тактовой частоты для таймера 256 (TCCR0=0x04) должен получить частоту на выходе делителя 15625Гц (период 64мкс),
для этого периода в 8-ми милисекудах счетчик должен будет инкрементироваться 125 раз. Так как счетчик 8-ми битный - ставлю начальное значение == 3.
В результате всего получаю интервал 16мс. Что я делаю не так? Вот часть кода:

char step[]={0b00000001,0b00000100,0b00000010,0b00001000,0b00000000}; //то, что будет выводиться в порт по кругу
volatile int nstep=0;

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
TCNT0 = 3; //опять записать в регистр таймера число 3
SFIOR |= 1<<0; // Сброс предделителя
if (nstep == 5)
{
nstep=0;
};
PORTB = step[nstep] ;
++nstep;
}
void main(void)
{
TIMSK=0x01; // прерывание разрешено
SFIOR |= 1<<0; // Сброс предделителя
TCNT0 = 3; //записать в регистр таймера число 3
TCCR0=0x04; //start timer
}
Flint
 
Сообщения: 23
Зарегистрирован: 05 янв 2009, 01:48
прог. языки: Си

Re: Нужный интервал для Таймера0 в Atmega8. Не могу установить

Сообщение =DeaD= » 18 янв 2009, 16:45

Flint писал(а):для этого периода в 8-ми милисекудах счетчик должен будет инкрементироваться 125 раз. Так как счетчик 8-ми битный - ставлю начальное значение == 3.
В результате всего получаю интервал 16мс. Что я делаю не так?

А откуда 125 раз то взялось? Вроде 8-битный счетчик, значит 2^8=256 у него состояний? :)

Ставьте начальное значение не 3, а 255-125=130.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Нужный интервал для Таймера0 в Atmega8. Не могу установить

Сообщение avr123.nm.ru » 18 янв 2009, 18:12

Flint писал(а):после каждого переполнения вывести в порт некое значение и опять запустить таймер для следующего отсчета
Если точные интервалы нужны то счет не останавливайте, а просто обновите число в таймере, а потом делайте действия с портом.

Настройка таймера - http://avr123.nm.ru/z6.htm

Удобно смотреть как считает в симуляторе PROTEUS или VMLAB - сразу ясно что не так.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Нужный интервал для Таймера0 в Atmega8. Не могу установить

Сообщение Flint » 18 янв 2009, 18:50

Да уж, это я ступил. Не пойму откуда я эти 128 только взял? Да, по поводу счета - я так потом сделал - сначала записать в счетчик новое значение, чтоб он там аппаратно начал считать, а потом уже программно сделать то, что мне надо. Так что задержек между двумя запусками создаваться не будет. Тоько вопрос один остался - как по хорошему сделать - нужно ли в обработчике каждый раз сбрасывать предделитель или нет? А сбросить его только один раз - при первом старте, в main().

Добавлено спустя 1 минуту 54 секунды:
avr123.nm.ru, там то я и смотрел :)
Flint
 
Сообщения: 23
Зарегистрирован: 05 янв 2009, 01:48
прог. языки: Си

Re: Нужный интервал для Таймера0 в Atmega8. Не могу установить

Сообщение avr123.nm.ru » 18 янв 2009, 19:15

Flint писал(а):нужно ли в обработчике каждый раз сбрасывать предделитель или нет? А сбросить его только один раз - при первом старте, в main().

avr123.nm.ru, там то я и смотрел :)


Дак и делай как там - http://avr123.nm.ru/z6.htm
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Нужный интервал для Таймера0 в Atmega8. Не могу установить

Сообщение algol1 » 18 янв 2009, 21:07

avr123.nm.ru писал(а):
Flint писал(а):нужно ли в обработчике каждый раз сбрасывать предделитель или нет? А сбросить его только один раз - при первом старте, в main().

avr123.nm.ru, там то я и смотрел :)


Дак и делай как там - http://avr123.nm.ru/z6.htm


Когда требуется получить заданную частоту всегда лучше использовать режим таймера CTC (обнулить таймер при достижении таймером значения OCRx). Тогда не придется думать ни о чем, сколько нопов использовать, когда куда чего записывать... и частота вызова прерывания будет абсолютно точной (с точностью до присутствия в теле основного цикла программы команд CLI и SEI) :)
Т.е. это значительно проще.
монтаж печатных плат http://www.mplata.ru
algol1
 
Сообщения: 57
Зарегистрирован: 11 янв 2009, 21:09
Откуда: Москва
ФИО: Головлев Александр Александрович

Re: Нужный интервал для Таймера0 в Atmega8. Не могу установить

Сообщение avr123.nm.ru » 18 янв 2009, 21:25

algol1 писал(а):
avr123.nm.ru писал(а):Дак и делай как там - http://avr123.nm.ru/z6.htm

Когда требуется получить заданную частоту всегда лучше использовать режим таймера CTC (обнулить таймер при достижении таймером значения OCRx). Тогда не придется думать ни о чем, сколько нопов использовать, когда куда чего записывать... и частота вызова прерывания будет абсолютно точной (с точностью до присутствия в теле основного цикла программы команд CLI и SEI) :)

Т.е. это значительно проще.


Дак там по ссылке ЭТО ИМЕННО и написано !

Изображение
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Нужный интервал для Таймера0 в Atmega8. Не могу установить

Сообщение algol1 » 18 янв 2009, 21:29

Так это тааам. А это здесь :)
монтаж печатных плат http://www.mplata.ru
algol1
 
Сообщения: 57
Зарегистрирован: 11 янв 2009, 21:09
Откуда: Москва
ФИО: Головлев Александр Александрович

Re: Нужный интервал для Таймера0 в Atmega8. Не могу установить

Сообщение =DeaD= » 18 янв 2009, 21:30

2avr123: А между прочим мне подача информации от algol1 в конкретном и полезном виде больше нравится :P
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Нужный интервал для Таймера0 в Atmega8. Не могу установить

Сообщение avr123.nm.ru » 18 янв 2009, 22:01

=DeaD= писал(а):2avr123: А между прочим мне подача информации от algol1 в конкретном и полезном виде больше нравится :P
Отлично ! Больше инфы полезной и разной !

Просто когда у человека появится новый вопрос он может не ждать пока кто-то ответит, а просто взять и прочитать.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Нужный интервал для Таймера0 в Atmega8. Не могу установить

Сообщение =DeaD= » 18 янв 2009, 22:24

avr123.nm.ru писал(а):Просто когда у человека появится новый вопрос он может не ждать пока кто-то ответит, а просто взять и прочитать.

Бывает такая инфа, про которую не знаешь что вообще такой метод есть, вот в этих случая справочники как раз не помогают, потому что туда тупо не полезешь.
Проект [[Open Robotics]] - Универсальные модули для построения роботов
Аватара пользователя
=DeaD=
 
Сообщения: 24218
Зарегистрирован: 06 окт 2004, 18:01
Откуда: Ебург
прог. языки: C++ / PHP / 1C
ФИО: Антон Ботов

Re: Нужный интервал для Таймера0 в Atmega8. Не могу установить

Сообщение avr123.nm.ru » 18 янв 2009, 22:45

=DeaD= писал(а):Бывает такая инфа, про которую не знаешь что вообще такой метод есть, вот в этих случая справочники как раз не помогают, потому что туда тупо не полезешь.

Вот потому я и показал наглядно что ТАМ была инфа.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Нужный интервал для Таймера0 в Atmega8. Не могу установить

Сообщение Duhas » 18 янв 2009, 23:03

вся инфа котрую надо читать есть в ДШ.... и сайт ваш, авр, простите ужасен, имхо.... форум он для ощения скорее чем для обмена ссылками... ответом на первый пост могло бы быть: "128? хм, вообще то вешнина 8-ми битного счетчкиа 255.." и человек бы понял что просто затупил...
«Как сердцу выразить себя? … Мысль изреченная есть ложь!»
В этом мире меня подводит доброта и порядочность...
"двое смотрят в лужу, один видит лужу, другой отраженные в ней звезды"
Аватара пользователя
Duhas
 
Сообщения: 6338
Зарегистрирован: 15 сен 2007, 13:03
Откуда: Красноярск
прог. языки: ASM(МК), C(PC)
ФИО: Гагарский Андрей Александрович

Re: Нужный интервал для Таймера0 в Atmega8. Не могу установить

Сообщение avr123.nm.ru » 18 янв 2009, 23:31

Duhas писал(а):ответом на первый пост могло бы быть: "128? хм, вообще то вешнина 8-ми битного счетчкиа 255.." и человек бы понял что просто затупил...
Точно ! Ответы могут быть разными - ИМХО главное чтоб ответы помогали тому кому нужна помощь.
Аватара пользователя
avr123.nm.ru
отсылающий читать курс
 
Сообщения: 14195
Зарегистрирован: 06 ноя 2005, 04:18
Откуда: Москва
Предупреждения: -8

Re: Нужный интервал для Таймера0 в Atmega8. Не могу установить

Сообщение Flint » 19 янв 2009, 23:18

обнулить таймер при достижении таймером значения OCRx

Да, можно и так интервал выдержать. Точный интервал мне не принципиален, но буду знать на будущее как точный реализовать. Но как я понял, режим обнуления при достижении значения в этом контроллере для таймера 0 - нет. А есть в таймере 1. Таймер 0 выборал просто из-за более простой конфигурации. Но чувствую мне понадобится еще один таймер, так что тогда будет кстати и местами их поменять.
А между прочим мне подача информации от algol1

Это где, не подскажите? :)
Flint
 
Сообщения: 23
Зарегистрирован: 05 янв 2009, 01:48
прог. языки: Си

След.

Вернуться в Микроконтроллеры

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 15