русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Pис.7.12


Дата добавления: 2015-08-31; просмотров: 863; Нарушение авторских прав


Чтение информации

Сделать это довольно просто: достаточно занести адрес нужной ячейки 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.

;=======================================

;RD_EEPROM - Чтение данных из EEPROM

;=======================================

;определение переменных-------------------------------

ADDR1 EQU 10H

GOTO BEGIN ; к началу

; Подпрограмма чтения------------------------------------

READ_EE

BSF STATUS,RP0 ; банк 1

BSF EECON1,RD ; инициализация чтения

BCF STATUS,RP0 ; банк 0

RETURN ; возврат

; Основная программа-----------------------------------

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 выводит программу из цикла ожидания.

;============================================

;WR_EEPROM - Запись данных в EEPROM

;===================================

;определение адресов переменных-----------------

ADDREQU 0Ch ; регистр адреса

DATAEQU 0Dh ; регистрданных

 

GOTOSTART

; increment ADR EEPROM c 0 to F (15)-----------

START

CLRF ADDR ; установка адреса 00H

LOOK

MOVFW ADDR ; адресв W

SUBLW 0FH ; уменьшаем на 1 с 15

BTFSS STATUS,C ;пока не достигнет 0 (тогда с=0)

GOTO EXIT ; тогда закончить

; уменьшаем данные записи: 254 – ADDR-------

MOVF ADDR,W ; адрес в W

SUBLW .254 ; 254 - adr

MOVWF DATA ; результат в DATA

; установить ADR и DATA перед записью --------

MOVFW ADDR

MOVWF EEADR ;

MOVFW DATA ;

MOVWF EEDATA ;

BSF STATUS,RP0 ;банк1

BSFEECON1,WREN ;разрешениезаписи

MOVLW 55H ; стандартная

MOVWFEECON2 ; процедура

MOVLW 0AAH ; перед

MOVWFEECON2 ; записью

BSF EECON1,WR ;инициализация записи

WAIT

BTFSC EECON1,WR ;ожидание окончания

GOTO WAIT ;записи (4 мс)

BCF EECON1,WREN ;запрет записи

BCF EECON1,EEIF ;сброс флага

BCF STATUS,RP0 ;возврат в банк 0

; Установка следующего адреса-----------------

INCF ADDR,F ; увеличиваем адрес до

BTFSC STATUS,C ; 0FH

GOTO LOOK ;

EXIT

GOTO $ ; конец записи

;----------------------------------------------------------

END

ОСНОВНЫЕ ПОЛОЖЕНИЯ НА ПАМЯТЬ

- Прерывание - это своеобразный переход, в большинстве случаев, по внешнему воздействию, из основной программы, на выполнение подпрограммы прерывания, с последующим из нее возвратом в основную программу.

- По наступлению события прерывания нормальное выполнение программы будет остановлено и программа перейдет на адрес ПЗУ 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.



<== предыдущая лекция | следующая лекция ==>
CNTMR0 Программа прерывания от переполнения счетчикаTMR0 | ОРГАНИЗАЦИЯ СВЯЗИ С ОПЕРАТОРОМ


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.152 сек.