roboforum.ru

Технический форум по робототехнике.
Текущее время: 30 ноя 2024, 20:35

Часовой пояс: UTC + 4 часа




Начать новую тему Ответить на тему  [ Сообщений: 10 ] 
Автор Сообщение
 Заголовок сообщения: Таймер 0 - расчет частоты прерывания
СообщениеДобавлено: 17 мар 2011, 00:35 
Не в сети
Аватара пользователя

Зарегистрирован: 10 фев 2011, 22:35
Сообщения: 22
Доброго времени суток. Будьте добры, объясните нубу как можно настроить 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.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер 0 - расчет частоты прерывания
СообщениеДобавлено: 17 мар 2011, 02:27 
Не в сети
отсылающий читать курс
Аватара пользователя

Зарегистрирован: 06 ноя 2005, 04:18
Сообщения: 14195
Откуда: Москва
eugmai86 писал(а):
Доброго времени суток. Будьте добры, объясните нубу как можно настроить 8ми битный таймер на частоту 38 кГц.


Рекомендую использовать мастер конфигурации встроенный в компилятор - http://proavr.narod.ru/z6.htm

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер 0 - расчет частоты прерывания
СообщениеДобавлено: 17 мар 2011, 09:19 
Не в сети
Аватара пользователя

Зарегистрирован: 01 июл 2009, 08:59
Сообщения: 2254
Откуда: Екатеринбург
прог. языки: асемблер AVR
eugmai86 писал(а):
Если не прав то поправьте


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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер 0 - расчет частоты прерывания
СообщениеДобавлено: 17 мар 2011, 09:36 
Не в сети
отсылающий читать курс
Аватара пользователя

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

_________________
Читайте !


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер 0 - расчет частоты прерывания
СообщениеДобавлено: 17 мар 2011, 15:10 
Не в сети

Зарегистрирован: 27 авг 2008, 10:45
Сообщения: 1981
Откуда: Харьков
прог. языки: С/С++
Щас некогда считать точные цифры, но вообще-то если в результате расчета получается больше, чем 255 - надо просто увеличивать прескалер и пересчитывать заново, пока не получится менее 255.

Добавлено спустя 7 минут 39 секунд:
А, да, а откуда такая частота странная - 31 МГц??? У нее разве не 20 максимму? Или это типа разогнанная тиня?


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер 0 - расчет частоты прерывания
СообщениеДобавлено: 17 мар 2011, 16:28 
Не в сети
Аватара пользователя

Зарегистрирован: 07 окт 2009, 00:29
Сообщения: 6028
Откуда: СПб
У каких-то тиней PLL-умножитель частоты на таймере.
По-моему даже до 64МГц у какой-то можно гонять...

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

Но у тринадцатой такого нет. Имхо, топикстартер точку поставить забыл.
Проц работает на 8МГц, а таймер переполняется с частотой 8M/256 = 31250


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: 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 - расчет частоты прерывания
СообщениеДобавлено: 17 мар 2011, 19:06 
Не в сети
Аватара пользователя

Зарегистрирован: 10 фев 2011, 22:35
Сообщения: 22
сори, частота не 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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер 0 - расчет частоты прерывания
СообщениеДобавлено: 18 мар 2011, 07:45 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Таймер 0 - расчет частоты прерывания
СообщениеДобавлено: 18 мар 2011, 17:11 
Не в сети
Аватара пользователя

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


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 10 ] 

Часовой пояс: UTC + 4 часа


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

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


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
Powered by phpBB © 2000, 2002, 2005, 2007 phpBB Group
Русская поддержка phpBB
phpBB SEO