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

Обсуждаем контроллеры компании Atmel.
Ответить
Прорезались зубы
Аватара пользователя
Сообщения: 243
Зарегистрирован: Пт фев 26, 2010 03:33:02
Откуда: Донецк

Сообщение pazak »

Студии 3.21 и 4.19 отрабатывают чётко активный перепад на PIND6 (ICP1) независимо от настройки этой лапы.
Стоит студия 4.19, если не трудно, объясните пожалуйста как это сделать.
В режиме захвата модуль ICP1 и не должен этого делать.
А хотелось бы очень :))
Опишу что я ваяю, пишу тахометр на маленький токарник (для себя). Можно в нете найти подобные устройства и не париться, но ИМХО, нет лучше способа изучить МК и научиться писАть для него программы, как сделать реальный проект самому :kill: Да и серому веществу нельзя давать залёживаться. Логика программы проста, при включении питания считаем импульсы с датчика за определённое время, переводим их в об/м, если больше 60 об считаем дальше, если меньше - измеряем период, переводим в об/м и естественно всё это выводим на 4Х7 светодиодный индикатор, период опроса каким способом считать будет около 3 сек. Как то так, на сегодня реализована динамическая индикация на TIM0 и он-же отсчитывает измерительный интервал, пока на индикатор выводится бегущая строка 0,1,2,3;1,2,3,4;... и т.д. Теперь нужно организовать на TIM1 измерение периода импульсов, ну раз TIM1 не сбрасывается аппаратно попробую сделать это программно, или повесить датчик на INT0 или INT1 и в прерывании запускать TIM1, а в следующем останавливать и считывать результат.

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

Сообщение akl »

нет лучше способа изучить МК и научиться писАть для него программы, как сделать реальный проект самому
Похвально. Чтобы Вам не проходить длинный путь создания тахометра посмотрите эту старую веточку. Задача, включая динамическую индикацию, решается на одном таймере Т1.
ICP1_до прихода импульса.GIF
ICP1_после прихода импульса.GIF
Последний раз редактировалось akl Пн янв 12, 2015 15:43:42, всего редактировалось 1 раз.
Реклама
Прорезались зубы
Аватара пользователя
Сообщения: 243
Зарегистрирован: Пт фев 26, 2010 03:33:02
Откуда: Донецк

Сообщение pazak »

Большое спасибо за ссылочку, очень пригодится.

С уважением.
Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Сообщение alexan9er »

Уважаемые коты, мучаюсь с асинхронным таймером на часовом кварце.
МК atmega328p-pu, у него ноги XTAL и TOSC совмещены, т.е. как я понимаю у него нет оптимизированных ног под чвсовой кварц.
В интирнетах я читаю что все подключают часовой кварц чуть ли вообще без нагрузочных конденсаторов, а у меня даже со всякими подборами-переборами и высчитываниями правильных емкостей кварц отстаёт в итоге на 6 секунд в минуту. Причём заставить его тикать быстрее не получается изменением емкостей в большую или меньшую сторону - только медленнее в обоих вариантах.
Паузу в секунду после включения выдерживаю.
Инициализацию таймера (сброс флагов) жду.
Куда дальше копать? У всех ошибка максимум пара секунд в день а у меня 6 секунд в минуту :shock:
Схему собрал на макетке без пайки (такая в которую втыкаются проводки), она может на него так влиять?
Кварцы менять пробовал, результат тот же.
В чём ещё можно искать причину?
Реклама
Эиком - электронные компоненты и радиодетали
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

alexan9er писал(а):кварц отстаёт в итоге на 6 секунд в минуту. Причём заставить его тикать быстрее не получается изменением емкостей в большую или меньшую сторону - только медленнее в обоих вариантах.
Это вы частотомером его, извините за тавтологию, частоту генерации измеряли?
все подключают часовой кварц чуть ли вообще без нагрузочных конденсаторов
В Мегах где отдельные ноги под часовой кварц, насколько я знаю, кондёры подключаются в самом МК.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Реклама
Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Сообщение alexan9er »

Нет, измерение частоты косвенное - у меня часы которые я делаю отстают :)
Возможно конечно надо попробовать упросить всё чтобы быть увереным что это именно кварц тупит а не я так напрограммировал...

Сделано так:
1. таймер 2 генерит прерывание каждые 1/2 секунды и поднимает флаг
2. таймер 1 занимается динамической индикацией
3. таймер 0 опрашивает кнопки и поднимает флаги их нажатости
3. основной цикл обрабатывает флаг таймера 2 и пересчитывает отображаемые цифры, после чего сбрасывает флаги. Также обрабатывает флаги нажатий кнопок.
Реклама
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18687
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

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

Мой уютный бложик... заходите!
Контактная информация:
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Так и знал что это быдлокод, а кварц ни при чём.
Вы какие кварцы и какой предделитель ставили?
Кстати да, у других Мег на низкочастотном генераторе подключаются встроенные кондёры 36 пФ, и внешние можно не ставить.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

По мне, часы с использованием "часового" кварца, подключенного к Т2 в асинхронном режиме делаются без использования других таймеров. В этом камне заложены аж 3 прерывания от Т2.
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Так у 328 нету ног чтобы подключить часовой кварц. Или заставить МК лагать на 32 кГц? :)))
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

Встроенный RC-генератор ведь есть.
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

Вот топикстартеру и решение. :)
Только из-за быдлокода наверное всё равно будет отставать :)))
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Сообщение alexan9er »

Gudd-Head, gоясните своё отношение к коду. Как правильнее спроектировать на ваш взгляд? Кварц 32768 Гц, предделитель 64, прерывание по переполнению.

Akl, я хочу использовать именно часовой кварц для отсчёта времени. Почему использовать три прерывания от одного таймера лучше? Я рассуждал так - встроенный генератор быстрее и он точно успеет всё сделать что мне нужно, а часовой медленный, будет только флаги выставлять.
Друг Кота
Аватара пользователя
Сообщения: 20093
Зарегистрирован: Чт сен 18, 2008 12:27:21
Откуда: Столица Мира Санкт-Петербург

Сообщение Gudd-Head »

alexan9er писал(а):Gudd-Head, gоясните своё отношение к коду.
Поставить внешнюю микросхему часов :)
Зачем изобретать то, что уже сделано? С календарём, учётом високосных дней и микропотреблением.
[ Всё дело не столько в вашей глупости, сколько в моей гениальности ] [ Правильно заданный вопрос содержит в себе половину ответа ]
Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Сообщение alexan9er »

Вы серьёзно?
Я для самообучения делаю, а не потому что мне нужны часы.
Если у вас есть объяснение отставания то я буду рад их услышать.
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18687
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

alexan9er писал(а):Если у вас есть объяснение отставания то я буду рад их услышать.
чтобы получить объяснения, вам нужно, как минимум, показать свой код и рассказать о выбранном способе тактирования ядра МК. а по рассказам о больном только Кашпировский диагнозы ставит.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Сообщение alexan9er »

Код пока выложить не могу, он дома.
По реакции на форуме я понял что спроектировано всё неправильно, вот это мнение меня и интересует. Как по мнению более опытных товарищей будет правильно.
И однако для того чтобы обозвать всё дело быдлокодом самого кода не потребовалось :)
ARV
Ум, честь и совесть. И скромность.
Аватара пользователя
Сообщения: 18687
Зарегистрирован: Чт дек 28, 2006 08:19:56
Откуда: Новочеркасск

Сообщение ARV »

не претендуя на абсолютную непогрешимость, выскажу свое мнение о том, как следует делать часы.
1. TIMER2 запускается в асинхронном режиме и настраивается на прерывания 1 раз всекунду
2. по прерыванию в обработчике ведется счет времени в volatile-переменных для секунд, минут, часов и т.д.
3. ядро тактируется от источника с частотой минимум в 4 раза большей, чем TIMER2 (допустим, от встроенного RC-генератора 8 МГц)
4. в главном цикле по мере необходимости переменные с показаниями часов выводятся куда надо, остальные ресурсы используются по необходимости, как обычно.
если рассматривать человека снизу, покажется, что мозг у него глубоко в жопе
при взгляде на многих сверху ничего не меняется...

Мой уютный бложик... заходите!
Контактная информация:
Открыл глаза
Аватара пользователя
Сообщения: 54
Зарегистрирован: Пт окт 03, 2014 14:41:16

Сообщение alexan9er »

У меня в общем так и сделано.
Ядро тактируется от встроенного генератора 8 МГц.
Я не стал время считать в самом прерывании от TIMER2, т.к. когда тыкал кнопку изменения времени и обрабатывал её в основном цикле то обработчик TIMER2 возвращал старые значения. В Си это дело возможно бы разрулил компилятор, но я пишу на Асме и никаких переменных у меня там нет, поэтому получалось что обработчик TIMER2 считал байт например с секундами и начал его инкрементировать, чтобы потом записать обратно, а основной цикл его за это время уже успел считать, изменить и записать обратно. Тут обработчик TIMER2 записывает в него вычисленное значение, которое уже устарело.
Поэтому я решил в обработчике просто устанавливать флаг что секунда прошла, а всё считать в основном цикле.
Надо попробовать забить на кнопки и посмотреть будет ли считать время точнее обработчик TIMER2, если так, то у меня там где-то есть ошибка.
Ну и динамическая индикация у меня не в основном цикле а в прерывании TIMER1 делается.
akl
Друг Кота
Сообщения: 4450
Зарегистрирован: Пт мар 07, 2008 06:54:43
Откуда: Ижевск

Сообщение akl »

alexan9er
Попробуйте перевести контроллер в режим POWER SAVE и разрешенными прерываниями OVER_T2, COMPA_T2. Таймер запустите без предделителя с полным размахом. Каждые 64 такта (1953,125мкс) по прерыванию сравнения меняете индикацию и наращиваете этот же регистр сравнения на 64. В каждом прерывании по переполнению наращиваете программный счётчик до совпадения с числом 64, что произойдёт через каждые 500000мкс. Фишка состоит в том, что прерывания обрабатываются с частотой встроенного RC-генератора. Всё остальное время камень находится в SLEEP'е. Таймер не останавливайте.
Ответить

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