Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
![]()
|
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 с ; сохранением суммы в регистре |