Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
![]()
|
RB2...7 Что и требуется Это то, что я называю "нейтрализацией " (можно придумать и другое название. Еще раз посмотрите на константу Биты с 0, 1 являются единицами, следовательно, биты с 0, 1 результата логической операции "И" будут в точности такими же, как и биты с 0, 1 результата опроса состояния выводов порта В Вывод : биты результата опроса выводов порта В , с 7...2, "нейтрализованы ". То есть, после исполнения команды b'00000011' , они гарантированно будут заменены нулями Состояния битов результата исполнения команды andlw b'00000011' , сбудут в точности повторять состояния битов с 0, 1 результата опроса порта В " Дешево и сердито ". 284 Существуют и другие случаи применения команды Например, если производятся операции "в границах " полубайта, то ей можно "нейтрализовать " любой из полубайтов Также можно осуществить и выборочную "нейтрализацию " битов в байте 13. О директиве INCLUDE и что такое $+N ? Директива INCLUDE также , как и другие директивы, это всего- лишь "элемент удобства ". В "Самоучителе, в учебно - тренировочных целях, "шапка " программы оформляется по принципу "прописки " только нужного, и не более того (ничего лишнего. Ив будущем я собираюсь действовать также То есть, прежде чем переходить к "удобствам ", нужно как следует "вжиться структуру шапки ". Для тех же, кто считает, что он в нее "вжился ", и существует директива INCLUDE Воспользовавшись директивой, можно "прописать всё оптом " (кроме регистров общего назначения, но этот " опт окажется за кадром ". Естественно, что после этого, "масса шапки " существенно уменьшается А теперь детали При "вводе в эксплуатацию " директивы, "из недр " извлекается и "подключается к работе " файл с расширением .INC , который есть нечто иное, как "заготовка шапки " программы с уже "прописанными " в ней , по- максимуму, регистрами специального назначения (включая и "прописку " битов флагов, и "прописку " мест сохранения результатов операций. Для каждого типа ПИКа имеется "свой " файл с расширением .INC , и все эти файлы находятся в папке MPLAB Откройте папку MPLAB, и Вы там их обнаружите целую "кучу ". Давайте просмотрим какой- нибудь из них, например, файл с названием P16F84a.INC (для. Откройте этот файл Если при его открытии, Вы увидите вопрос С помощью какой программы открыть, то выберете иконку программы (а если ее нет в списке , то создайте. После этого, в текстовом редакторе MPLAB, Вы увидите то, что после "ввода в эксплуатацию " директивы "будет находиться за занавесом ". Для того чтобы воспользоваться этим "добром ", нужно "соблюсти некоторые формальности ": 1. В рабочей части программы, названия регистров и битов должны быть в точности такими же, как ив тексте файла с расширением .IN С То есть, если написано, то и нужно писать, а не как- то иначе (например, Status ), а иначе будете получать сообщения об ошибках 2. Несколько изменилась форма представления битов конфигурации (бит с названием ... включить / выключить ), поэтому нет необходимости "ломать голову " над определением значения числа, выражающего их состояния (например, 03FF1H). Еще раз посмотрите в текст файла P16F84a.INC и обратите внимание на то, что регистры специального назначения 1- го банка (например, OPTION_REG, TRIS... ) "прописаны " по своим фактическим адресам, то есть, 81h, 8...h, а не по адресам нулевого банка 01h, 0...h, которые я использую для написания текстов программ, не содержащих директивы INCLUDE То же самое относится и к файлам с расширением .INC других типов ПИКов Допустим , что текст программы, в которой используется директива, не содержит ошибок После этого "на гора будет выдан " список сообщений с итогом Build completed успешное ассемблирование ). Все эти сообщения являются информирующими (Message). Они не являются ошибками (Error). Типы, цифровые коды и содержание сообщений расписаны в "MPASM. Руководство пользователя. Появление таких информирующих сообщений обусловлено "пропиской ", в файле с расширением .INC, фактических адресов регистров специального назначения 1- го банка Может возникнуть вопрос "Почему в "Самоучителе, во всех "шапках " программ, регистры специального назначения 1- го банка "прописываются " по адресам нулевого банка, а не по своим фактическим адресам" Ответ чтобы избавиться от сообщений информативного характера типа Message[302], которых достаточно много 285 При этом, я руководствуюсь тем соображением, что на первых порах, нежелательно распылять свое внимание на просмотри анализ каких- то длинных списков сообщений При "вводе в эксплуатацию " директивы, должны быть применены специальные символы, ив "шапке " программы, написание названия INC- файла не должно отличаться от написания названия соответствующего INC- файла, "лежащего " в папке MPLAB Что такое goto $+N Обращаю Ваше внимание на то, что речь идет не о символе S , а о символе (доллар. N – число "прыжка ", которое может быть отображено в различных системах исчисления Например , исполнение команды приведет к "прыжку " рабочей точки программы на 2- ю, после $+2 , команду, по направлению сверху вниз Если вместо знака " + ", использовать знак " - ", то будет тоже самое, но по направлению снизу вверх Подобрав числовое значение N и знак, можно "прыгнуть " (осуществить безусловный переход) туда, куда нужно При этом, отпадает необходимость в выставлении метки Команда goto $ "мертвяк " (" закольцовка " на саму себя, без возможности выхода. Команда заменяет два NOP а 14. О выводе битов и байтов на выводы порта. В случае вывода бита (битов, соответствующий ( ие ) выводы) порта предварительно должен ( ны ) быть настроены) на работу "на выход ". Если выводится весь байт, то все выводы порта предварительно должны быть настроены на работу "на выход ". Настройка " направлений работы выводов порта осуществляется в регистре специального назначения TRIS… Вывод бита с помощью команд BCF / BSF. Для вывода бита, используются бит- ориентированные команды (на выводе порта нулевой уровень) или (на выводе порта единичный уровень. За один присест ", можно вывести только один бит Если нужно последовательно изменить состояния, например, 3 битов, то необходимо также последовательно, исполнить 3 бит- ориентированные команды BCF / BSF Например , вывод нуля, на вывод извиняюсь за тавтологию, будет выглядеть так bcf PortB,4 (установить, на выходе защелки вывода RB4, нулевой уровень. С учетом того, что RB4 работает "на выход ", это соответствует формированию, на выводе, нулевого уровня Вывод байта с помощью команды MOVWF. Для вывода байта используется байт- ориентированная команда MOVWF Предварительно , все выводы порта должны быть настроены на работу "на выход ". Сначала, байт (число) должен быть скопирован в регистр W из какого- нибудь регистра общего назначения или этот байт (число) должен быть константой, записанной в регистр W с помощью команды MOVLW Например : movwf Расшифровка ": установка на выходах всех защелок порта В уровней , предварительно записанных в регистр W при работе "на выход ", выходы защелок подключены к выводам порта ) Еще проще вывод содержимого регистра W в порт В Если в регистр W была записана константа, то она и будет выведена в порт В То же самое можно сказать и о случае копирования, в регистр W, содержимого какого- то регистра общего назначения, например, с названием ABCD ( movf ABCD,W ). В большинстве случаев, в регистре ABCD "лежит " результат "долгой и кропотливой работы " программы (в динамике. Быстрый" вывод группы битов с количеством бОльшим 1, но меньшим ми. Особое место занимает случай, когда "за один присест " (без использования бит- ориентированных команд, в порт нужно вывести количество битов более одного, но менее восьми Предположим : На выводы порта В с номерами 0,1,2,3 нужно вывести полубайт К выводам порта В с номерами 4,5,6,7 подключены выходы внешних устройств 286 Что нужно сделать Перед выводом полубайта, необходимо "настроить " биты регистра TrisB следующим образом выставить в битах с нули (работа выводов "на выход "), а в битах с, выставить единицы (работа выводов "на вход "). Это выглядит так bsf Status,RP0 ; выбор го банка (или Status,5) movlw b'11110000' ; запись константы в аккумулятор movwf TrisB ; копирование числа 11110000, изв регистр Если в дальнейшем не требуется производить каких- то операций с содержимым регистра ( регистров ) специального назначения 1- го банка, то после команды TrisB , нужно выбрать 0- й банк ( bcf или Status,5 ). Всё Выводы порта В "настроены " так, как было указано выше, и теперь можно "выводить наружу " полубайт Вопрос : " С выводами , настроенными на работу на выход, все ясно На них будет выводиться полубайт А не повлияет ли процесс вывода полубайта на состояния остальных 4- х выводов , настроенных на работу на вход" Ответ нет, не повлияет (хотя на выходах защелок выводов RB4,5,6,7 выставятся какие- то уровни В данном случае, неважно какие) по той причине, что выходы этих защелок электрически отключены от выводов (работа "на вход "). Уровни, присутствующие на выводах, если в дальнейшем они не будут перестраиваться на работу "на выход ", полностью определяются состояниями выходов внешних устройств, подключенных к ним В регистр W должна быть записана либо константа k , где - константа, либо в него должно быть скопировано содержимое регистра общего назначения, в котором хранится результат предшествующей работы программы ABCD,W ). Затем, movwf PortB , и дело сделано Вопрос : " А если нужно, например, вывести три бита И не соседних друг с другом , а допустим , с" Ответ они выводятся также, как ив описанном выше случае, только нужно внести коррективы в значение константы, записываемой в регистр TrisB Для случая работы остальных выводов порта В "на вход ", она будет выглядеть так Существуют и другие разновидности вывода "наружу " группы битов с количеством бОльшим 1, но меньшим 8- ми Руководствуясь сказанным выше, плюс немного смекалки, можно реализовать любую разновидность вывода. Пример организации 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 ; Классический SecM,F ; х байтный goto PAUSE ; вычитающий SecH,F ; счетчик. goto PAUSE ; goto ............. ; Переход туда, куда нужно или без этой команды, .................. ; если работа происходит на "линейном" участке. ; программы. При помощи такого счетчика можно обеспечить достаточно длительные задержки 287 По такому же принципу можно "сконструировать " счетчик любой " байтности ". То, что Вы видите, это классический 3- байтный вычитающий счетчик Заменив decfsz на incfsz , получите суммирующий счетчик Применив и, и, получите комбинированный счетчик Номиналы констант зависят и от конструкции счетчика (в том числе и с учетом "врезок "), и от величины требуемой задержки " Самоучитель по программированию PIC контроллеров для начинающих" http://ikarab.narod.ru E-mail: karabea@lipetsk.ru |