Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
Скачать 3.49 Mb.
|
DC не "привязан " к десятичной системе исчисления, так как для того чтобы осуществить такую "привязку ", нужно "привязать " перенос- заём не к числу .15, а к числу .9. Этого нет Флаг DC "привязан " только к двоичной системе исчисления (также, как и остальные флаги. Так что, слово "десятичного ", из текста комментария к флагу DC лучше либо вообще убрать, либо заменить его на слово " полубайтного ". Флаг DC может применяться только для контроля типа " перенос - заем есть / нет " в "зоне" 4- хбитных чисел … .15). Каким- то образом "аппаратно вычленить ", из байта, младший полубайт и работать сними отдельно, технически невозможно, так как все регистры ПИКов (по крайней мере, среднего семейства) 8- битные То , что "получается на выходе " - всегда 8- битное число Поэтому , при анализе "реакции " флага DC на результат соответствующей операции, приходится, из 8- битного результата, "вычленять " 4- хбитное число Только после этого можно ответить на вопрос "Почему флаг DC поднялся или опустился" Если же производятся операции с 8- битными числами из числового диапазона от .00 … .15, то никаких проблем нет С учетом специфики флага, практическая надобность в его использовании , по сравнению с другими флагами, мала 199 Если нужно "привязать " ход исполнения программы к событиям переносов / заёмов , тов подавляющем большинстве случаев, используется флаг С А теперь давайте остановимся, "переведем духи постараемся понять смысл прочитанного Может возникнуть вопрос "Зачем нужно было так подробно расписывать этот въедливый процесс Дал бы готовые определения, и дело с концом ." Ответ : при таком подходе к работе , программист рискует оказаться один на один со множеством неразрешимых задач, которые он не сможет решить даже при сильнейшем желании это сделать Таких задач, походу составления и отладки программы, может быть много, и если не владеть эффективной и агрессивной методикой их решения (типа "я тебе покажу кузькину мать" или "не хочешь отдавать Возьму силой "), то участь этого программиста печальна Какой смысл "взращивать " в себе комплекс неполноценности по отношению, например, к тем же флагами, если пользуясь достаточно простыми методиками, и имея в своем распоряжении такой мощнейший "инструмент " как, можно " выпотрошить / взломать " не только эти флаги, но и многое другое Спокойно и по - деловому Без обманчивых надежд на "манну небесную ". Польза такого рода "взломов " не столько в том , что "добывается " информация, сколько в том , что она как бы "становится родной " и поэтому легко "уходит в подкорку ". В виде опыта и индивидуальных , для каждого программиста, образов, которые, в нужное время, "извлекаются " из подсознания в виде готового (или почти готового) решения, которое ненужно каждый раз "вымучивать " и "рожать при помощи кесарева сечения ". Для того чтобы такое "извлечение " происходило в "автомате ", нужно основательно "попотеть " и "провести в симуляторе " много времени, производя при этом какие- то осознанные, целенаправленные действия, с "уходом " в заблуждения и " выкарабкиванием " из них Примерно такого рода процесс я и попытался воспроизвести для затруднительной ситуации типа "как работают флаги C и DC ?". Это также можно рассматривать как примитивный пример программного анализа (взлома "). Вывод "не стоит ждать милостей от природы ". Если программист хочет добиться чего- то стОящего , то ему нужно не ждать "бесплатного сыра ", а со знанием дела, "брать в руки интеллектуальную дубину и выбивать всю дурь из своих затруднений и проблем ". Нашему брату ненужно объяснять, как с ней обращаться Лишь бы она была в наличии , да потяжелее Плюс хорошие мозги Вот таки рождаются классные программисты Теперь , поближе к практике В следующем разделе, будет приведен пример использования флага C " Самоучитель по программированию PIC контроллеров для начинающих" http://ikarab.narod.ru E-mail: karabea@lipetsk.ru 200 14. Пример задействования флага С в трехбайтном суммирующем устройстве Циклический сдвиг Операция умножения Пример реализации 3- байтного суммирующего устройства. Составляя любую программу, программист работает стем или иным количеством регистров общего назначения С их содержимым производятся различные операции Все они - однобайтные , ив пределах одного байта, работа сними не вызывает особых затруднений Но часто возникает необходимость в работе с числами , значения которых велики (более, чем. Например, мой частотомер содержит 8 десятичных разрядов, что соответствует максимальному значению отображаемого, десятичного числа 99 999 999. В двоичном виде, это число выглядит так 101 11110101 11100000 11111111 (можете убедиться в этом в конверторе систем исчислений ). Итого, 27 двоичных разрядов Для того чтобы отобразить такое число, трех регистров окажется мало (х разряда, следовательно, нужно задействовать 4 регистра общего назначениях разряда. При этом получается "перебор " в 5 разрядов, ново- первых, "кашу маслом не испортишь " (эти регистра способны отобразить число гораздо большее, чем 99999999), а во - вторых, выбора все- равно нет, так как все регистры 8- битные Вопрос : как распределить эти разряды по регистрам Ответ : необходимо определить порядок старшинства Вспоминайте о том , о чем говорилось ранее ( HH, H, M, L ). Назначаем /" прописываем " регистры, например, с названиями RegHH, RegH, RegM, RegL и "закрепляем " за каждым из них по одному байту 4- байтного (32- битного ) двоичного числа, начиная с младшего (он будет "лежать " в регистре RegL ) и далее , в порядке возрастания старшинства, вплоть до самого старшего (он будет "лежать " в регистре RegHH ). Таким образом, мы распределили 4- байтное , двоичное число по 4- м регистрам общего назначения Таким образом, количество регистров, входящих в состав многобайтного регистра, назначается по принципу "перекрытия максимально возможного числа ". В данном примере, нужно 27 разрядов, а организовано 32. Это единственный вариант с минимально возможным "перебором ". Например, в случае применения линейки из семи 7- сегментных индикаторов, достаточно и трех регистров ( RegH, RegM, RegL ). А теперь давайте осмыслим, что мы "сотворили ". Мы "раздробили " единое, 4- байтное число, на 4 части, нарушив тем самым внутренние связи, существующие между байтами Проще говоря, имеются 4 отдельных части, которые, если не принять каких- то мер, между собой взаимодействовать не будут Следовательно , нужно каким - то образом организовать это взаимодействие Необходимость этой организации можно объяснить на таком примере Имеется какое- нибудь устройство на микросхеме 8- разрядного регистра ( ИР ). Требуется собрать тоже самое, нонах микросхемах 4- разрядных регистров Следовательно , нужно соответствующим образом соединить эти две микросхемы, ведь без такого соединения, устройство не будет работать так, как нужно Примерно тоже самое нужно сделать ив нашем случае Разница заключается в том , что водном случае, речь идет об аппаратном способе соединения, а в другом случае, о программном способе соединения Ради этого и затеивались "разборки " с флагами То есть, взаимодействие байтов, "внутри " многобайтного числа, можно организовать с помощью флагов То же самое, нос другого бока ": с помощью флагов, из нескольких регистров общего назначения, можно создавать N- байтные регистры (N - количество задействованных регистров общего назначения. Специфика организации работы таких регистров состоит в том , что многобайтный регистр "рождается " только тогда, когда программа этого "захочет ". 201 То есть, в том случае, когда организовано программное взаимодействие между соответствующими байтами Если это взаимодействие организовано, то несколько регистров общего назначения будут работать как один многобайтный регистр На примере "учебно- тренировочного ", суммирующего устройства, файлы которого называются c_dc.asm и c_dc_1.asm (иллюстрация " принципа, давайте разберемся, как с помощью программных средств, организуется трехбайтный регистр, и как он работает Файл программы, с формализованными комментариями, называется c_dc.asm ( находится в папке " Тексты программ. Это выглядит так ;******************************************************************************** ; ПРИМЕР ИСПОЛЬЗОВАНИЯ ФЛАГА "C" ( А ТАКЖЕ И ФЛАГА "Z") ;******************************************************************************** ; Стандартная подпрограмма суммирования двух трехбайтных чисел RegH, RegM, RegL - трехбайтное число го слагаемого. TimerH, TimerM, TimerL - трехбайтное число го слагаемого. Результат суммирования сохраняется в регистрах TimerH, TimerM, TimerL. ;******************************************************************************** ; " ШАПКА ПРОГРАММЫ " ;================================================================================ ;............................................................. ;............................................................. ;================================================================================ ; Определение положения регистров специального назначения. ;================================================================================ Status equ 03h ; Регистр Status. ;............................................................. ;............................................................. ;================================================================================ ; Определение названия и положения регистров общего назначения. ;================================================================================ RegL equ 0Ch ; Регистр младшего разряда го слагаемого equ 0Dh ; Регистр среднего разряда го слагаемого. RegH equ 0Eh ; Регистр старшего разряда го слагаемого equ 1Ch ; Регистр младшего разряда го слагаемого. TimerM equ 1Dh ; Регистр среднего разряда го слагаемого equ 1Eh ; Регистр старшего разряда го слагаемого. ;............................................................. ;================================================================================ ; Определение места размещения результатов операций. ;================================================================================ W equ 0 ; Результат направить в аккумулятор . F equ 1 ; Результат направить в регистр . ;............................................................. ;================================================================================ ; Присваивание битам названий. ;================================================================================ C equ 0 ; Бит флага переноса - заёма . Z equ 2 ; Бит флага нулевого результата. ;================================================================================ org 0 ; Начать выполнение программы goto START ; с подпрограммы START. ;******************************************************************************** ;******************************************************************************** ; РАБОЧАЯ ЧАСТЬ ПРОГРАММЫ 202 ;******************************************************************************** START ...................................... YES ...................................... goto PLUS ;================================================================================ ; Суммирование двух трехбайтных двоичных чисел. Результат суммирования - ; трехбайтное двоичное число. ;================================================================================ PLUS movf RegL,W ; Скопировать содержимое регистра RegL ; в регистр W. addwf TimerL,F ; Сложить содержимое регистров W и TimerL с ; сохранением результата в регистре TimerL. btfss Status,C ; Опрос бита 0 ( флага С ) регистра Status. goto PLUS_1 ; Если бит 0 =0, то переход в ПП PLUS_1. incf TimerM,F ; Если бит 0 =1, то инкремент содержимого ; регистра TimerM с сохранением результата ; в нем же. btfss Status,Z ; Опрос бита 2 (флага Z) регистра Status. goto PLUS_1 ; Если бит 2 =0, то переход в ПП PLUS_1. incf TimerH,F ; Если бит 2 =1, то инкремент содержимого ; регистра TimerH с сохранением результата ; в нем же. PLUS_1 movf RegM,W ; Скопировать содержимое регистра RegM ; в регистр W. addwf TimerM,F ; Сложить содержимое регистров W и TimerM с ; сохранением результата в регистре TimerM. btfsc Status,C ; Опрос бита 0 ( флага С ) регистра Status. incf TimerH,F ; Если бит 0 =1, то инкремент содержимого ; регистра TimerH с сохранением результата ; в нем же. movf RegH,W ; Если бит 0 =0, то скопировать содержимое ; регистра RegH в регистр W. addwf TimerH,F ; Сложить содержимое регистров W и TimerH с ; сохранением результата в регистре TimerH. goto YES ; Безусловный переход в ПП YES. ;-------------------------------------------------------------------------------- ;******************************************************************************** end ; Конец программы. ================================================================================= АРИФМЕТИЧЕСКИЕ ПРИМЕРЫ СУММИРОВАНИЙ ================================================================================= Случай отсутствия переносов- 80 120 100 60 50 100 ---------------- 140 170 200 Значения чисел сумм не превышают 255. --------------------------------------------------------------------------------- Случай наличия переносов 1 --------------------------------------------------------------------------------- Младший разряд 150 120 100 100 180 200 -------------------------------- 250+1=251 300+1-256=45 300-256=44 -------------------------------- 251 45 44 203 При суммировании младших и средних разрядов значения сумм превысили 255 (2 переноса. --------------------------------------------------------------------------------- Случай наличия переносов 2. Дополнительно задействуется флаг Z (опрос его состояния. --------------------------------------------------------------------------------- Младший разряд 150 130 100 100 125 200 --------------------------------- 250+1=251 255+1-256=0 300-256=44 --------------------------------- 251 0 44 При суммировании младших и средних разрядов значения сумм превысили 255 (2 переноса. --------------------------------------------------------------------------------- Файл программы, с неформализованными комментариями, называется c_dc_1.asm ( находится в папке " Тексты программ. Это выглядит так ;******************************************************************************** ; ПРИМЕР ИСПОЛЬЗОВАНИЯ ФЛАГА "C" ( А ТАКЖЕ И ФЛАГА "Z") ;******************************************************************************** ; Стандартная подпрограмма суммирования двух трехбайтных чисел ;================================================================================ ; Суммирование двух трехбайтных двоичных чисел. Результат суммирования - ; трехбайтное двоичное число. ;================================================================================ PLUS movf RegL,W ; Скопировать содержимое регистра RegL ; в регистр W. addwf TimerL,F ; Сложить содержимое регистров W и TimerL с ; сохранением суммы в регистре TimerL. btfss Status,C ; Флаг С поднят ? goto PLUS_1 ; Если нетто переход в ПП PLUS_1. incf TimerM,F ; Если да, то инкремент содержимого регистра ; TimerM с сохранением результата в нем же. btfss Status,Z ; Флаг Z поднят goto PLUS_1 ; Если нетто переход в ПП PLUS_1. incf TimerH,F ; Если да, то инкремент содержимого регистра ; TimerH с сохранением результата в нем же. PLUS_1 movf RegM,W ; Скопировать содержимое регистра RegM ; в регистр W. addwf TimerM,F ; Сложить содержимое регистров W и TimerM с ; сохранением суммы в регистре |