Самоучитель по программированию PIC контроллеров для начинающих (Е.А. Корабельников,2008). Самоучитель по программированию PIC контроллеров для начинающих. Система команд pic16F84A 26 Что такое программа иправила ее составленияПример создания программы автоколебательного мультивибратораДирективы.
![]()
|
EECON1 управляет чтением - записью в EEPROM память данных Он имеет 3 рабочих бита, манипуляции со значениями которых необходимы при организации процедур чтения - записи Пока , ненужно "забивать себе голову " информацией об этих битах Причина простая при чтении и записи данных в EEPROM память данных, применяются рекомендуемые разработчиками стандартные процедуры (эти биты в них участвуют) и вносить в них коррективы простонет необходимости 19 Если нужно произвести чтение или запись, тов программу просто вставляется соответствующая стандартная процедура, рекомендованная разработчиками, в которой все действия стандартно "расписаны " (включая и работу с этими битами. Об этих процедурах я расскажу позднее Сказанное выше относится и к регистру EECON2 Регистр INTCON имеет 5 рабочих битов Это регистр управления прерываниями После возникновения факта прерывания, за счет "ухода " рабочей точки программы в подпрограмму прерываний, происходит временная приостановка выполнения "основной " условно) программы После возврата из подпрограммы прерываний, отработка "основной " программы продолжается Если в составе программы имеется подпрограмма прерываний, тов "шапке " программы (пока привыкните к этому названию, а объяснение будет позднее) устанавливается так называемый вектор прерываний, который также, как и команда старта для "основной " программы, определяет начальный адрес счетчика команд для первой команды, но только неосновной" программы, а подпрограммы прерываний "Основная " программа стартует и выполняется до тех пор, пока рабочая точка программы не войдет в "зону " разрешения прерываний Если в этой "зоне " происходит, например, внешнее прерывание по входу, то адрес следующей команды "основной " программы запоминается (адрес возврата записывается в стек - об этом позднее, выполнение "основной " программы приостанавливается, и происходит переход (по вектору прерывания) на начало исполнения подпрограммы прерывания Далее , подпрограмма прерываний выполняется по такому же принципу, как и "основная " программа, вплоть до окончания этой подпрограммы В конце подпрограммы прерываний всегда исполняется специальная команда возврата При этом, из стека извлекается адрес возврата, после чего "основная " программа начинает исполняться далее Таким образом, прерывание - это специфический переход, в большинстве случаев, по внешнему воздействию, из "основной " программы, на выполнение подпрограммы прерывания, с последующим возвратом из не в "основную " программу В ПИКах имеется несколько источников прерываний Для того, чтобы произошло любое из них, сначала нужно установить бит глобального разрешения прерываний (установить в 7- м бите регистра INTCON единицу ). 6 - й бит ( EEIE ) разрешает / запрещает прерывания по окончанию цикла записи в EEPROM память данных- й бит ( TOIE ) разрешает / запрещает прерывания по переполнению, то есть, если этот вид прерываний разрешен, то уход в подпрограмму прерывания произойдет при смене содержимого TMR0 с FFh на 00h (при переполнении. 4 - й бит ( INTE ) разрешает / запрещает внешнее прерывание по входу- й бит ( RBIE ) разрешает / запрещает прерывания по изменению уровня сигнала на любом из выводов RB4…RB7 Примечание : направление работы выводов портов А и В можно устанавливать в любых комбинациях (см регистры PORTA и PORTB О них - ниже. Те выводы портов, на которые поступают сигналы, инициирующие прерывания, должны работать "на вход ". Это относится к выводам RB0/INT , RB4...RB7 порта В и выводу RA4/TOCKI порта А Что касается последнего, то импульсную последовательность, подаваемую на счетный вход (вывод, вполне можно считать сигналом прерываний, только косвенно, так как прерывание наступает не по факту подсчета отдельного импульса, а по факту подсчета группы импульсов (переполнение. Регистры TRISA_иTRISB'>TRISA и TRISB имеют 5 и 8 рабочих бита соответственно (по количеству выводов портов А и В ). Их адреса - 85h и 86h (см область оперативной памяти. Распечатки на них нет, но Вы без труда поймете их функции Биты регистров TRISA и TRISB управляют направлением работы выводов портов А и В Если какой- нибудь из этих битов устанавливается в 1, то соответствующий вывод порта работает на вход, то есть, принимает данные с выхода внешнего устройства, подключенного к этому выводу 20 Если бит TRISA/TRISB устанавливается в 0, то соответствующий вывод порта уже сам является источником сигнала для подключенного к этому выводу, входа внешнего устройства, и программа может управлять этим внешним устройством (например, светодиодом или каким- то другим исполнительным устройством. При помощи этих битов, в пределах каждого из портов, можно устанавливать различные комбинации направлений работы их выводов, а также и менять их (направления) входе исполнения программы Так как регистры TRISA и TRISB находятся в 1- м банке , то, при работе сними, необходимо перейти в 1- й банк , произвести необходимые изменения битов и вернуться в 0- й банк (если далее работа происходит в нулевом банке. Регистры PORTA_иPORTB'>PORTA и PORTB (см распечатку ниже регистра) управляют защелками портов А и В Количество рабочих битов в них такое же, как и количество выводов портов (5 и 8). Защелка это аппаратно реализованное устройство оперативной памяти, а проще говоря, триггер Биты регистров PORTA и PORTB управляют этими триггерами Если какой- либо из этих битов установить в 1, тона выходе защелки (а значит и на соответствующем выводе порта, настроенном "на выход ") также установится 1 а для ноля - ноль. Так как защелки являются триггерами, то перевод их выходов из одного состояния в другое происходит " одномоментно ". Это означает то, что, например, для вывода цифры на 7- сегментный индикатор, в течение определенного программой интервала времени, достаточно одной команды на вывод цифры ( байта ) вначале этого интервала времени, и одной команды на ее сброс в конце этого интервала времени В промежутке времени между этими двумя командами, программа может выполнять какие- либо другие действия, формируя за счет этих действий данный интервал времени, причем эти действия могут быть напрямую несвязанными с работой по выводу цифры в- сегментный индикатор (например, может производиться подсчет количества импульсов, операции с регистрами , работа с EEPROM памятью и т д. Следует четко уяснить следующее биты регистров PORTA и PORTB защелками управляют всегда, ноне всегда данные с выходов защелок присутствуют на выводах портов Выходы защелок портов подключаются к выводам портов только при работе этих выводов "на выход. При работе выводов портов на вход, выходы защелок от соответствующих выводов портов отключаются . В отличие от выводов порта В , к которым могут быть либо подключены, либо отключены внутренние, подтягивающие резисторы, выводы порта А внутренней "подтяжки " не имеют Таким образом, если они настроены на работу на вход, ток ним нужно подключать внешние подтягивающие резисторы Если нужно организовать счет импульсов (задействован, то роль подтягивающего резистора для вывода RA4/TOCKI может выполнять, например, коллекторная нагрузка внешнего устройства Регистр счетчика команд (13 бит) разделен на 2 регистра В регистре счетчика команд PC с названием (младший байт счетчика команд) находится младшие 8 битов адреса команды Остальные 5 битов (старшие) "лежат " в старшем байте счетчика команд PC с названием старших его бита не используются. Изначально, " понятийновыгодно " представить себе 13- битное слово регистра PC как "неразделимый массив " с одним исключением (о нем - ниже, что (без учета этого исключения) означает если команды отрабатываются последовательно (без "прыжков ") и произошло переполнение (состояние 255 сменилось на состояние 0), то содержимое PCH инкрементируется (увеличивается на 1). 13- разрядное слово позволяет организовать максимальный объем памяти программ до 256 х 2 х 2 х 2 х 2 х 2=8192 слов (в тексте программы можно использовать до 8192- х команд ). Для 5- битного PCH , это "потолок ". Могут использоваться не все 5 бита меньшее их количество Соответственно , объем памяти программ, в этих случаях, будет меньше 21 Память программ многих типов м / контроллеров меньше 8192 словно есть и м / контроллеры с объемом памяти программ по максимуму (8 килослов ). С регистром PCL никаких проблем нет Проблемы есть с регистром PCH В частности , они связаны с вычисляемым переходом Вычисляемым переходом (это стандартное название процедуры) называется приращение содержимого PC на величину числового содержимого регистра, называемого аккумулятором (об этом - в следующих разделах. Проще говоря, если перед выполнением команды вычисляемого перехода, в PC имела место быть команда, например, с адресом 5 , а в регистре "лежит " число 2, тов результате исполнения команды вычисляемого перехода, произойдет переход (прыжок ") на команду с адресом 5+2=7. Это упрощенный пример, который я привожу для обозначения сути вычисляемого перехода На самом деле, существуют некоторые нюансы (суть от этого не меняется, о которых я расскажу позднее Таким образом, вычисляемый переход является четвертой разновидностью переходов по тексту программы после переходов по стеку (условный переход, переходов в подпрограммы ( безусловный переходи переходов наметки (разновидность безусловного перехода. Какой именно из этих переходов применить - решает программист в соответствии с оптимальным , на его взгляд, способом решения стоящих передним задач Выше было сказано, что в том случае, если программа отрабатывается последовательно, при переполнении регистра, происходит инкремент содержимого регистра PCH Это имеет место быть, но только не в случае исполнения процедуры вычисляемого перехода В этом случае, при переполнении, инкремента PCH не происходит В технических описаниях м / контроллеров (речь идет о ПИКах среднего семейства) причина этого не объясняется, а только дается указание о недопустимости пересечения границы блока памяти программ (каждый блок 256 команд. Поэтому можно только предположить, что это ограничение объясняется какими- то специфическими особенностями организации взаимодействия PCL и PCH , детали которого разработчики ПИКов не посчитали нужным разъяснить (просто поставили перед фактом. И это непустые слова Нарушение этого указания приводит к тому , что вычисляемый переход происходит не на ту команду, на которую нужно перейти (сбой работы программы. Пример начало исполнения вычисляемого перехода приходится на команду с номером , в памяти программ, равным 508. 508 - 256 = 252. Число 252 вплотную, слева, "подступает к границе " 256- байтного блока (этой "границей " является переход от 255 к 0, ив этом случае, нужно "держать ушки на макушке " в смысле : "а как бы ее не пересечь ". Если максимальное приращение счетчика команд PC будет менее числа 3 включительно, то "произойдет переход на планируемую программистом команду (509, 510, 511), а если оно будет более трех, например, 4, тов результате сложения, содержимое регистра PCL окажется нулевыми- одно и то же, но общепринято указывать 0), плюс инкремент содержимого регистра PCH Но , в случае вычисляемого перехода, инкремента содержимого регистра PCH не происходит В конечном итоге, переход на 512- ю команду не осуществляется, а вместо этого осуществляется возврат назад, на 256- ю команду (в "лежало " число, ионов случае вычисляемого перехода, не изменилось, а в регистре PCL будет "лежать " 00000000 ), что есть сбой Пояснения к этому примеру Двоичное представление числа 508: 00000001 ( PCH ) 11111100 ( PCL ). Для вычисляемого перехода с приращением 3, результат 00000001 11111111 - все в норме : переход будет осуществлен на 508+3=511- ю команду Для вычисляемого перехода с приращением 4, должен быть результат 00000000 , нона самом деле, будет результат 00000000 ( приращения PCH нет ), то есть, 256. Переход будет осуществлен на 256- ю команду , а должен быть на 512- ю команду (сбой. Для того чтобы предотвратить подобного рода сбои, операцию вычисляемого перехода ненужно организовывать в непосредственной близости от "границ " 256- командных блоков памяти программ 22 Практический вывод в части касающейся в 1024 слова, если вычисляемого перехода нетто о регистре PCH можно вообще "забыть ", то есть, не обращать на него внимания, так как содержимое этого регистра будет изменяться "в автомате " и вмешательства программиста в этот процесс просто не требуется Если производится вычисляемый переход, тов ходе его исполнения, переполнения регистра PCL допускать нельзя. Регистры INDF и FSR - регистры косвенной адресации Здесь необходимо кое- что пояснить Существует 2 вида адресации прямая и косвенная Прямая адресация это обращение к регистру напрямую, то есть в команде указывается название регистра, с содержимым которого нужно произвести какое- то действие При этом, адрес этого регистра в области оперативной памяти, определяется в "автомате " по его названию. При косвенной адресации, название регистра не указывается, а указывается адрес этого регистра в области оперативной памяти, предварительно записанный в регистр FSR Для того, чтобы осуществить действие с регистром , адрес которого записан в регистре FSR , необходимо обратиться к регистру INDF Для начинающих это звучит достаточно непонятно Пока примите это к сведению Это нужно уяснять на конкретных примерах Конечный результат прямой и косвенной адресации один и тот же, просто в некоторых случаях, используя косвенную адресацию, можно обойтись гораздо меньшим количеством команд Сначала нужно как следует освоить прямую адресацию, как более простую для понимания, а только после этого переходить к косвенной И то , и другое предстоит сделать И наконец , самый часто используемый регистр - регистр W или его еще называют аккумулятором Это тот же регистр общего назначения, только с определенным названием (в том смысле, что оно заранее определено также, как и названия регистров специального назначения. Его адрес, в отличие от регистра общего назначения, знать необязательно и "прописывать " его адрес ненужно Стоит только обратиться к регистру W , как адрес автоматически поставится ему в соответствие Он также является 8- битным и выполняет функцию оперативной памяти, обычно, на время одного, двух, трех машинных циклов (а также и более ). Наиболее часто он применяется по той простой причине, что большое количество команд ориентировано именно на операции с этим регистром ( буква W входит в состав этих команд. Например, для того чтобы перегрузить данные из одного регистра в другой , сначала данные из регистра- отправителя загружаются в регистр W , а затем из W загружаются в регистр - получатель, так как команды "прямой переправки " байта из одного регистра в другой , в списке команд нет Флаги Определение флагов дано выше Основная часть флагов находится в регистре STATUS_Самый_часто_применяемый_из_них_-_флаг_нулевого_результата_(2_-_йбит_сназваниемZ'>STATUS Самый часто применяемый из них - флаг нулевого результата ( 2 - й бит с названием Z ). Он показывает, является ли результатом проведенной операции нулевой результат (флаг поднят, что соответствует установке- го бита регистра STATUS в 1) или этот результат ненулевой (флаг опущен во- м бите - 0). Кроме информирования программиста о результате операции, содержимое бита Z может являться критерием выбора того или иного сценария работы программы, для чего он чаще всего и применяется Например , программист поставил условие если результат операции неравен, то программа исполняется далее, а если равен нулю, то происходит переход на выполнение подпрограммы (или наметку) После выполнения операции, флаг или останется опущенным (0) или поднимется (1). Далее следует команда ветвления типа если- й бит регистра STATUS не равен 0, то программа исполняется дальше, а если равен 0, то происходит переход на выполнение 23 подпрограммы (или наметку) Дешево и сердито Если использовать цепочку таких проверок, то можно, например, выяснить, попадает ли результат операции в какой - то числовой "сектор " или нет, равен ли он какому- то числу или нет, ив зависимости от этого, направить программу в то или иное "русло ". Нетрудно заметить, что анализ содержимого бита (а также и некоторых других флагов, происходит при выполнении так называемых команд ветвления, суть которых если X, то так, а если Y, то по другому, применяющихся при выборе так называемых "сценариев работы программы ". Это словосочетание также, как и словосочетание "рабочая точка программы " - моя "самодеятельность ", и я "ввожу его в эксплуатацию " с целью наиболее комфортного восприятия информации Сценарии работы программы это возможные варианты ее исполнения, которые |