roboforum.ru

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

Таймер 0 - расчет частоты прерывания

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

Таймер 0 - расчет частоты прерывания

Сообщение eugmai86 » 17 мар 2011, 00:35

Доброго времени суток. Будьте добры, объясните нубу как можно настроить 8ми битный таймер на частоту 38 кГц.
Смысл в следующем: есть ИК диод и ТСОП 4838, хочу сделать пульт на 4 кнопки чтоб управлять нагрузкой на другом контроллере. Пытаюсь мастером начального кода в CVAVR настроить таймер 0В для tiny13 по переполнению на частоту 38 кГц.
Для 16 битного таймера, на сколько я понимаю, нужно установить следующие значения:

Timer's 0 Clock value - 31250 кГц,
Timer value - 0,
Compare A - (31250/38000)*31250= 25699= 6463
(Если не прав то поправьте.) А вот на 8ми битный таймер чего то в голову мысли не лезут... Проблема в том, что я не могу подобрать значение Compare A не более 255.
Аватара пользователя
eugmai86
 
Сообщения: 22
Зарегистрирован: 10 фев 2011, 22:35

Re: Таймер 0 - расчет частоты прерывания

Сообщение avr123.nm.ru » 17 мар 2011, 02:27

eugmai86 писал(а):Доброго времени суток. Будьте добры, объясните нубу как можно настроить 8ми битный таймер на частоту 38 кГц.


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

Re: Таймер 0 - расчет частоты прерывания

Сообщение Radist » 17 мар 2011, 09:19

eugmai86 писал(а):Если не прав то поправьте


Конечно вы не правы. Объясню по простому. У вас есть МК, который работает на какой-то частоте. У вас она почему-то равна 31 МГц с копейками (сам я с этой тинькой не работал, поэтому утверждать что она на такой частоте работать не будет не могу - вдруг там PLL какой-нибудь). Ставьте нормальный кварц частотой 8 МГц, или внутренний генератор. 38 кГц - это 26 с копейками мкс. Зная длину такта переводим это время в такты. За период надо выходной бит изменить дважды, значит полученное число делим попалам. Теперь надо чтобы через это число тактов происходило прерывание по переполнению. А значит в таймер пишется число, равное максимум минус полученные ранее такты (от половины периода). При каждом вхождении в подпрограмму обработки прерывания надо инвертировать выходной бит и перезагружать таймер.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Таймер 0 - расчет частоты прерывания

Сообщение avr123.nm.ru » 17 мар 2011, 09:36

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

Re: Таймер 0 - расчет частоты прерывания

Сообщение boez » 17 мар 2011, 15:10

Щас некогда считать точные цифры, но вообще-то если в результате расчета получается больше, чем 255 - надо просто увеличивать прескалер и пересчитывать заново, пока не получится менее 255.

Добавлено спустя 7 минут 39 секунд:
А, да, а откуда такая частота странная - 31 МГц??? У нее разве не 20 максимму? Или это типа разогнанная тиня?
boez
 
Сообщения: 1981
Зарегистрирован: 27 авг 2008, 10:45
Откуда: Харьков
прог. языки: С/С++

Re: Таймер 0 - расчет частоты прерывания

Сообщение Michael_K » 17 мар 2011, 16:28

У каких-то тиней PLL-умножитель частоты на таймере.
По-моему даже до 64МГц у какой-то можно гонять...

Добавлено спустя 4 минуты 52 секунды:
Ага. У двадцать шестой.

Но у тринадцатой такого нет. Имхо, топикстартер точку поставить забыл.
Проц работает на 8МГц, а таймер переполняется с частотой 8M/256 = 31250
Аватара пользователя
Michael_K
 
Сообщения: 6028
Зарегистрирован: 07 окт 2009, 00:29
Откуда: СПб

Re: Таймер 0 - расчет частоты прерывания

Сообщение רגוזין רומאן » 17 мар 2011, 18:36

Код: Выделить всёРазвернуть
For generating a waveform output in CTC mode, the OC1A output can be set to toggle
its logical level on each compare match by setting the compare output mode bits to
toggle mode (COM1A1:0 = 1). The OC1A value will not be visible on the port pin unless
the data direction for the pin is set to output (DDR_OC1A = 1). The waveform generated
will have a maximum frequency of fOC1A = fclk_I/O/2 when OCR1A is set to zero (0x0000).
The waveform frequency is defined by the following equation:

Toggle mode and Phase and Frequency Correct PWM Mode:
LaTeX: OCRnA=\left(\frac{fclk_I/O}{OCRnA*N*2}\right)-1
Just:
LaTeX: OCRnA=\left(\frac{fclk_I/O}{OCRnA*N}\right)-1
רגוזין רומאן
 

Re: Таймер 0 - расчет частоты прерывания

Сообщение eugmai86 » 17 мар 2011, 19:06

сори, частота не 31 мГц, запятую пропустил это 31,250 кГц полученные после деления тактовой частоты МК 4,0 мгц. на 128.

Добавлено спустя 29 минут 36 секунд:
Спасибо, вроде разобрался.
Задаю частоту МК от внутреннего генератора, например 4,8 МГц(для тини 13 эта частота выставляется фьюзами)
В настройках таймера задаю делитель этой частоты 1. Теперь,
fOCnx=(fclk_I/O)/(2 ⋅ N ⋅(1 + OCRnx))
fOCnx=38кГц; - необходимая частота
fclk_I/O=4,8 МГц частота МК от внутреннего генератора, она же частота таймера деленная на N;
N - делитель частоты МК для получения частоты таймера(в моем случае 1)
OCRnx - нужно найти, т.е. неизвесная

OCRnx=((fclk_I/O)/(fOCnx ⋅ 2 ⋅ N))-1=4800кГц/(38кГц*2)-1=62

Если все правильно то 62 (или 3Е в хекс) и есть искомое значение Compare A. Кому не лень проверьте плиз.

Добавлено спустя 1 час 27 минут 45 секунд:
и еще, на сколько я понял, таймер переполняется при значении 256, поэтому в Compare A нужно записать 256-62= 194
Аватара пользователя
eugmai86
 
Сообщения: 22
Зарегистрирован: 10 фев 2011, 22:35

Re: Таймер 0 - расчет частоты прерывания

Сообщение Radist » 18 мар 2011, 07:45

Нет, одно дело если вы работаете через прерывания по переполнению, и совсем другое когда работаете через прерывание по совпадению. В настройках таймера настраиваем переключение ноги по совпадению, а также сброс таймера по совпадению (CTC). Так что в регистр сравнения надо писать именно 62.
Аватара пользователя
Radist
 
Сообщения: 2253
Зарегистрирован: 01 июл 2009, 08:59
Откуда: Екатеринбург
прог. языки: асемблер AVR

Re: Таймер 0 - расчет частоты прерывания

Сообщение eugmai86 » 18 мар 2011, 17:11

спасибо, долго не мог сообразить что не так)
Аватара пользователя
eugmai86
 
Сообщения: 22
Зарегистрирован: 10 фев 2011, 22:35


Вернуться в Новичкам или основы основ роботостроения.

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

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