Таймеры/счётчики в AVR

Обсуждаем контроллеры компании Atmel.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

artemik32 писал(а):Что не правильно?
Сравните

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

OCR1AH=0x0F;   // число сравнения
OCR1AL=0x9E;   

TIMSK=0x40;     // разрешение прерывания по совпадению канала А
TIFR=0x40;     // сброс флага OCF1A

TCCR1A=0x00;
TCCR1B=0x09;   // старт таймера в режиме Fcpu/1 с автосбросом по совпадению (СТС)
...
#asm("sei")    // разрешаем глобальные прерывания
Реклама
Аватара пользователя
artemik32
Встал на лапы
Сообщения: 121
Зарегистрирован: Пт сен 04, 2015 13:10:49
Откуда: г. Ижевск

Re: Таймеры/счётчики в AVR

Сообщение artemik32 »

Да обнуление TIFR помогло, спасибо большое. Только его надо ставить перед самым разрешением глобальных прерываний, а то он снова успеет установиться. Я сначала не понял о каких флагах идет речь, думал о своих :) . А флаги TIFR думал не на что не влияют, только для индикации какого то события.
Истина где-то рядом...
Реклама
Аватара пользователя
COKPOWEHEU
Говорящий с текстолитом
Сообщения: 1525
Зарегистрирован: Чт июн 10, 2010 20:11:19

Re: Таймеры/счётчики в AVR

Сообщение COKPOWEHEU »

Ага, для индикации события "условие прерывания выполнено, можно обрабатывать", когда это прерывание будет разрешено глобально (бит I регистра SREG) и локально (в данном случае регистр TIMSK, для другой переферии - другие) будет вызван его обработчик и флаг снимется аппаратно.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Таймеры/счётчики в AVR

Сообщение СКАЗОЧНИК »

Простите, но у меня очередной глупый вопрос. :oops:
Хочу в новом устройстве использовать Тини13, т.к. его ресурсов для него более, чем достаточно. Но, к сожалению в ней нет 16 битного таймера. :(
Мне надо сделать что-то типа периодометра. А максимальное значение периода может быть в 1,44 секунды.
Я посчитал, если использовать тактовую частоту Тини13 в 128 кГц, то при делителе на 1024 у меня получится, что таймер переполнится через 2,048 сек. Что мне вполне подходит.
Однако, другой вопрос. Это устройство должно уметь управлять двумя нагрузками, иметь одну или две кнопки и уметь сохранять три значения периодов (разных) в ЕЕPROM.
Вроде получается, что один такт процессорного времени будет длится 7,812 мкс, т.е. достаточно быстро и мне его тоже на все хватит.
Точно? Нигде я не накосячил? какие подводные камни я еще не знаю?
Станислав
Реклама
Эиком - электронные компоненты и радиодетали
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Таймеры/счётчики в AVR

Сообщение Z_h_e »

Вряд ли хорошей идеей будет использовать генератор 128кГц.
The frequency depends on supply voltage, temperature and batch variations.
А 8-битный счетчик легко превращается в дохренабитный, если в регистрах или ОЗУ считать количество переполнений, это ж не много займет программных ресурсов МК.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Реклама
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Таймеры/счётчики в AVR

Сообщение СКАЗОЧНИК »

Просто мне не удобно записывать в память еще и количество переполнений... ((( Хотел просто обойтись одним диапазоном таймера. :dont_know: Ну и прям очень точно мне тоже не шибко надо мерить... Плюс-минус километр нормально. )))

Хочу мерить период следования импульсов на Тойотовский спидометр... А там, на сколько мне удалось найти информацию 2500 импульсов на километр, а это значит что 1 км/ч = 0,708 имп/сек. или 1,14 сек/имп. Т.е. самое большой период будет где-то в1,41-1,44 сек между импульсами. Ниже мне не надо.
Последний раз редактировалось СКАЗОЧНИК Вс мар 27, 2016 22:03:47, всего редактировалось 1 раз.
Станислав
Реклама
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Таймеры/счётчики в AVR

Сообщение Z_h_e »

Ну может и хватит точности, я не знаю насколько плавает генератор 128кГц. Если держать точно питание и температуру, то может и не так страшно. Опять внешнее тактирование никто не отменял.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Таймеры/счётчики в AVR

Сообщение СКАЗОЧНИК »

А в EEPROM никак не измениться запись? Или она дольше станет? Она по тактам или по своему времени?

З.Ы. Простите, если не по теме и если это есть в даташите...

З.З.Ы. Температура точно не получится стабильной. Она будет скакать в больших приделах (от уличной погоды). А напряжение питания через стабилизатор LM1117-5.0 В. (или КРЕНка)
Станислав
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

Режим записи в EEPROM от тактирования не зависит
EEPROM_TN13.PNG
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Таймеры/счётчики в AVR

Сообщение Z_h_e »

Не совсем не зависит. Вот выдержка из даташит про регистр OSCCAL
The calibrated Oscillator is used to time EEPROM and Flash access. If EEPROM or Flash is
written, do not calibrate to more than 10%above the nominal frequency. Otherwise, the
EEPROM or Flash write may fail. Note that the Oscillator is intended for calibration to 9.6 MHz or
4.8 MHz. Tuning to other values is not guaranteed, as indicated in Table 6-7below.
Но про 128кГц ничего не нашел.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

OSCCAL трогает генератор 4,8/9,6МГц, а СКАЗОЧНИК, видимо, работает от Internal 128 kHz Oscillator
The 128 kHz internal Oscillator is a low power Oscillator providing a clock of 128 kHz. The fre-
quency depends on supply voltage, temperature and batch variations. This clock may be select
as the system clock by programming the CKSEL fuses to “11”.
Правда, как и Вы писали, лучше измерять период в тиках таймера, работающего от Fo=128000Гц. Например, для данного случая выражение для скорости будет S[км/час]=3600/2500*Fo*Nx/nox. Если измерять один период Nx, выражение упрощается до S[км/час]=184320/nox, где
Fo-частота генератора, Гц
Nx-целое число периодов измеряемого параметра за время измерения.
nox-число периодов Fo за время Nx
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Таймеры/счётчики в AVR

Сообщение СКАЗОЧНИК »

akl писал(а):СКАЗОЧНИК, видимо, работает от Internal 128 kHz Oscillator
Еще пока не работаю... Пока взвешиваю, стоит или нет использовать. ведь обычно пытаются увеличить частоту, чтобы было больше операций в секунду, а у меня задача чуть другая, хотя количество операций не хотелось бы урезать. :)

Второй момент, именно саму скорость мне не нужно уточнять. Это не спидометр (то что я хочу сотворить). Спидометр есть штатный и наглядный. Мне же надо всего лишь привязать к штатной скорости время периода между импульсами с датчика скорости. И его запомнить.

Задача стоит вообще простая. Нужно определить, что транспортное средство двигается с определенной скоростью (например +-15 км/ч), т.е. период примерно такой между импульсами и если все так, то... включить противотуманные фары. А если едем 5 км/ч, то выключить их. Аналогично и со вторым ближним светом. Один включен всегда, а второй включается дополнительно, когда разогнались до 40 км/ч. В городе второй ближний свет не сильно нужен, а лампы ксеноновые будут экономиться. ) Также и с туманками. По поводу выбора ламп - это не мой вопрос. ))) {В данной теме вопрос света не обсуждается}

И чтобы устройству не надо было вычислять с какой скоростью двигается автомобиль (а они разные бывают), то надо сделать его обучаемым один раз при установке. Т.е. едешь со скоростью 5 км/ч, нажал кнопочку и запомнилось значение в памяти, когда надо выключать и т.д.
Станислав
akl
Друг Кота
Сообщения: 4445
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Re: Таймеры/счётчики в AVR

Сообщение akl »

Зачем нужно обучение, когда можно сразу занести в память пороговые значения, включая гистерезис.
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Таймеры/счётчики в AVR

Сообщение Z_h_e »

akl писал(а):OSCCAL трогает генератор 4,8/9,6МГц, а СКАЗОЧНИК, видимо, работает от Internal 128 kHz Oscillator
Конечно я понял это. По всей видимости генератор 4,8/9,6МГц все равно остается включенным для тактирования EEPROM, даже если стоят фузы 128кГц. Вот этой инфы я и не нашел..
СКАЗОЧНИК писал(а):Просто мне не удобно записывать в память еще и количество переполнений...
А что же там неудобного? Выделяете регистр для этого дела, их слава богу аж 32 и делаете инкремент его при каждом переполнении.

Еще есть вариант, это преобразовать частоту в напряжение и его измерять АЦП. Может для Вашей точности RC цепочки хватит.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Таймеры/счётчики в AVR

Сообщение СКАЗОЧНИК »

akl писал(а):Зачем нужно обучение, когда можно сразу занести в память пороговые значения
Z_h_e писал(а):вариант, это преобразовать частоту в напряжение и его измерять АЦП
Не совсем варианты. Первый боюсь не подойдет тем, что я не знаю изначально сколько импульсов на сколько км/ч. поэтому надо будет сначала это на машине замерить, а потом внести в программу. А в другой машине может быть по другому, поэтому уже придется снова менять прошивку...
А второй вариант, тоже над ним думал, надо тоже сесть, проехать и замерить диапазон напряжений и привязать его к скорости. Думаю, что он будет совсем небольшим, а питание в бортовой сети скачет (зависит от заведен/заглушен, и от качества генератора и т.д.).
Поэтому остановился пока на измерении периода. :dont_know:
Станислав
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Таймеры/счётчики в AVR

Сообщение Z_h_e »

Преобразователь в напряжение я бы тоже не стал делать, так, как вариант. Но его сделать не должно быть сложно, даже с нестабильным напряжением. Просто не к чему.

Я бы вот как сделал, наверное.
1. Тактовая частота максимальная.
2. Выделил бы регистр (ы) счета переполнения таймера и другие которые не трогаются в основном теле программы и других местах.
3. В обработчике прерывания переполнения таймера
- сохранить статус в спец регистр
- инкрементировал регистр(ы)
- восстановить статус.
4 В обработчике внешнего прерывания по фронту ну или по спаду
- считать в регистр флаг переполнения таймера (вдруг возник одновременно с внешним)
- считать значение таймера0
- сбросить таймер0 (для этого нужно держать регистр с нулевым значением)
- сбросить старшие регистры-счетчики
- сохранить статус и прочие регистры
- если есть флаг переполнения, сбросить его, инкрементировать регистры
- перекинуть данные счетчика в любую удобную память, лучше регистры если есть свободные, а должны быть. Т.е. по сути сохранить значение периода
- восстановить статус и регистры

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

Т.е. таким способом организовать режим захват для таймера, как я понял у 13 его нет аппаратного. Может конечно где затупил, но это нормально для неотлизанного алгоритма.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Таймеры/счётчики в AVR

Сообщение СКАЗОЧНИК »

Хм... Вот сижу и думаю по поводу переполнений таймера. Сейчас посчитаю посижу, может что в голову и взбредет. По захвату копаю даташит. Но, думаю, что это тоже не сильно надо. Есть прерывания внешние простые. Если при сработке останавливать (сбрасывать) таймер, сохранив натиканное значение, то это мне и нужно. Вроде как проще думал...
В любом случае по результатам отпишусь, или тему создам, выложу исходники. может кому надо будет. )))
Станислав
Аватара пользователя
Z_h_e
Собутыльник Кота
Сообщения: 2708
Зарегистрирован: Сб май 14, 2011 21:16:04
Откуда: г. Чайковский

Re: Таймеры/счётчики в AVR

Сообщение Z_h_e »

Да, не написал. Внешние прерывания инициируются как раз датчиком скорости, но Вы конечно поняли и так.
Изображение
Добро всегда побеждает зло. Поэтому кто победил - тот и добрый.
Аватара пользователя
Jman
Мучитель микросхем
Сообщения: 414
Зарегистрирован: Ср янв 26, 2011 13:43:30
Откуда: С того берега моря
Контактная информация:

Re: Таймеры/счётчики в AVR

Сообщение Jman »

Всем привет. Имею Аттини13А, таймер ноль и формулу TCNT0 = (256 - T/clkТ0), где clkТ0 — частота тактирования таймера/счётчика0. Как мне тикать примерно раз в секунду. Частота = 4800000, делитель 256. 4800000/256 = 18.750кГц. 1/18.750кГц = 0.0000533 сек. И как дальше? 256 - что? секунды, герцы? килогерцы? И если я использую переполнение, что записать в TCNT0? И если я использую COMP, что писать в TCNT0? Никак не могу понять, как эти таймеры считать. Помогите, по каким формулам считать и что подставлять. спасибо.
PS: В пристежке скрин АВРкальк, там понятно только частота и прескаллер. TCNT показывает 228 это верно?
Вложения
Screenshot_1.png
(32.67 КБ) 212 скачиваний
[color=#4080FF]- Бежит этот подлец-электрон, а вокруг его масса (аж 10 в 23й) штук ионов кремния и 10 в 15й ионов примеси и он, подлец, взаимодействует![/color]
Аватара пользователя
СКАЗОЧНИК
Идёт направо - песнь заводит, Налево - сказку говорит.
Сообщения: 5000
Зарегистрирован: Чт апр 21, 2011 17:55:50
Откуда: Иркутск

Re: Таймеры/счётчики в AVR

Сообщение СКАЗОЧНИК »

Я уже где-то отвечал на такой же вопрос. Суть в том, чтобы вообще понимать что такое таймер и как его считать без формул. ))))
http://radiokot.ru/forum/viewtopic.php? ... 8#p2717558

Один из критериев это частота ядра. Она у вас 4,8 МГц. Или 4800000 Гц. Правильно?
Теперь у вас предделитель таймера выставляется. Его можно поставить 8, 64, 256, 1024... (выставляется в регистрах настройки таймера и биты эти в регистрах называются CS см. даташит).
Пусть вы выбрали предделитель на 256. Тогда ваша частота тактирования МК будет делиться на 256, т.е. 4800000 / 256 = 18750 Гц. С такой частотой будет считать таймер. А сам процессор у МК будет считать с частотой 4,8 МГц. Потому что таймер - это периферия МК и работает сам по себе. Что значит эта частота? А то, что таймер будет прибавлять по единичке в свой счетный регистр с частотй 18750 Гц. Ну или если вычислить период, то по формуле периода Т=1/f получим 1 / 18750 = 0,000053333 сек. Т.е. один "тик,щелчек" таймера будет происходить со скоростью 0,000053333 сек, что тоже самое 0,053 мс, что тоже самое 53 мкс.
Теперь дальше. Контроллер у нас 8 битный. И таймер 0 тоже восьмибитный. Значит счетный регистр у него может считать только от 0 до 255 (всего 256). Поэтому ваши 256 это всего лишь число до которого может считать таймер и переполнится (сбросится в ноль и начнет по кругу).
Простой математикой получаем, что таймер досчитает до 256 за (256 * 0,000053333) 0,013653 секунды.
Если вы используете переполнение, то до одной секунды в никак не досчитаете, а если используете режим "совпадения со счетным регистром", то тем более или также. )))
И даже если сменить предделитель на самый большой, все равно будет переполняться быстрее, чем за 1 секунду.
Чтобы тикать так, то вам в прерывании по переполнению надо будет заводить еще одну переменную и ее заполнять каждое прерывание по 1 значению (прибавлять). И уже ее считать, когда будет 1 секунда.

З.Ы. В регистр сравнения записывается число с которым счетный регистр таймера сравнивает свое текущее значение. И если сравнение произошло, то вызывает соответствующее прерывание и сбрасывается в ноль, потом продолжает считать по новому кругу.
Здесь же надо смотреть режим работы таймера, т.к. может и не сбрасываться, а считать в другую сторону, все зависит от режима работы таймера... (см. даташиты)...
Станислав
Ответить

Вернуться в «AVR»