Как создать высокоточный секундомер на базе микроконтроллера ATtiny2313. Какие компоненты потребуются для сборки устройства. Каковы основные этапы программирования микроконтроллера для реализации функций секундомера. Как обеспечить точность измерения времени до сотых долей секунды.
Особенности микроконтроллера ATtiny2313 для создания секундомера
ATtiny2313 — это 8-битный микроконтроллер семейства AVR от компании Atmel, обладающий рядом характеристик, делающих его отличным выбором для создания секундомера:
- Низкое энергопотребление — идеально для портативных устройств
- Встроенный RC-генератор на 1 МГц — не требует внешнего кварца
- 16-битный таймер/счетчик — позволяет точно отмерять временные интервалы
- 18 программируемых линий ввода/вывода — достаточно для подключения дисплея и кнопок
- 1 КБ флэш-памяти программ — хватает для размещения кода секундомера
- 128 байт SRAM и 128 байт EEPROM — для хранения переменных и настроек
Такой набор характеристик позволяет реализовать все необходимые функции секундомера в компактном корпусе при минимальном энергопотреблении.
Принципиальная схема секундомера на ATtiny2313
Рассмотрим основные компоненты принципиальной схемы секундомера:
- Микроконтроллер ATtiny2313 — управляющий элемент устройства
- Четырехразрядный семисегментный LED-дисплей — для отображения времени
- Кнопки управления — старт/стоп, сброс, настройка
- Резисторы и конденсаторы — обвязка микроконтроллера
- Стабилизатор напряжения — для питания схемы от батареи
Дисплей подключается к портам микроконтроллера через токоограничивающие резисторы. Кнопки соединяются с входами МК через подтягивающие резисторы. Питание осуществляется от батареи через стабилизатор напряжения 5В.
Программирование микроконтроллера ATtiny2313 для работы секундомера
Основные этапы разработки программного обеспечения для секундомера включают:
- Инициализация портов ввода/вывода для работы с дисплеем и кнопками
- Настройка таймера для точного отсчета временных интервалов
- Реализация функций запуска, остановки и сброса отсчета времени
- Алгоритм динамической индикации для управления дисплеем
- Обработка нажатий кнопок в прерываниях
Программирование осуществляется на языке Си или ассемблере с использованием соответствующих средств разработки для микроконтроллеров AVR.
Реализация точного отсчета времени в секундомере
Для обеспечения высокой точности измерения времени в секундомере используется следующий подход:
- Таймер микроконтроллера настраивается на генерацию прерывания каждую 1 мс
- В обработчике прерывания инкрементируется счетчик миллисекунд
- При достижении счетчиком значения 1000 инкрементируется счетчик секунд
- Аналогично реализуются счетчики минут и часов
Такой метод позволяет достичь точности измерения времени до сотых долей секунды. Для еще большей точности можно использовать внешний кварцевый резонатор.
Алгоритм динамической индикации для управления дисплеем
Для управления четырехразрядным семисегментным LED-дисплеем используется метод динамической индикации:
- В цикле поочередно активируется каждый разряд дисплея
- На сегменты активного разряда выводится соответствующая цифра
- Частота обновления разрядов выбирается не менее 50 Гц для отсутствия мерцания
- Для экономии энергии неиспользуемые сегменты отключаются
Данный алгоритм позволяет управлять многоразрядным дисплеем, используя минимальное количество выводов микроконтроллера.
Обработка нажатий кнопок управления секундомером
Для корректной обработки нажатий кнопок управления секундомером применяются следующие методы:
- Использование аппаратных прерываний по изменению состояния входов
- Программная защита от дребезга контактов
- Обработка длительных нажатий для дополнительных функций
- Реализация конечного автомата для управления режимами работы
Такой подход обеспечивает надежное и удобное управление секундомером при минимальной нагрузке на основной цикл программы.
Оптимизация энергопотребления секундомера на ATtiny2313
Для увеличения времени автономной работы секундомера от батареи применяются следующие методы оптимизации энергопотребления:
- Использование режима сна микроконтроллера между измерениями
- Отключение неиспользуемых периферийных модулей
- Снижение тактовой частоты МК до минимально необходимой
- Применение режима динамической индикации дисплея
- Использование кнопок с фиксацией для включения/выключения
Комплексное применение этих методов позволяет значительно увеличить время работы устройства от одного комплекта батарей.
Калибровка и повышение точности секундомера
Для достижения максимальной точности измерения времени в секундомере на ATtiny2313 можно применить следующие методы:
- Использование внешнего высокоточного кварцевого резонатора
- Программная калибровка с использованием эталонного источника времени
- Компенсация температурной зависимости частоты генератора
- Периодическая синхронизация с внешним источником точного времени
Применение этих методов позволяет добиться точности хода секундомера на уровне профессиональных измерительных приборов.
Схема электронного секундомера на микроконтроллере AT89C4051
Главная » Измерение » Схема электронного секундомера на микроконтроллере AT89C4051
в Измерение 2 комментария 4,572 Просмотров
Большинство лабораторий и учебных заведений нуждаются в точных секундомерах для измерения времени. Этот простой проект фокусируется на построении секундомера с точностью до 0,01 секунды. Секундомер можно использовать для спортивных событий, подключив датчик через разъем CON2.
Паяльный фен YIHUA 8858
Обновленная версия, мощность: 600 Вт, расход воздуха: 240 л/час…
Подробнее
Схема и работа электронного секундомера
Принципиальная схема прецизионного секундомера показана ниже. Она построена на стабилизаторе напряжения 7805 (IC1), микроконтроллере AT89C4051 (IC2), 4-разрядном 7-сегментном дисплее с общим анодом (DIS1) и нескольких дополнительных компонентах.
Схема питается от сети 220В с помощью понижающего трансформатора X1 (на схеме не показан). С выход X1 (7,5В-0-7,5В) переменное напряжение выпрямляется диодами D1 и D2 и сглаживается конденсаторами C1 и C4.
После стабилизатора 7805 напряжение 5В запитывает оставшуюся часть схемы, в том числе и микроконтроллера.
Микроконтроллер (IC2) работает на частоте 12МГц. Это достигается за счет подключения кварца 12МГц к выводам XTAL1 и XTAL2 IC2.
Тестер транзисторов / ESR-метр / генератор
Многофункциональный прибор для проверки транзисторов, диодов, тиристоров…
Подробнее
Конденсатор C5 и резистор R8 составляют часть схемы сброса для IC2 при включении. Кнопка S2 используется для ручного сброса IC2 и сброса счетчика на ноль. Кнопка S3 используется для запуска и остановки секундомера. 4-разрядный 7-сегментный дисплей работает в режиме мультиплексированния.
Когда переключатель S1 замкнут, дисплей DIS1 указывает 00.00. При нажатии кнопки S3, на DIS1 отображается отсчет до момента отпускания S3. Максимальный отсчет времени составляет 99,99 секунд.
Программное обеспечение написано на языке C и скомпилировано с использованием программного обеспечения Keil μVision V5. Задержка на языке C зависит от компилятора. Иногда может потребоваться небольшая коррекция в цикле задержки для точной калибровки.
Hex файл, созданный программным обеспечением Keil, записывается в микроконтроллер с использованием подходящего программатора.
Конструкция и тестирование
Рисунок печатной платы с односторонним расположением компонентов приведен ниже.
После пайки всех компонентов, запрограммируйте микроконтроллер AT89C4051 и поместите его на печатную плату с использованием панельки. Подайте питание с помощью S1. Убедитесь, что на индикаторе отображается 00.00. Если этого нет, то проверьте схему на предмет ошибок.
Когда вы нажимаете S3, дисплей начинает отсчет, отпускаете S3 — отсчет останавливается. Если снова нажать S3, отсчет Если в любой момент нажать S2, то произойдет сброс показаний в ноль.
Для настройки сравните показания с откалиброванным секундомером. Если в показаниях есть несоответствие, отрегулируйте цикл задержки в коде до достижения точного показания.
Скачать прошивку секундомера (33,5 KiB, скачано: 492)
EFY 05/2017
Блок питания 0…30 В / 3A
Набор для сборки регулируемого блока питания…
Подробнее
секундомер 2018-08-30
С тегами: секундомер
Разработка цифрового секундомера | Статья в журнале «Молодой ученый»
Библиографическое описание:Прошин, А. А. Разработка цифрового секундомера / А. А. Прошин, С. А. Бростилов, Н. В. Горячев. — Текст : непосредственный // Молодой ученый. — 2015. — № 2 (82). — С. 187-190. — URL: https://moluch.ru/archive/82/15066/ (дата обращения: 08.05.2023).
За последнее время разработка и производство новых микроконтроллеров (МК) безостановочно развивалось. Каждый месяц на свет появляются новые типы МК, различного применения, от простых бытовых с архитектурой RISC — Reduced Instruction Set Computing — вычисления с сокращённым набором команд, до высокопроизводительных с полным набором команд (CISC).
Благодаря массовому производству цена МК неуклонно падает. Наиболее подходящими МК для проектирования, в современных экономических условиях сложившихся на территории России, являются изделия компании Atmel. Они, прежде всего, предпочтительны по соотношению цена\качество.Поставленная перед нами задача создания цифрового секундомера является достаточно сложной инженерной задачей. Для её решения выберем 8-разрядный МК Attiny2313, серии Tiny фирмы Atmel.
Для организации отсчёта времени применим микросхему часов реального времени — DS1307. Микросхема использует шину передачи данных I2C.
В качестве индикатора применим жидкокристаллический индикатор Wh2602, со встроенным контроллером HD44780.
Спроектируем принципиальную схему устройства (рисунок 1)
Рис. 1. Схема электрическая принципиальная
ЖК индикатор использует для своей работы порт B контроллера. Матричная клавиатура подключена к порту D. Назначение кнопок управления:
S1 |
ПУСК |
S5 |
РЕЗ2 |
S2 |
ЗАМЕР1 |
S6 |
СБРОС |
S3 |
ЗАМЕР2 |
S7 |
ПРСЧ |
S4 |
РЕЗ1 |
S8 |
СТОП |
Кнопка S9 не используется, кварцевый резонатор ZQ1 задаёт временные интервалы микросхемы DD1.
Кварцевый резонатор ZQ2 необходим для тактирования работы МК. DA1 — стабилизатор напряжения +5 В, необходимый для нормальной работы МК и ЖК.
На примере схемы, показанной на рис.1, хорошо видно, насколько упрощается схемотехника цифрового автомата при применении современного МК и современной элементной базы.
Для программирования удобно использовать один из языков высокого уровня. Для МК семейства AVR ATtiny наиболее распространённым является язык Си. Программу напишем в распространенной системе CVAVR. Данная система обладает конструктором кода, что в значительной степени упрощает создание программы МК.
После компиляции данного проекта, в среде CVAVR получаем следующие (рисунок 2):
Рис. 2. Информационное окно компилятора
Из рисунка 2 видно, что программа составлена, верно — ошибки отсутствуют. Программа довольно объёмна — имеет размер 994 байт и занимает почти 49 % памяти МК. Большой размер программы связан с использованием дополнительных библиотек компилятора: lcd. h; delay.h; ds1307.h. Первая предназначена для организации работы ЖК, вторая для организации задержек, третья используется для работы с часами реального времени DS1307.
Таким образом, разработан цифровой автомат, реализующий алгоритм работы цифрового секундомера. Устройство построено на базе современного МК ATtiny2313 производства фирмы ATMEL. Внешний вид примененного ЖК в различных режимах работы показан на рисунке 3.
Рис. 3. Результата работы секундомера
Выполненный проект показывает насколько сложные задачи можно решать с помощью простых 8-ми разрядных, МК фирмы ATMEL.
Литература:
1. Бростилов С. А. Метрологический анализ измерительной подсистемы информационно-измерительной системы для исследования средств воздушного охлаждения / С.А Бростилов, Н. В. Горячев, Т. Ю. Бростилова // Труды международного симпозиума Надежность и качество. 2014. Т. 2. С. 127–129.
2. Таньков Г. В. Механические и тепловые воздействия на РЭС / Г. В. Таньков, Н. В. Горячев, И. И. Кочегаров // Молодой ученый. — 2015. — № 1. — С. 112–113.
3. Горячев Н. В. Автоматизированный выбор системы охлаждения теплонагруженных элементов радиоэлектронных средств / Н. В. Горячев, И. Д. Граб, К. С. Петелин, В. А. Трусов, И. И. Кочегаров, Н. К. Юрков // Прикаспийский журнал: управление и высокие технологии. 2013. № 4. С. 136–143.
4. Андреев П. Г. Анализ программных пакетов моделирования влияния электромагнитных воздействий на изделия радиоэлектронных средств / П. Г. Андреев, С. А. Бростилов, Т. Ю. Бростилова, Н. В. Горячев, Г. П. Разживина, В. А. Трусов // Информационно-вычислительные технологии и математическое моделирование в решении задач строительства, техники, управления и образования: сб. статей. Междунар. научн.чтения– Пенза: ПГУАС, 2014. — C 126–130.
5. Горячев Н. В. Концепция создания автоматизированной системы выбора теплоотвода электрорадиоэлемента / Н. В. Горячев, Н. К. Юрков // Современные информационные технологии. 2010. № 11. С. 171–176.
6. Шишкин Ф. Д. Особенности программируемых логических устройств / Ф. Д. Шишкин, Н. В. Горячев, В. А. Трусов // Молодой ученый. — 2015. — № 1. — С. 115–117.
7. Горячев Н. В. Проектирование топологии односторонних печатных плат, содержащих проволочные или интегральные перемычки / Н. В. Горячев, Н. К. Юрков // Труды международного симпозиума Надежность и качество. 2011. Т. 2. С. 122–124.
8. Стрельцов Н. А. SDR-трансиверы и их применение / Н. А. Стрельцов, Н. В. Горячев, В. А. Трусов // Труды международного симпозиума Надежность и качество. 2014. Т. 1. С. 281–282.
9. Горячев Н. В. Тепловая модель учебной системы охлаждения / Н. В. Горячев, Д. Л. Петрянин // Прикаспийский журнал: управление и высокие технологии. 2014. № 2. С. 197–209.
10. Белов А. Г. Обзор современных датчиков утечки воды / А. Г. Белов, Н. В. Горячев, В. А. Трусов, Н. К. Юрков // Труды международного симпозиума Надежность и качество. 2013. Т. 2. С. 34–36.
11. Петрянин Д. Л. Анализ систем защиты информации в базах данных / Д. Л. Петрянин, Н. В. Горячев, Н. К. Юрков // Труды международного симпозиума Надежность и качество. 2013. Т. 1. С. 115–122.
12. Меркульев А. Ю. Системы охлаждения полупроводниковых электрорадиоизделий / А. Ю. Меркульев, Н. В. Горячев, Н. К. Юрков // Молодой ученый. — 2013. — № 11. — С. 143–145.
13. Горячев Н. В. Концептуальная структура СППР в области выбора теплоотвода электрорадиоэлемента / Н. В. Горячев // Труды международного симпозиума Надежность и качество. 2012. Т. 2. С. 241–241.
14. Горячев Н. В. Уточнение тепловой модели сменного блока исследуемого объекта / Н. В. Горячев, И. Д. Граб, Н. К. Юрков // Труды международного симпозиума Надежность и качество. 2013. Т. 1. С. 169–171.
15. Подложенов К. А. Разработка энергосберегающих технологий для теплиц / К. А. Подложёнов, Н. В. Горячев, Н. К. Юрков // Современные информационные технологии. 2012. № 15. С. 193–194.
16. Grab I. D., Sivagina U. A., Goryachev N. V., Yurkov N. K. Research methods of cooling systems. Innovative Information Technologies: Materials of the International scientific — рractical conference. Part 2. –M.: HSE, 2014, 443–446 pp.
17. Горячев Н. В. Концептуальная схема разработки систем охлаждения радиоэлементов в интегрированной среде проектирования электроники / Н. В. Горячев, Н. К. Юрков // Проектирование и технология электронных средств. 2009. № 2. С. 66–70.
18. Шуваев П. В. Формирование структуры сложных многослойных печатных плат / П. В. Шуваев, В. А. Трусов, В. Я. Баннов, И. И. Кочегаров, В. Ф. Селиванов, Н. В. Горячев // Труды международного симпозиума Надежность и качество. 2013. Т. 1. С. 364–373.
19. Трифоненко И. М. Обзор систем сквозного проектирования печатных плат радиоэлектронных средств / И. М. Трифоненко, Н. В. Горячев, И. И. Кочегаров, Н. К. Юрков // Труды международного симпозиума Надежность и качество. 2012. Т. 1. С. 396–399.
20. Горячев Н. В. К вопросу реализации метода автоматизированного выбора системы охлаждения / Н. В. Горячев, И. И. Кочегаров, Н. К. Юрков // Алгоритмы, методы и системы обработки данных. 2013. № 3 (25). С. 16–20.
21. Сивагина Ю. А. Разработка ретранслятора радиосигналов и его компьютерной модели / Ю. А. Сивагина, Н. В. Горячев, Н. К. Юрков, И. Д. Граб, В. Я. Баннов // Современные информационные технологии. 2013. № 17. С. 207–213.
22. Горячев Н. В. Исследование и разработка средств и методик анализа и автоматизированного выбора систем охлаждения радиоэлектронной аппаратуры / Горячев Н. В., Танатов М. К., Юрков Н. К. // Надежность и качество сложных систем. 2013. № 3. С. 70–75.
23. Гусев А. М. Структурно-разностный анализ элемента, включающего вершинную, негативную, позитивную и позитивно-контурную пары направлений / А. М. Гусев и др.// Международный студенческий научный вестник. 2014. № 3. С. 7.
24. Трусов В. А. Программно-определяемые приемопередатчики и их применение / В. А. Трусов, Н. В. Горячев, В. Я. Баннов // Молодой ученый. — 2014. — № 21. — С. 234–236.
Основные термины (генерируются автоматически): ATMEL, CVAVR, AVR, CISC, RISC, кварцевый резонатор, реальное время, современный МК, цифровой автомат, цифровой секундомер.
Таймер с ATtiny2313
; ; ************************************************* ; * Таймер ATtiny2313 с 7-сегментным дисплеем * ; * Четырехзначный мультиплексированный выход, цифровой ключ * ; * (C) 2012, avr-asm-tutorial.net * ; ************************************************* ; ; Включенный заголовочный файл для целевого типа AVR ATtiny2313 .НОЛИСТ .INCLUDE "tn2313def.inc" ; Заголовок для AT90S2313 .СПИСОК ; ; ============================================ ; H A R D W A R E I N F O R M A T I O N ; ============================================ ; ; _____________ ; / | ; Сбросить о--| |--ö + 3 В ; Ключ 1 Dwn o--| |--o Светодиоды активны, низкий уровень ; Клавиша 2 Вверх о--| |--o Сегмент g ; S2A Cnt-мод о--| A T |--o Сегмент f ; Выход о--| |--o Сегмент e ; Ключ 3 Идти--| t i n y |--o Сегмент d ; Анод Dig1 o--| |--o Сегмент c ; Анод Dig2 o--| 2 3 1 3 |--o Участок б ; Анод Dig3 o--| |--o Сегмент а ; Земля о--| |--o Анод Dig4 ; |______________| ; ; ========================== ; КАК ЭТО РАБОТАЕТ ; ========================== ; ; Описание: ; Это обеспечивает таймер с четырехзначным 7-сегментным ; отображать. Он может считать вниз или вверх, в зависимости от ; переключатель 2А. Во время активного счета два ; Светодиоды между минутами и секундами мигают ; быстро, а выходной контакт имеет высокий активный уровень. ; ; Внутреннее функционирование ; 0: Процессор ; Работает с внутренним RC-генератором по умолчанию, ; тактовая частота 1 Мвыб/с ; ; 1. 16-битный таймер 1 ; Работает с внутренними часами, предварительно масштабированными на 8, и ; в режиме CTC с ICR1, установленным на 625, поэтому ; прерывание происходит каждые 0,005 секунды для привода ; мультиплексор из четырех цифр с частотой 50 Гц. ; Таймер устанавливает флаг f5ms. Если секунда ; таймер дополнительно устанавливает флаг f1s. ; ; 2. Флаги ; 2а) флаг 5 мс: ; Неактивный режим (счетчик не запущен): ; Если установлено после таймера int, процедура ; сканирует ключевые входы. Если один из ключей ; нажата, вызывается соответствующая процедура: ; - Клавиша Вниз нажата: это уменьшает тревогу ; время на 5 секунд. Новое время будильника ; записывается в EEPROM. ; - Клавиша вверх нажата: это увеличивает тревогу ; время на 5 секунд. Новое время будильника ; записывается в EEPROM. ; - Нажата клавиша Go: запуск таймера. Если ; выбран обратный отсчет (переключатель 2A выключен) ; время установлено на время будильника. Если до- ; выбран счет (переключатель 2A вкл.) ; время очищается. Выходной контакт A0 установлен ; на высокий, двойной светодиод в середине ; дисплеи мигают. Каждый второй импульс ; увеличивает счет времени. Если время достигает ; ноль (счет вниз) соотв. время будильника (до ; считая) выходной контакт A0 выключен. ; Активный режим (счетчик запущен): ; - Нажата клавиша вниз: истекшее время ; уменьшилось на 5. ; - Клавиша вверх нажата: прошедшее время увеличивается ; на 5. ; - Нажата клавиша Go: счетчик перезапускается. ; Любой активный ключ блокирует дальнейшую обработку ключа ; пока ни одна из клавиш не будет нажата в течение как минимум ; длительность 20 мс. ; 2б) 1 с флаг: ; Если не активирован, счетчик неактивного времени ; уменьшается. Если он достигает нуля (после 20 ; секунд) цифровые индикаторы выключены ; и два светодиода в середине переключаются ; до 1/4 для экономии энергии. ; Если активировано: прошедшее время увеличивается ; на единицу и сравнивается со временем будильника. ; Если время будильника достигнуто, выходной контакт ; выключен (ноль). ; ; ============================================ ; П О Р Т С А Н Д П И Н С ; ============================================ ; .EQU ppSegment = PORTB ; выходной порт сегментов .EQU pdSegment = DDRB ; порт направления сегментов .EQU ppAnodes = PORTD ; порт драйвера анода .EQU pdAnodes = DDRD ; анодный драйвер и направление ввода клавиш .EQU PiKeys = ПИН-код ; порт ввода ключа .EQU biKey1 = 0 ; ключ 1 входной бит .EQU biKey2 = 1 ; ключ 2 входной бит .EQU biKey3 = 2 ; ключ 3 входной бит .EQU ppOutput = ПОРТ ; выходной порт .EQU pdOutput = DDRA ; выходной порт направления .EQU boOutput = 0 ; выходной бит .EQU piJumper = PINA ; входной порт перемычки .EQU biJumper = 1 ; входной бит перемычки ; ; ============================================ ; C O N S T A N T S T O C A N G E ; ============================================ ; . EQU cMux = 50 ; Частота MUX для всех четырех цифр ; ; ============================================ ; F I X + D E R I V E D C O N S T A N T S ; ============================================ ; .EQU cClock = 1000000 ; часы процессора .EQU cPresc = 8 ; прескалер TC1 .EQU cTc1Clk = cClock / cPresc ; часы TC1 .EQU cCtc = cTc1Clk / cMux / 4 ; Значение CTC TC1 .EQU c1s = 4 * cMux ; ; ============================================ ; РЕГИСТРАЦИЯ ; ============================================ ; ; используется: R0..R1 для 7-сегментного преобразования ; б/у: R2..R9как хранилище последовательностей MUX ; бесплатно: R10..R12 .DEF rDOff = R13 ; downcounter для выключения дисплея .DEF rDisp = R14 ; счетчик для отображения времени будильника вместо времени .DEF rSreg = R15 ; Сохранить регистр SREG .DEF об/мин = R16 ; Многоцелевой регистр .DEF обод = R17 ; Многоцелевые внутренние прерывания .DEF rFlg = R18 ; Регистр флага .EQU f5ms = 0 ; 5 мс над флагом .EQU f1s = 1 ; 1 секунда над флагом .EQU факт = 2 ; счет и вывод активны . EQU fKey = 3 ; ключ заблокирован .DEF rTimeL = R19 ; счетчик времени .DEF rTimeH = R20 ; .DEF rAlrmL = R21 ; хранение времени будильника .DEF rAlrmH = R22 .DEF rKey = R23 ; для подсчета ключей .DEF rC1sL = R24 ; счетчик секунд .DEF rC1sH = R25 ; используется: X (XH:XL) как указатель мультиплексора на SRAM ; использовал; Y (YH:YL) для преобразования в 7-сегментный ; б/у: Z (ZH:ZL) многоцелевые внешние целые ; ; ============================================ ; С Р А М Д Е Ф И Н И Т И О Н С ; ============================================ ; ; (нет, SRAM используется только для операций со стеком) ; ; ============================================ ; Р Е С Е Т И Н Т В Е К Т О Р С ; ============================================ ; .CSEG .ОРГ $0000 rjmp Главная ; Вектор сброса рети; Вектор INT0 рети; Вектор INT1 rjmp Tc1CaptIsr ; Вектор захвата TC1 рети; Вектор TC1COMPA рети; Вектор TC1OVF рети; Вектор TC0OVF рети; Вектор USART-RX рети; Вектор USART-UDRE рети; Вектор USART-TX рети; АНАКОМП вектор рети; Вектор PCINT рети; TC1COMPB вектор рети; TC0COMPA вектор рети; TC0COMPB вектор рети; Вектор УЗИ-СТАРТ рети; Вектор УЗИ-ОВФ рети; EE-READY вектор рети; Вектор ВДТ-ОВФ ; ; ============================================ ; И Н Т Е Р У П Т С Е Р В И Ц Е С ; ============================================ ; ; TC1 ICF Isr (мультиплексор и синхронизация) Tc1CaptIsr: в rSreg,SREG ; сохранить SREG лди обод,0b01111111 ; чистые анодные драйверы вне ppAnodes, Rimp ld обод,X+ ; прочитать следующие байты мультиплексора бст rC1sL,5 ; скопировать бит 7 секундного счетчика в T sbrc rFlg,fAct корп. обод,7; скопируйте флаг T в бит 7, чтобы мигать вне ppSegment,rimp ; вывод в сегменты ld обод,X+ ; читать следующий драйвер анода вне ppAnodes,rimp ; установить анодные драйверы sbr rFlg,1<rDisp вкл. rDisp перезвонить Перезагрузить ; X - счетчик положения мультиплексора ldi XH, ВЫСОКИЙ (2) LDI XL, НИЗКИЙ(2) ldi rC1sH,HIGH(c1s) ; начать новый счетчик ldi rC1sL, НИЗКИЙ (c1s) ; Инициализация и запуск таймера ldi rmp,HIGH(cCtc) ; установить регистр ICR1 выход ICR1H, об/мин ldi rmp, LOW (cCtc) выход ICR1L, об/мин ldi об/мин,0 ; установить режим вне TCCR1A, об/мин ldi rmp,(1< rKey вкл. rKey вкл. rKey вкл. rKey sbr rFlg,1< rDisp вкл. rDisp rjmp Перезагрузить Флаг5msKey2: лди об/мин,5 добавить rAlrmL,rmp лди об/мин, 0 adc rAlrmH,rmp cpi rAlrmL, LOW (3599) brcs Flag5msОбновление cpi rAlrmH, ВЫСОКИЙ (3599) brcs Flag5msОбновление LDI rAlrmL,НИЗКИЙ(3599) ldi rAlrmH, ВЫСОКИЙ (3599) rjmp Flag5msUpdate Флаг5msKey3: перезвонить Перезагрузить ldi rC1sH,HIGH(c1s) ; начать новый счетчик ldi rC1sL, НИЗКИЙ (c1s) sbr rFlg,1< rTimeH Flag1sEq: cp rTimeL,rAlrmL ; сравнить со временем будильника brne UpDateDisplay cp rTimeH,rAlrmH brne UpDateDisplay клрВремяL ; перезапустить новый clrTimeH cbr rFlg,1< ; ZH:ZL — вычитатель (ZH:ZL = 600 или 60) ; ПолучитьЦифра2: клр рмп ; rmp это счетчик ПолучитьDigit2Count: суб R0,ZL ; вычесть младший бит sbc R1,ZH ; вычесть старший бит brcs GetDigit2Ok вкл. об/мин rjmp GetDigit2Count ПолучитьDigit2Ok: добавить R0,ZL ; восстановить последний адк R1,ZH Преобразовать цифру: ldi ZH,HIGH(2*SegTab) ; точка Z на 7-сегментную таблицу ldi ZL, LOW (2 * SegTab) добавить ZL,rmp ; добавить число цифр л/мин об/мин, Z ; прочитать результат из таблицы ст Y,rmp ; запись в регистр MUX адив YL,2 ; указать на следующую позицию отображения рет ; преобразовать предпоследнюю цифру (ZL = 10) ПолучитьЦифра1: клр рмп ; rmp это счетчик ПолучитьDigit1Count: суб R0,ZL ; вычесть числовое основание brcs GetDigit1Ok вкл. об/мин rjmp GetDigit1Count ПолучитьDigit1Ok: добавить R0,ZL ; добавить базу цифр rjmp ConvertDigit ; преобразовать последнюю цифру Получить цифру: мов об/мин,R0 ; скопировать последнюю цифру rjmp ConvertDigit ; ; Перезапустить счетчик ; Перезапуск: sbis piJumper,biJumper ; запускать? rjmp RestartZero ; нет, вниз mov rTimeL,rAlrmL ;время перезапуска мов rTimeH,rAlrmH rjmp RestartMux Перезапустить с нуля: клрВремяL ; ясное значение для прямого счета clrTimeH ; Преобразование времени в буфер в SRAM РестартМукс: вызвать UpdateDisplay ; преобразовать в 7-сегментный лди рмп,0b00111111 ; отображать цифру 1 движение R9, об/мин лди рмп,0b01011111 ; отображать цифру 2 мов R7, об/мин лди рмп,0b01101111 ; отображать цифру 3 мов R5, об/мин лди рмп,0b01110111 ; отображать цифру 4 мов R3, об/мин рет ; ; Семисегментный стол ; ; 0: _gFEDCBA 01000000 ; --- 1: _gfedCBa 01111001 ; ф/г/б 2: _GfEDcBA 00100100 ; --- 3: _GfeDCBA 00110000 ; д//с 4: _GFedCBa 00011001 ; --- 5: _GFeDCbA 00010010 ; д 6: _GFEDCba 00000011 ; 7: _gfedCBA 01111000 ; 8: _GFEDCBA 00000000 ; 9: _GFedCBA 00011000 Сегментная вкладка: . DW 0b0111100101000000 ; 1, 0 .DW 0b0011000000100100 ; 3, 2 .DW 0b0001001000011001 ; 5, 4 .DW 0b0111100000000011 ; 7, 6 .DW 0b0001100000000000 ; 9, 8 ; ; Содержимое EEPROM для запуска ; .EQU cAlrm = 1*60+30 ; запуск в 01:30 .ESEG .ОРГ 0x0000 .DB LOW(cAlrm), HIGH(cAlrm) ; ; Конец исходного кода ;
time — Прерывание таймера Attiny не делает прерывание каждые 1000 мс
Я вижу три проблемы с этим подходом.
Во-первых, вы используете некалиброванное время очень низкого качества. источник. Частота внутреннего RC-генератора хороша с точностью до всего несколько процентов. Он также очень нестабилен и сильно зависит от температура. Использование внешнего керамического генератора с частотой 16 МГц должно дать вам частоту, которая не хуже, чем 0,5% от, с типичным ошибка около 0,1%. Однако он все еще несколько нестабилен. Если вы вместо этого используют кристалл осциллятор , то можно ожидать погрешность порядка десяти раз меньше (в диапазоне 100 ppm), и очень хорошая стабильность. В зависимости от ваших требований к качеству, 100 стр/мин может быть недостаточно. достаточно хорошо, и в этом случае у вас все еще есть возможность измерить скорость дрейфа и откалибруйте ее (см. ниже).
Вторая проблема, которую уже поднимал 6v6g, заключается в том, что ваш таймер считает от нуля до 122 включительно, что дает период 123 такта таймера. Посмотрите на временные диаграммы в техпаспорт, если вам нужно убедить себя в этом. Если вы хотите период из 122, вы должны установить для OCR0A значение 121.
Третья проблема заключается в том, что вы сбрасываете таймер с помощью ISR. Этот может работать в этой программе, но это очень хрупкий подход, который стоит избегая. Проблема в том, что все, что делает микроконтроллер, занимает время, и ваш ISR может даже быть задержан другим прерыванием. Если таймер увеличивается после поднятия флага прерывания, но до того, как вы сбросьте его, вам не хватает одного счета. Если вы хотите иметь непрерывный шкала времени, никогда не сбрасывать таймер. Вы можете:
позволить ему работать непрерывно, без помех (и выполнить
OCR0A += 122
в течение ИСР),или позволить ему сбросить себя, используя соответствующую генерацию сигнала режим (CTC или быстрый PWM).
Наконец, вот трюк, который вы можете использовать для калибровки секундомера. Вместо подсчета прерываний до тех пор, пока счетчик не достигнет 8 (что предполагает период прерывания ровно 1/8 с), увеличьте a счетчик наносекунд внутри ISR и считать одну секунду, как только у вас есть один миллиард наносекунд:
const uint32_t nanoseconds_per_interrupt = 124928000; ISR(TIMER0_COMPA_vect) { статический uint32_t наносекунд; наносекунды += наносекунды_на_прерывание; если (наносекунд >= 1000000) { наносекунды -= 1000000; секунды++; // затем обновить минуты, часы... если необходимо } }
Это будет увеличивать секунды каждые восемь прерываний… время. Однако время от времени потребуется девять прерываний. Этот добавляет немного джиттера, но предотвращает ошибки синхронизации накапливаются и заставляют часы дрейфовать. Если дрожание видно, вы можно уменьшить, сократив период прерывания.
Значение 124928000, которое я написал выше, предполагает, что ISR вызывается каждый раз. 122×1024 цикла тактовой частоты 1 МГц. Вы можете изменить его, чтобы он соответствовал другую тактовую частоту или другую настройку OCR0A. Хитрость заключается в следующем: как только вы измерите скорость дрейфа секундомера, вы сможете настроить это число, чтобы удалить этот дрейф. Например, если вы измеряете секундомер и обнаружите, что он работает на 0,04% медленнее, тогда вы увеличиваете это число на 0,04% (что дало бы 124977971) и дрейф пропал.
Редактировать : В комментарии 6v6gt указал на четвертую проблему в вашем коде, что, вероятно, является самой большой проблемой. Ваша логика подсчета прерываний это:
если (intr_count == 8) { intr_count = 0; } еще { intr_count++; }
Счет от 0 до 8 включительно и зацикливание с периодом 9 прерываний.