Основы микропроцессорной техники | |
Раздел 5. Однокристальный микроконтроллер серии PIC | |
| «Структура курса | Глава 1 | Глава 2 | Глава 3 | Глава 4 | Глава 5 | Глава 6 | Раздел 7 | Глава 8 | Дополнения | |
| Раздел 5 - Страницы: « | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | » | |
5.2.7. Счетчик командСчетчик команд PCL и PCLATH имеет разрядность 13 бит. Младший байт счетчика (PCL) доступен для чтения и записи и находится в регистре 02h. Старший байт счетчика команд не может быть прямо записан или считанных и берется из регистра PCLATH (PC latch high), адрес которого 0Ah. Содержимое PCLATH передается в старший байт счетчика команд, когда он загружается новым значением. В зависимости от того, загружается в счетчик команд новое значение во время выполнения команд CALL, GOTO, или в младший байт счетчика команд (PCL) происходит запись, - старшие биты счетчика команд загружаются с PCLATH разными способами, как показано на Рис. 5.6.
Команды CALL и GOTO оперируют 11-разрядным адресным диапазоном, достаточным для смещения в пределах страницы программной памяти объемом 2К слов. Для МК подгруппы PIC16F8X этого хватает. С целью обеспечения возможности расширения памяти команд для будущих моделей МК предусмотрено загрузки двух старших бит счетчика команд из регистра PCLATH <4:3>. При использовании команд CALL и GOTO пользователь должен убедиться в том, что эти страничные биты запрограммированные для выхода на нужную страницу. При выполнении команды CALL или выполнении прерывания весь 13-битный счетчик команд помещается в стек, поэтому для возвращения из подпрограммы не нужны манипуляции с разрядами PCLATH <4:3>. Микроконтроллеры подгруппы PIC16F8X игнорируют значение бит PCLATH <4:3 ≶, используемые для обращения к страницам 1, 2 и 3 программной памяти. Однако применять биты PCLATH <4:3> как ячейки памяти общего назначения не рекомендуется, так как это может повлиять на совместимость с будущими поколениями изделий. Возможность выполнять арифметические операции непосредственно над счетчиком команд позволяет очень быстро и эффективно осуществлять табличные преобразования в PIC-контроллерах. Микроконтроллеры подгруппы PIC16F8X имеют восьмиривневий аппаратный стек шириной 13 бит (см. Рис. 5.4). Область стека не принадлежит ни к программной области, ни в область данных, а указатель стека пользователю недоступен. Текущее значение счетчика команд посылается в стек, когда выполняется команда CALL или происходит обработка прерывания. При выполнении процедуры возврата из подпрограммы (команды RETLW, RETFIE или RETURN) содержимое счетчика команд восстанавливается из стека. Регистр PCLATH при операциях со стеком не меняется. Стек работает как циклический буфер. Итак, после того как стек был загружен 8 раз, девятое загрузки перепишет значение первой. Десятое загрузки перепишет вторую и т.д. Если стек был выгружен 9 раз, счетчик команд становится таким же, как после первого выгрузки. Признаков положения стека в контроллере не предусмотрено, поэтому пользователь должен самостоятельно следить за уровнем вложения подпрограмм. 5.2.8. Прямая и косвенная адресацииКогда происходит прямая 9-битная адресация, младший 7 бит берется как прямое адрес из кода операции, а два бита указателя страниц (RP1, RP0) из регистра статуса, как показано на Рис. 5.7.
Признаком косвенной адресации является обращение к регистру INDF. Любая команда, использующая INDF (адрес 00h) как регистр фактически обращается к указателю, который хранится в FSR (адрес 04h). Чтение косвенным образом самого регистра INDF даст результат 00h. Запись в регистр INDF косвенным образом будет выглядеть как NOP, но биты статуса могут быть изменены. Необходима 9-битная адрес формируется путем объединения содержимого 8-битного FSR регистра и бита IRP из регистра статуса (см. Рис. 5.7). Обратите внимание, что некоторые регистры специальных функций располагаются в банке 1. Чтобы адресоваться к ним, нужно дополнительно установить в единицу бит RP0 в регистре статуса. 5.2.9. Порты ввода / выводаКонтроллеры подгруппы PIC16F8X имеют два порта: PORTA (5 бит) и PORTB (8 бит) с побитового индивидуальным настройкой на ввод или вывод. Порт А (PORTA) представляет собой 5-битный фиксатор, что соответствует выводам контроллера RA. Линия RA4 имеет вход триггера Шмидта и выход с открытым стоком. Все остальные линии порта имеют ТТЛ входные уровне и КМОП выходные буферы. Адрес регистра порта А - 05h. Каждой линии порта поставлен в соответствие бит направления передачи данных, хранящейся в управляющем регистре TRISA, расположенном по адресу 85h. Если бит управляющего TRISA регистра имеет значение 1, то соответствующая линия будет устанавливаться на ввод. Ноль переключает линию на вывод и одновременно выводит на нее содержимое соответствующего регистра-фиксатора порта. При включении питания все линии порта по умолчанию настраиваются на ввод. На Рис. 5.8 дано схему линий RA <3:0> порта А.
Операция чтения порта А считывает состояние выводов порта, в то время как запись в него изменяет состояние триггеров порта. Все операции с портом являются операциями типа "чтение-модификация-запись". Поэтому запись в порт предполагает, что состояние выводов порта сн ачала считывается, затем модифицируется и записывается в триггер-фиксатор. Вывод RA4 мультиплексированных с тактовым входом таймера TMR0. Схема линии RA4 порта А приведена на Рис. 5.9. Порт B (PORTB) - это двунаправленных 8-битный порт, соответствующий выводам RB <7:0> контроллера и расположен по адресу 06h. Управляющий регистр, который относится к этому порту TRISB расположен на первой странице регистров по адресу 86h. Если бит управляющего TRISB регистра имеет значение 1, то соответствующая линия будет устанавливаться на ввод. Ноль переключает линию на вывод и одновременно выводит на нее содержимое соответствующего регистра. При включении питания все линии порта по умолчанию настраиваются на ввод.
У каждой ножки порта В является небольшое активная нагрузка (около 100мкА) на линию питания (pull-up). Она автоматически отключается, если эта ножка запрограммирована как вывод. Более того, управляющий бит / RBPU регистра OPTION <7> может отключить (при RBPU = 1) все нагрузки. Инициализация при включении питания также отключает все нагрузки. Четыре линии порта В (RB <7:4>) могут вызвать прерывание при изменении значения сигнала на каждой из них. Если эти линии настроены на ввод, то они опрашиваются и замыкаются в цикле чтения Q1. Новая величина входного сигнала сравнивается со старой в каждом командном цикле. При несовпадении значения сигнала на ножке и в фиксаторе генерируется высокий уровень. Выходы детекторов "разногласий" RB4, RB5, RB6, RB7 соединяются по схеме ИЛИ и генерируют прерывание RBIF (запоминается в регистре INTCON <0>). Любая линия, настроенная как вывод, в этом сравнении не участвует. Прерывание может вывести кристалл из режима SLEEP. В подпрограмме обработки прерывания следует сбросить запрос прерывания одним из следующих способов:
При этом необходимо иметь в виду, что условие "разногласия" будет продолжать устанавливать признак RBIF. Только чтение порта В может устранить "расхождение" и позволит обнулить бит RBIF. Прерывания по разногласия и программно устанавливаемые внутренние активные нагрузки на этих четырех линиях могут обеспечить простой интерфейс, например, с клавиатурой, с выходом из режима SLEEP по нажатию клавиш. Схемы линий порта B приведены на Рис. 5.10 и 5.11.
При организации двунаправленных портов необходимо учитывать особенности организации ввода / вывода данных МК. Любая команда, осуществляющая запись, выполняет ее внутри как "чтение-модификация-запись". Например, команды BCF и BSF считывают порт целиком, модифицируют один бит и выводят результат обратно. Здесь необходима осторожность. В частности, ко анда BSF PORTB, 5 (установить в единицу бит 5 порта B) сначала считывает все реальные значения сигналов, присутствующих в данный момент на выводах порта. Затем выполняются действия над битом 5, и новое значение байта целиком записывается в выходные фиксаторы. Если другой бит регистра PORTB используется как двунаправленных порт ввода / вывода (скажем, бит 0), и в данный момент он определен как входной, то входной сигнал на этом выводе будет считанных и записан обратно в выходной триггер-фиксатор этого же вывода, стирая предыдущий состояние. До тех пор, пока эта ножка остается в режиме ввода, никаких проблем не возникает. Однако если позднее линия 0 переключится в режим вывода, ее состояние будет неопределенным. На ножку, работающий в режиме вывода, не должны грузиться внешние источники токов ("монтажное И", "монтажное ИЛИ"). Большие результирующие токи могут повредить кристалл. Необходимо выдерживать определенную последовательность обращения к портам ввода / вывода. Запись в порт вывода происходит в конце командного цикла. Но при чтении данные должны быть стабильны в начале командной цикла. Будьте внимательны в операциях чтения, следующих сразу за записью в тот же порт. Здесь надо учитывать инерционность установления напряжения на выводах. Может потребоваться программная задержка, чтобы напряжение на ножке (которая зависит от нагрузки) успела стабилизироваться до начала выполнения следующей команды чтения. | |
| «Структура курса Раздел 5 - Страницы: « | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | » | |