Частый гость
 
Группа: Участник
Сообщений: 97
Регистрация: 30-09-08
Пользователь №: 40 592

|
;******************************************************************************* **************** ; RD_I2C.asm Чтение байтов данных из м/схемы памяти 24C64, с использованием ; модуля MSSP м/контроллера PIC16F873A ; (учебная программа) ;******************************************************************************* **************** ; "Практикум по конструированию устройств на PIC контроллерах" ; (http://ikarab.narod.ru) karabea@Lipetsk.ru ;=============================================================================== ================ ; Автор: И.Н.Шевченко (RW1ZK), г.Заозерск Мурманская обл. ; (PIC18F252, 24C16). ; Е.А.Корабельников: перевод c PIC18F252 на PIC16F873A, с 24С16 на 24С64 ; и объяснение работы. ;=============================================================================== ================ ; Из 24С64 читается 5 байтов, но это количество можно изменить. ; Считанные байты записываются в первые 5 ячеек EEPROM памяти данных PIC16F873A. ; Линии SCL и SDA "подтянуты" к +5V через резисторы 4,7 Ком. ; Кварц 4 Мгц. ;=============================================================================== ================ ; Функции выводов порта С: ; RC3 - линия SCL - вывод №6 24C64, ; RC4 - линия SDA - вывод №5 24C64, ; остальные выводы порта С не используются. ; Выводы портов А и В не используются. ;----------------------------------------- ; Объем программы: 84 команды. ;******************************************************************************* **************** LIST p=16F876A ; Задание типа микроконтроллера. __CONFIG 3F71h ; Включено: XT-генератор, PWRT, сброс BOR. ; Выключено: защита, WDT, LVP, DEBUG. ;=============================================================================== =================== ; Регистры специального назначения. ;=============================================================================== =================== Status equ 03h ; Регистр Status. SSPStat equ 14h ; Регистр статуса модуля MSSP (банк 1). SSPCon equ 14h ; Регистр управления модуля MSSP. SSPCon2 equ 11h ; Регистр управления модуля MSSP (банк 1). SSPAdd equ 13h ; Регистр управления скоростью обмена (банк 1). SSPBuf equ 13h ; Регистр приемо-передающего буфера. PIR1 equ 0Ch ; Регистр флагов прерываний от периферийных модулей.
PortA equ 05h ; Регистр защелок порта A. TrisA equ 85h ; Регистр выбора направлений работы выводов порта A (банк 1). ;-------------------------------------------- ; Регистры управления EEPROM памятью данных. ;-------------------------------------------- EEAdr equ 0Dh ; Регистр адреса (банк 2). EEData equ 0Ch ; Регистр данных (банк 2). EECon1 equ 0Ch ; Управляющий регистр (банк 3). EECon2 equ 0Dh ; Регистр, обеспечивающий защиту ; от случайной записи (банк 3). ;=============================================================================== ================ ; Регистры общего назачения. ;=============================================================================== ================ Temp equ 20h ; Регистр временного хранения считанных байтов. Byte equ 21h ; Счетчик байтов (он же - указатель адреса). ;=============================================================================== ================ ; Присвоение битам названий. ;=============================================================================== ================ Z equ 2 ; Флаг нулевого результата. RP0 equ 5 ; Бит выбора банка. RP1 equ 6 ; Бит выбора банка. SSPIF equ 3 ; Флаг прерывания от модуля MSSP. SEN equ 0 ; Бит включения "Старта". PEN equ 2 ; Бит включения "Стопа". ACKSTAT equ 6 ; Бит подтверждения от ведомого. SMP equ 7 ; Бит управления длительностью фронта. RCEN equ 3 ; Бит разрешения/запрета приема. ACKEN equ 4 ; Бит подтверждения ведущим приема байта. ;=============================================================================== ================ org 0 ; Начать выполнение программы с 0-го адреса PC. ;******************************************************************************* ****************
;******************************************************************************* **************** ; НАЧАЛО ПРОГРАММЫ. ;******************************************************************************* **************** ; Инициализация модуля MSSP (работа по I2C, режим ведущего, скорость 100 Кгц). ;=============================================================================== ================ ; Все не задействованные модули отключены по умолчанию. ; Выводы всех портов, по умолчанию, работают на вход. По этой причине, не нужно подтверждать ; обязательную, в данном случае, настройку выводов RC3 (SCL) и RC4 (SDA) на работу "на вход". ; Все регистры SSP... , по умолчанию, сброшены в ноль. Прерывания запрещены. ; Обязательный, в данном случае, нулевой уровень отклика (сигнала АСК) на прием ПИКом байта, ; считанного из 24С64 (ACKDT=0), установлен по умолчанию. ;----------------------------------------------------------------------------------------------- bsf Status,RP0 ; Переход в 1-й банк. movlw 9 ; Установка стандартной скорости обмена: movwf SSPAdd ; Fosc/{4*(SSPAdd+1)}=4Мгц/40=100 Кгц. bsf SSPStat,SMP ; Управление длительностью фронта выключено, ; т.к. выбрана стандартная скорость (100 Кгц.).
movlw b'00000000' movwf TrisA
bcf Status,RP0 ; Переход в 0-й банк.
clrf Byte ; Сброс счетчика байтов. movlw b'00101000' ; Включение модуля MSSP (SSPEN=1), movwf SSPCon ; в режиме I2C-ведущего (SSPM3..SSPM0=1000). ;******************************************************************************* **************** ; Начало передачи массива байтов. ;******************************************************************************* **************** ; Формирование условия "START". ;=============================================================================== ================ bsf PortA,5 call START ; Начало формирования условия "START". ;--->Возврат по стеку из ПП START ;=============================================================================== ================ ; Передача режимного байта. ;=============================================================================== ================ movlw b'10100000' ; Передача режимного байта: 1010 - код функциональности, call WR_I2C ; 000 - адрес м/схемы, 0 - режим записи. ;--->Возврат по стеку из ПП WR_I2C ;=============================================================================== ================ ; Передача байтов адреса той ячейки 24C64, из которой будет считан 1-й байт массива ; В данном случае, считывание начнется с 1-й ячейки (адрес 00h). ;=============================================================================== ================ movlw 0 ; Передача старшего call WR_I2C ; байта адреса. ;--->Возврат по стеку из ПП WR_I2C movlw 10h ; Передача младшего call WR_I2C ; байта адреса. ;--->Возврат по стеку из ПП WR_I2C ;=============================================================================== ================ ; Формирование условия "STOP". ;=============================================================================== ================ call STOP ; Начало формирования условия "STOP". ;--->Возврат по стеку из ПП STOP ;=============================================================================== ================ ; Формирование условия "START". ;=============================================================================== ================ call START ; Начало формирования условия "START". ;--->Возврат по стеку из ПП START ;=============================================================================== ================ ; Передача режимного байта. ;=============================================================================== ================ movlw b'10100001' ; Передача режимного байта: 1010 - код функциональности, call WR_I2C ; 000 - адрес м/схемы, 1 - режим чтения. ;--->Возврат по стеку из ПП WR_I2C ;=============================================================================== ================ ; ПП приема байта и формирования отклика ведущего на принятый байт. ;=============================================================================== ================ ; Прием байта. ;------------------------------------- RD_I2C bsf Status,RP0 ; Переход в 1-й банк. bsf SSPCon2,RCEN ; Разрешение приема текущего байта ; от 24С64 (начало приема). bcf Status,RP0 ; Переход в 0-й банк. bcf PIR1,SSPIF ; Сброс флага перерываний от модуля MSSP.
btfss PIR1,SSPIF ; Прием текущего байта завершен или нет? goto $-1 ; Если нет, то ожидание. ; Если завершен, то принятый байт аппаратно копируется ; в SSPBuf и программа исполняется далее. movf SSPBuf,W ; Копирование принятого байта movwf Temp ; из SSPBuf в Temp. ;++++++++++++++++++++++++++++++++++ ; Принятый байт скопирован в Temp. ;---------------------------------------------------- ; Формирование отклика ведущего. ;---------------------------------------------------- bsf Status,RP0 ; Переход в 1-й банк. bsf SSPCon2,ACKEN ; Формирование подтверждения (АСК) принятого байта. bcf Status,RP0 ; Переход в 0-й банк.
bcf PIR1,SSPIF ; Сброс флага перерываний от модуля MSSP.
btfss PIR1,SSPIF ; 9-й импульс закончился или нет? goto $-1 ; Если нет, то ожидание. ; Если закончился, то программа исполняется далее. ;=============================================================================== ================ ; Запись принятого байта в одну из ячеек EEPROM памяти данных PIC16F873A. ;=============================================================================== ================ ; Анализ количества записываемых байтов. ;---------------------------------------------------- movlw .16 ; Задание количества записываемых байтов. subwf Byte,W ; Byte - 5 = ... btfsc Status,Z ; Записаны все 5 байтов или не все? goto FINAL ; Если все, то запись заканчивается. ; Если не все, то программа исполняется далее. ;---------------------------------------------------- ; Процедура записи в EEPROM память данных PIC16F873A. ;---------------------------------------------------- bcf Status,RP0 ; Переход bsf Status,RP1 ; во 2-й банк. movf Byte,W ; movwf EEAdr ; Byte --> EEAdr. movf Temp,W ; movwf EEData ; Temp --> EEData. bsf Status,RP0 ; Переход в 3-й банк.
bcf EECon1,7 ; Выбор режима записи в EEPROM память данных. bsf EECon1,2 ; Разрешение записи.
movlw 55h ; Обязательная movwf EECon2 ; процедура. movlw 0AAh ; ---"--- movwf EECon2 ; ---"--- bsf EECon1,1 ; Инициализация записи. bcf EECon1,2 ; Запрет записи.
btfsc EECon1,1 ; Запись завершена или нет? goto $-1 ; Если нет, то ожидание. bcf Status,RP0 ; Если завершена, то bcf Status,RP1 ; переход в 0-й банк. ;---------------------------------------------------- ; Подготовка к обработке следующего байта. ;---------------------------------------------------- incf Byte,F ; Byte + 1 = номер/адрес текущего байта. goto RD_I2C ; Переход на начало обработки следующего байта. ;=============================================================================== ================ ; Формирование условия "STOP". ;=============================================================================== ================ FINAL call STOP ; Начало формирования условия "STOP". ;--->Возврат по стеку из ПП STOP ;------------------------------------ ; "Закончен бал, погасли свечи". ;------------------------------------ bcf PortA,5 goto $ ; "Вечное, мертвое кольцо" (вместо него ; может быть продолжение программы). ;=============================================================================== ================ ; ПП передачи байта и анализа отклика ведомого. ;=============================================================================== ================ POVTOR bcf Status,RP0 ; Переход в 0-й банк. WR_I2C movwf SSPBuf ; Загрузка буфера байтом любой функциональности ; (начало передачи текущего байта). bcf PIR1,SSPIF ; Сброс флага перерываний от модуля MSSP.
btfss PIR1,SSPIF ; Передача текущего байта завершена или нет? goto $-1 ; Если нет, то ожидание. ; Если завершено, то программа исполняется далее. ;------------------------------------ ; Анализ отклика ведомого. ;------------------------------------ bsf Status,RP0 ; Переход в 1-й банк. btfsc SSPCon2,ACKSTAT; Подтверждение от ведомого (ACK) принято или нет? goto POVTOR ; Если нет, то повтор передачи текущего байта. bcf Status,RP0 ; Если есть, то переход в 0-й банк, return ; после чего - возврат по стеку. ;=============================================================================== ================ ; ПП формирования условия "START". ;=============================================================================== ================ START bcf PIR1,SSPIF ; Сброс флага перерываний от модуля MSSP.
bsf Status,RP0 ; Переход в 1-й банк. bsf SSPCon2,SEN ; Начало формирования условия "START". bcf Status,RP0 ; Переход в 0-й банк.
btfss PIR1,SSPIF ; Формирование условия "START" завершено или нет? goto $-1 ; Если нет, то ожидание. ; Если завершено, то программа исполняется далее. return ; Возврат по стеку. ;=============================================================================== ================ ; ПП формирования условия "STOP". ;=============================================================================== ================ STOP bcf PIR1,SSPIF ; Сброс флага перерываний от модуля MSSP.
bsf Status,RP0 ; Переход в 1-й банк. bsf SSPCon2,PEN ; Начало формирования условия "STOP". bcf Status,RP0 ; Переход в 0-й банк.
btfss PIR1,SSPIF ; Формирование условия "STOP" завершено или нет? goto $-1 ; Если нет, то ожидание. ; Если завершено, то программа исполняется далее. return ; Возврат по стеку. ;******************************************************************************* **************** end ; Конец программы.
|