Вы находитесь на странице: 1из 8

6/5.

Русифицированная программа многофункционального (расчеты для модулей


TMR… , USART, EUSART, CCP, АЦП, LCD, источника опорного напряжения)
PIC-калькулятора и работа с ней.

Нужность такого “инструмента” очевидна.


В поисках этого “счастья”, я “полазил” по Интернету и нашел вполне приличную
программу (кстати, выбор совсем небогатый).
Правда, не все в ней было ОК и пришлось кое-что “подогнать” под истину, поэтому
“конечный продукт” несколько отличается от “матери”, но только в лучшую сторону.
Кроме того, английская "абракадабра”, своей “ложкой дегтя”, сильно портит русскую
“бочку меда”.
Вот я и “подсуетился”, вспомнив про свои
былые “кровавые битвы” на
“криптографическом фронте”.
Пользовался редактором Hex Workshop.
Это конечно не “Рио-де-Жанейро”, но “свои
порядки навести можно”.
По ходу дела, я убрал все лишнее и
оставил только то, что действительно нужно.
Так как существуют ограничения по длине
слов/словосочетаний, то пришлось
исхитряться (искать оптимум).
Предлагаю Вашему вниманию результат
своего вмешательства в программу.
На картинке слева, Вы видите окно
программы.
Управление - простейшее: щелкаете по
нужной кнопке, после чего запускается
соответствующая, “калькуляторная” утилита.
На данный момент (по состоянию на 01.08.07), из того списка, который Вы видите,
отработаны только модули TMR…, USART, модуль компараторов и модуль
источника Uоп.
В этом подразделе, будет описана работа
программы в части касающейся только этих
модулей.
Остальные кнопки я пока заблокировал, и при
нажатии на них, будет выдаваться сообщение
об ошибке.
По мере создания подразделов, посвященных
этим модулям, я буду постепенно снимать
блокировки с соответствующих кнопок и
объяснять порядок работы с той или иной
утилитой, “встроив” это объяснение в контекст
описания работы модуля.
Внимание! Программа работает только с
английской раскладкой клавиатуры.

Утилита Источник Uоп


Примечание: при работе с модулем
компараторов, формулы не применяются и
поэтому нет соответствующей утилиты.
После щелчка по кнопке “Источник Uоп”,
открывается то окно, которое Вы видите слева.
В “материнской” программе, были перепутаны
местами значения бита VRR регистра VRCON.
Я этот дефект устранил.
В остальном, все ОК.

1
Можете сверить расчитанные номиналы Vref (для Vdd = 5 вольт) c номиналами Vref,
расчитанными “вручную”, в подразделе 6/1 “Практикума…”. Совпадение - полное.
В результате расчета, в зависимости от установленных значений Vdd (напряжение
питания) и бита VRR (выбор диапазона), программа выдает таблицу номиналов Vref
(выходное напряжение модуля), с указанием “привязок” этих номиналов к битам VR3…
0.
В окошке “Vdd”, по умолчанию, программа выставляет значение Vdd = 5 вольт, но
может быть установлено и другое значение питающего напряжения.
Для этого, с помощью клавиатуры компьютера, нужно просто заменить текущее
значение Vdd на то, которое нужно.
Значение Vdd не должно превышать 5-ти вольт.
Если Вы “настучите” число более 5-ти, то программа “уйдет в отказ” (получите
сообщение о том, что этого делать нельзя).
Если номинал Vdd есть дробное число, то и в этом случае расчет Vref будет
произведен, только необходимо учитывать то, что целую и дробную части числа нужно
разделять не символом “запятая”, а символом “точка”.
Количество цифр, после десятичной точки, может быть любым, но обычно достаточно
не более трех.
Точность расчета Vref - до тысячной доли вольта.
И еще одна общая, для всех утилит, особенность: в большинстве случаев, после
смены значения параметра, участвующего в расчете, расчет не производится.
Для “запуска” процедуры расчета, нужно совершить какое-либо действие, например,
щелкнуть в любом месте полей, ограниченных рамками (например, поля "Итог") или
нажать на клавишу “Enter”.
Лучше пользоваться первым способом, так как, при "эксплуатации" клавиши “Enter”,
программа может “подглюкивать” в части касающейся установки десятичной точки.
Если по каким-то причинам десятичная точка не выставляется, то нужно закрыть окно
утилиты, а затем открыть его и повторить попытку.

Утилита TMR-X

Модули таймеров, вне зависимости от их номера, имеют в своем составе счетчик и


предделитель.
А раз это так, то, при работе с любым из них, можно воспользоваться одной
универсальной утилитой, которая расчитывает время отработки одного цикла счета
этой “связки”.
После щелчка по кнопке
“TMR-X”, открывается то окно,
которое Вы видите слева.

Внимание! Утилита TMR-X (а


также и TMR-Y) работает не
с внешним, а только с
внутренним тактом.

Так как данная утилита


универсальна, то она может
работать как с однобайтным
TMR… (TMR0, TMR2), так и с
двухбайтным TMR… (TMR1).
Нужно только выставить точку
в соответствующей опции поля
"Тип" ("8 бит" или "16 бит").
По той же самой причине,
имеют место быть все
возможные Кдел. предделителя
(с кратностью 2).

2
1. При работе с TMR0, задействуются все Кдел, причем, Кдел. = 1:1 соответствует
отключенному предделителю.
В поле "Тип", нужно выставить "8 бит".
2. При работе с TMR1, нужно задействовать только Кдел. 1:1 (предделитель работает,
но не делит), 1:2, 1:4, 1:8.
На остальные Кдел. "нужно закрыть глаза".
В поле "Тип", нужно выставить "16 бит".
3. При работе с TMR2, нужно задействовать только Кдел. 1:1 (предделитель работает,
но не делит), 1:4, 1:16.
На остальные Кдел. "нужно закрыть глаза".
В поле "Тип", нужно выставить "8 бит".
Результат работы выходного делителя не учитывается.

В поле "OSC(Мгц)" можно установить любую частоту кварца до 64 Мгц.


При попытке выставить более высокую частоту, программа выдаст сообщение об
ошибке и установит частоту 64 Мгц.
По умолчанию, выставляется частота 4 Мгц.
Можно "настучать" и дробное значение частоты (до 6 цифр после десятичной точки).
На выставление нуля в целой части числа, программа сначала "ругается", а затем
"обижается" и закрывается.

Примечание: "Прескалер" это "забугорное" название предделителя. Слово "прескалер"


меня вынудило применить только то, что оно короче слова "предделитель" (для
применяемого способа русификации программы, это существенно).
В поле "Предустановка", можно ее произвести, то есть, двигая ползунок (выбор
"грубо") или щелкая по кнопкам "больше"/"меньше" (выбор "точно"), можно выставить
любое значение числа в пределах одного байта (при работе с TMR0 или TMR2) или
двух байтов (при работе с TMR1).
По умолчанию, в поле "Предустановка", выставляется 0.
В поле "Послеустановка", можно увеличить ("затянуть") время цикла счета на время
исполнения от 1 до 15 машинных циклов.
Двигая ползунок (выбор "грубо") или щелкая по кнопкам "больше"/"меньше" (выбор
"точно"), можно выставить любое значение числа машинных циклов в пределах
от 1 до 15.
По умолчанию, в поле "Послеустановка", выставляется 7 м.ц.
Обращаю Ваше внимание на то, что, в данном случае, речь идет не о значении
времени, а о количестве машинных циклов.
Послеустановка может оказаться полезной, например, в случаях ухода в прерывания
по переполнению таймера, если окончание цикла счета нужно "привязать" не к
моменту переполнения таймера, а к началу какого-то, интересующего конструктора,
"активного действия" (на практике, очень востребовано), например, к установке уровня
(уровней) на выводе (выводах) порта (и т.д.).
Сразу же, в начале ПП прерывания, этого сделать нельзя по той простой причине, что
нужно произвести подготовительные "мероприятия" (сохранение содержимого регистров
W и Status, банковская перестраховка или еще что-то первоочередное).
В данном случае, нужно просто подсчитать общее количество машинных циклов
исполнения этих команд (до "активного действия"), прибавить к этому количеству 2 м.ц.
(время исполнения "виртуальной" команды call: на "закладку" адреса возврата в стек,
требуется время), и полученный результат выставить в поле "Послеустановка".
В результате этого, утилита выдаст значение времени с момента начала счета (от
предустановленного значения) до момента начала, интересующего конструктора,
"активного действия", производимого в ПП прерывания.
Разработчики программы немного пожадничали, ограничив количество машинных циклов
послеустановки числом 15, но в тех случаях, когда "активное действие" производится в
начале ПП прерывания (сразу же после первоочередных "мероприятий"), этот "потолок"
вполне приемлем.
Утилиту TMR-X (а также и TMR-Y) желательно применять только в случаях работы с
прерываниями по переполнению таймеров.

3
Это обусловлено тем, что при "выводе наружу" результатов счета, посредством
организации стандартных проверок состояний флагов переполнений таймеров, велика
вероятность отклонения расчитанного значения времени счета от его фактического
значения.
Почему?
Потому, что проверка состояния любого флага производится не в течение одного
(идеал), а в течение трех машинных циклов (в предыдущем подразделе, я назвал
последствия этой "бяки" "неравномерным Гитлер капутом").
В этом случае, будет наблюдаться что-то типа "недолет – норма – перелет" (как
повезет).
Это нужно как следует прочувствовать и увидеть своими глазами.
Под это дело, я "набросал" программу автоколебательного мультивибратора, в которой
задействуется таймер TMR1, и производится проверка состояния флага его
переполнения (TMR1IF).
Можно перейти и на другой таймер. Суть от этого не меняется.
То, что Вы видите ниже (файл программы Multi_1.asm прилагается), предназначено для
работы в симуляторе: имеет место быть малый период импульсной последовательности
и малая длительность импульса (чтобы MPLAB быстрее считал), но ничто не мешает
увеличить и то, и другое.
;********************************************************************************
; Multi_1.asm Автоколебательный мультивибратор.
; Задействован модуль таймера TMR1.
; PIC16F628A Кварц 4 мГц.
;================================================================================
LIST p=16F628A ; Установка типа микроконтроллера.
__CONFIG 03F21H ; Бит защиты выключен, WDT выключен,
; стандартный XT - генератор.
;================================================================================
; Определение положения регистров специального назначения.
;================================================================================
PortB equ 06h ; Регистр управления защелками порта В.
CMCON equ 1Fh ; Регистр управления модулем компараторов.
PIR1 equ 0Ch ; Регистр флагов прерываний от периферийных
; модулей.
T1CON equ 10h ; Регистр управления модулем таймера TMR1.
TMR1L equ 0Eh ; Регистр младшего разряда TMR1.
TMR1H equ 0Fh ; Регистр старшего разряда TMR1.
;================================================================================
; Присвоение битам названий.
;================================================================================
TMR1IF equ 0 ; Флаг прерывания по переполнению TMR1.
;================================================================================
org 0 ; Начать выполнение программы с адреса 0 PC.
;********************************************************************************

;********************************************************************************
; Подготовительные операции.
;--------------------------------------------------------------------------------
movlw 7 ; Выключение модуля
movwf CMCON ; компараторов.
movlw b'00000001' ; Включение TMR1, внутренний такт,
movwf T1CON ; Кдел. предделителя = 1:1.
; Остальное - по умолчанию.
;------------------------------------
; Автоколебательный мультивибратор.
;------------------------------------
SNOVA movlw .255 ;
movwf TMR1H ; Предустановка TMR1.
movlw .243 ;
movwf TMR1L ;

WR btfss PIR1,TMR1IF ; Стандартная проверка состояния


goto WR ; флага (цикл - 3 м.ц.).

4
bcf PIR1,TMR1IF ; Программный сброс флага.

bsf PortB,2 ; Формирование


nop ; импульса
bcf PortB,2 ; (t = 2 м.ц.).

goto SNOVA ; Переход на новый цикл.

;********************************************************************************
end ; Конец программы.

Примечание: модуль компараторов я отключил "в привыкательных целях" (пусть "глаза


помозолит", хуже не будет). В данном случае, его можно и не отключать.
При замере в симуляторе времени цикла счета, я выставлял точку остановки на
команде goto SNOVA.
Результаты замеров сведены в таблицу:

Значение Тцикла (м.ц.) для коэффициента деления предделителя


TMR1L 1 -> 00000001 2 -> 00010001 4 -> 00100001
.243 24 39 63
.244 24 36 60
.245 24 33 57
.246 21 33 51
.247 21 30 48
.248 21 27 45

При работе с Кдел. = 1, в идеале, при изменении значения содержимого TMR1L на


единицу, длительность цикла должна меняться на 1 м.ц.
Теперь посмотрите на то, что происходит на самом деле.
А происходит "форменное безобразие" (линейность "корова языком слизала"), и оно
"порждает" накапливающийся (по мере увеличения Кдел.) "бадак".
Именно этот "бардак" я и имел ввиду, употребив в предыдущем подразделе
словосочетание "гуляющий период", но нужно сделать одну существенную поправку.
Ранее предполагалось, что, в случае циклического опроса состояния флага прерывания
по переполнению таймера (любого), за счет того, что опрос происходит не за один, а
за несколько машинных циклов, импульсная последовательность, “выведенная наружу”,
будет неравномерна ("гуляющий" период).
Результаты "симуляторных испытаний" этого предположения не подтвердили: при
фиксированных значениях констант, эта импульсная последовательность равномерна
(все циклы счета имеют одинаковое время).
Вопрос: "Так что же "гуляет""?
Ответ: "гуляет" фактическое значение времени цикла счета относительно своего
идеального (ожидаемого) значения.
Например, наивно ожидается такой, линейный порядок изменения времени цикла счета:
24, 23, 22, 21, 20, 19, а по факту имеется 24, 24, 24, 21, 21, 21 (см. таблицу).
Из чего у этой "бяки" "ноги растут"?
А все из того же: длительность цикла опроса состояния флага равна не одному, а
трем машинным циклам.
Из таблицы видно то, что, во всех случаях, число 3 четко прослеживается (на разные
лады), причем, при увеличении Кдел, кроме этого, имеют место быть и различия
кратные трем.
Вывод: если имеет место быть динамика сигнала ШИМ, например, в случае
программной реализации принципа широтно – импульсной модуляции, то использовать,
под это дело, проверку состояния флага прерывания по переполнению таймера
(любого) крайне не желательно, так как в этом случае, линейность модуляции
ухудшится за счет вносимых в нее погрешностей (см. таблицу).
Вопрос: "Как, в этом случае, быть"?
Ответ: "уйти" в прерывания. В этом случае, указанная выше "бяка", отсутствует.

5
А если динамики сигнала ШИМ нет, и нужно сформировать "незамысловатую"
импульсную последовательность, при фиксированных значениях Кдел предделителя и
предустановочных констант?
Нет проблем.
В этом случае, будет формироваться равномерная импульсная последовательность
(можете проверить в программе Multi_1.asm).
Только при этом нужно учесть, что имеет место быть описанное выше "расчетное
неудобство" (см. таблицу), в связи с чем, утилиту TMR-X (и TMR-Y) целесообразно
применять только для "грубого" расчета времени цикла счета, а его точное
(фактическое) значение нужно определять в симуляторе.
При работе же с прерываниями по переполнению таймеров, утилиту TMR-X (и TMR-Y)
можно (и нужно) использовать для точного расчета времени цикла счета.
Если счет происходит от внутреннего такта (CLKOUT) и выставлен Кдел = 1, то,
после разрешения работы от внутреннего такта (в программе Multi_1.asm - после
команды movwf T1CON), содержимое таймера инкрементируется каждый машинный
цикл, за исключением машинного цикла предустановки (включая и сброс в ноль).
Если таймер однобайтный (TMR0, TMR2), то инкрементируется содержимое
единственного его "счетного" регистра, а если 2-байтный (TMR1), то инкрементируется
содержимое регистра младшего разряда (TMR1L).
В этом можно легко убедиться (в окне RAM), вставив, в программу Multi_1.asm,
несколько NOPов сразу же после команды movwf T1CON (до предустановки) или после
команды movwf TMR1L (после предустановки), и пошагово ее исполняя.
При увеличении Кдел., инкремент будет происходить через 2, 4, 8 и т.д. машинных
циклов.
В соответствии со сказанным выше, моментом начала цикла счета является момент
окончания записи предустановочного числа (movwf TMR …) в регистр TMR1L (TMR0,
TMR2) .
С определением момента окончания счета, сложнее.
Формально (де-юре),
моментом окончания
цикла счета таймера
является момент
поднятия флага
прерывания по
переполнению
таймера, но в
пределах цикла
программной
процедуры (например,
от предыдущей
предустановки до
последующей
предустановки), де-
факто, он всегда
затягивается на
время исполнения
команд, входящих в
цикл этой
программной
процедуры.
То есть, на практике,
речь идет не о цикле
счета таймера, а о
времени исполнения
одного цикла
циклической
подпрограммы, в
которой этот таймер
задействуется.
6
Это относится как к работе с "уходом" в прерывания по переполнению любого
таймера, так и к работе с проверками состояний их флагов.
Сказанное лишний раз подтверждает практическую нужность поля "Послеустановка"
(в нем можно учесть "затяжку").

Утилита TMR-Y

Утилита TMR-Y это более "навороченный" вариант утилиты TMR-X.


Исходные данные для расчета:
- частота кварца,
- количество дополнительных машинных циклов после переполнения таймера,
- заданное время или частота (можно выбрать) цикла.
Что касается первого и последнего, то можно "настучать" любой (в пределах
дозволенного) номинал, в том числе и дробный.
Результат расчета:
- числовое значение предустановочного числа,
- коэффициент деления предделителя,
- фактическое (расчитанное) время цикла,
- процент ошибки (отклонение фактического времени цикла от заданного).
В поля "Наилучшее" выводятся результаты расчетов с минимальным процентом
ошибок.
Отсутствие результатов расчета в таблицах полей "8-битный результат" (TMR0,
TMR2) и/или "16-битный результат" (TMR1) свидетельствует о том, что приемлемых
результатов расчета либо нет, либо этот результат выходит за пределы технических
возможностей таймера.
Если в таблице расчета имеется строка (строки) с коэффициентом деления
предделителя, не применяемым в таймере, с которым Вы работаете, то эту строку
(строки) нужно просто проигнорировать.
По-моему, этот "сервис" очень удобен и существенно облегчает работу.

Утилита USART

С номиналом частоты кварца можно производить те же "манипуляции", что и при


работе с утилитами TMR-X и TMR-Y.
В поле "Выбор скорости", можно выбрать один из номиналов списка стандартных
скоростей обмена данными.
По умолчанию, выставляется скорость 9600 бод/cек.
Если, в выпадающем списке этого поля, щелкнуть по нужному Вам значению скорости,
то это значение
продублируется в поле
"Скорость" и
автоматически будет
произведен расчет.
В поле "Выбор
скорости", числовое
значение выбранной
скорости выделится
синим цветом.
Пока это выделение
будет иметь место быть,
можно, вращая колесико
мыши, перебрать все
стандартные номиналы
скоростей, причем, после
смены одной скорости на
другую, автоматически
производится расчет для
установленного номинала
скорости. Это очень удобно при проведении сравнительной оценки.
7
Если нужно выставить нестандартное значение скорости, то его нужно "настучать" в
поле "Скорость".
Если установить галочку в окошке "Кбод", то будет произведен расчет для скорости в
килободах.
При этом, значение этой скорости нужно "настучать" в поле "Скорость" (можно
выставлять дробные числа с десятичной точкой).
Если этого не сделать, то ранее установленное значение скорости (в бодах) будет
переведено в килободы, и Вы получите "суперскорость" (и соответствующий расчет).
В таблицу поля "Итог", выводится итог расчета для обеих скоростных режимов
(BRGH = 0 и 1).
В столбце "SPBRG", указывается десятичное значение константы, которую нужно
записать в регистр SPBRG.
В столбце "Скорость", указывается фактическое значение скорости.
В столбце "Ош. %", указывается процент отклонения фактического значения скорости
от заданного значения скорости.
В поле "Наилучшее", выводится результат расчета с наименьшим процентом
отклонения фактического значения скорости от заданного значения скорости.
Результаты этого расчета можно скопировать в буфер обмена.

Инструкция по скачке программы PIC – калькулятора.


На главной странице сайта, нужно щелкнуть по ссылке
"Форум. Тема: PIC контроллеры и все что с ними связано".
На открывшейся WEB странице, нужно найти подчеркнутое словосочетание
пойдет на пользу всем.
Скрытая ссылка находится на букве м.
По мере разблокировки утилит, я здесь же буду выкладывать "свежие" варианты
программы.

Надеюсь, что эта программа достойно пополнит "арсенал" Ваших "инструментов" и


будет хорошим подспорьем в работе.
Кроме этого, ее смело можно (и нужно) использовать в обучающих целях.

"Практикум по конструированию устройств на PIC контроллерах"      http://ikarab.narod.ru       E-mail: karabea@lipetsk.ru