Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
Скачать 3.49 Mb.
|
movlw ... "? Ответ : конечно же можно В этом случае, нужно убрать, из "шапки ", соответствующие "прописки ". Идем дальше Следующие несколько групп команд я пропускаю по причине того, что их работа была рассмотрена на 1- м этапе Если необходимо сформировать калиброванный интервал времени, в состав которого входит интервал времени отработки полного цикла динамической индикации, то числовое значение константы Const1 нужно подобрать таким образом, чтобы интервал времени отработки полного цикла динамической индикации был немного меньше требуемой величины калиброванного интервала времени (грубая доводка. После этого, с помощью дополнительной задержки (осуществляется подбор числового значения ее константы / констант ), нужно точно "довести " суммарный интервал времени отработки полного цикла динамической индикации, этой задержки и "сопутствующих " команд, до требуемой величины калиброванного интервала времени (точная доводка. Точная доводка " осуществляется сразу же после окончания полного цикла динамической индикации Посмотрите в текст программы По своей "конструкции ", группа команд "точной доводки " - практически тоже самое, что и группа команд "грубой доводки ". На момент начала "точной доводки ", регистр "свободен ", и по этой причине, он в очередной раз задействуется Если возможны допуски, ив связи с этим , точной калибровки не требуется, то группу команд "точной доводки " можно исключить из текста программы После выхода рабочей точки программы из ПП динамической индикации, один из- сегментных индикаторов линейки будет находиться в активном состоянии, вплоть до начала следующего цикла динамической индикации Хотя практического (визуального) выигрыша в "гашении " этого 7- сегментного индикатора и нет , но "для порядка ", его лучше погасить, установив все защелки порта В в 0. А можно и не "гасить ". Как говорится, дело хозяйское В данном случае, ПП динамической индикации оформлена в виде универсальной "заготовки ", врезанной " в некую программу, составные части которой представлены в виде строк из точек Обратите внимание на несколько строк из точек, которые расположены после последней команды группы команд гашения активного разряда линейки В этом "месте " должно формироваться двоичное число, десятичное значение которого и будет индицироваться в линейке из 8- ми 7- сегментных индикаторов Если в линейке 8 знакомест, то необходимо сформировать 4- байтное двоичное число 241 если 7 знакомест, то 3- байтное Почему ? Об этом говорилось ранее. В данном , "учебно- тренировочном " случае, не имеет значения, каким именно образом сформировано 4- байтное двоичное число Вариантов его формирования может быть множество Их выбор зависит от функционального предназначения разрабатываемого устройства и выбранного способа его аппаратной и программной реализации Количество "рабочих " знакомест линейки можно изменить Если требуется количество знакомест меньшее, чем 8, тов группе команд Увеличение на 1 содержимого счетчика ... , нужно заменить число .08 на число десятичных разрядов, которое требуется (.07, .06, ...). Например, конструируется устройство с использованием 4- х знакомест Заменяем .08 на .04. После этого, в группе команд установки запятой, нужно заменить пятерку на тот номер знакоместа, в котором нужно выставить запятую и определиться с времязадающими константами, Const1 и Const2 В этом случае, строки с "пропиской " регистров ... LED7 , из "шапки " программы, нужно удалить (не используются. Если запятую выставлять ненужно, то все команды группы команд установки запятой и первую команду группы команд вывода десятичной цифры на индикацию (вместе с названием метки, можно удалить В этом случае, возврат ( из ПП TABLE ) будет происходить на команду Если 8- ми знакомест мало и их количество нужно увеличить, то принцип тот же самый, за исключением того, что в этом случае, потребуется наращивание разрядности адресного кода ( управление дешифратором) с трех до четырех (нужен еще один вывод порта, замена дешифратора 555 ИД 7 на дешифратор сбегающим" нулем, имеющий 4 адресных входа и более 8- ми выходов, увеличение числа LED ов , корректировка " байтности " и т д С этой универсальной "заготовкой " вполне можно работать, но "для полного счастья ", не хватает "разборок " с ПП преобразования двоичных чисел в двоично - десятичные ( ПП Bin2_10 ) Об этой ПП будет рассказано в следующем разделе Дополнительно В обучающих целях, группа команд работы с содержимым регистра Index программы Fsr.asm ( начинается с команды incf Index,F , а заканчивается командой CYCLE ) предоставлена в том виде, в котором Вы видите ее в программе Fsr.asm В ней "фигурирует " восьмерка, которая "бросается в глаза ". Так удобнее Но можно "зайти и с другого бока ". При переходе от числа 7 к числу 8, бит изменяет свое состояние сна, а во всех остальных случаях (от 0 до 7 включительно, он имеет значение 0. Вот за это и можно "зацепиться ". Получается такая компактная группа команд incf Index,F btfss Index,3 goto CYCLE которой смело можно заменить соответствующую группу команд программы Fsr.asm Это называется многовариантностью Люди пытливого склада ума найдут в этом много интересного А это картинка, поясняющая принцип динамической индикации (используется линейка из восьми 7- сегментных индикаторов с общим катодом 242 243 16. Преобразование двоичных чисел в двоично - десятичные Окончательное формирование текста подпрограммы динамической индикации Работа подпрограммы преобразования двоичных чисел в двоично - десятичные достаточно сложна для понимания, и скорее всего, для начинающих, детальный "разбор этих полетов " будет связан с немалыми трудностями С другой стороны, "разборки " с ней , хотя бы, на уровне общих понятий, абсолютно необходимы, так как если нужно визуально отобразить числа в десятичном виде, то без этой подпрограммы просто не обойтись Если я "выдам на гора " готовую подпрограмму, то она будет подобна "бесплатному сыру " расплата " наступит при первом же затруднении, а если "уйду в детали ", то с непривычки , может получиться "перенапряг и отбитие почек ". То есть, необходим разумный компромисс Так и сделаю А заодно , "попутно " разберемся с некоторыми "новенькими штучками " и приобретем полезные навыки ПП преобразования двоичных чисел в двоично - десятичные (далее, для краткости, просто " ПП преобразований чисел) входит в состав некой условной программы, в которой ПП преобразований чисел работает в комплексе с ПП динамической индикации, а обе они, в свою очередь, "органически вписаны " в программу , реализующую некое измерительное устройство Результаты измерений выводятся на индикацию в линейку из 8- ми 7- сегментных индикаторов По большому счету, в данном случае, неважно, что именно измеряется Главное - чтобы на каждом "витке " полного цикла "программы ", к моменту " влёта " рабочей точки программы в ПП преобразований чисел, тем или иным способом, было бы сформировано 4- байтное двоичное число С ним и будет работать ПП преобразований чисел, а после этого, ПП динамической индикации Файл программы называется (находится в папке " Тексты программ. Она выглядит так ;******************************************************************************** ; ГРУППА ПОДРПРОГРАММ ПРЕОБРАЗОВАНИЯ ДВОИЧНЫХ ЧИСЕЛ ; В ДВОИЧНО - ДЕСЯТИЧНЫЕ ; (для случая преобразования 4- байтных двоичных чисел в разрядные десятичные. ;******************************************************************************** ; " ШАПКА ПРОГРАММЫ " ;******************************************************************************** ; Универсальная группа подпрограмм преобразования 4- байтных ; двоичных чисел в разрядные десятичные числа. ;............................................................. ;================================================================================ ; Определение положения регистров специального назначения. ;================================================================================ Indf equ 00h ; Регистр Indf. Status equ 03h ; Регистр Status. FSR equ 04h ; Регистр FSR. ;............................................................. ;............................................................. ;================================================================================ ; Определение названия и положения регистров общего назначения. ;================================================================================ LED0 equ 10h ; Регистр хранения результатов преобразований ; го двоично - десятичного разряда. LED1 equ 11h ; ------- го ------------------------- LED2 equ 12h ; ------- го ------------------------- LED3 equ 13h ; ------- го ------------------------- LED4 equ 14h ; ------- го ------------------------- 244 LED5 equ 15h ; ------- го ------------------------- LED6 equ 16h ; ------- го ------------------------- LED7 equ 17h ; ------- го ------------------------- Count equ 0Dh ; Счетчик проходов equ 1Fh ; Регистр оперативной памяти. TimerL equ 1Bh ; Регистр младшего разряда 4- байтного ; двоичного числа. TimerM equ 1Ch ; Регистр среднего разряда 4- байтного ; двоичного числа. TimerH equ 1Dh ; Регистр старшего разряда 4- байтного ; двоичного числа. TimerHH equ 1Eh ; Регистр самого старшего разряда 4- байтного ; двоичного числа. ;............................................................. ;............................................................. ;================================================================================ ; Определение места размещения результатов операций. ;================================================================================ W equ 0 ; Результат направить в аккумулятор . F equ 1 ; Результат направить в регистр . ;================================================================================ ; Присваивание битам названий. ;================================================================================ C equ 0 ; Флаг переноса - заёма . ;............................................................. ;............................................................. ;================================================================================ org 0 ; Начать выполнение программы goto START ; с подпрограммы START. ;******************************************************************************** ;******************************************************************************** ; РАБОЧАЯ ЧАСТЬ ПРОГРАММЫ ;******************************************************************************** START ..................................... ; ..................................... NEW call Bin2_10 ; Условный переход в ПП Bin2_10 ; Адрес следующей команды закладывается в стек ; ..................................... ; ..................................... ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ГРУППА ПОДПРОГРАММ 8- РАЗРЯДНОЙ ДИНАМИЧЕСКОЙ ИНДИКАЦИИ без ПП TABLE ; (то, что было рассмотрено ранее. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;.... ..................................... ; ..................................... ;.... ..................................... ; ..................................... ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; ГРУППА ПОДПРОГРАММ ФОРМИРОВАНИЯ 4- БАЙТНОГО ДВОИЧНОГО ЧИСЛА . ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ;.... ..................................... ; ..................................... ;.... ..................................... ; ..................................... ; ..................................... ; К этому моменту 4- байтное двоичное число (в регистре TimerL/TimerM/TimerH/TimerHH) должно быть сформировано для последующей обработки его в группе подпрограмм преобразования 4- байтных двоичных чисел в разрядные десятичные числа. goto NEW ; Безусловный переход наметку подпрограммы START, то есть, начало нового ; полного цикла "программы. ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 245 ; ГРУППА ПОДПРОГРАММ ПРЕОБРАЗОВАНИЯ 4- БАЙТНЫХ ДВОИЧНЫХ ЧИСЕЛ В РАЗРЯДНЫЕ ДЕСЯТИЧНЫЕ ЧИСЛА . ;++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ ; Подготовка к преобразованию . ;================================================================================ Bin2_10 bcf Status,C ; Сброс флага переноса - заёма . movlw .32 ; Запись в регистр Count числа проходов movwf Count ; преобразования, равного суммарному ; количеству битов многоразрядного регистра ; TimerL/TimerM/TimerH/TimerHH (8*4=32). clrf LED0 ; Сброс в 0 содержимого регистра LED0. clrf LED1 ; -------"------ LED1. clrf LED2 ; -------"------ LED2. clrf LED3 ; -------"------ LED3. clrf LED4 ; -------"------ LED4. clrf LED5 ; -------"------ LED5. clrf LED6 ; -------"------ LED6. clrf LED7 ; -------"------ LED7. ;------------------------------------------------------------------------------- ; Примечание процесс преобразования заканчивается приуменьшении числа проходов преобразования, которые заложены в регистр Count (.32), до нуля. ;================================================================================ ; Циклический сдвиг влево. ;================================================================================ Loop16 rlf TimerL,F ; Циклический сдвиг влево 4- байтного двоичного rlf TimerM,F ; числа, записанного в группе регистров rlf TimerH,F ; TimerL/TimerM/TimerH/TimerHH, на одну rlf TimerHH,F ; позицию через бит С регистра STATUS. rlf LED0,F ; Циклический сдвиг влево 4- байтного двоичного rlf LED1,F ; числа, записанного в группе регистров rlf LED2,F ; LED0/LED1/LED2/LED3, на одну позицию через rlf LED3,F ; бит С регистра STATUS. decfsz Count,F ; Декремент (-1) содержимого регистра Count с ; сохранением результата в нем же. goto adjDEC ; Если результат не, то переход в ПП adjDEC ; Если результат =0, то программа ; исполняется далее. ;================================================================================ ; Поразрядное распределение содержимого регистров LED0...3 (обоих полубайтов) по младшим полубайтам регистров LED0...7. ;================================================================================ swapf LED3,W ; Запись старшего полубайта LED3 andlw 0Fh ; в младший полубайт LED7. movwf LED7 ; -------------------------------- movfw LED3 ; Запись младшего полубайта LED3 andlw 0Fh ; в младший полубайт LED6. movwf LED6 ; -------------------------------- swapf LED2,W ; Запись старшего полубайта LED2 andlw 0Fh ; в младший полубайт LED5. movwf LED5 ; -------------------------------- movfw LED2 ; Запись младшего полубайта LED2 andlw 0Fh ; в младший полубайт LED4. movwf LED4 ; -------------------------------- swapf LED1,W ; Запись старшего полубайта LED1 andlw 0Fh ; в младший полубайт LED3. movwf LED3 ; -------------------------------- movfw LED1 ; Запись младшего полубайта LED1 andlw 0Fh ; в младший полубайт LED2. movwf LED2 ; -------------------------------- 246 swapf LED0,W ; Запись старшего полубайта LED0 |