» » » Программирование точных часов с применением алгоритма Брезенхама (Bresenham's Algorithm)

 
 
 
1

Программирование точных часов с применением алгоритма Брезенхама (Bresenham's Algorithm)

Разместил mazr 20 января 2015. Просмотров: 4 272


В свое время меня заинтересовала возможность реализации точного хода часов программно.
Алгоритмы такие были найдены. Как не смешно, но по сути они совершенно не точные. Часы работающие по такому алгоритму никогда не показывают точное время. Они всегда спешат или всегда отстают, но в результате работают идеально точно. Такой каламбур у меня во вступлении. Конечно эти идеи заинтересуют тех, кто чуть чуть знаком с программированием, не важно, на ассемблере или языках высокого уровня.

Также рассмотрим простой и быстрый десятичный счет к привязке к стандарту часов, минут, секунд без преобразования из 16-ой системы счисления в десятичную, также чисто десятичный счет.
Эти методами удобно пользоваться при разработке различных устройств, отсчитывающих точные временные интервалы и производящие их счет и счет различных событий.
Так как я в основном пользуюсь средой разработки и микроконтроллерами фирмы Микрочип, то все будет привязано к ним.

Примечание редакции. Алгоритм Брезенхама применён в программировании PIC-контроллеров Бобом Аммерманом (Bob Ammerman) и описан с доработками в июне 2001 года Романом Блейком (Roman Black) в оригинальной статье «Zero-error 1 second Timer. A very versatile Zero Cumulative Error timing system with PIC source code». См. и другие ссылки на источники.
Программирование точных часов с применением алгоритма Брезенхама (Bresenham's Algorithm)

Метод, позволяющий получить точные временные интервалы

Простая и быстрая система получения точных временных периодов на микроконтроллере PIC. Эта система даёт простой, быстрый способ генерировать достоверные периоды на микроконтроллере PIC с любой тактовой частотой. Особенно для односекундных событий, таких как простые часы. Вы можете использовать любой кварц, какой у вас есть и всё равно будете получать идеальную односекундную синхронизацию. Система будет генерировать достоверные периоды от миллисекунд до многих секунд при очень быстром исполнении кода.

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

Используется модифицированная версия алгоритма Брезенхама. Система Брезенхама идеальна для пошагового перемещения на точное расстояние с нулевой погрешностью (однако при этом важно понимать, что каждый шаг будет немного длиннее или короче). Система обеспечивает итоговую нулевую погрешность за некоторый промежуток времени.

Рассмотрим алгоритм работы системы для получения 1 сек. интервала.
Пусть тактовая частота контроллера 4МГц. Это соответствует 1.000.000 машинных циклов в 1 сек. для PIC-микроконтроллера. (1.000.000, это 24- битная переменная, для которой требуется три регистра PIC-микроконтроллера 0×0F4240).

Для упрощения расчетов выберем частоту коррекции кратную 256 машинных циклов, возьмем число 256.
 — При инициализации системы добавляем 1.000.000 +256 в 24-битную переменную.
 — прерываемся каждые 256 отсчетов
 — при каждом прерывании декрементируем средний байт переменной (вычитаем 256)
 — проверяем переполнение и декрементируем старший байт, если необходимо.
 — когда старший и младший байты равны нулю, заканчиваем счет 256 и прибавляем 1.000.000 в 24- битную переменную.
(прибавить 1 000 000 очень просто — загружаем старший и средний байты, затем прибавляем младший байт и, если он переполняется, инкрементируем средний байт).

В приложении можно посмотреть исходный код с прерыванием и подробными комментариями данного алгоритма.
На практике прерывание через 256 отсчетов не совсем удобно, хотя максимальная погрешность колебания — 256 отсчётов или 0.0256%. Удобно использовать прерывание через каждые 65536 (256×256) команд, тогда нужно будет делать проверку каждые 65536 отсчётов, что оставляет больше времени для основной программы. Итоговая ошибка останется равной нулю, но колебание в каждой отдельной секунде увеличится. Максимальное колебание составит около 0.066 секунды или около 7%.
При таком периоде прерывания вычитание единицы (65536) производится из старшего байта.

Недостатки метода и пути их разрешения

- Эта система добавляет небольшой сдвиг каждому периоду (плавает продолжительность каждого периода) Но итоговая погрешность равно нулю.
 — так как система не синхронизирована с истинным 1 сек. интервалом, то верней сказать, что получаем стабильный период из тактов, формируемых кварцевым генератором мк. Дело в том, что практическая частота применяемого кварца не будет ровно 4000000 Гц. Соответственно,
вводимая 24- битная переменная будет не равна 1000000. Это приводит в конечном итоге к некоторой ошибке, сказывающейся на точность 1 сек. отсчетов. Для устранения такой погрешности нужно знать точную частоту используемого кварца хотя бы до 1Гц и по ней рассчитывать необходимую 24 –битную переменную. Например, частота кварца 4000344Гц, то вводим число 1000086.
Если отсутствует возможность точно измерить частоту используемого кварца, можно рассчитать по реально работающему устройству ошибку и откорректировать переменную в программе по следующей методике:
 — сравниваем точное время с измеренным за N минут, получаем ошибку Х секунд
 — вычисляем (Хсек/Nx60)х1000000=Х получаем число, необходимое прибавить или отнять к переменной.
Ошибка будет минимизирована. Например, для часов, погрешность времени будет не более 1 секунды в год.

Программа счета секунд, минут и часов. Вариант десятичного счета

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

Данный шедевр подвинул меня создать программу счета в десятичной системе.
В каждом регистре будут считаться сотни. Например, в первом регистре счет идет до 99, после превышения, прибавляется 1 к следующему регистру. Первый сбрасывается в ноль. В первом считается следующая сотня и опять прибавляется 1 к следующему регистру, и т.д. Пример программы, позволяющей считать в четырех регистрах до 99.99.99.99, приведен в проекте. См. приложение.
Увеличить максимальное число счета очень просто, надо в конце подпрограммы (перед return) добавить строчку call prv_0, это для следующего регистра сотен.

Программа удобна для подсчета различных событий с выводом на индикацию. Результат сразу получаем в 10-ой системе. Используется косвенная адресация. Прокомментировать каждый цикл программы в текущий момент обработки у меня до конца не получается. Надо все расписывать очень подробно. Думаю, что в симуляторе работа программа будет более понятна и наглядна.

Работающий проект в приложении. Для удобства счета в симуляторе одного цикла программы установлена точка остановки. Буду благодарен, если кто заметит неточности или ошибки. Постараюсь ответить на вопросы.

Файлы

Приложения: листинги, проекты и пр., упомянутое в статье.
taim_1.asm.zip | Файл 4,22 Kb загружен 18 раз. , prov_h.zip | Файл 12,54 Kb загружен 14 раз. , prov.zip | Файл 12,97 Kb загружен 14 раз.

Перевод на русский язык оригинальной статьи Романа Блейка — Roman Black, «Zero-error One Second Timer!» от команды сайта piclist.ru
One_second_timer_zero_error_rus.pdf | Файл 109,79 Kb загружен 13 раз.

Рекомендуем изучить источники

Roman Black, «Zero-error One Second Timer!» (EN)
Roman Black, «High accuracy PIC timing systems» (EN)
Микроконтроллеры PIC: техническая документация, статьи и разработки на русском языке
Welcome to the official PICList home page (EN)
Александр (mazr)
г.Тамбов
Профиль mazr
Военный пенсионер.
 

Понравилось? Палец вверх!

  • всего лайков: 15

Поделись с друзьями!

Связанные материалы:


Схема на Датагоре. Новая статья Фото-реле на микроконтроллере ATTiny13... Привет датагорцам! Я затеял ремонтные работы дома, и мне понадобилась система автоматического...
Схема на Датагоре. Новая статья Контроллер управления кухонной электроплитой. Регулятор мощности и таймер отключения... Благодаря идее и участию Юрия Зинченко (ZenitSoft) было разработано и построено устройство,...
Схема на Датагоре. Новая статья Измерения переменного напряжения звуковой частоты мультиметрами М-832... Вряд ли будет преувеличением сказать, что тестер семейства М-83х есть у каждого радиолюбителя....
Схема на Датагоре. Новая статья Рейтинги. Перезагрузка!... Привет, дрУги! Сегодня, 3 октября 2012г., начался отсчет рейтингов по новой системе. Все прежние...
Схема на Датагоре. Новая статья Трансформаторы БРА... В справочнике приведены классификации трансформаторов, система их уcловных обозначений, основные...
Схема на Датагоре. Новая статья 10 практических устройств на AVR-микроконтроллерах. Книга 2. Кравченко А. В.... 10 практических устройств на AVR-микроконтроллерах. Книга 2. Кравченко А. В. Издательство:...
Схема на Датагоре. Новая статья Применение микроконтроллеров в звуковой технике. С. Р. Баширов, А. С. Баширов, Р. И. Авилов.... Применение микроконтроллеров в звуковой технике. С. Р. Баширов, А. С. Баширов, Р. И. Авилов. ...
Схема на Датагоре. Новая статья Журнал "Радио" №12, 1989 г.... Журнал "Радио" №12, 1989 г. Старое доброе Радио. Нас особенно интересуют: В Король. УМЗЧ С...
Схема на Датагоре. Новая статья Сборка и программирование мобильных роботов в домашних условиях. Жимарши Ф.... Сборка и программирование мобильных роботов в домашних условиях. Фредерик Жимарши. Издательство: НТ...
Схема на Датагоре. Новая статья VB-Audio Generator 2. Генератор ЗЧ... Генератор ЗЧ. Работает сам по себе. Много настроек. Позволяет на слух проверить возможности аудио...
Схема на Датагоре. Новая статья Микроконтроллеры AVR семейства Classic фирмы ATMEL. Евстифеев А. В.... Книга представляет собой справочное издание по применению микроконтроллеров AVR семейства Classic...
Схема на Датагоре. Новая статья Радиолюбительские конструкции на PIC микроконтроллерах, Кн.1, Н.И. Заец... Радиолюбительские конструкции на PIC микроконтроллерах, Солон-Пресс, 2003г. Автор: Н.И. Заец В...
<
  • Главный редактор
20 января 2015 20:01

Игорь Петрович Котов / Datagor

Цитата
  • С нами с 25.02.2011
  • Ушёл в реал Пользователь offline
  • 1 654 комментария
  • 265 публикаций
 
  • 0
Александру благодарность за полезный материал! drinks
Осталось напрячься и осознать его.

Добавление комментария


Налетай! Паяльники, станции, жала с доставкой
  • smilelolbyewinkyahoocoollaughing
    crazybadcryingsadirefulsickstraight
    ballooncakegooddrinksmailbombsun
    nightrainstarscolddashguitar-manhandshake
    musicnegativenopardonshoksleepunknown
    wackoyawnblushbullyhashsmokingwhew
Скопируйте текст вашего комментария на случай неверного ответа на контрольный вопрос.