Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Metod_MCS11_12.doc
Скачиваний:
3
Добавлен:
01.07.2025
Размер:
805.38 Кб
Скачать

Варианты заданий

  1. Составить блок-схему программы записи 2-х байтов в микросхему памяти EEPROM (адрес 10101100) по коммуникационной шине I2C по текущему адресу ячейки. Составить программу и отладить её с помощью MCStudio.

  2. Составить и отладить программу записи 2-х байтов в микросхему памяти EEPROM (адрес 10101100) по коммуникационной шине I2C, начиная с ячейки 1FH.

  3. Составить и отладить программу чтения 2-х байтов из микросхемы памяти EEPROM по коммуникационной шине I2C текущему адресу.

  4. Составить программу чтения 2-х байтов из микросхемы памяти EEPROM по коммуникационной шине I2C и заданному адресу.

На рис. 5 в качестве примера представлен вариант блок-схемы программы записи байта в микросхему памяти с интерфейсом I2C. При составлении программ рекомендуется для линии SCL использовать бит порта P0.6, для линии SDA – бит порта P0.7. Предусмотреть генерацию START и STOP условий, счётчики битов и байтов, контроль бита подтверждения ACK. Длительность импульса на линии SCL должна быть не менее 5 микросекунд (5 машинных циклов при частоте кварцевого резонатора микроконтроллера 12 МГц), длительность паузы – не менее 5 мксек. Для передачи байта старшим битом вперёд можно использовать следующую последовательность команд: загрузить байт в аккумулятор, сдвинуть

влево с помощью команды RLC, выдать бит переноса С на линию SDA c помощью команды mov C, P0.6.

Для примера приведём несколько фрагментов программ контроллера интерфейса I2C. Фрагмент программы, реализующий формирование адреса устройства (микросхемы памяти):

; в r0 записан байт 00000***, содержащий младшую часть адреса

; устройства в виде комбинации из 3-х бит, для общности ;обозначенных звёздочками

; в регистре r1 записан байт 10100000, содержащий старшую часть

;адреса 1010, принятую для микросхем памяти

mov a,r0 ; запись в аккумулятор байта 00000***, содержащего ;младшую часть адреса для формирования полного адреса ;и признака операции чтения или записи

rl a ;начало формирования адреса: сдвиг байта в аккумуляторе

; влево освобождает нулевой бит, необходимый для

;обозначения операции чтения или записи, и сдвигает биты

; младшей части адреса *** в положение, которое они ;должны занимать в полном адресе, результат – 0000***0

orl a,#r1 ; конец формирования адреса устройства при записи: опе-

; рация логическое ИЛИ аккумулятора и регистра дает 7-;битный адрес микросхемы EEPROM 1010***0 в ;аккумуляторе и признак записи 0 в его нулевом бите

; если необходима операция чтения, то следует командой ;setb ACC.0 установить нулевой бит аккумулятора в 1, в ;результате получим адрес для записи 1010***1

Фрагмент программы, содержащий операцию передачи одного байта [4]:

; для облегчения программирования определим макрокоманды, то ;есть с помощью директивы macro заменим некоторую ;последовательность команд одним именем, которым будем ;пользоваться вместо неё.

; макрокоманду вначале определяют (делают макроопределение)

; макроопределение задержки в 3 машинных цикла (команда nop

; выполняется за один машинный цикл

delay_3 macro

nop

nop

nop

endm

; макроопределение задержки в 4 машинных цикла

delay_4 macro

nop

nop

nop

nop

endm

; макроопределение установки высокого уровня на линии SCL (на;чало генерации синхроимпульса) и ожидания, если на линии SCL ;к этому моменту времени ведомым устройством установлен низкий ;уровень

; (таким образом ведомое устройство может снижать темп обмена)

SCL_HIGH: macro

setb SCL_PIN

jnb SCL_PIN,$ ; ожидание высокого уровня

endm

; макроопределения закончились

;

; определение имён регистров и битов

BIT_CNT equ r3 ; счётчик битов процедур с I2C

NO_ASK equ f0 ; флаг отсутствия подтверждения приёма

; Выводы порта P0, используемые для подключения шины I2C

SCL_PIN equ P0.6 ; линия тактирования

SDA_PIN equ P0.7 ; линия данных

; конец определения регистров и битов

;

; Подпрограмма SEND_BYTE – передаёт 1 байт, предварительно

; помещённый в аккумулятор

SEND_BYTE:

mov BIT_CNT,#8 ;установить счётчик битов

SB_LOOP:

rlc A ; перемещение более старшего бита в бит переноса С, так как ;выдача битов на линию SDA происходит старшим битом ;вперёд

mov SDA_PIN,C ; выдача бита на линию SDA

SCL_HIGH ; установка высокого уровня на SCL

delay_3 ; задержка 3 машинных цикла (генерация

; синхроимпульса)

clr SCL_PIN ; установка низкого уровня на SCL

; (конец синхроимпульса)

delay_3

djnz BIT_CNT, SB_LOOP ; цикл до передачи всех битов в

; байте

setb SDA_PIN ; освободить линию SDA для получения

; бита подтверждения от устройства ;(подтверждение заключается в

; установке устройством низкого уровня ; ASK на SDA)

SCL_HIGH ; начало генерации синхроимпульса

delay_4 ; генерация синхроимпульса

jnb SDA_PIN, SB_EX ; проверить правильность ответа

; (ответ правильный, если устройство

; установило низкий уровень на SDA)

setb NO_ACK ; установить статус "нет ответа"

SB_EX:

clr SCL_PIN ; завершить генерацию синхроимпульса

delay_3

ret ; конец подпрограммы

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]