Электромеханические системы автоматизации
Характеристика, устройство, конфигурация и назначение микроконтроллеров I8051, PIC16F877, организация их памяти. Основные методы и приемы системного программирования микроконтроллеров и интерфейса на языках семейства ассемблер MCS-51 и PICmicro.
Рубрика | Коммуникации, связь, цифровые приборы и радиоэлектроника |
Вид | методичка |
Язык | русский |
Дата добавления | 18.04.2010 |
Размер файла | 3,0 M |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
г) Возвращение из подпрограммы (RETURN, RETFIE или RETLW). Значение PC возвращается со стека.
Рисунок 37 - Возможные варианты изменения состояния PC
При выполнении инструкций возврата из подпрограммы 13-разрядное значение для счетчика программ PC берется с вершины стека, поэтому манипуляция битами регистра PCLATH<3:4> не требуется (Рис. 37 г).
Пример переключения с 0 в 1 страницу памяти программ для выполнения подпрограммы в 1й странице:
ORG 0x500
BSF pclath,3 ; Выбор страницы 1 (800h-FFFh)
CALL SUBI_PI ; Переход на страницу 1 (800h-FFFh)
...
;
ORG 0x900
SUBI_PI ; Страница 1 (800h-FFFh)
...RETURN ; Возврат на страницу 0 (000h-7FFh)
5.5 Организация памяти данных
Память данных разделяется на регистры двух типов:
- Регистры специального назначения (SFR), управляющие работой микроконтроллера;
- Регистры общего назначения (GPR), предназначены для хранения данных программы.
Память данных разделена на банки, содержащие регистры общего и специального назначения. Регистры общего назначения размещаются в разных банках памяти данных для того, чтобы была возможность организовать более 96 байт ОЗУ. Регистры специального назначения предназначены для управления периферийными модулями и функциями микроконтроллера. Управление банками памяти выполняется битами в регистре STATUS<7:5>. На рис. 38 представлена карта памяти данных.
Рисунок 38 - Карта памяти микроконтроллера PIC16F877
Чтобы передть данные из одного регистра в другой, необходимо использовать дополнительный регистр W. Эта операция выполняется двумя командами за два машинных цикла микроконтроллера.
Обращение ко всем регистрам памяти данных может быть выполнено прямой или косвенной адресацией. При прямой адресации для указания банка памяти данных необходимо использовать биты PR1-PR0 регистра STATUS. В случае косвенной адресации адрес регистра сохраняется в FSR (Рис. 39), а в бите IRP регистра STATUS указывается, к какой паре банков памяти данных выполняют обращение (0/1 или 2/З). Для выполнения косвенной адресации необходимо обратиться к регистру INDF. Обращение к регистру INDF фактически вызовет действие с регистром, адрес которого указан в FSR. Косвенное чтение регистра INDF (FSR=0) даст результат значения ячейки 00h. Косвенная запись в регистр INDF не вызовет никаких действий (вызывает воздействия на флаги АЛУ в регистре STATUS).
Рисунок 39 - Механизмы прямой и косвенной адресации
Пример использования косвенной адресации для отчистки блока памяти с адресами 20h-2Fh:
BCF STATUS, IRP; Установить банк 0,1
MOVLW 0X20 ; Указать первый регистр в ОЗУ
MOVWF FSR
NEXT:
CLRF INDF ; Очистить регистр
INCF FSR, F ; Увеличить адрес
BTFSS FSR, 4 ; Завершить?
GOTO NEXT ; Нет, продолжить очистку
CONTINUE: ;Да
Пример переключения между памяти данных для прямой адресации:
CLRF STATUS ; Очистка регистра STATUS (Банк 0)
;
BSF STATUS,RP0 ; Банк 1
...
BCF STATUS,RP0 ; Банк 0
...
MOVLW 0x60 ; Установить RP0 и RP1 в STATUS регистре
XORWF STATUS,F ; (Банк 3)
...
BCF STATUS,RP0 ; Банк 2
...
BCF STATUS,RP1 ; Банк 0
Регистры общего назначения (GPR).
Регистры общего назначения размещаются в разных банках памяти данных. Эти регистры не инициализируются при сбросе по включению питания и имеют неизвестное значение, а при всех остальных сбросах микроконтроллера не изменяют своего значения.
Обращение к регистрам общего назначения может быть выполнено прямой или косвенной адресацией (через регистры FSR и INDF). В микроконтроллере существуют регистры общего назначения, адресуемые к одной и той же ячейке ОЗУ, независимо от текущего банка памяти данных. При адресации к старшей области памяти данных (последние 16 ячеек) в любом банке происходит «зеркальное» обращение только к регистрам с адресами 70h-7Fh.
Регистры специального назначения (SFR).
Регистры специального назначения используются для управления ядром и периферийными модулями микроконтроллера. Эти регистры реализованы как статическое ОЗУ. Описание регистров SFR, управляющих периферийными модулями, смотрите в соответствующем разделе.
Регистры специального назначения размещены в различных банках памяти данных, а некоторые из регистров отображаются во всех банках.
Переключение рабочего банка памяти выполняется настройкой битов RP1-RP0 регистра STATUS. При сбросе по включению питания и других видах сброса микроконтроллера в некоторые регистры специального назначения записывается определенное значение. Существуют регистры SFR, которые содержат неизвестное значение при сбросе по включению питания, а при других видах сброса не изменяются.
Обращение к регистрам специального назначения может быть выполнено прямой или косвенной адресацией.
5.6 Система прерываний микроконтроллера
Микроконтроллер PIC16F877 имеет 14 источников прерываний. Регистр INTCON содержит флаги отдельных прерываний, биты разрешения этих прерываний и бит глобального разрешения прерываний. Структурная схема логики прерываний показана на рис. 40.
Если бит GIE (INTCON<7>) установлен в «1», разрешены все немаскированные прерывания. Если GIE=0, то все прерывания запрещены. Каждое прерывание в отдельности может быть разрешено или запрещено установкой/сбросом соответствующего бита в регистрах INTCON (Рис. 41), PIE1 (Рис. 42) и PIE2 (Рис. 43). При сбросе микроконтроллера бит GIE сбрасывается в «0».
При возвращении из подпрограммы обработки прерывания, по команде RETFIE, бит GIE аппаратно устанавливается в «1», разрешая все немаскированные прерывания.
В регистре INTCON находятся флаги следующих прерываний: внешнего сигнала INT, изменения уровня сигнала на входах RB7-RB4, переполнения TMR0.
В регистрах PIR1 (Рис. 44), PIR2 (Рис. 45) содержатся флаги прерываний периферийных модулей микроконтроллера, а в регистрах PIE1, PIE2 соответствующие биты разрешения прерываний. В регистре INTCON находится бит разрешения прерываний от периферийных модулей.
Рисунок 40 - Структурная схема системы прерываний
При переходе на подпрограмму обработки прерываний, бит GIE аппаратно сбрасывается в «0», запрещая прерывания, адрес возврата из подпрограммы обработки прерываний помешается в стек, а в счетчик команд PC загружается вектор прерывания 0004h. Источник прерываний может быть определен проверкой флагов прерываний, которые должны быть сброшены программно перед разрешением прерываний, чтобы избежать повторного вызова.
Флаги прерываний устанавливаются независимо от состояния соответствующих битов маски и бита GIE.
Внешнее прерывание с входа RB0/INT происходит по переднему фронту сигнала, если бит INTEDG (OPTION_REG<6>) установлен в «1»; по заднему фронту сигнала, если бит INTEDG сброшен в «0». Когда активный фронт сигнала появляется на входе RB0/INT бит INTF (INTCON<1>) устанавливается в «1». Прерывание может быть запрещено сбросом бита INTE (INTCON<4>) в «0». Флаг прерывания INTF должен быть сброшен программно в подпрограмме обработки прерываний. Прерывание INT может вывести микроконтроллер из режима SLEEP, если бит INTE=1 до перехода в режим SLEEP. Состояние бита GIE определяет, переходить на подпрограмму обработки прерываний после выхода из режима SLEEP.
Рисунок 41 - Регистр управления прерываниями INTCON
Назначение битов регистра INTCON:
GIE - Бит общего разрешения прерываний;
PEIE - Бит разрешения прерываний от периферийных модулей;
T0IE - Бит разрешения прерываний по переполнению TMR0;
INTE - Бит разрешения прерываний по внешнему входу INT;
RBIE - Бит разрешения прерываний по изменению уровня на входах RB4-RB7. Обычно используется для обслуживания клавиатурной матрицы.
T0IF - Флаг прерывания по переполнению таймера TMR0 (сбрасывается программно);
INTF - Флаг прерывания по внешнему входу INT (сбрасывается программно);
RBIF - Флаг прерывания по изменению уровня сигнала на входах RB4-RB7 (сбрасывается программно).
Рисунок 42 - Регистр управления прерываниями PIE1
Назначение битов регистра PIE1:
PSPIE - Разрешение прерываний записи/чтения ведомого параллельного порта;
ADIE - Разрешение прерываний по окончанию преобразования АЦП;
RCIE - Разрешение прерываний от приемника УСАПП;
TXIE - Разрешение прерываний от передатчика УСАПП;
SSPIE - Разрешение прерываний от модуля синхронного последовательного порта;
CCP1IE - Разрешение прерываний от модуля CCP1;
TMR2IE - Разрешение прерываний по переполнению TMR2;
TMR1IE - Разрешение прерываний по переполнению TMR1;
Рисунок 43 - Регистр управления прерываниями PIE2
Назначение битов регистра PIE2:
EEIE - Разрешение прерываний по окончанию записи в EEPROM данных;
BCLIE - Разрешение прерываний по возникновению коллизий на шине;
CCP2IE - Разрешение прерываний от модуля CCP2.
Рисунок 44 - Регистр флагов периферийных модулей PIR1
Назначение битов регистра PIR1:
PSPIF - Флаг прерывания от ведомого параллельного порта после операции чтения/записи;
ADIF - Флаг прерывания от АЦП после завершения преобразования;
RCIF - Флаг прерывания от приемника УСАПП по заполнению буфера приема;
TXIF - Флаг прерывания от передатчика УСАПП по опустошению буфера передачи;
SSPIF - Флаг прерывания от модуля MSSP (сбрасывается программно);
CCP1IF - Флаг прерывания от модуля CCP1:
а) В режиме захвата выполнен захват значения TMR1 (сбрасывается программно);
б) В режиме сравнения значение TMR1 достигло величины, записанной в регистры CCPR1H:CCPR1L (сбрасывается программно);
в) В режиме ШИМ не используется.
TMR2IF - Флаг прерывания по переполнению таймера TMR2 (сбрасывается программно);
TMR1IF - Флаг прерывания по переполнению таймера TMR1 (сбрасывается программно).
Рисунок 45 - Регистр флагов периферийных модулей PIR2
Назначение битов регистра PIR2:
EEIF - Флаг прерывания по окончанию записи в EEPROM данных (сбрасывается программно);
BCLIF - Флаг прерывания по обнаружению коллизии в режиме ведущего на шине I2C (сбрасывается программно);
CCP2IF - Флаг прерывания от модуля CCP2:
а) В режиме захвата выполнен захват значения TMR1 (сбрасывается программно);
б) В режиме сравнения значение TMR1 достигло величины, записанной в регистры CCPR2H:CCPR2L (сбрасывается программно);
в) В режиме ШИМ не используется.
Рисунок 46 - Регистр настроек OPTION_REG
Назначение битов регистра OPTION_REG:
-RBPU - Бит включения внутренних подтягивающих резисторов на входах PORTB. 0 - подтягивающие резисторы включены;
INTEDG - Выбор активного сигнала на внешнем входе прерывания INT:
0 - Прерывание по заднему фронту сигнала;
1 - Прерывание по переднему фронту сигнала.
T0CS - Выбор тактового сигнала для таймера TMR0:
0 - Внутренний сигнал CLKOUT;
1 - Внешний сигнал с вывода RA4/T0CKI.
T0SE - Выбор фронта приращения TMR0 при внешнем тактовом сигнале:
0 - Приращение по переднему фронту;
1 - Приращение по заднему фронту.
PSA - Выбор включения предделителя:
0 - Предделитель включен перед TMR0;
1 - Предделитель включен перед сторожевым таймером.
PSA2, PSA1, PSA0 - выбор коэффициента деления предделителя:
Значение: |
Для TMR0: |
Для WDT: |
|
000 |
1:2 |
1:1 |
|
001 |
1:4 |
1:2 |
|
010 |
1:8 |
1:4 |
|
011 |
1:16 |
1:8 |
|
100 |
1:32 |
1:16 |
|
101 |
1:64 |
1:32 |
|
110 |
1:128 |
1:64 |
|
111 |
1:256 |
1:128 |
Если предделитель подключен к WDT, то его коэффициент деления для модуля TMR0 равен 1:1.
При переходе на подпрограмму обработки прерываний в стеке аппаратно сохраняется только адрес возврата. Как правило, дополнительно необходимо сохранять ключевые регистры (например W, STATUS), что выполняется программно.
Операция сохранения значения регистров обычно обозначается PUSH, а восстановление значения регистров обозначается POP. Обратите внимание, что PUSH, POP не являются мнемоникой команд, а лишь обозначают действие, которое может быть выполнено последовательностью команд. Следует отличать эти операции от команд микропроцессора I8051, т. к. микроконтроллеры PICmicro имеют аппаратный стек не доступный из программы. Для упрощения текста программы можно эти сегменты кода программы представить в виде макросов MPASM.
Последовательность операций при сохранении контекста программы:
1) Сохранить регистр W независимо от текущего банка памяти;
2) Сохранить регистр STATUS в банке 0;
3) Выполнить подпрограмму обработки прерываний;
4) Восстановить регистр STATUS и текущий банк памяти данных;
5) Восстановить регистр W.
Если необходимо сохранить и другие регистры, то сохранение нужно выполнять после сохранения регистра STATUS (шаг 2), а восстановление перед восстановлением STATUS (шаг 4).
Можно применять для сохранения контекста программы область памяти данных, которая имеет «зеркальное» отображение во всех банках регистров - адреса 70h-7Fh.
Пример написания макроса сохранения регистров программы:
PUSH_MACRO MACRO ; Макрос сохранения регистров
MOVWF W_TEMP ; Копировать W во временный
;регистр независимо от текущего банка
SWAPF STATUS,W ; Обменять полубайты в регистре STATUS
; и записать в W
MOVWF STATUS_TEMP ; Сохранить STATUS во временном регистре банка 0
ENDM ; Конец макроса
;
POP_MACRO MACRO ; Макрос восстановления регистров
SWAPF STATUS_TEMP,W ; Обменять полубайты оригинального значения STATUS; и записать в W (восстановить текущий банк)
MOVWF STATUS ; Восстановить значение STATUS из регистра W
SWAPF W_TEMP,F ; Обменять полубайты в регистре ;W_TEMP и сохранить
; результат в W_TEMP
SWAPF WJTEMP,W ; Обменять полубайты в регистре W_TEMP и ; восстановить оригинальное значение W без
; воздействия на STATUS
ENDM ; Конец макроса
Пример инициализации системы прерываний:
PIE1_MASK1 EQU B'01101010' ; Значение для регистра маски ;прерываний
CLRF STATUS ; Банк 0
CLRF INTCON ; Выключить прерывания и сбросить флаги
CLRF PIR1 ; Сбросить все флаги
BSF STATUS,RP0 ; Банк 1
MOVLW PIE1_MASK1 ; Записать маску прерываний в регистр PIE1
MOVWF PIE1 ;
BCF STATUS,RP0 ; Банк 0
BSF INTCON,GIE ; Включить прерывания
В примере показана инициализация прерываний, где PIE1_MASK - значение, записываемое в регистр маски периферийных прерываний.
Макрокоманды должны быть определены прежде, чем они будут использоваться. Для простоты отладки текста программы макрокоманды рекомендуется помещать в отдельные файлы, включаемые в исходный файл программы, до применения макрокоманды. Рекомендуется включать файлы с макрокомандами в начале исходного файла:
LIST p=pl6F877 ; Список директив
#INCLUDE <P16F877.INC> ; Дополнительный файл к микроконтроллеру
#INCLUDE <MY_STD.MAC> ; Подключить файл стандартных макрокоманд
#INCLUDE <APP.MAC> ; подключить файл специальных макрокоманд
; Определение битов конфигурации для этого приложения
_CONFIG _XT_OSC & _PWRTE_ON & _BODEN_OFF & _CP_OFF & _WDT_ON
org 0x00 ; Начало памяти программ
RESET_ADDR ; Первая выполняемая инструкция после сброса
end
Как указывалось выше, система прерываний микроконтроллера PIC16F877 имеет 14 источников прерываний и всего лишь один вектор входа в подпрограммы прерываний. Такая организация системы прерываний накладывает некоторые особенности при написании программ. Определение источника прерывания назначается программе, которая при обслуживании прерываний должна определять какой узел микроконтроллера нуждается в обработке, путем проверки установленных флагов прерываний.
В нижеприведенном примере представлена типовая структура проверки возникшего прерывания. В этом примере используются макрокоманды для сохранения значения регистров перед выполнением кода обработки прерываний:
Org ISR_ADDR ;
PUSH_MACRO ; Макрокоманда сохранения регистров.
; или другой код
CLRF STATUS ; Банк 0
BTFSC PIR1,TMR1IF ; Прерывание ot TMR1?
GOTO t1_int ; Да
BTFSC PIR1,ADIF ; Нет, прерывание от АЦП?
GOTO AD_int ; Да, от АЦП
... ; Нет, проверка других источников
... ; прерываний
BTFSC INTCON,RBIF ; Нет, прерывание по изменению сигнала
; на RB7:RB6?
GOTO portb_int ; Да.
INT_ERROR_LP1 ; Нет, процедура восстановления при ошибке
GOTO INT_ERROR_LPl ; Здесь должна располагаться процедура
; обработки возникновения неожидаемого
; прерывания T1_INT
; Обработка прерываний от TMR1
...
BCF PIR1,TMR1IF ; Сброс флага прерывания от TMR1
GOTO END_ISR ; Завершение обработки прерываний
AD_INT ; Обработка прерываний от АЦП
...
BCF PIR1,ADIF ; Сброс флага прерывания от АЦП
GOTO END_ISR ; Завершение обработки прерываний
PORTВ_INT ; Обработка прерываний по изменению
... ; сигнала на RB7:RB6
END_ISR
POP_MACRO ; Макрокоманда восстановления значения
; регистров или другой код
RETFIE ; Возвращение из обработки прерываний,
; разрешение прерываний
5.7 Порты ввода/вывода
Универсальные порты ввода/вывода могут рассматриваться как самые простые периферийные модули. Они позволяют микроконтроллерам PIC контролировать работу и управлять другими устройствами. Для большинства каналов портов ввода/вывода регистры TRIS управляют направлением данных на выводе. Бит TRIS<x> управляет направлением данных на канале PORT<x>. Если бит TRIS установлен в «1», то соответствующий канал порта ввода/вывода работает как вход, а если бит TRIS сброшен в «0», то канал ввода/вывода работает как выход. Простой способ запомнить направление канала ввода/вывода и состояние битов регистров TRIS: 1 - напоминает «In» (ввод); «0» - напоминает «Out» (выход).
Регистр PORT - защелка данных, выводимых на порт ввода/вывода. При чтении регистра PORT возвращается состояние выводов порта. Это означает, что необходима некоторая осторожность при выполнении команд со структурой «чтение-модификация-запись» для изменения логического уровня на выходах порта.
Чтение регистра PORT возвращает состояние на выводах порта, а запись выполняется в выходную защелку. Обратите внимание на операции «чтение-модификация-запись» (например BSF и BCF). Сначала происходит чтение состояния выводов порта, изменение полученного значения, а затем выполняется запись в выходную защелку порта.
Расположение выводов микроконтроллера PIC16F877 можно увидеть на рис. 47. Мультиплицирование каналов ввода/вывода с функциями периферийных модулей вносит свои особенности при программировании и настройке микроконтроллера.
Когда периферийный модуль подключен к выводу порта, функциональные возможности канала порта ввода/вывода могут измениться, в соответствии с требованиями периферийного модуля. Например, модуль АЦП, которому настраивают соответствующие каналы как аналоговые входы. Таким образом, выводы портов могут быть мультиплицированы с аналоговыми входами и входом Vref. Для каждого вывода необходимо определить режим его работы (аналоговый вход или цифровой канал ввода/вывода) настройкой управляющих битов в регистре ADCON1 (регистр управления АЦП). Когда вывод работает как аналоговый вход, то чтение состояния этого вывода будет давать результат «0». Следует заметить, что при сбросе микроконтроллера выводы, мультиплицированные с АЦП, настраиваются на аналоговый ввод.
Регистры TRIS управляет направлением каналов ввода/вывода, даже когда он работает в режиме аналогового входа. Пользователь должен гарантировать, что соответствующий бит TRIS установлен в «1», если вывод используется как аналоговый вход.
При включении некоторых периферийных модулей отменяется действие битов TRIS. Поэтому следует избегать команд «чтение-модификация-запись» с регистрами TRIS (например, BSF, BCF, XORWF и т. д.).
Рисунок 47 - Расположение выводов микроконтроллера PIC16F877
Регистры PORTA и TRISA.
Линия RA4 имеет триггер Шмидта на входе и открытый сток на выходе. Все остальные каналы PORTA имеют ТТЛ буфер на входе и полнофункциональные выходные КМОП буферы. Все выводы имеют биты управления направления данных в регистре TRISA, с помощью которых можно настроить выводы как входы или выходы.
Запись «1» в TRISA переводит соответствующий выходной буфер в Z-состояние. Запись «0» в регистр TRISA определяет соответствующий канал как выход, содержимое защелки PORTA передается на вывод микроконтроллера. Пример настройки каналов порта POTA:
BCF STATUS,RP0 ; Выбрать банк 0
CLRF PORTA ; Инициализация защелок PORTA
BSF STATUS,RP0 ; Выбрать банк 1
MOVLW 0хCF ; Значение для инициализации
; направления каналов PORTA
MOVWF TRISA ; Настроить RA<3:0> как входы.
; настроить RA<5:4> как выходы
; Биты TRISA<7:6> всегда читаются как '0'.
Регистры PORTB и TRISB
PORTB - 8-разрядный двунаправленный порт ввода/вывода. Биты регистра TRISB определяют направление каналов порта. Установка битва в «1» регистра TRISB переводит выходной буфер в Z-состояние. Запись «0» в регистр TRISB настраивает соответствующий канал как выход, содержимое защелки PORTB передается на вывод микроконтроллера (если выходная защелка подключена к выводу микроконтроллера).
Пример настройки порта PORTB:
BCF STATUS,RP0 ; ВЫБРАТЬ БАНК 0
CLRF PORTB ; ИНИЦИАЛИЗАЦИЯ ЗАЩЕЛОК PORTB
BSF STATUS,RP0 ; ВЫБРАТЬ БАНК 1
MOVLW 0хCF ; ЗНАЧЕНИЕ ДЛЯ ИНИЦИАЛИЗАЦИИ
; НАПРАВЛЕНИЯ КАНАЛОВ PORTB
MOVWF TRISB ; НАСТРОИТЬ RB<3:0> КАК ВХОДЫ.
; RB<5:4> КАК ВЫХОДЫ. RB<7:6> КАК ВХОДЫ
К каждому выводу PORTB подключен внутренний подтягивающий резистор. Бит -RBPU (регистр OPTION_REG<7>) определяет, подключены (-RBPU=0) или нет (-RBPU=1) подтягивающие резисторы. Подтягивающие резисторы автоматически отключаются, когда каналы порта настраиваются на выход и после сброса по включению питания POR.
а) |
б) |
|
Рисунок 47 - Структурная схема выводов RB0-RB3 (a) и RB4-RB7 (б) |
Четыре канала PORTB RB7-RB4 (Рис. 47) настроенные на вход, могут генерировать прерывания по изменению логического уровня сигнала на входе. Если один из каналов RB7-RB4 настроен на выход, то он не может быть источником прерываний. Сигнал на выводах RB7-RB4 сравнивается со значением, сохраненным при последнем чтении PORTB. В случае несовпадения одного из значений устанавливается флаг RBIF (INTCON<0>) и, если разрешено, генерируется прерывание.
Это прерывание может вывести микроконтроллер из режима SLEEP. В подпрограмме обработки прерываний необходимо сделать следующие действия:
- Выполнить чтение или запись в PORTB, исключив несоответствие;
- Сбросить флаг RBIF в «0».
Несоответствие сохраненного значения с сигналом на входе PORTB всегда устанавливает бит RBIF в «1». Чтение из PORTB прервет условие несоответствия и позволит сбросить флаг RBIF в «0».
Прерывания по изменению сигнала на входах PORTB и программа переключения конфигурации этих каналов позволяет реализовать простой интерфейс обслуживания клавиатуры с выходом из режима SLEEP по нажатию клавиш.
Прерывания по изменению сигнала на входах рекомендуется использовать для определения нажатия клавиш, когда PORTB полностью задействован для реализации клавиатуры. Не рекомендуется опрашивать PORTB при использовании прерываний по изменению входного сигнала.
Вывод RB0/INT может служить для ввода внешнего сигнала прерываний, настраиваемого битом INTEDG регистра OPTION_REG<6>.
Регистры PORTC и TRISC.
PORTC - 8-разрядный двунаправленный порт ввода/вывода. Биты регистра TRISC определяют направление каналов порта. Установка бита в «1» регистра TRISC переводит выходной буфер в Z-состояние. Запись «0» в регистр TRISC настраивает соответствующий канал как выход, содержимое защелки PORTC передается на вывод микроконтроллера (если выходная защелка подключена к выводу микроконтроллера).
Выводы PORTC мультиплицированы с несколькими периферийными модулями. На каналах PORTC присутствует входной буфер с триггером Шмидта.
При использовании периферийных модулей необходимо соответствующим образом настраивать биты регистра TRISC для каждого вывода PORTC. Некоторые периферийные модули отменяют действие битов TRISC, принудительно настраивая вывод на вход или выход. В связи с чем, не рекомендуется использовать команды «чтение-модификация-запись» с регистром TRISC.
Настройка каналов PORTC производится аналогичными способами, указанными выше.
Регистры PORTD и TRISD.
PORTD - 8-разрядный двунаправленный порт ввода/вывода. Биты регистра TRISD определяют направление каналов порта.
Каналы PORTD могут работать как 8-разрядный микропроцессорный порт (ведомый параллельный порт), если бит PSPMODE (TRISE<4>) установлен в «1». В режиме ведомого параллельного порта к входам подключены буферы с уровнями TTL.
Регистры PORTE и TRISE.
PORTE имеет три вывода (RE0/-RD/AN5, RE1/-WR/AN6, RE2/-CS/AN7), индивидуально настраиваемые на вход или выход. Выводы PORTE имеют входной буфер Шмидта.
Каналы PORTE станут управляющими выводами ведомого параллельного порта, когда бит PSPMODE (TRISE<4>) установлен в «1». В этом режиме биты TRISE<2:0> должны быть установлены в «1». В регистре ADCON1 необходимо также настроить выводы PORTE как цифровые каналы ввода/вывода. В режиме ведомого параллельного порта к выводам PORTE подключены входные буферы TTL.
Выводы PORTE мультиплицированы с аналоговыми входами. Когда каналы PORTE настроены как аналоговые входы, биты регистра TRISE не влияют на направление данных PORTE, чтение будет давать результат «0».
После сброса по включению питания выводы настраиваются как аналоговые входы, а чтение дает результат «0».
Особенности выполнения команд «чтение-модификация-запись».
Все операции записи в порт выполняются по принципу «чтение-модификация-запись». Например, команды BCF и BSF считывают значение в регистр ЦПУ, выполняют битовую операцию и записывают результат обратно в регистр. Требуется некоторая осторожность при применении подобных команд к регистрам портов ввода/вывода. Например, команда BSF PORTB,5 считывает все восемь битов PORTB в ЦПУ, изменяет состояние бита 5 и записывает результат в выходные защелки PORTB. Если другой канал PORTB (например, RB0) настроен на вход, то сигнал на выводе будет считан в ЦПУ и записан в защелку данных, поверх предыдущего значения. Пока RB0 настроен как вход, никаких проблем не возникает. Но, если RB0 будет позже настроен как выход, значение в защелке данных может отличаться от требуемого значения.
В нижеуказанном примере показан эффект последовательного выполнения команд «чтение-модификация-запись» с регистром порта ввода/вывода. Начальные установки порта: PORTB<7:4> входы; PORTB<3:0> выходы. Выводы RB7-RB6 имеют внешние подтягивающие резисторы и не подключены к другим цепям в схеме:
Защелка PORTB Выводы PORTB
BCF STATUS,RP0
BCF PORTB, 7 ;01PP PPPP 11pp PPPP
BCF PORTB,6 ;10PP PPPP 11PP PPPP
BSF STATUS,RP0 ;
BCF TRISB,7 ;10PP PPPP 11PP PPPP
BCF TRISB,6 ;10PP PPPP 10PP PPPP
Обратите внимание. Возможно, пользователь ожидал, что после выполнения программы на выходах PORTB будет значение 00PP PPPP. Однако 2-я команда BCF установила в «1» RB7.
Запись в порт ввода/вывода фактически происходит в конце машинного цикла, а чтение данных выполняется в начале цикла. Поэтому требуется некоторая осторожность при записи в порт ввода/вывода, если перед записью выполняется чтение состояния этого порта. Последовательность команд должна быть такой, чтобы установилось напряжение на выводе порта прежде, чем будет выполнена команда записи в порт, сопровождаемая чтением состояния выводов (иначе вместо нового значения может быть считано предыдущее). Если возможна описанная ситуация, разделите команды записи инструкциями NOP или любыми другими командами, которые не обращаются к порту ввода/вывода.
При инициализации портов ввода/вывода рекомендуется сначала записать стартовое значение в выходную защелку порта (регистр PORT), а затем настроить направление каналов порта (регистр TRIS). Эта последовательность устраняет возможность ложного уровня на выходе порта, т. к. при включении питания в выходных защелках порта содержится случайное значение.
5.8 Модуль таймера TMR0
TMR0 - таймер/счетчик, имеет следующие особенности:
- 8-разрядный таймер/счетчик;
- Возможность чтения и записи текущего значения счетчика;
- 8-разрядный программируемый предделитель;
- Внутренний или внешний источник тактового сигнала;
- Выбор активного фронта внешнего тактового сигнала;
- Прерывания при переполнении (переход значения от FFh к 00h).
Блок схема модуля TMR0 и общего с WDT предделителя, показана на рис. 48:
Рисунок 48 - Блок-схема модуля таймера TMR0
Когда бит T0CS сброшен в «0» (OPTION_REG<5>, Рис. 46), TMR0 работает от внутреннего тактового сигнала. Если бит T0CS установлен в «1» (OPTION_REG<5>), TMR0 работает от внешнего источника тактового сигнала с входа RA4/T0CKI. Активный фронт внешнего тактового сигнала выбирается битом T0SE в регистре OPTION_REG<4> (T0SE=0 - активным является передний фронт сигнала). Предделитель может быть включен перед WDT или TMR0, в зависимости от состояния бита PSA (OPTION_REG<3>). Нельзя прочитать или записать новое значение в предделитель.
Любая запись в регистр TMR0 вызовет запрещение приращения таймера TMR0 в течение двух следующих машинных циклов (2TCY). Если предделитель включен перед TMR0, то запись в регистр TMR0 вызовет немедленное изменение TMR0 и сброс предделителя. Приращение TMR0 и предделителя запрещено в течение 2-х машинных циклов (2TCY), после записи в TMR0. Например, если коэффициент предделителя равен 2, то после операции записи в регистр TMR0 приращение таймера не будет происходить в течение 4 циклов для TMR0. Далее таймер работает в нормальном режиме.
Прерывания от TMR0 возникают при переполнении счетчика, т. е. при переходе его значения от FFh к 00h. При возникновении прерывания устанавливается в «1» бит T0IF (INTCON<2>). Само прерывание может быть разрешено или запрещено установкой/сбросом бита Т0IЕ в регистре INTCON<5>. Флаг прерывания от TMR0 T0IF (INTCON<2>) должен быть сброшен в подпрограмме обработки прерываний. В SLEEP режиме микроконтроллера модуль TMR0 выключен и не может генерировать прерывания.
Переключение предделителя выполняется программным способом, т. е. переключение можно сделать во время выполнения программы.
Для предотвращения случайного сброса микроконтроллера следует выполнять переключение предделителя от TMR0 к WDT как показано в примере ниже, даже если WDT выключен.
В данном примере первая часть изменения регистра OPTION_REG не должна выполняться, если желаемый коэффициент предделителя отличный от 1:1. Если требуется настройка коэффициента предделителя 1:1, то необходимо установить промежуточное значение коэффициента (отличное от 1:1), а затем установить коэффициент предделителя 1:1 в последней части изменения OPTION_REG.
Переключение предделителя от TMR0 к WDT:
BSF STATUS,RP0 ;Банк 1
MOVLW Ь'ХХ0Х0ХХХ' ; ВЫБРАТЬ ИСТОЧНИК ТАКТОВОГО СИГНАЛА И
MOVWF OPTION_REG ; КОЭФФИЦИЕНТ ПРЕДДЕЛИТЕЛЯ. ОТЛИЧНЫЙ ОТ 1:1
BCF STATUS,RP0 ; БАНК 0
CLRF TMR0 ; СБРОСИТЬ TMR0 И ПРЕДДЕЛИТЕЛЬ
BSF STATUS,RP0 ; БАНК 1
MOVLW B'XXXX1XXX' ; ВКЛЮЧИТЬ ПРЕДДЕЛИТЕЛЬ ПЕРЕД WDT.
MOVWF OPTION_REG ; НО НЕ ВЫБИРАТЬ КОЭФФИЦИЕНТ ДЕЛЕНИЯ
CLRWDT ; СБРОСИТЬ WDT И ПРЕДДЕЛИТЕЛЬ
MOVLW B'XXXX1XXX' ; ВЫБРАТЬ НОВОЕ ЗНАЧЕНИЕ КОЭФФИЦИЕНТА
MOVWF OPTION_REG ; ПРЕДДЕЛИТЕЛЯ
BCF STATUS,RP0 ; БАНК0
Примечания к примеру. Если желаемое значение коэффициента деления отличное от 1:1, то строки 2 и 3 в текст программы не должны включаться. Если требуется настройка коэффициента предделителя 1:1, то необходимо установить промежуточное значение коэффициента (отличное от 1:1) в строках 2 и 3, а затем установить коэффициент предделителя 1:1 в строках 10 и 11.
Пример переключение предделителя от WDT к TMR0:
CLRWDT ; СБРОСИТЬ WDT И ПРЕДДЕЛИТЕЛЬ
BSF STATUS,RP0 ;БАНК1
MOVLW B'XXXX0XXX' ; ВКЛЮЧИТЬ ПРЕДДЕЛИТЕЛЬ ПЕРЕД TMRO И
MOVWF OPTION_REG ; ВЫБРАТЬ НОВОЕ ЗНАЧЕНИЕ КОЭФФИЦИЕНТА ДЕЛЕНИЯ
BCF STATUS,RP0 ; БАНК 0
Пример инициализации TMR0 (внутренний источник тактового сигнала):
CLRF TMR0 ; СБРОС TMR0
CLRF INTCON ; ВЫКЛЮЧИТЬ ПРЕРЫВАНИЯ И СБРОСИТЬ T0IF
BSF STATUS,RP0 ; БАНК1
MOVLW 0ХС3 ; ВЫКЛЮЧИТЬ ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ НА PORTB.
MOVWF OPTION_REG ; ПРЕРЫВАНИЯ ПО ПЕРЕДНЕМУ ФРОНТУ СИГНАЛА НА RB0
; TMR0 ИНКРЕМЕНТИРУЕТСЯ ОТ ВНУТРЕННЕГО ТАКТОВОГО СИГНАЛА
; ПРЕДДЕЛИТЕЛЬ 1:16.
BCF STATUS,RP0 ; БАНК 0
;** BSF INTCON,T0IE ; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ОТ TMR0
;** BSF INTCON,GIE ; РАЗРЕШИТЬ ВСЕ ПРЕРЫВАНИЯ
; ЕСЛИ ПРЕРЫВАНИЯ ОТ TMR0 ВЫКЛЮЧЕНЫ, ТО ВЫПОЛНЯЙТЕ ПРОВЕРКУ БИТА
; ПЕРЕПОЛНЕНИЯ.
T0_OVFL_WAIT
BTFSS INTCON,T0IF
GOTO T0_OVFL_WAIT
; ПРОИЗОШЛО ПЕРЕПОЛНЕНИЕ TMR0
Пример инициализации TMR0 (внешний источник тактового сигнала):
CLRF TMR0 ; СБРОС TMR0
CLRF INTCON ; ВЫКЛЮЧИТЬ ПРЕРЫВАНИЯ И СБРОСИТЬ T0IF
BSF STATUS,RP0 ; БАНК 1
MOVLW 0X37 ; ВКЛЮЧИТЬ ПОДТЯГИВАЮЩИЕ РЕЗИСТОРЫ НА PORTB.
MOVWF OPTION_REG ; ПРЕРЫВАНИЯ ПО ЗАДНЕМУ ФРОНТУ СИГНАЛА НА RB0
; TMR0 ИНКРЕМЕНТИРУЕТСЯ ОТ ВНЕШНЕГО ТАКТОВОГО СИГНАЛА;
; ПРЕДДЕЛИТЕЛЬ 1:256.
BCF STATUS,RP0 ; БАНК 0
;** BSF INTCON,T0IE ; РАЗРЕШИТЬ ПРЕРЫВАНИЯ ОТ TMR0
;** BSF INTCON, GIE ; РАЗРЕШИТЬ ВСЕ ПРЕРЫВАНИЯ
; ЕСЛИ ПРЕРЫВАНИЯ ОТ TMR0 ВЫКЛЮЧЕНЫ, ТО ВЫПОЛНЯЙТЕ ПРОВЕРКУ БИТА
; ПЕРЕПОЛНЕНИЯ.
T0_OVFL_WAIT
BTFSS INTCON, T0IF
GOTO T0_OVFL_WAIT
; ПРОИЗОШЛО ПЕРЕПОЛНЕНИЕ TMR0
5.9 Модуль таймера TMR1
Таймер TMR1 - 16-разрядный таймер/счетчик, состоящий из двух 8-разрядных регистров (TMR1H и TMR1L) доступных для чтения и записи. Счет выполняется в спаренных регистрах (TMR1H-TMR1L), инкрементируя их значение от 0000h до FFFFh, далее считает с 0000h. При переполнении счетчика устанавливается в «1» флаг прерывания TMR1IF в регистре PIR1<0>. Само прерывание можно разрешить или запретить установкой/сбросом бита TMR1IE в регистре Р1Е1<0>. TMR1 может работать в двух режимах:
- Режим таймера;
- Режим счетчика.
Включение модуля TMR1 осуществляется установкой бита TMR1ON в «1» в регистре T1CON:
Битом TMR1CS (T1CON<1>) выбирается источник тактовых импульсов (Рис. 50). В режиме таймера TMR1 инкрементируется на каждом машинном цикле. Если TMR1 работает с внешним источником тактового сигнала, то приращение происходит по каждому переднему фронту сигнала.
Таймер TMR1 имеет внутренний вход сброса от СРР модуля.
Когда включен генератор тактовых импульсов (T1OSCEN=1), выводы RC1/T1OSI/CCP2 и RC0/T1OSO/T1CKI настроены как входы. Значение битов TRISC<1:0> игнорируется, а чтение данных с этих выводов дает результат '0'.
Управляющие биты TMR1 находятся в регистре T1CON:
Рисунок 49 - Регистр управления таймером T1CON
Рисунок 50 - Модуль таймера TMR1
Назначение битов регистра T1CON:
TMR1ON - Бит включения модуля таймера;
TMR1CS - Выбор источника тактового сигнала для приращения таймера (внутренний/внешний);
-T1SYNC - Синхронизация внешнего тактового сигнала;
T1OSCEN - Включение тактового генератора TMR1;
T1CKPS1, T1CKPS0 - Выбор коэффициента деления предделителя TMR1:
Значение: |
Коэффициент: |
|
00 |
1:1 |
|
01 |
1:2 |
|
10 |
1:4 |
|
11 |
1:8 |
Чтение TMR1H или TMR1L. во время счета в асинхронном режиме, гарантирует получение текущего значения счетчика (реализовано аппаратно). Однако пользователь должен иметь в виду, что чтение 16-разрядного значения выполняется по одному байту. Это накладывает некоторые ограничения, т. к. таймер может переполниться между чтениями байт.
Запись в TMR1 рекомендуется выполнять после остановки таймера. Запись в регистры TMR1 во время приращения таймера может привести к непредсказуемому значению регистра.
Чтение 16-разрядного значения требуется некоторой осторожности, т. к. требуется два цикла чтения для получения всех 16 разрядов.
В нижеуказанном примере представлена рекомендованная последовательность операций чтения 16-разрядного значения TMR1 в асинхронном режиме с решением проблем переполнения. В данном примере таймер не останавливается:
; ВЫКЛЮЧИТЬ ВСЕ ПРЕРЫВАНИЯ
MOVF TMR1H,W ; ЧТЕНИЕ СТАРШЕГО БАЙТА
MOVWF ТМРН ;
MOVF TMR1L,W ; ЧТЕНИЕ МЛАДШЕГО БАЙТА
MOVWF TMPL ;
MOVF TMR1H,W ; ЧТЕНИЕ СТАРШЕГО БАЙТА
SUBWF ТМРН,W ; СРАВНЕНИЕ С ПРЕДЫДУЩИМ ЧТЕНИЕМ
BTFSC STATUS,Z ;
GOTO CONTINUE ; 16-РАЗРЯДНОЕ ЗНАЧЕНИЕ ПРОЧИТАНО ПРАВИЛЬНО
; ВОЗМОЖНО, МЕЖДУ ЧТЕНИЯМИ БАЙТОВ ПРОИЗОШЛО
; ПЕРЕПОЛНЕНИЕ ТАЙМЕРА
; ПРОЧИТАТЬ ЗНАЧЕНИЯ ЗАНОВО
MOVF TMR1H,W ; ЧТЕНИЕ СТАРШЕГО БАЙТА
MOVWF ТМРН ;
MOVF TMR1L,W ; ЧТЕНИЕ МЛАДШЕГО БАЙТА
MOVWF TMPL ;
CONTINUE:
; ВКЛЮЧИТЬ ПРЕРЫВАНИЯ (ЕСЛИ НЕОБХОДИМО)
Для записи 16-разрядного значения в регистры TMR1, сначала нужно очистить регистр TMR1L, чтобы в запасе было большое число тактов TMR1 прежде, чем произойдет перенос из младшего регистра TMR1L в TMR1H. Выполнить запись в TMR1H. а затем записать значение в TMR1L. Эта последовательность действий показана в примере:
; ВЫКЛЮЧИТЬ ВСЕ ПРЕРЫВАНИЯ
CLRF TMR1L ; ОЧИСТИТЬ МЛАДШИЙ БАЙТ
; ДЛЯ ПРЕДОТВРАЩЕНИЯ ПЕРЕНОСА В TMRH
MOVLW HI_BYTE ; ЗНАЧЕНИЕ ДЛЯ TMR1H
MOVWF TMR1H ; ЗАПИСАТЬ СТАРШИЙ БАЙТ
MOVLW L0_BYTE ; ЗНАЧЕНИЕ ДЛЯ TMR1L
MOVWF TMRIH ; ЗАПИСАТЬ МЛАДШИЙ БАЙТ
; ВКЛЮЧИТЬ ПРЕРЫВАНИЯ (ЕСЛИ НЕОБХОДИМО)
CONTINUE:
Пример инициализации TMR1 от внутреннего тактового сигнала:
CLRF T1CON ; ВЫКЛЮЧИТЬ TMR1, ВНУТРЕННИЙ ТАКТОВЫЙ СИГНАЛ.
; ГЕНЕРАТОР TMR1 ВЫКЛЮЧЕН, ПРЕДДЕЛИТЕЛЬ =1:1
CLRF TMR1H ; ОЧИСТИТЬ СТАРШИЙ БАЙТ РЕГИСТРА TMR1
CLRF TMR1L ; ОЧИСТИТЬ МЛАДШИЙ БАЙТ РЕГИСТРА TMR1
CLRF INTCON ; ВЫКЛЮЧИТЬ ПРЕРЫВАНИЯ
BSF STATUS,RP0 ;БАНК 1
CLRF PIE1 ; ВЫКЛЮЧИТЬ ПЕРИФЕРИЙНЫЕ ПРЕРЫВАНИЯ
BCF STATUS,RP0 ; БАНК 0
CLRF PIR1 ; ОЧИСТИТЬ ФЛАГИ ПЕРИФЕРИЙНЫХ ПРЕРЫВАНИЙ
MOVLW 0X30 ; ВНУТРЕННИЙ ТАКТОВЫЙ СИГНАЛ С ПРЕДДЕЛИТЕЛЕМ 1:8
MOVWF T1CON ; TMR1 И ГЕНЕРАТОР TMR1 ВЫКЛЮЧЕНЫ
BSF TICON,TMR10N ; ВКЛЮЧИТЬ TMR1
; ПРЕРЫВАНИЯ ОТ TMR1 ВЫКЛЮЧЕНЫ, ПРОВЕРЯЙТЕ БИТ ПЕРЕПОЛНЕНИЯ
T1_OVFL_WAIT
BTFSS PIR1,TMR1IF
GOTO T1_OVFL_WAIT
; ПЕРЕПОЛНЕНИЕ TMR1
BCF PIR1,TMR1IF
Пример инициализации TMR1 от внешнего тактового сигнала:
CLRF T1CON ; ВЫКЛЮЧИТЬ TMR1, ВНУТРЕННИЙ ТАКТОВЫЙ СИГНАЛ.
; ГЕНЕРАТОР TMR1 ВЫКЛЮЧЕН, ПРЕДДЕЛИТЕЛЬ =1:1
CLRF TMR1H ; ОЧИСТИТЬ СТАРШИЙ БАЙТ РЕГИСТРА TMR1
CLRF TMR1L ; ОЧИСТИТЬ МЛАДШИЙ БАЙТ РЕГИСТРА TMR1
CLRF INTCON ; ВЫКЛЮЧИТЬ ПРЕРЫВАНИЯ
BSF STATUS,RP0 ;БАНК 1
CLRF PIE1 ; ВЫКЛЮЧИТЬ ПЕРИФЕРИЙНЫЕ ПРЕРЫВАНИЯ
BCF STATUS,RP0 ; БАНК 0
CLRF PIR1 ; ОЧИСТИТЬ ФЛАГИ ПЕРИФЕРИЙНЫХ ПРЕРЫВАНИЙ
MOVLW 0X3E ; ВНЕШНИЙ НЕ СИНХРОНИЗИРОВАННЫЙ СИГНАЛ С ; ПРЕДДЕЛИТЕЛЕМ 1:8 И ВНЕШНИМ ГЕНЕРАТОРОМ
MOVWF T1CON ; TMR1 ВЫКЛЮЧЕН
BSF TICON,TMR10N ; ВКЛЮЧИТЬ TMR1
; ПРЕРЫВАНИЯ ОТ TMR1 ВЫКЛЮЧЕНЫ, ПРОВЕРЯЙТЕ БИТ ПЕРЕПОЛНЕНИЯ
T1_OVFL_WAIT
BTFSS PIR1,TMR1IF
GOTO T1_OVFL_WAIT
; ПЕРЕПОЛНЕНИЕ TMR1
BCF PIR1,TMR1IF
5.10 Модуль таймера TMR2
Таймер TMR2 - 8-разрядный таймер с программируемым предделителем и выходным делителем, 8-разрядным регистром периода PR2. Таймер TMR2 может быть опорным таймером для ССР модуля в ШИМ режиме. Регистры TMR2 доступны для записи/чтения и очищаются при любом виде сброса.
Входной тактовый сигнал (Fosc/4) поступает через предделитель с программируемым коэффициентом деления (1:1, 1:4 или 1:16), определяемый битами T2CKPS1, T2CKPS0 (T2CON<1:0>).
Таймер TMR2 считает, инкрементируя от 00h до значения в регистре PR2, затем сбрасывается в 00h на следующем машинном цикле. Регистр PR2 доступен для записи и чтения. После сброса значение регистра PR2 равно FFh (Рис. 51).
Рисунок 51 - Модуль таймера TMR2
Сигнал переполнения TMR2 проходит через выходной 4-разрядный делитель с программируемым коэффициентом деления (от 1:1 до 1:16 включительно) для установки флага TMR2IF в регистре PIR1<1>.
Для уменьшения энергопотребления таймер TMR2 может быть выключен сбросом бита TMR2ON (T2CON<2>) в «0»:
Рисунок 52 - Регистр управления таймером T2CON
Назначение битов регистра:
T2CKPS1, T2CKPS0 - Выбор коэффициента предделителя TMR2:
Значение: |
Коэффициент: |
|
00 |
1:1 |
|
01 |
1:4 |
|
1x |
1:16 |
TMR2ON - Бит включения таймера;
TOUTPS3-TOUTPS0 - Биты выбора коэффициента деления выходного делителя TMR2:
Значение: |
Коэффициент: |
|
0000 |
1:1 |
|
0001 |
1:2 |
|
… |
… |
|
1111 |
1:16 |
Пример инициализации таймера TMR2:
CLRF T2C0N ; Выключить TMR2. предделитель = 1:1,
; выходной делитель =1:1
CLRF TMR2 ; Очистить регистр TMR2
CLRF INTCON ; Выключить прерывания
BSF STATUS,RP0 ; Банк 1
CLRF PIE1 ; Выключить периферийные прерывания
BCF STATUS,RP0 ; Банк 0
CLRF PIR1 ; Очистить флаги периферийных прерываний
MOVLW 0X72 ; Предделитель = 1:15, выходной делитель = 1:16,
MOVWF T2CON ; TMR2 выключен
BSF T2CON,TMR20N ; ВКЛЮЧИТЬ TMR2
; Прерываний OTTMR2 выключены, проверяйте бит переполнения
T2_OVFL_WAIT
BTFSS PIRI, TMR2IF ; Произошло переполнение TMR2?
GOTO T2_OVFL_WAIT ; Нет, оставаться в цикле
; Переполнение TMR2
BCF PIR1,TMR2IF
6 Транслятор ассемблера микроконтроллеров PICmicro MPASM
6.1 Правила написания программ
Принципы написания программ на языке ассемблера для микроконтроллеров семейства PICmicro остаются такие же, как и описанные в главах 2 и 3 для микроконтроллеров семейства MCS-51. Существуют только некоторые особенности:
- Необходимо учитывать аппаратные тонкости при программировании микроконтроллеров Microchip, описанные в главе 5 данного издания;
- Микроконтроллер имеет только 35 команд;
- Микроконтроллер имеет только 8 ячеек стека;
- Микроконтроллер имеет прямую, непосредственную и довольно сложный механизм косвенной адресации;
- Синтаксис директив транслятора немного отличается от синтаксиса транслятора ASM51;
- Величины числовых констант записываются следующим способом:
H'9F' - запись шестнадцатеричного числа;
0x9F - запись шестнадцатеричного числа;
D'10' - десятичное число;
O'377' - восьмеричное число;
B'11001101' - двоичное число;
A'T' - символ ASCII;
'R' - символ ASCII.
6.2 Директивы ассемблера MPASM:
Большую часть директив ассемблера ASM51 понимает и транслятор MPASM. Список основных директив транслятора указан в таблице 10. Для более детального описания и получения информации по директивам, обратитесь к руководству пользователя транслятора MPASM.
Таблица 10 - Список основных директив
Директива |
Описание |
|
BANKISEL |
Выбор банка РОН для косвенной адресации |
|
BANKSEL |
Выбор банка РОН для прямой адресации |
|
__CONFIG |
Установка битов конфигурации |
|
CONSTANT |
Определить символьную константу |
|
DA |
Сохранение строки в памяти программ |
|
DATA |
Сохранение значений или текста в памяти программ |
|
DB |
Побайтное сохранение данных в памяти программ |
|
#DEFINE |
Определяет замену текста |
|
DT |
Определяет таблицу данных |
|
END |
Окончание программы |
|
ENDM |
Окончание макроса |
|
EQU |
Определение константы ассемблера |
|
EXPAND |
Включение текста макроса в файл листинга программы |
|
__IDLOCS |
Установка значения ID |
|
#INCLUDE |
Подключение дополнительного исходного файла |
|
LIST |
Список параметров |
|
LOCAL |
Объявить локальную переменную макроса |
|
MACRO |
Определить макрос |
|
NOEXPAND |
Не разворачивать текст макроса |
|
NOLIST |
Выключить вывод в файл листинга |
|
ORG |
Установить адрес программы |
|
PROCESSOR |
Выбор типа микроконтроллера |
|
RADIX |
Система счисления по умолчанию |
|
SET |
Определение константы |
|
#UNDEFINE |
Отменить замену текста |
MPASM может использоваться в двух случаях:
- Для генерации абсолютного кода, который может быть загружен непосредственно в микроконтроллер;
- Для генерации объектных файлов, которые связываются с другими компилированными модулями.
Абсолютный код - режим работы программы MPASM по умолчанию.
При компиляции исходного файла в этом режиме, все значения должны быть явно указаны в исходном файле или во включаемых файлах. Если компиляция выполнена без ошибок, то будет создан HEX файл кода программы, который можно использовать для непосредственного программирования микроконтроллера.
Компилятор MPASM, как и ASM-51, так же имеет возможность генерировать объектные модули, которые могут быть связаны друг с другом с использованием линкера MPLINK. Линкер необходим для окончательного формирования исполняемого (абсолютного) кода. Данный метод позволяет многократно использовать отлаженные модули программы. Объектные файлы могут быть сгруппированы в библиотечные файлы с помощью программы MPLIB. Библиотеки могут указываться в качестве параметра во время линковки и, таким образом, в исполняемый код будет включены только необходимые процедуры.
Для набора текста исходной программы может быть использован любой текстовый редактор, как и в трансляторе ASM-51. Таким редактором, например, как уже было указано ранее, является редактор «Блокнот» ОС Windows.
Типы файлов, связанные с ассемблером MPASM:
*.asm - исходный текст программы на языке ассемблер;
*.lst - листинг программы после трансляции;
*.err - список ошибок, возникших после компиляции;
*.hex - выходной файл кода программы;
*.hxl - файл кода программы отдельно младших байтов кода;
*.hxh - файл кода программы отдельно старших байтов кода;
*.cod - файл для отладчика;
*.o - выходной объектный файл модуля (программы).
Формат файла листинга, генерируемого MPASM следующий: имя файла и версия, дата и время компиляции, номер страницы выводятся в начале каждой страницы.
Первая колонка цифр указывает базовый адрес кода в памяти. Вторая колонка показывает 32-разрядное значение всех символьных переменных созданных директивами SET, EQU, VARIABLE, CONSTANT или CBLOCK. Третья колонка предназначена для машинного кода, выполняемого микроконтроллером. Четвертая колонка содержит номер строки соответствующего исходного файла
Остаток строки зарезервирован для исходного текста, который породил машинный код.
Ошибки, предупреждения и сообщения вставляются между строк исходного кода и относятся к следующей по тексту строке исходного кода.
Таблица символов (SYMBOL TABLE) показывает все символьные переменные, определенные в программе.
Карта использования памяти (MEMORY USAGE MAP) дает представление об использовании памяти в графическом виде. Символ «X» показывает использованный участок, а «-» - отмечает участок памяти не используемый данным объектом. При генерации объектного файла карта памяти не выводится.
7 Практикум по ассемблеру PICmicro
7.1 Требования к отчетам
К отчетам предъявляются такие же требования, которые указаны в главе 4.1 данного издания.
Для написания программ можно использовать язык ассемблер MPASM Microchip Technology или интегрированную среду разработки и отладки программ MPLab IDE.
Программы решения заданий данной главы необходимо писать в соответствии принципиальной электрической схемы демонстрационно-отладочного стенда PICDEM 2 Plus.
7.2 Практическое задание №1
Тема: Знакомство с ассемблером PICmicro. Программирование цифровых портов ввода/вывода.
Цель: Изучить систему команд микроконтроллера PIC16F877 среднего семейства PICmicro. Получить навыки в программировании портов ввода/вывода.
Таблица 11 - Варианты заданий к самостоятельной работе
Вариант |
Задание |
|
1 |
Выполнить бегущий огонь одного светодиода с частотой 1Гц |
|
2 |
Выполнить бегущий огонь двух светодиодов с частотой 0,5Гц |
|
3 |
Выполнить бегущую тень одного светодиода с частотой 1Гц |
|
4 |
Выполнить бегущий огонь 2х светодиодов в шахматном порядке с частотой 0,5Гц |
|
5 |
Выполнить включение накапливающихся светодиодов с частотой переключения 1,5Гц |
|
6 |
Выполнить попеременное включение светодиодов D2, D3 и D4, D5 с частотой 1Гц |
|
7 |
Выполнить включение светодиодов в последовательности D3, D5, D4, D2 с частотой 1,5Гц |
|
8 |
Выполнить включение светодиодов в последовательности D4, D2, D5, D3 с частотой 0,5Гц |
|
9 |
Выполнить бегущий огонь одного светодиода с тушением светодиодов между переключениями частотой с 0,5Гц |
|
10 |
Выполнить бегущий огонь двух светодиодов с тушением светодиодов между переключениями с частотой 1Гц |
|
11 |
Выполнить бегущую тень одного светодиода с его включением между переключениями с частотой 1,5Гц |
|
12 |
Выполнить бегущий огонь 2х светодиодов с их выключением между переключениями в шахматном порядке с частотой 0,5Гц |
|
13 |
Выполнить включение накапливающихся светодиодов с их выключением между переключениями с частотой переключения 1Гц |
|
14 |
Выполнить попеременное включение светодиодов D2, D3 и D4, D5 с их выключением между переключениями с частотой 1,5Гц |
|
15 |
Выполнить включение светодиодов в последовательности D3, D5, D4, D2 с их выключением между переключениями с частотой 0,5Гц |
|
16 |
Выполнить включение светодиодов в последовательности D4, D2, D5, D3 с их выключением между переключениями с частотой 0,5Гц |
|
17 |
Выполнить бегущий огонь одного светодиода с реверсом на конечном значении с частотой 1,5Гц |
|
18 |
Выполнить бегущий огонь двух светодиодов с реверсом на конечном значении с частотой 0,5Гц |
|
19 |
Выполнить бегущую тень одного светодиода с реверсом на конечном значении с частотой 1Гц |
|
20 |
Выполнить зажигание светодиодов по двоичному закону с частотой смены комбинации 1Гц |
|
21 |
Выполнить бегущий огонь одного светодиода с двукратным зажиганием в позиции с частотой 0,5Гц |
|
22 |
Выполнить бегущий огонь двух светодиодов с двукратным зажиганием в позиции с частотой 0,5Гц |
|
23 |
Выполнить бегущую тень одного светодиода с двукратным погасанием в позиции с частотой 1,5Гц |
|
24 |
Выполнить бегущую тень двух светодиодов с двукратным погасанием в позиции с частотой 1,5Гц |
|
25 |
Выполнить попеременное включение светодиодов D2, D3 и D4, D5 с двукратным зажиганием в позиции с частотой 1Гц |
|
26 |
Выполнить включение светодиодов в последовательности D3, D5, D4, D2 с двукратным зажиганием в позиции с частотой 1,5Гц |
|
27 |
Выполнить включение светодиодов в последовательности D4, D2, D5, D3 с двукратным зажиганием в позиции с частотой 0,5Гц |
|
28 |
Выполнить последовательное накапливание, а затем убывание светодиодов в другую сторону с частотой переключений 0,5Гц |
|
29 |
Выполнить плавное зажигание светодиодов D2 и D3 в течение 3сек., а затем резкое тушение. |
|
30 |
Выполнить плавное тушение светодиодов D3 и D4 в течение 4сек., а затем их резкое зажигание. |
7.3 Практическое задание №2
Тема: Таймеры и система прерываний микроконтроллера PIC16F877.
Цель: Изучить возможности и практически освоить написание программ с использованием таймеров и системы прерываний.
Таблица 12 - Варианты заданий к самостоятельной работе
Подобные документы
Семейство 16-разрядных микроконтроллеров Motorola 68HC12, их структура и функционирование. Модуль формирования ШИМ-сигналов. Средства отладки и программирования микроконтроллеров 68НС12. Особенности микроконтроллеров семейства MCS-196 фирмы INTEL.
курсовая работа [239,6 K], добавлен 04.01.2015Рассмотрение структуры и принципов работы таймеров/счетчиков (общего назначения, сторожевого, типов А, В, С, D, Е) микроконтроллеров и аналого-цифрового преобразователя семейства AVR с целью разработки обучающего компьютерного электронного пособия.
курсовая работа [1,0 M], добавлен 06.03.2010Использование микроконтроллеров AVR фирмы Atmel в проектируемой аппаратуре. Архитектура и общие характеристики прибора, предназначение арифметики логического устройства и понятие флэш-памяти. Формат пакета данных, алгоритм их передачи и система команд.
контрольная работа [427,3 K], добавлен 12.11.2010Структурная схема микроконтроллеров семейства MCS-51: отличительные особенности, назначение выводов, блок регистров специальных функций. Карта прямоадресуемых бит. Методы адресации, граф команд пересылки, обмена и загрузки. Ввод и отображение информации.
курсовая работа [135,5 K], добавлен 22.08.2011Адресное пространство микроконтроллеров MSP430F1xx. Байтовая и словная формы инструкций. Система команд MSP микроконтроллеров. Периферийные устройства микроконтроллеров MSP430F1xx. Аналого-цифровой преобразователь ADC12, его технические характеристики.
курсовая работа [278,1 K], добавлен 04.05.2014Микроконтроллер (MCU) — микросхема, предназначенная для управления электронными устройствами. Их можно встретить во многих современных приборах, в том числе и бытовых. Рассмотрение архитектуры различных микроконтроллеров, ядра, памяти, питания, периферии.
реферат [216,5 K], добавлен 24.12.2010Понятие и виды микроконтроллеров. Особенности программирования микропроцессорных систем, построение систем управления химико-технологическим процессом. Изучение архитектуры микроконтроллера ATmega132 фирмы AVR и построение на его основе платформы Arduino.
курсовая работа [1,9 M], добавлен 13.01.2011Проектирование специализированных радиоэлектронных устройств с применением микропроцессорных комплектов и цифровых микросхем среднего и малого уровней интеграции. Архитектура микроконтроллеров семейства INTEL8051. Программа устройства на Ассемблере.
курсовая работа [42,3 K], добавлен 29.07.2009Общая характеристика операций, выполняемых по командам базовой системы. Описание и мнемокоды команд, используемых при разработке программы на языке AVR Ассемблера. Основные принципы работы команд с обращением по адресу SRAM и к регистрам ввода–вывода.
реферат [148,4 K], добавлен 21.08.2010Классификация, структура, архитектура и модульная организация микроконтроллеров. Средства разработки программного обеспечения AVR-контроллеров. Директивы транслятора ассемблера, рабочая частота и циклы. Исследование арифметических и логических команд.
методичка [3,0 M], добавлен 19.09.2019