Сделать это довольно просто: достаточно занести адрес нужной ячейки EEPROM в регистр EEADR, затем установить разряд RD регистра EECON1 и прочитать хранящийся код из регистра EEDATA.
Строго говоря, перед обращением к EEPROM следует проверить содержимое peгистpaEECON1, и убедится, что успешно закончены предыдущие операции чтения (RD=0) и записи (WR=0). Нулевые значения в этих разрядах устанавливают аппаратно, их принудительная запись не имеет смысла. Между установкой RD и чтением регистра EEDATA разряд RD должен успеть вернуться в исходное (нулевое) состояние. Обычно это не проверяют, так как чтение из EEPROM занимает всего один машинный цикл, для него достаточно времени, затрачиваемого на переключение банков регистров командой BCF.
MOVLWADDR ; Адрес ячейки EEPROM
MOVWFEEADR ; заносим в EEADR
BSF STATUS,RP0 ; EECON1 вбанке 1
BSF EECON1,RD ; Командачтения
BCF STATUS,RP0 ; EEDATA вбанке 0
MOVFWEEDATA ; W = EEDATA
ПРОГРАММА: ЧТЕНИЕ ИНФОРМАЦИИ ИЗ EEPROM ДАННЫХ
Приведена программа чтения из EEPROM данных с последующим копированием в ОЗУ микроконтроллера, начиная с адреса 10Н. размер адресного поля определен константой 3FH.
; Основная программа-----------------------------------
BEGIN
MOVLW ADDR1 ; начало адресного
MOVWF FSR ; поля
CLRF EEADR ;
METKA
CALL READ_EE ; прочитать
MOVFW EEDATA ; копировать в W
MOVWF INDF ; и переслать в начало адр. поля
INCF FSR,F ; увеличить адрес
INCF EEADR,F ; в EEADR
MOVFW EEADR ; все
XORLW 3FH ; переменные
BTFSS STATUS,Z ; прочитаны?
GOTO METKA ; нет, продолжить
GOTO $ ; да, зациклиться навсегда
; конец всем командам ------------------------
END
Запись информации
Предварительного стирания содержимого ячейки EEPROM перед записью в нее не требуется, но процедура записи умышленно усложнена. Это сделано для того, чтобы при сбоях предотвратить случайное искажение хранящихся данных. Занеся в регистр EEADR адрес ячейки, а в EEDATA — предназначенный для записи в нее код, следует выполнить следующие операции:
BSFSTATUS,RP0 ; Включаем банк 1
BCFINTCON,GIE ;Запрещаем все прерывания
BSFEECON1,WREN ; Разрешаем запись
MOVLWН'55’
MOVWF EECON2
MOVLW H'AA'
MOVWF EECON2
BSFEECON1,WR ; Команда начала записи
BSFINTCON,GIE ;Разрешаемпрерывания
Команды, выделенные полужирным шрифтом, обязательны перед записью в каждую ячейку EEROM. Запрет прерываний необходим, если они были разрешены. После начала записи прерывания можно разрешить вновь. Установить WREN допустимо один раз перед началом цикла записи в несколько ячеек. Если же запись в EEPROM не предвидится, лучше сбросить этот разряд .
Собственно запись занимает довольно много времени (до 10 мс на ячейку). Выполняется она без участия процессорного ядра МК, которое может в это время заниматься другими делами. Об окончании записи свидетельствует аппаратное обнуление разряда WR регистра EECON1 и установка в его же разряде EEIF — флаге запроса прерывания.сбрасывать флаг следует программно.
Запись в EEPROM, несмотря на все принятые меры, остается одной из самых опасных операций. Случайное выключение питания, подача сигнала сброса или срабатывание сторожевого таймера во время ее выполнения приводят к досрочному прекращению начатого процесса, содержимое записываемой ячейки остается неопределенным. Об ошибке сигнализирует (к сожалению, не всегда) установка WRERR в регистре EECON1, который в этом случае следует принудительно обнулить и повторить запись. Более надежно контрольное считывание записанного значения и сравнение его с заданным.
ПРОГРАММА: ЗАПИСЬ ИНФОРМАЦИИ В EEPROM ДАННЫХ
Для данных и адресов, по которым происходит их запись, используются регистры DATA и ADDR, информация сначала устанавливается там, а затем копируется в регистрах EEPROM данных: ЕЕDATA и EEADR.
Окончание записи в ячейку выполнено командой BTFSC EECON1,WR, которая при сбросе разряда WR выводит программу из цикла ожидания.
- Прерывание - это своеобразный переход, в большинстве случаев, по внешнему воздействию, из основной программы, на выполнение подпрограммы прерывания, с последующим из нее возвратом в основную программу.
- По наступлению события прерывания нормальное выполнение программы будет остановлено и программа перейдет на адрес ПЗУ 0x004, который называется вектором прерывания. По этому адресу и должна находиться подпрограмма отработки прерывания. При этом адрес возврата сохраняется в стеке.
У PIC – контроллеров вектор прерывания один для всех источников, поэтому данная подпрограмма должна сама различать события, вызвавшие прерывание, если разрешено более одного прерывания. Определение источника прерывания производится путем опроса соответствующих флагов прерывания, которые устанавливаются по наступлению прерывания. По прерыванию по входу RB0 – флаг INTF (INTCON,1), а по входу RB4 - RB7 – RBIF (INTCON,0).
Для ухода в прерывания необходимо:
1. в "шапке" программы определить вектор прерывания;
2. определить активный фронт прерываний (OPTION), в "основном теле"программы;
3. назначить источник (INTCON) и "зону" действия прерываний;
4. в начале подпрограммы прерывания сохранить, а в конце подпрограмм прерывания (до команды RETFIE) - восстановить содержимое регистров STATUS и W;
5. сбросить флаг прерывания по выбранному источнику прерываний;
6. в самом конце подпрограммы прерываний записать команду RETFIE.
Прерывания по изменению уровней сигналов на выводах RB4...RB7 являются одной из разновидностей прерываний. В отличие от прерываний по выводу INT, где нужно предварительно определить активные фронты прерываний (бит INTEDG регистра Option), для прерываний по измененнию уровней сигналов на выводах RB4...RB7, этого делать не требуется, так как уход в эти прерывания происходит и при смене 0 на 1, и при смене 1 на 0 на любом из выводов RB4...RB7.
Если сравнить прерывания по выводу INT и прерывания по изменению уровней сигналов на любом из выводов RB4...RB7, то, за исключением указанного выше и того, что перед выходом из прерывания нужно сбросить другой флаг (RBIF), их механизм одинаков. Так что, если речь идет только об одном внешнем устройстве, которое является источником прерываний, и нужно уйти в прерывания не по какому-то конкретному перепаду, а по любому перепаду внешнего управления, то это внешнее устройство можно подключить к любому из 4-х выводов RB4...RB7.
Главное преимущество работы со всеми типами прерываний - малая инерционность отклика устройства на внешний управляющий сигнал прерывания (активный перепад), что может быть очень полезным в тех конструкторских разработках, к которым предъявляются жесткие требования по инерционности (скорости) срабатывания исполнительных устройств.
При уходе в прерывание команда CALL существует (стек задействован), но она как бы "виртуальная" (в явном виде не выражена и в тексте программы не указывается). Она опознается и исполняется внутри PICа его аппаратными средствами. Команда же возврата из прерывания (по стеку) вполне реальная (RETFIE). Она применяется только при выходе из прерывания и нигде более. Сказанное выше ("виртуальный" CALL и RETFIE) относится ко всем типам прерываний, и это есть их "глобальный" механизм.
ВОПРОСЫ ДЛЯ САМОПРОВЕРКИ
7.1. Какое максимальное количество байт могут обойти команды коpоткий JMP, LOOP и относительный переход? Какой машинный код операнда при этом генерируется?
7.3. Напишите программу вычисления 12 чисел Фибоначчи: 1, 1, 2, 3, 5, 8, 13,... (каждое число в последовательности представляет собой сумму двух предыдущих чисел). Для организации цикла используйте команду LOOP.