Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
Скачать 3.49 Mb.
|
http://ikarab.narod.ru E-mail: karabea@lipetsk.ru 279 Дополнительно. О задержках программы. При применении кварца на 4 мГц, максимально возможная частота мультивибратора составляет 50 кГц Если нужно получить частоту выше чем 50 кГц, то нужно применить кварц с частотой более мГц Если нужно получить частоту порядка нескольких герц или долей герца (или еще ниже, то нужно применить не однобайтный , а 2- х или 3- хбайтный счетчик Для решения большинства задач, связанных сформированием низкочастотных сигналов, обычно, достаточно и 2- хбайтного счетчика, работа которого описана при "разборках " с программой cus.asm N однобайтных счетчиков (задержки отрабатываются последовательно, не есть N- байтный счетчик . Например , в случае применения 2- хбайтного счетчика, обеспечивается гораздо бОльшая задержка, чем в случае последовательной отработки двух задержек, формируемых однобайтными счетчиками. Информация по работе с портами . Не стОит пытаться управлять защелками выводов портов из "шапки " программы Из этого ничего путного не получится После безошибочной "прописки " регистров, PortA, TrisB, PortB (а также и других регистров специального назначения) по адресам, указанным в распечатке области оперативной памяти, про эти строки (в "шапке " программы) можно вообще "забыть " (условно. Управление защелками портов осуществляется только в рабочей части программы . Если нужно изменить состояние только одной из защелок, то используются бит- ориентированные команды bcf или bsf Если нужно изменить состояния сразу нескольких защелок (или вообще всех, то используются байт- ориентированные команды Например , необходимо установить на выводах, RB1, RB2, RB3, RB4, RB5, RB6, RB7 : 1, 0, 0, 1, 1, 0, 0, 0 соответственно Для реализации этого действия, в регистр PortB, нужно записать число 00011001 Непосредственно , записать константу, в регистр PortB, нельзя Это можно сделать только через регистр W Делается это так movlw b'00011001' movwf Вместо можно использовать число .25 или 19h. К соответствующим выводам портов, выходы защелок подключаются только тогда, когда эти выводы настроены на работу "на выход. От выводов портов, настроенных на работу "на вход, выходы соответствующих защелок отключены Переключениями направлений работы выводов портов "рулят " биты регистров TrisA и TrisB Вывод из этого следующий программа "способна" управлять состояниями или только тех выводов портов, которые настроены на работу "на выхода состояния выводов портов, настроенных на работу "на вход, будут определяться внешними источниками сигналов. Если вернуться к приведенному выше примеру и предположить , что например, выводы, RB1, RB2, настроены на работу на выхода выводы, RB5, RB6, настроены на работу на вход, то после исполнения указанных выше двух команд, на выводах, RB1, RB2, установятся, 0, 0, соответственно, а состояния выводов, RB5, RB6, будут определяться внешними источниками сигналов, несмотря на то, что на выходах защелок этих выводов установятся, 0, 0, 0 соответственно Что касается последнего, то, по большому счету, толку от этой установки – никакого 280 Также, как и от установки любой комбинации нулей и единиц , ведь выходы этих защелок не подключены к выводам порта В 3. О надежности работы программы. Вопрос по программе "Какой смысл включать первые 4 команды ПП Start в полный цикл программы, ведь исполнив их один раз (нам "витке "), далее, их можно не исполнять "? То есть, речь идет о выставлении метки на команде и о замене команды Start в рабочей части программы) на команду название метки Представьте себе достаточно обычную ситуацию плохой контакт с батарейкой или посети "прошла " импульсная помеха в то время, когда мультивибратор работает Если при этом произойдет "несанкционированное " изменение содержимого регистров Status и / или TrisB , то устройство может перестать работать (простейший случай зависания программы. В этом случае, восстановить работоспособность устройства можно только после выключения и последующего включения питания Если же безусловный переход осуществляется в ПП Start , тов случае наличия "бяки ", последствия этого сбоя будут устранен наследующем "витке " полного цикла программы, без манипуляций с выключателем питания То есть, речь идет о "перестраховке ", необходимость которой определяет программист Она вовсе необязательна, но знать об этом нужно (в жизни всякое бывает "). 4. О директиве EQU. При присвоении битам регистров специального назначения их названий (в "шапке " программы, названия битов повторяться не должны, но номера битов повторяться могут Например , биту можно одновременно присвоить названия С и RBIF ( С equ и equ 0 ). В этом случае, если рабочая часть команды, то команда обратится к биту № 0 регистра, а если рабочая часть команды, то команда обратится к биту № 0 регистра. О регистре OptionR. В "шапках " текстов программа следовательно ив рабочих частях программ, название регистра специального назначения OPTION обязательно должно иметь в своем названии букву R Я пишу так Если название этого регистра не будет содержать буквы, то после ассемблирования текста программы, выдаст сообщение об ошибке и файл создан не будет ( можете проверить. 6. Чем отличается PIC16F84 от PIC16F84A . По "цоколевке ", они полные аналоги Есть отличия в электрических и временнЫх характеристиках, но они не очень существенны С точки зрения обеспечения лучших временнЫх характеристик, более предпочтителен PIC16F84A С точки зрения обеспечения лучших электрических характеристик, более предпочтителен PIC16F84 Так как основная часть устройств, собранных на этих м / контроллерах , работает в электрических режимах, которые далеки от предельно допустимых, тов этом случае, предпочтение нужно отдавать PIC16F84A Сравнительная таблица электрических и временных характеристик этих ПИКов "лежит " на странице 78 даташита PIC16F84A 7. Каков верхний предел быстродействия PIC16F84A по его счетному входу ( вывод RA4/TOCKI )? Перестраховочный " вариант разработчиков - 30 Мгц ., но реально, он выше Вполне обычным является "потолок " 50 … 60 Мгц ., а для некоторых "выдающихся экземпляров ", и выше Но на это уповать не стОит Короче , кому как повезет 281 8. О "плавающей" запятой. Практическая необходимость в организации "плавающей " запятой появляется при наличии нескольких пределов измерений (подсчетов. Если имеется только один предел измерения, как например, в программе 7- разрядного, чистого " частотомера, то необходимости, в организации "плавающей " запятой, нет Проще говоря, " проволочину ", подключенную к 13- му выводу ПИКа ( RB7 ), можно отключить, после чего, через гасящий резистор (примерно 470 ом, подключить этот вывод к +5 в ( запятая постоянно включена, и группу команд установки запятой можно аннулировать При этом освобождается вывод порта В RB7 , который можно использовать для чего- то другого Номинал гасящего резистора запятой нужно подобрать таким образом, чтобы яркость ее свечения (она будет светиться ярко) была примерно такой же, как и яркость свечения остальных сегментов Естественно , что после такого изменения текста программы (вмешательства в "святая святых "), необходимо произвести коррекцию интервала времени измерения в сторону его увеличения Примечание : в текст программы Kea.asm, группа команд установки запятой введена в обучающих целях Для того чтобы организовать "плавающую " запятую (речь идет о программном изменении положения запятой, в зависимости от выставленного предела измерения, в текст программы Kea.asm, нужно ввести группу команд опроса клавиатуры и назначить дополнительный регистр общего назначения Например , Pin В зависимости от результата опроса клавиатуры, в него будут записываться соответствующие константы (эту запись можно произвести ниже точки входа во 2- й и последующие "витки " полного цикла программы, которые и будут определять положения запятой А дальше все просто в группе команд установки запятой, команда заменяется на команду Естественно, что количество положений запятой может быть и более двух Это зависит от замысла программы В дальнейшем , я в деталях расскажу, как именно организуется работа с "плавающей " запятой. Пояснения к программам Retr_1.asm и Retr_3.asm . Для программы Retr_1.asm В данном случае, WDT (включен в битах конфигурации) работает без предделителя ( предделитель включен перед, который не задействуется , и следовательно , предделитель отключен от) и имеет время срабатывания примерно 18 мс Учитывая то, что походу исполнения программы, он сбрасывается очень часто, этого времени с избытком хватает для обеспечения " безсбросной " отработки программы То есть, в данном случае, необходимости в подключении предделителя , к, нет, и не нужно "ломать голову " над заданием его коэффициента деления В битах № 0,1,2, можно выставить 0 (а можно и единицы или комбинацию нулей и единиц Это не влияет на работу программы, плюс 0 в бите № 3 ( предделитель включен переда следовательно, отключен от, плюс 0 в битах № 4 и 5 (не имеет значения, можно выставить и 1), плюс 0 в битах № 6 и 7 (определено заданием на разработку. Вот и получается , что в регистр OptionR можно записать константу .00. Для программы Retr_3.asm Кроме сказанного выше, значение бита неважно (уходов в прерывания нет. Поэтому в комментарии и сказано "остальное несущественно, нов битах и 7 должны быть установлены нули В остальных битах, можно выставить "все что угодно " (неважно, но проще всего выставить нули Что и сделано 10. Как "загрузить" текст программы, в текстовый редактор MPLAB, из " Винворда " расширение) и других текстовых редакторов Например, текст программы находится в файле с расширением .doc В " Винворде ", открываете этот файл, щелкаете по Выделить все, а затем , по Копировать После этого, текст программы "уйдет " в буфер обмена 282 Закрываете " Винворд " (появляется диалоговое окно с вопросом Нужно ли сделать содержимое буфера обмена доступным другим приложениям, установленным на Вашем компьютере ? Жмите Да ). Создаете проект (описано в "Самоучителе. Щелкаете по Вставить , и текст программы скопируется в пустое окно созданного Вами ASM- файла Вернее всего, после этого, форматирование текста будет нарушено, и после ассемблирования , будет выдана ошибка Error 8 (HEX- файл создан не будет. Если это тактов соответствии с "правилом 12- ти пробелов ", столбцы текста программы нужно выровнять После такого "наведения порядка ", при условии, что в тексте программы нет ошибок, ассемблирование пройдет успешно При загрузке текстов программ из других текстовых редакторов, нужно руководствоваться описанным выше принципом Если использовать ASM- редактор Петра Высочанского (в нем осуществляется автоматическое форматирование, то работу по выравниванию столбцов можно существенно упростить. К вопросу о точном и стабильном формировании величин измерительных интервалов времени. Недавно просмотрел один из форумов, на котором обсуждался этот вопрос и обнаружил ссылки намой сайт, смысл которых в том , что я, якобы, утверждаю, что сформированный программными средствами интервал времени измерения будет нестабильным Да , он будет нестабильным, если программист поленился (или не знает, как это сделать) произвести "выравнивание " сценариев, которые исполняются в "внутри " интервала времени измерения Естественно , что такое может быть, но это свидетельствует только о недостаточно высоком уровне профессионализма В "Самоучителе, я пытаюсь объяснить, как избежать этого "ляпа ". Можно абсолютно точно (по нулям "), программно сформировать высокостабильные величины интервалов времени измерения Например , точно 100 000, 1 000 000 или 10 000 000 машинных циклов ( или другое количеством ц, и без каких бы тони было "гуляний " (если произведено "выравнивание "). Обращаю внимание машинных циклов, а не микросекунд Количество машинных циклов, за время которых формируется интервал времени измерения, определяется только программой и не подвержено воздействию дестабилизирующих факторов (например, температуры. При таком "раскладе ", речь идет не о программной , а об аппаратной нестабильности Теоретически , при применении кварца на 4000000 Гц, 1 м ц . = 1 мкс, но реально, формируется сигнал с частотой отличную от 4000000 Гц, плюс, дестабилизирующие факторы По этим причинам, требуются и коррекция частоты тактового генератора ПИКа (по эталонному частотомеру, и принятие мер по "сглаживанию " негативного влияния дестабилизирующих факторов ( термокомпенсация или применение термостатирования. Если принять меры по минимизации этих источников погрешностей / нестабильности , то с учетом сказанного (по нулями "выравнивание "), можно " сваять " классное, измерительное устройство. Для чего нужна команда k ? Чаще всего, эта команда ( побитное "И" содержимого регистра W и 8- разрядной константы) применяется при опросе клавиатуры, для "нейтрализации " тех битов байта, которые могут "исказить " результат опроса, ведь в подавляющем большинстве случаев, под клавиатуру задействуется всего- лишь несколько битов байта, а опрашивается - то весь байт В этих "вредоносных " битах, нужно просто выставить нули, не воздействуя при этом на "рабочие " биты Я это называю "нейтрализацией ". Давайте разбираться В подавляющем большинстве случаев, кнопки клавиатуры подключаются к выводам порта со 283 стороны младших его разрядов (или. Это обусловлено тем, что после опроса состояний выводов порта (опроса клавиатуры, в большинстве случаев, отрабатывается процедура вычисляемого перехода, для которой редко когда требуется задействование битов с номерами 3...7. Например, в ЧМ / ЦШ , клавиатура подключена к выводам RA0, То есть, ПП опроса клавиатуры (включая и вычисляемый переход) рассчитана на работу с числами от .00 до .03. Но ведь эти 2 бита являются только частью байта, и нормальная работа ПП опроса клавиатуры будет обеспечена только при нулевых уровнях в остальных 6- ти битах В битах №№ 5,6,7 нули будут присутствовать по определению вбиты всегда читаются как нули. А вот с битами №№ 2,3,4 - сложнее нужно разобраться с состояниями выводов, RA3, Проблем не будет, если эти выводы работают "на выходи, перед опросом клавиатуры, все защелки порта А сброшены в 0. При этом, защелки выводов, тоже сбрасываются в 0, но это "по барабану ", так как по причине их работы "на вход ", выходы этих защелок, от выводов, RA1 (к ним подключена клавиатура ) , отключены В этом случае все " ОК " и никаких проблем Именно такой случай и имеет место быть в программе ЧМ / ЦШ Усложняем задачу Задействуем порт В Подключаем 2- хкнопочную клавиатуру к выводам RB0, RB1 К оставшимся шести выводам, подключаем выходы внешних устройств Таким образом, перед опросом клавиатуры, все выводы порта В должны быть настроены на работу "на вход ". Вывод : состояния выходов всех защелок, на момент опроса, перестают влиять на результат опроса состояния выводов порта В (выходы всех защелок отключены от соответствующих выводов порта В ), и результат опроса будет определяться состоянием клавиатуры, RB1 ) и состояниями выходов внешних устройств ( RB2...7 ). Для нормального функционирования ПП вычисляемого перехода, с выводов RB2...7, необходимо считать нули Если это так, то все "OK" и никаких проблемно на практике, часто встречаются случаи, когда выходы одного или нескольких внешних устройств находятся в состоянии 1. В этом случае считается единица (единицы, после чего, в ПП вычисляемого перехода, рабочая точка программы будет " отфутболена " не туда, куда нужно, а "совсем в другую степь " ( приращение PC будет больше ожидаемого, что есть нечто иное, как нарушение работы программы Вопрос : "Как быть "? Ответ : сразу же после опроса состояния выводов порта В ( movf PortB,W ) необходимо применить команду Логика операции "И" такова, что если хотя бы один из битов равен 0, то результат этой операции будет нулевым Посмотрите на константу Биты с 7...2 являются нулевыми, следовательно, биты с 7...2 результата логической операции "И" также будут нулевыми Причем , вне зависимости оттого, какие уровни считались при опросе клавиатуры с выводов |