- •Часть 1. Изучение интегрированной системы mcStudio
- •Порядок работы с интегрированной системой mcStudio
- •Запуск интегрированной системы mcStudio
- •2. Написание программы на языке Ассемблер
- •Визуализация контролируемых ресурсов микроконтроллера
- •4. Выполнение симуляции программы
- •5. Создание и отладка новой программы
- •6. Загрузка ранее созданной программы
- •7. Выход из интегрированной системы mcStudio
- •8. Некоторые дополнительные возможности mcStudio
- •Часть 2. Изучение команд передачи данных
- •Задание
- •Оформление программы
- •Контрольные вопросы
- •Задание
- •Контрольные вопросы
- •Лабораторная работа № 3 Реализация функций времени. Часть 1 Введение
- •Задание
- •Контрольные вопросы
- •Лабораторная работа № 4 Реализация функций времени. Часть 2 Введение
- •Задание
- •Контрольные вопросы
- •Задание
- •Контрольные вопросы
- •Лабораторная работа № 6 Программирование последовательного порта микроконтроллера Введение
- •Задание
- •Контрольные вопросы
- •Варианты заданий
- •Контрольные вопросы
- •Особенности использования демонстрационной версии интегральной системы mcStudio
- •Библиографический список
Варианты заданий
Составить блок-схему программы записи 2-х байтов в микросхему памяти EEPROM (адрес 10101100) по коммуникационной шине I2C по текущему адресу ячейки. Составить программу и отладить её с помощью MCStudio.
Составить и отладить программу записи 2-х байтов в микросхему памяти EEPROM (адрес 10101100) по коммуникационной шине I2C, начиная с ячейки 1FH.
Составить и отладить программу чтения 2-х байтов из микросхемы памяти EEPROM по коммуникационной шине I2C текущему адресу.
Составить программу чтения 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 ; конец подпрограммы
