Авторизация


...

Кто на сайте?

Сейчас 165 гостей и 2 зарегистрированных пользователей на сайте

  • inmiernikwesto

Статистика

-Посетители : 23739
-Материалы : 209

Пользователь сайта продает...

  pic12f683

Пользователь сайта покупает...

Любителям часов и счета.

Автор: Александр Милевский Просмотров: 3771

 

Эта система даёт простой, быстрый способ генерировать достоверные периоды на микроконтроллере 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 очень просто -  загружаем старший и средний байты, затем прибавляем младший байт и, если он переполняется, инкрементируем средний байт).

Ссылка для скачивания доступна только авторизованным пользователям сайта !
 можно посмотреть исходный код с прерыванием и подробными комментариями данного алгоритма с сайта piclict.ru.

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

При таком периоде прерывания вычитание единицы (65536) производится из старшего байта.

- сравниваем точное время с измеренным за N минут, получаем ошибку Х сек

- вычисляем (Хсек/Nx60)х1000000=Х получаем число, необходимое прибавить или отнять к переменной .

Ошибка будет минимизирована, например,  для часов, погрешность времени будет не более 1 сек. в год.

 

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

- Эта система добавляет небольшой сдвиг каждому периоду (плавает продолжительность каждого периода) Но итоговая погрешность равно нулю.

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

 

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

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

Ссылка для скачивания доступна только авторизованным пользователям сайта !

Этот шедевр подвинул меня создать программу счета в десятичной системе.

В каждом регистре будут считаться сотни. Например, в первом регистре счет идет до 99, после превышения, прибавляется 1 к следующему регистру. Первый сбрасывается в ноль. В первом считается следующая сотня и опять прибавляется 1 к следующему регистру, и т.д. Пример программы, позволяющей считать в четырех регистрах  до 99.99.99.99, приведен в примере.

Увеличить максимальное число счета очень просто, надо в конце подпрограммы (перед return)  добавить строчку call   prv_0, это для следующего регистра сотен.

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

Работающий проект программы можно взять

Ссылка для скачивания доступна только авторизованным пользователям сайта !
.

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

Случайные статьи....

Prev Next

Пробник для диагностики состояния электролитических конденсаторов

02-10-2011 Super User

Пробник для диагностики состояния электролитических конденсаторов

 КОНКУРС   Предлагается прибор-пробник, обеспечивающий диагностику состояния электролитических  конденсаторов без выпаивания конденсаторов из печатной платы.  Неисправность электролитических конденсаторов является одной  из главных причин выхода из строя  радиоэлектронной аппаратуры (РЭА). Особенно это актуально для конденсаторов, которые находятся в схемах импульсных источников  питания в...

ПП чтения данных из Flash памяти программ.

24-05-2012 Super User

 Для чтения содержимого памяти программ используется инструкция (команда) TBLRD. Она имеет несколько разновидностей: TBLRD*     - чтение TBLRD*+ - чтение +1 TBLRD*-  - чтение -1 TBLRD+* - +1,чтение В программе необходимо предварительно записать в указательTBLPTRадрес таблицы (байт) данных,  к примеру,  здесь  задан...

Пробник для диагностики состояния электролитических конденсаторов

02-10-2011 Super User

Пробник для диагностики состояния электролитических конденсаторов

 КОНКУРС   Предлагается прибор-пробник, обеспечивающий диагностику состояния электролитических  конденсаторов без выпаивания конденсаторов из печатной платы.  Неисправность электролитических конденсаторов является одной  из главных причин выхода из строя  радиоэлектронной аппаратуры (РЭА). Особенно это актуально для конденсаторов, которые находятся в схемах импульсных источников  питания в...

Термостат с нагревателем и охладителем

14-03-2011 Alex

Термостат с нагревателем и охладителем

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


Все права принадлежат ChipMK.ru. При копировании материала ссылка обязательна. 2011-2017 © ChipMK.ru

ChipMk.ru Яндекс.Метрика
PRCY.ru