Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Samouchitel

.pdf
Скачиваний:
16
Добавлен:
13.02.2015
Размер:
3.65 Mб
Скачать

8. О "плавающей" запятой.

Практическая необходимость в организации "плавающей" запятой появляется при наличии нескольких пределов измерений (подсчетов).

Если имеется только один предел измерения, как например, в программе 7-разрядного, "чистого" частотомера Kea.asm, то необходимости, в организации "плавающей" запятой, нет. Проще говоря, "проволочину", подключенную к 13-му выводу ПИКа (RB7), можно отключить, после чего, через гасящий резистор (примерно 470 ом.), подключить этот вывод к +5в. (запятая постоянно включена), и группу команд установки запятой можно аннулировать. При этом освобождается вывод порта В RB7, который можно использовать для чего-то другого.

Номинал гасящего резистора запятой нужно подобрать таким образом, чтобы яркость ее свечения (она будет светиться ярко) была примерно такой же, как и яркость свечения остальных сегментов.

Естественно, что после такого изменения текста программы (вмешательства в "святая святых"), необходимо произвести коррекцию интервала времени измерения в сторону его увеличения.

Примечание: в текст программы Kea.asm, группа команд установки запятой введена в

обучающих целях.

Для того чтобы организовать "плавающую" запятую (речь идет о программном изменении положения запятой, в зависимости от выставленного предела измерения), в текст программы Kea.asm, нужно ввести группу команд опроса клавиатуры и назначить дополнительный регистр общего назначения. Например, Pin.

Взависимости от результата опроса клавиатуры, в него будут записываться соответствующие константы (эту запись можно произвести ниже точки входа во 2-й и последующие "витки" полного цикла программы), которые и будут определять положения запятой.

А дальше все просто: в группе команд установки запятой, команда movlw 5 заменяется на команду movfw Pin.

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

Вдальнейшем, я в деталях расскажу, как именно организуется работа с "плавающей" запятой.

9. Пояснения к программам Retr_1.asm и Retr_3.asm.

Для программы Retr_1.asm.

Вданном случае, WDT (включен в битах конфигурации) работает без предделителя (предделитель включен перед TMR0, который не задействуется, и следовательно, предделитель отключен от WDT) и имеет время срабатывания примерно 18 мс. Учитывая то, что по ходу исполнения программы, он сбрасывается очень часто, этого времени с избытком хватает для обеспечения "безсбросной" отработки программы.

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

Вбитах № 0,1,2, можно выставить 0 (а можно и единицы или комбинацию нулей и единиц. Это не влияет на работу программы), плюс 0 в бите №3 (предделитель включен перед TMR0, а следовательно, отключен от WDT), плюс 0 в битах №4 и 5 (не имеет значения, можно выставить и 1), плюс 0 в битах №6 и 7 (определено заданием на разработку).

Вот и получается, что в регистр OptionR можно записать константу .00. Для программы Retr_3.asm.

Кроме сказанного выше, значение бита №6 не важно (уходов в прерывания нет). Поэтому в комментарии и сказано "остальное не существенно", но в битах №3 и 7 должны быть установлены нули.

Востальных битах, можно выставить "все что угодно" (не важно), но проще всего выставить нули. Что и сделано.

10. Как "загрузить" текст программы, в текстовый редактор MPLAB, из "Винворда" (расширение .doc) и других текстовых редакторов?

Например, текст программы находится в файле с расширением .doc.

В "Винворде", открываете этот файл, щелкаете по Выделить все, а затем, по Копировать. После этого, текст программы "уйдет" в буфер обмена.

281

Закрываете "Винворд" (появляется диалоговое окно с вопросом Нужно ли сделать

содержимое буфера обмена доступным другим приложениям, установленным на Вашем компьютере? Жмите Да).

Создаете проект (описано в "Самоучителе...").

Щелкаете по Вставить, и текст программы скопируется в пустое окно созданного Вами

ASM-файла.

Вернее всего, после этого, форматирование текста будет нарушено, и после ассемблирования, будет выдана ошибка Error 8 (HEX-файл создан не будет).

Если это так, то в соответствии с "правилом 12-ти пробелов", столбцы текста программы нужно выровнять.

После такого "наведения порядка", при условии, что в тексте программы нет ошибок, ассемблирование пройдет успешно.

При загрузке текстов программ из других текстовых редакторов, нужно руководствоваться описанным выше принципом.

Если использовать ASM-редактор Петра Высочанского (в нем осуществляется автоматическое форматирование), то работу по выравниванию столбцов можно существенно упростить.

11. К вопросу о точном и стабильном формировании величин измерительных интервалов времени.

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

Да, он будет нестабильным, если программист поленился (или не знает, как это сделать) произвести "выравнивание" сценариев, которые исполняются в "внутри" интервала времени измерения.

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

В "Самоучителе...", я пытаюсь объяснить, как избежать этого "ляпа".

Можно абсолютно точно ("по нулям"), программно сформировать высокостабильные величины интервалов времени измерения.

Например, точно 100 000, 1 000 000 или 10 000 000 машинных циклов (или другое количество м.ц.), и без каких бы то ни было "гуляний" (если произведено "выравнивание").

Обращаю внимание машинных циклов, а не микросекунд.

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

При таком "раскладе", речь идет не о программной, а об аппаратной нестабильности. Теоретически, при применении кварца на 4000000 Гц., 1 м.ц. = 1 мкс., но реально, формируется сигнал с частотой отличную от 4000000 Гц., плюс, дестабилизирующие факторы.

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

12. Для чего нужна команда andlw k ?

Чаще всего, эта команда (побитное "И" содержимого регистра W и 8-разрядной константы k) применяется при опросе клавиатуры, для "нейтрализации" тех битов байта, которые могут "исказить" результат опроса, ведь в подавляющем большинстве случаев, под клавиатуру задействуется всего-лишь несколько битов байта, а опрашивается-то весь байт.

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

Я это называю "нейтрализацией". Давайте разбираться.

Вподавляющем большинстве случаев, кнопки клавиатуры подключаются к выводам порта со

282

стороны младших его разрядов (RA0,1... или RB0,1...).

Это обусловлено тем, что после опроса состояний выводов порта (опроса клавиатуры), в большинстве случаев, отрабатывается процедура вычисляемого перехода, для которой редко когда требуется задействование битов с номерами 3...7.

Например, в ЧМ/ЦШ, клавиатура подключена к выводам RA0, RA1.

То есть, ПП опроса клавиатуры (включая и вычисляемый переход) рассчитана на работу с числами от .00 до .03.

Но ведь эти 2 бита являются только частью байта, и нормальная работа ПП опроса клавиатуры будет обеспечена только при нулевых уровнях в остальных 6-ти битах.

Вбитах №№ 5,6,7 нули будут присутствовать по определению (в PIC16F84A, биты №№ 5,6,7 всегда читаются как нули).

А вот с битами №№ 2,3,4 - сложнее: нужно разобраться с состояниями выводов RA2, RA3, RA4.

Проблем не будет, если эти выводы работают "на выход" и, перед опросом клавиатуры, все защелки порта А сброшены в 0.

При этом, защелки выводов RA0, RA1 тоже сбрасываются в 0, но это "по барабану", так как по причине их работы "на вход", выходы этих защелок, от выводов RA0, RA1 (к ним подключена клавиатура), отключены.

Вэтом случае все "ОК" и никаких проблем.

Именно такой случай и имеет место быть в программе ЧМ/ЦШ. Усложняем задачу.

Задействуем порт В.

Подключаем 2-хкнопочную клавиатуру к выводам RB0, RB1.

К оставшимся шести выводам, подключаем выходы внешних устройств.

Таким образом, перед опросом клавиатуры, все выводы порта В должны быть настроены на работу "на вход".

Вывод: состояния выходов всех защелок, на момент опроса, перестают влиять на результат опроса состояния выводов порта В (выходы всех защелок отключены от соответствующих выводов порта В), и результат опроса будет определяться состоянием клавиатуры

(RB0, RB1) и состояниями выходов внешних устройств (RB2...7).

Для нормального функционирования ПП вычисляемого перехода, с выводов RB2...7, необходимо считать нули.

Если это так, то все "OK" и никаких проблем, но на практике, часто встречаются случаи, когда выходы одного или нескольких внешних устройств находятся в состоянии 1.

В этом случае считается единица (единицы), после чего, в ПП вычисляемого перехода, рабочая точка программы будет "отфутболена" не туда, куда нужно, а "совсем в другую степь" (приращение PC будет больше ожидаемого), что есть не что иное, как нарушение работы программы.

Вопрос: "Как быть"?

Ответ: сразу же после опроса состояния выводов порта В (movf PortB,W) необходимо применить команду andlw b'00000011'.

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

Посмотрите на константу.

Биты с №№ 7...2 являются нулевыми, следовательно, биты с №№ 7...2 результата логической операции "И" также будут нулевыми.

Причем, вне зависимости от того, какие уровни считались при опросе клавиатуры с выводов RB2...7. Что и требуется.

Это то, что я называю "нейтрализацией" (можно придумать и другое название). Еще раз посмотрите на константу.

Биты с №№ 0, 1 являются единицами, следовательно, биты с №№ 0, 1 результата логической операции "И" будут в точности такими же, как и биты с №№ 0, 1 результата опроса состояния выводов порта В.

Вывод: биты результата опроса выводов порта В, с №№ 7...2, "нейтрализованы".

То есть, после исполнения команды andlw b'00000011', они гарантированно будут заменены нулями.

Состояния битов результата исполнения команды andlw b'00000011', с №№ 0, 1, будут в точности повторять состояния битов с №№ 0, 1 результата опроса порта В.

"Дешево и сердито".

283

Существуют и другие случаи применения команды andlw k.

Например, если производятся операции "в границах" полубайта, то ей можно "нейтрализовать" любой из полубайтов.

Также можно осуществить и выборочную "нейтрализацию" битов в байте.

13. О директиве INCLUDE и что такое goto $+N ?

Директива INCLUDE также, как и другие директивы, это всего-лишь "элемент удобства". В "Самоучителе...", в учебно-тренировочных целях, "шапка" программы оформляется по принципу "прописки" только нужного, и не более того (ничего лишнего).

И в будущем я собираюсь действовать так же.

То есть, прежде чем переходить к "удобствам", нужно как следует "вжиться структуру шапки". Для тех же, кто считает, что он в нее "вжился", и существует директива INCLUDE. Воспользовавшись директивой INCLUDE, можно "прописать всё оптом" (кроме регистров общего назначения), но этот "опт окажется за кадром".

Естественно, что после этого, "масса шапки" существенно уменьшается. А теперь детали.

При "вводе в эксплуатацию" директивы INCLUDE, "из недр" MPLAB извлекается и "подключается к работе" файл с расширением .INC, который есть не что иное, как "заготовка шапки" программы с уже "прописанными" в ней, по-максимуму, регистрами специального назначения (включая и "прописку" битов флагов, и "прописку" мест сохранения результатов операций).

Для каждого типа ПИКа имеется "свой" файл с расширением .INC, и все эти файлы находятся в папке MPLAB.

Откройте папку MPLAB, и Вы там их обнаружите целую "кучу".

Давайте просмотрим какой-нибудь из них, например, файл с названием P16F84a.INC (для

PIC16F84A).

Откройте этот файл.

Если при его открытии, Вы увидите вопрос С помощью какой программы открыть?, то выберете иконку программы MPLAB (а если ее нет в списке, то создайте).

После этого, в текстовом редакторе MPLAB, Вы увидите то, что после "ввода в

эксплуатацию" директивы INCLUDE, "будет находиться за занавесом".

Для того чтобы воспользоваться этим "добром", нужно "соблюсти некоторые формальности":

1.В рабочей части программы, названия регистров и битов должны быть в точности такими же, как и в тексте файла с расширением .INС.

То есть, если написано STATUS, то и нужно писать STATUS, а не как-то иначе (например, Status), а иначе будете получать сообщения об ошибках.

2.Несколько изменилась форма представления битов конфигурации (бит с названием ...

включить/выключить), поэтому нет необходимости "ломать голову" над определением значения числа, выражающего их состояния (например, 03FF1H).

Еще раз посмотрите в текст файла P16F84a.INC и обратите внимание на то, что регистры специального назначения 1-го банка (например, OPTION_REG, TRIS...) "прописаны" по своим фактическим адресам, то есть, 81h, 8...h, а не по адресам нулевого банка 01h, 0...h, которые я использую для написания текстов программ, не содержащих директивы INCLUDE.

То же самое относится и к файлам с расширением .INC других типов ПИКов.

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

После этого "на гора будет выдан" список сообщений с итогом Build completed successfully (успешное ассемблирование).

Все эти сообщения являются информирующими (Message). Они не являются ошибками (Error).

Типы, цифровые коды и содержание сообщений расписаны в "MPASM. Руководство пользователя".

Появление таких информирующих сообщений обусловлено "пропиской", в файле с расширением .INC, фактических адресов регистров специального назначения 1-го банка. Может возникнуть вопрос: "Почему в "Самоучителе...", во всех "шапках" программ, регистры специального назначения 1-го банка "прописываются" по адресам нулевого банка, а не по своим фактическим адресам?"

Ответ: чтобы избавиться от сообщений информативного характера типа Message[302], которых достаточно много.

284

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

Что такое goto $+N

Обращаю Ваше внимание на то, что речь идет не о символе S, а о символе $ (доллар). N – число "прыжка", которое может быть отображено в различных системах исчисления. Например, исполнение команды goto $+2 приведет к "прыжку" рабочей точки программы на 2-ю, после goto $+2, команду, по направлению сверху вниз.

Если вместо знака "+", использовать знак "-", то будет то же самое, но по направлению снизу вверх.

Подобрав числовое значение N и знак, можно "прыгнуть" (осуществить безусловный переход) туда, куда нужно.

При этом, отпадает необходимость в выставлении метки.

Команда goto $ "мертвяк" ("закольцовка" на саму себя, без возможности выхода). Команда goto $+1 заменяет два NOPа.

14.О выводе битов и байтов на выводы порта.

Вслучае вывода бита (битов), соответствующий (ие) вывод (ы) порта предварительно должен (ны) быть настроен (ы) на работу "на выход".

Если выводится весь байт, то все выводы порта предварительно должны быть настроены на работу "на выход".

"Настройка" направлений работы выводов порта осуществляется в регистре специального назначения TRIS…

Вывод бита с помощью команд BCF/BSF.

Для вывода бита, используются бит-ориентированные команды BCF (на выводе порта нулевой уровень) или BSF (на выводе порта единичный уровень).

"За один присест", можно вывести только один бит.

Если нужно последовательно изменить состояния, например, 3 битов, то необходимо так же последовательно, исполнить 3 бит-ориентированные команды BCF/BSF

Например, вывод нуля, на вывод RB4 (извиняюсь за тавтологию), будет выглядеть так: bcf PortB,4 (установить, на выходе защелки вывода RB4, нулевой уровень).

С учетом того, что RB4 работает "на выход", это соответствует формированию, на выводе RB4, нулевого уровня.

Вывод байта с помощью команды MOVWF.

Для вывода байта используется байт-ориентированная команда MOVWF. Предварительно, все выводы порта должны быть настроены на работу "на выход". Сначала, байт (число) должен быть скопирован в регистр W из какого-нибудь регистра

общего назначения или этот байт (число) должен быть константой, записанной в регистр W с помощью команды MOVLW.

Например: movwf PortB.

"Расшифровка": установка на выходах всех защелок порта В уровней, предварительно записанных в регистр W (при работе "на выход", выходы защелок подключены к выводам порта).

Еще проще: вывод содержимого регистра W в порт В.

Если в регистр W была записана константа, то она и будет выведена в порт В.

То же самое можно сказать и о случае копирования, в регистр W, содержимого какого-то регистра общего назначения, например, с названием ABCD (movf ABCD,W).

В большинстве случаев, в регистре ABCD "лежит" результат "долгой и кропотливой работы" программы (в динамике).

"Быстрый" вывод группы битов с количеством бОльшим 1, но меньшим 8-ми.

Особое место занимает случай, когда "за один присест" (без использования бит-ориентированных команд), в порт нужно вывести количество битов более одного, но менее восьми.

Предположим:

На выводы порта В с номерами 0,1,2,3 нужно вывести полубайт.

К выводам порта В с номерами 4,5,6,7 подключены выходы внешних устройств.

285

Что нужно сделать?

Перед выводом полубайта, необходимо "настроить" биты регистра TrisB следующим образом: выставить в битах с №№0,1,2,3 нули (работа выводов RB0,1,2,3 "на выход"), а в битах с №№4,5,6,7, выставить единицы (работа выводов RB4,5,6,7 "на вход").

Это выглядит так:

bsf

Status,RP0

; выбор 1-го банка (или bsf Status,5)

movlw

b'11110000'

; запись константы в аккумулятор

movwf

TrisB

; копирование числа 11110000, из W,

 

 

; в регистр TrisB

Если в дальнейшем не требуется производить каких-то операций с содержимым регистра (регистров) специального назначения 1-го банка, то после команды movwf TrisB, нужно выбрать 0-й банк (bcf Status,RP0 или bcf Status,5).

Всё. Выводы порта В "настроены" так, как было указано выше, и теперь можно "выводить наружу" полубайт.

Вопрос: "С выводами, настроенными на работу на выход, все ясно. На них будет выводиться полубайт. А не повлияет ли процесс вывода полубайта на состояния остальных 4-х выводов, настроенных на работу на вход?"

Ответ: нет, не повлияет (хотя на выходах защелок выводов RB4,5,6,7 выставятся какие-то уровни. В данном случае, не важно какие) по той причине, что выходы этих защелок электрически отключены от выводов RB4,5,6,7 (работа "на вход").

Уровни, присутствующие на выводах RB4,5,6,7, если в дальнейшем они не будут перестраиваться на работу "на выход", полностью определяются состояниями выходов внешних устройств, подключенных к ним.

В регистр W должна быть записана либо константа (movlw k, где k - константа), либо в него должно быть скопировано содержимое регистра общего назначения, в котором хранится результат предшествующей работы программы (movf ABCD,W).

Затем, movwf PortB, и дело сделано.

Вопрос: "А если нужно, например, вывести три бита. И не соседних друг с другом, а допустим,

с №№1,4,7?"

Ответ: они выводятся так же, как и в описанном выше случае, только нужно внести коррективы в значение константы, записываемой в регистр TrisB.

Для случая работы остальных выводов порта В "на вход", она будет выглядеть так: 01101101 Существуют и другие разновидности вывода "наружу" группы битов с количеством бОльшим 1, но меньшим 8-ми.

Руководствуясь сказанным выше, плюс немного смекалки, можно реализовать любую разновидность вывода.

15. Пример организации 3-байтного счетчика.

 

..................

 

; Команды программы.

 

movlw

L

; Запись константы L

 

movwf

SecL

; в регистр SecL.

 

movlw

M

; Запись константы M

 

movwf

SecM

; в регистр SecM.

 

movlw

H

; Запись константы H

 

movwf

SecH

; в регистр SecH.

 

..................

 

; Другие команды программы

 

..................

 

; (могут быть, а могут и не быть).

PAUSE

decfsz

SecL,F

;

 

goto

PAUSE

; Классический

 

decfsz

SecM,F

; 3-х байтный

 

goto

PAUSE

; вычитающий

 

decfsz

SecH,F

; счетчик.

 

goto

PAUSE

;

 

goto .............

 

; Переход туда, куда нужно или без этой команды,

 

..................

 

; если работа происходит на "линейном" участке

 

..................

 

; программы.

При помощи такого счетчика можно обеспечить достаточно длительные задержки.

286

По такому же принципу можно "сконструировать" счетчик любой "байтности". То, что Вы видите, это классический 3-байтный вычитающий счетчик. Заменив decfsz на incfsz, получите суммирующий счетчик.

Применив и decfsz, и incfsz, получите комбинированный счетчик.

Номиналы констант зависят и от конструкции счетчика (в том числе и с учетом "врезок"), и от величины требуемой задержки.

"Самоучитель по программированию PIC контроллеров для начинающих" http://ikarab.narod.ru E-mail: karabea@lipetsk.ru

287

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]