Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
Скачать 3.49 Mb.
|
call После возврата по стеку, программа будет исполняться далее В данном случае, ПП TABLE размещена в конце программы, но ее можно разместить ив начале программы Посмотрите в текст программы Fsr.asm После команды TABLE , Вы видите "линейный " участок из 4 последовательно исполняемых групп команд Детально , их состав и работа будут рассмотрены на 2- м этапе "разборок ", а пока , буквально пару слово нихЗачем нужна группа команд установки запятой, понятно уже из ее названия Группа команд формирования адресного кода управления дешифратором формирует этот самый адресный код Ранее , я "привязал " дешифратор к м / схеме 555 ИД 7, имеющей 3 адресных входа и 8 выходов ( да будет так. В зависимости от адресного кода, на каком- либо одном из 8- ми выходов дешифратора устанавливается 0 (на остальных 1). В результате этого, активируется тот 7- сегментный индикатор линейки, к общим катодам которого подключен этот выход Возникает вопрос "M ожно ли обойтись без внешнего дешифратора, передав его функции микроконтроллеру Ответ : да , можно, но только в случае наличия еще одного (кроме двух задействованных) 8- выводного порта, к которому , в этом случае, могут быть подключены 8 выводов общих катодов 7- сегментных индикаторов линейки В PIC16F84A , третьего порта нет и поэтому применение внешнего дешифратора необходимо Для микроконтроллеров, с количеством портов не менее 3- х, дешифратор можно организовать программно 232 В этом случаев вниманию "заготовку " программы, на место группы команд формирования адресного кода управления дешифратором, нужно "поставить " группу команд, которая реализует дешифратор Группа команд вывода на индикацию символов десятичных цифр также в особых пояснениях не нуждается тот или иной символ десятичной цифры, в виде перекодированного байта, банально записывается в защелки порта В Вывод символа на индикацию будет осуществлен в тот 7- сегментный индикатор, на общих катодах которого дешифратор установил 0. Функция группы команд задержки, определяющей время нахождения одного 7- сегментного индикатора в активном состоянии, ясна из названия этой группы команд В ней осуществляется подбор числового значения времязадающей константы (констант. Предположим, что один "виток " малого кольца индикации "отмотан ", и произошел переход наследующий его "виток ". Для того чтобы, на этом "витке ", обеспечить обработку байта, хранящегося в следующем (по порядку старшинства) е, - изменение адресного кода дешифратора, приводящее к активации следующего (по порядку старшинства) знакоместа, необходимо увеличить, на 1, содержимое "рулевого " регистра, которое и происходит после исполнения команды После инкремента содержимого регистра, нужно обязательно проверить, а не закончилась ли отработка цикла большого кольца индикации (после этого, нужно переходить наследующий цикл Или по- другому не установилась ли, в регистре Index, восьмерка Для этого, организуется проверочная группа команд, с задействованием флага нулевого результата Z Это мы уже проходили Отличие заключается только в том , что вместо команды операции с константой ( sublw ), используется команда операции с содержимым регистра ( subwf ), к которому эта команда обращается В регистр W, записывается константа .08. Флаг Z сбрасывается в 0 (а можно и не сбрасывать, так как это флаг 1- й группы ). Из содержимого регистра Index, вычитается содержимое регистра (то есть, число .08), и после этого, проверяется состояние флага нулевого результата Z Результат этой операции будет нулевым только в том случае, если в регистре Index будет "лежать " число .08. Если число, "лежащее " в регистре Index, отлично от восьмерки, то после проверки состояния флага, произойдет безусловный переход в ПП CYCLE , то есть, на новый "виток " малого кольца индикации, после чего, описанная выше "цепочка событий " повторится, но только будет обрабатываться содержимое следующего, по старшинству, LED а Если число, "лежащее " в регистре Index, будет равно 8- ми, то после проверки состояния флага, команда будет проигнорирована (вместо нее, исполняется "виртуальный " nop ), и будет отработан сценарий типа "программа исполняется далее ". Если это так, то выполняется выравнивающий nop В том смысле, что он устраняет "разнобой " в 1 м ц между указанными выше, сценариями ветвления И в самом деле, переход рабочей точки программы на 1- ю команду одного сценария, происходит через 2 м ц . ( команда goto исполняется за 2 м ц .), а ее переход на 1- ю команду другого сценария, через 1 м ц . (команда "виртуального " а исполняется за 1 м ц .). Если речь идет о "плюс- минус двух лаптях ", то выравнивающий nop не нужен, но если ПП динамической индикации участвует в формировании калиброванных интервалов времени, то выравнивание необходимо Это влияет на стабильность результатов измерений В данном случае, "разнобой " невелики на него вполне можно "закрыть глаза ", но дело не в нем , а в принципе А это уже серьёзно , так как речь идет о качестве измерительных устройств В данном случае, выравнивающий nop только один, нов других случаях, их может потребоваться несколько 233 На этот "невзрачный ", выравнивающий nop я обращаю Ваше внимание по той причине, что в случаях наличия ветвлений, происходящих внутри калиброванных циклов, необходимость в выравнивании возникает достаточно часто Только в этом случае, можно сформировать и калиброванный , и высокостабильный интервал времени Итак , в случае исполнения сценария "программа исполняется далее ", после выравнивающего NOP а , исполняется команда То есть, байт "рулевого " регистра Index сбрасывается в 0, что есть подготовка к переходу наследующий цикл большого кольца индикации Перед тем, как его осуществить, с целью обеспечения выхода из ПП динамической индикации, необходимо уменьшить, на 1, содержимое счетчика больших колец индикации ( decfsz Count,F ). Команда ветвления, кроме декремента, еще и осуществляет проверку типа "результат декремента равен или неравен нулю" Если результат декремента содержимого регистра Count не равен нулю, то исполнится команда CYCLE , и рабочая точка программы "улетит " на начало следующего цикла После отработки следующего цикла большого кольца индикации, произойдет следующий декремент содержимого регистра Count и т д До тех пор, пока в регистре Count не "появится " 0. После этого, команда будет проигнорирована (вместо нее, "виртуальный " NOP ), и далее , будет исполнена команда выравнивающего NOP а После этого, рабочая точка программы выходит из ПП динамической индикации (завершение полного цикла динамической индикации, и после исполнения групп ПП и команд, осуществляющих различные "полезные " операции, "улетает " ( goto Bin2_10 ) на первую команду ПП Bin2_10 , которую можно считать точкой входа в полный цикл программы После этого, всё то , о чем шла речь, будет многократно повторяться до тех пор, пока не будет выключено питание устройства Выход наследующий цикл большого кольца индикации происходит сразу же после смены содержимого регистра сна. Сразу же " означает то, что этот выход происходит очень быстро, ноне "мгновенно ". Посмотрите в текст "программы ". После команды инкремента содержимого регистра Index, и до команды сброса его содержимого в 0 (в том случае, если результат инкремента равен .08), отрабатывается 6 м ц Таким образом, смена восьмерки на 0 произойдет через 6 м ц . вначале- го, то есть, быстро Второй этап Теперь разберемся с группами команд, которые в тексте ПП динамической индикации, отмечены прерывистыми линиями из точек, то есть, полностью оформим текст ПП динамической индикации Вашему вниманию предоставляется ASM- файл универсальной "заготовки " ПП 8- разрядной динамической индикации, с использованием внешнего дешифратора Файл программы называется (находится в папке " Тексты программ. Она выглядит так ;******************************************************************************** ; ГРУППА ПОДПРОГРАММ 8- РАЗРЯДНОЙ ДИНАМИЧЕСКОЙ ИНДИКАЦИИ С ; ИСПОЛЬЗОВАНИЕМ ВНЕШНЕГО ДЕШИФРАТОРА . ;******************************************************************************** ; " ШАПКА ПРОГРАММЫ " ;******************************************************************************** ; Универсальная группа подпрограмм разрядной динамической индикации. ;================================================================================ ; Определение положения регистров специального назначения. 234 ;================================================================================ Indf equ 00h ; Регистр INDF. PC equ 02h ; Регистр счетчика команд equ 03h ; Регистр Status. FSR equ 04h ; Регистр FSR. PortA equ 05h ; Регистр PortA. PortB equ 06h ; Регистр PortB. ;............................................................. ;............................................................. ;================================================================================ ; Определение названия и положения регистров общего назначения. ;================================================================================ LED0 equ 10h ; Регистр го сегментного индикатора. LED1 equ 11h ; ------- го ------------------------- LED2 equ 12h ; ------- го ------------------------- LED3 equ 13h ; ------- го ------------------------- LED4 equ 14h ; ------- го ------------------------- LED5 equ 15h ; ------- го ------------------------- LED6 equ 16h ; ------- го ------------------------- LED7 equ 17h ; ------- го ------------------------- Index equ 0Ch ; Регистр счетчика количества ; малых колец индикации. Count equ 0Dh ; Регистр счетчика количества ; больших колец индикации. Temp equ 0Fh ; Регистр временного хранения данных. ;............................................................. ;================================================================================ ; Определение места размещения результатов операций. ;================================================================================ W equ 0 ; Результат направить в аккумулятор . F equ 1 ; Результат направить в регистр . ;================================================================================ ; Присваивание битам названий. ;================================================================================ Z equ 2 ; Флаг нулевого результата. ;............................................................. ;............................................................. ;================================================================================ ; Присваивание константам названий. ;================================================================================ Const1 equ Y1 ; Y1 - значение времязадающей константы ; "грубо" (до .255). Задается программистом. Const2 equ Y2 ; Y2 - значение времязадающей константы ; "точно" (до .255). Задается программистом. ;================================================================================ org 0 ; Начать выполнение программы goto START ; с подпрограммы START. ;******************************************************************************** ;******************************************************************************** ; РАБОЧАЯ ЧАСТЬ ПРОГРАММЫ ;******************************************************************************** ; Подготовительные операции. ;-------------------------------------------------------------------------------- ;START ...................................... ; ...................................... ;-------------------------------------------------------------------------------- ; Группа подпрограмм преобразования двоичных чисел в двоично - десятичные . ;-------------------------------------------------------------------------------- ;Bin2_10 ...................................... ; ...................................... ;....... ...................................... ; ...................................... ;....... ...................................... ; ...................................... 235 ; На данный момент, регистры LED0 ... LED7 заполнены двоично - десятичными числами, ; которые необходимо вывести на индикацию (отобразить) в линейку из ми сегментных индикаторов. ; На момент начала группы подпрограмм динамической индикации, все прерывания должны быть запрещены, все выводы порта В и первые 3 вывода порта А должны быть настроены на работу "на выход, работа должна происходить в нулевом банке. ;******************************************************************************** ; Подготовка счетчика количества малых колец индикации Index к началу полного цикла динамической индикации. ;-------------------------------------------------------------------------------- clrf Index ; Сброс в 0 содержимого счетчика ; малых колец индикации Index. ;-------------------------------------------------------------------------------- ; Предварительная закладка количества больших колец индикации, которое нужно "пройти" за один полный цикл динамической индикации в регистр Count. ;-------------------------------------------------------------------------------- movlw X ; Запись константы X (количество больших ; колец индикации, задается программистом, ; в регистр W. movwf Count ; Копирование содержимого регистра W в ; регистр счетчика количества больших колец ; индикации Count. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Использование косвенной адресации при работе с таблицей данных. ;================================================================================ ; Подготовка к косвенной адресации запись в регистр W адреса регистра младшего разряда линейки сегментных индикаторов (привязка" к сегментному индикатору, с активации которого начинается полный цикл первого большого кольца индикации. ;-------------------------------------------------------------------------------- CYCLE movlw LED0 ; Запись в регистр W адреса регистра LED0. addwf Index,W ; Увеличение адреса регистра LED0 на величину ; числа, записанного в регистре счетчика ; количества малых колец индикации Index, ; c сохранением результата в регистре W. ;-------------------------------------------------------------------------------- ; Косвенная адресация. ;-------------------------------------------------------------------------------- movwf FSR ; Копирование содержимого регистра W ; в регистр FSR. movf Indf,W ; Копирование содержимого регистра с адресом , ; записанным в регистре FSR, в регистр W. call TABLE ; Условный переход (адрес следующей команды ; закладывается в стек ) в ПП TABLE. ;---> Возврат по стеку из ПП TABLE ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Группа команд установки запятой. ;-------------------------------------------------------------------------------- movwf Temp ; Копирование содержимого регистра W (7- ; сегментные коды индицируемых двоично- ; десятичных чисел) в регистр Temp. movlw 5 ; Запись в регистр W константы .05. bsf Status,Z ; Поднятие флага нулевого результата Z. subwf Index,W ; Вычесть содержимое регистра W (число .05) ; из содержимого регистра Index ; (числа от .00 до .07). btfss Status,Z ; Проверка состояния флага Z. goto No_Dot ; Если флаг Z опущен (результат операции ; не, то переход в ПП No_Dot ; (запятая не выставляется. bsf Temp,7 ; Если флаг Z поднят (результат операции, ; то установка в единицу го бита ; (установка запятой) регистра Temp. ;-------------------------------------------------------------------------------- ; Группа команд вывода десятичной цифры на индикацию. |