Академический Документы
Профессиональный Документы
Культура Документы
Если речь идет о том, что ведущий осуществляет чтение данных, "лежащих на
хранении" в аппаратных "дебрях" ведомого (осуществляет прием байтов, передаваемых
ведомым), то обязательно должен быть некий "рубильник", который включает/выключает
(запускает в работу/прекращает работу) режим чтения, а иначе "железяка" будет "глупо
моргать глазами" ("моя твоя не понимайт"), и на этом закончатся все "души
прекрасные порывы" ("любви не получилось").
В качестве такого "рубильника", используется бит RCEN.
Им нужно "клацнуть" непосредственно перед началом чтения.
Алгоритм этого "клацанья" настолько "детский", что я не решаюсь унижать Вас его
объяснением.
Если речь идет только о передаче байтов ведущим (см. предыдущий подраздел),
то имеет место быть разновидность сигнала АСК только 1-го пункта.
Если речь идет о приеме байтов ведущим, то имеет место быть разновидность
сигнала АСК и 1-го, и 2-го пунктов.
Последнее объясняется тем, что, прежде чем осуществить прием, нужно осуществить
передачу "рулежных" байтов: режимных (под передачу и под прием) и байтов адреса.
3
Процедуру записи в EEPROM память данных PIC16F873A я "врезал" в ПП приема
байтов, после чего "закольцевал" все это "безобразие" (конец à начало) через счетчик
принятых байтов.
Это позволяет обойтись без условных переходов и возвратов.
Ниже Вы видите, как это выглядит программно.
Примечание: принципиальная схема под эту "железяку" "лежит" в предыдущем
подразделе (ничего не изменилось).
;********************************************************************************
; 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=16F873A ; Используется PIC16F873A.
__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 ; Регистр флагов прерываний
; от периферийных модулей.
;--------------------------------------------
; Регистры управления EEPROM памятью данных.
;--------------------------------------------
EEAdr equ 0Dh ; Регистр адреса (банк 2).
EEData equ 0Ch ; Регистр данных (банк 2).
EECon1 equ 0Ch ; Управляющий регистр (банк 3).
EECon2 equ 0Dh ; Регистр, обеспечивающий защиту
; от случайной записи (банк 3).
;================================================================================
; Регистры общего назачения.
;================================================================================
Temp equ 20h ; Регистр временного хранения
; считанных байтов.
Byte equ 21h ; Счетчик байтов (он же - указатель адреса).
4
;================================================================================
; Присвоение битам названий.
;================================================================================
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 Кгц.).
bcf Status,RP0 ; Переход в 0-й банк.
7
bsf Status,RP0 ; Переход в 1-й банк.
bsf SSPCon2,SEN ; Начало формирования условия "START".
bcf Status,RP0 ; Переход в 0-й банк.
Работа программы
Вплоть до окончания передачи младшего байта адреса, все то же самое (см.
предыдущий подраздел).
Единственное замечание: бит ACKDT сброшен в 0 по умолчанию.
А раз это так, то, не смотря на его "боевые заслуги", он вообще "лишен прописки и
удален за 101-й километр" (прошу не путать с проститутками. Это "парень" достойный.
Просто оказался не нужным).
;================================================================================
; Формирование условия "STOP".
;================================================================================
call STOP ; Начало формирования условия "STOP".
;--->Возврат по стеку из ПП STOP
;================================================================================
; Формирование условия "START".
;================================================================================
call START ; Начало формирования условия "START".
;--->Возврат по стеку из ПП START
;================================================================================
; Передача режимного байта.
;================================================================================
movlw b'10100001' ; Передача режимного байта: 1010 - код
call WR_I2C ; функциональности, 000 - адрес м/схемы,
; 1 - режим чтения.
;--->Возврат по стеку из ПП WR_I2C
8
; Прием байта.
;-------------------------------------
RD_I2C bsf Status,RP0 ; Переход в 1-й банк.
bsf SSPCon2,RCEN ; Разрешение приема текущего байта
; от 24С64 (начало приема).
bcf Status,RP0 ; Переход в 0-й банк.
9
При этом, в "плавающей" задержке, задействуется все тот же "легендарный" флаг
SSPIF (самый натуральный "универсал").
Итак, байт считан ("лежит" в регистре Temp) и ведущий сформировал отклик.
При этом, "крови почти не пролито", плюс, отсутствие "возни с фазой/временем".
По-моему, "получилась могучая (наш губернатор это слово очень любит) любовь" и
можно расчитывать на "румяных карапузов".
Теперь нужно записать считанный байт в ячейку EEPROM памяти данных PIC16F873A.
Байт есть, но нужно записать его не "абы как", а в конкретную ячейку, с конкретным
адресом.
Следовательно, нужно "поставить подпрограмму на счетчик", то есть, организовать
внутреннее кольцо счета.
В данном случае, это делается достаточно стандартно, но с совмещением функций.
Под это дело назначен регистр Byte.
;********************************************************************************
; НАЧАЛО ПРОГРАММЫ.
;********************************************************************************
; Инициализация модуля MSSP (работа по I2C, режим ведущего, скорость 100 Кгц).
;================================================================================
................................
clrf Byte ; Сброс счетчика байтов.
................................
;================================================================================
; ПП приема байта и формирования отклика ведущего на принятый байт.
;================================================================================
; Прием байта.
;-------------------------------------
RD_I2C bsf Status,RP0 ; Переход в 1-й банк.
................................
;================================================================================
; Запись принятого байта в одну из ячеек EEPROM памяти данных PIC16F873A.
;================================================================================
; Анализ количества записываемых байтов.
;----------------------------------------------------
movlw 5 ; Задание количества записываемых байтов.
subwf Byte,W ; Byte - 5 = ...
btfsc Status,Z ; Записаны все 5 байтов или не все?
goto FINAL ; Если все, то запись заканчивается.
; Если не все, то программа
; исполняется далее.
;----------------------------------------------------
; Процедура записи в EEPROM память данных PIC16F873A.
;----------------------------------------------------
................................
;----------------------------------------------------
; Подготовка к обработке следующего байта.
;----------------------------------------------------
incf Byte,F ; Byte + 1 = номер/адрес текущего байта.
goto RD_I2C ; Переход на начало обработки
; следующего байта.
;================================================================================
; Формирование условия "STOP".
;================================================================================
FINAL call STOP ; Начало формирования условия "STOP".
................................
10
В начале программы, содержимое регистра Byte сбрасывается в ноль (подготовка к
счету).
После того, как будет отработана ПП приема байта и формирования отклика
ведущего на принятый байт, из числа, "лежащего" в регистре Byte, вычитается
заданное количество обрабатываемых байтов (5), после чего производится проверка
нулевого результата операции вычитания.
Если результат не равен 0, то текущий байт (Temp) записывается в EEPROM память
данных PIC16F873A, в ячейку с адресом, "лежащим" в регистре Byte.
После выхода из процедуры записи, производится инкремент содержимого регистра
Byte и отрабатывается новый цикл чтения.
И так далее.
На 5-м "витке" внутреннего цикла, будет получен нулевой результат вычитания, после
чего формируется условие "STOP" и программа благополучно "зависает" на команде
goto $ (напоминаю, что программа одноцикловая).
В итоге, в 1-ю ячеку EEPROM памяти данных PIC16F873A, будет записано числовое
значение 1-го, считанного из 2464А, байта, во 2-ю - 2-го … в 5-ю - 5-го, в порядке
Ну и ладушки.
По ходу дела, последовательно, "двух зайцев прихлопнул".
А в дали еще один "маячит" (кто ищет приключений, тот их всегда найдет).
Спрятался, но уши из-за куста торчат. Это их слабый и предательский орган.
Что-то типа Ахиллесовой пяты.
Ух какой матерый и жирный!
Ну я побежал.
В следующем подразделе "угощу свежей зайчатинкой".
12