1. Последовательный интерфейс связи.
Последовательный интерфейс связи (SCI) применяется для коммуникации между микроконтроллером и подключенными к нему устройствами.SCIиспользует две линии портаD(PD0для получения данных иPD1для передачи), а также регистры статуса, конфигурации и данных (см. теоретическую часть). В данной лабораторной работе платы отладочных модулей (далее ОМ) соединяются по три через последовательный интерфейс связи по схеме, показанной на рис.1.
Рис.1 Схема соединения ОМ по SCI.
RDI - Reciever Data Input;
TDO - Transmitter Data Output.
По схеме видно, что первый микроконтроллер может обмениваться данными с любым из двух других микроконтроллеров, а те, в свою очередь, только с первым. Это накладывает некоторые ограничения на пользование каналом связи. В частности, во время передачи данных первым микроконтроллером прием может вестись как одним, так и двумя микроконтроллерами, в то время, как передача может осуществляться или вторым, или третим микроконтроллером, но не двумя одновременно (при этом информация в линии становится бессмысленной).
Сигналы RDI и TDO ОЭВМ преобразуются на дополнительной плате в уровни, соответсвующие физическому стандарту RS-232C, с помощью схемы, представленной на рис.2.
Рис.2. Схема преобразования уровней сигналов.
В данной лабораторной работе используются прерывания от последовательного интерфейса связи. При выполнении заданий следует учитывать, что адрес подпрограммы обработки прерывания должен заноситься в ячейки $1FF6 (старший байт) и $1FF7 (младший байт).
Рассмотрим работу интерфейса на приведенном ниже примере, состоящем из двух программ. Программа 1 предназначена для передачи данных, а программа 2 - для приема. Для обеспечения связи эти программы должны функционировать на разных машинах (но не на ОМ2 и ОМ3 одновременно, см. рис.1).
Программа 1:
200 LDA #$30 КонфигурируемSCIна нужную
STA $D скорость (9600 бод);
LDA #$0 8 битные
STA $E данные;
LDA #$8 настраиваем
STA $F на передачу.
LDA $10 Сбрасываем флаги.
LDA $0 Передаем значение с переключателей
STA $11 по сети.
212 BRA 212 Организуем бесконечный цикл.
Программа 2:
200 LDA #$30 КонфигурируемSCIна нужную
STA $D скорость (9600 бод);
LDA #$0 8 битные
STA $E данные;
LDA #$4 настраиваем
STA $F на прием.
LDA $10 Сбрасываем флаги.
20E BRCLR 5,$10,$20EЖдем окончания приема.
LDA $11 Загружаем полученные данные в регистрA.
213 BRA $213 Организуем бесконечный цикл.
Программа 1 передает считанный с переключателей дополнительной платы байт данных по сети. При этом микроконтроллер-получатель должен выполнять программу 2. Заметим, что программа 2 может выполняться одновременно вторым и третим микроконтроллерами (см. рис.1), в этом случае передаваемую информацию получит и тот, и другой.
Поставьте точки останова по адресам $212 в программе 1 и $213 в программе 2. Запустите сначала программу 2, затем программу 1 и убедитесь в их правильной совместной работе (в регистрах Aобеих ОЭВМ должно оказаться передаваемое число).
Следующий пример - прообраз часто используемой на практике системы с одним ведущим и несколькими ведомыми устройствами, подключенными к одной общей линии. Получение информации ведущим от ведомого осуществляется по инициативе ведущего следующим образом:
-ведущий посылает в линию номер устройства, которому он хочет передать информацию (2 для ОМ2 и 3 для ОМ3, см. рис.1 практической части);
-эта (командная) посылка отличается от остальных (информационных) каким-либо признаком (в нашем случае установленным в 1 девятым битом) и должна быть принята всеми ведомыми устройствами, которые, в свою очередь, сравнивают полученный номер со своим и, в случае совпадения, производят прием информации с линии.
Получение командной посылки ведомыми устройствами происходит с использованием прерывания по единичному девятому биту, что позволяет выполнять основную программу, не отвлекаясь на ожидание информации с линии, и лишь по приходу данных начать их обработку.
Программа 1 (передатчик):
200 RSP УстанавливаемSPв $FF.
LDA #$2 Конфигурируем портD
STA $7 (D1 на вывод, остальные линии на ввод).
LDA #$30 Устанавливаем скорость
STA $D передачи данных 9600 бод.
LDA #50 Устанавливаем длину посылки 9 бит
STA $E и старший передаваемый бит в 1.
LDA #$8 Разрешаем передачу
STA $F данных.
LDA #$2 Загружаем идентификатор устройства.
213 BRCLR 7,$10,$213 Ждем установления режима передачи данных
(флаг TDRE).
STA $11 Посылаем идентификатор по сети.
LDА #$10 Задаем количество пакетов равным $10.
21А BRCLR 7,$10,$21А Ждем окончания передачи очередного пакета
(флаг TDRE).
STА $11 Посылаем следующий пакет.
DECА Декрементируем счетчик.
BNE $21А Возврат на передачу пакета, если переданы не все.
222 BRA 222 Завершаем программу.
Программа 2 (приемник):
Основной блок:
200 RSP УстанавливаемSPв $FF.
LDA #$2 Конфигурируем портD
STA $7 (D1 на вывод, остальные линии на ввод).
LDA #$FF Переключаем портВ
STA $5 на вывод данных.
LDA#$80 Сигнализируем светодиодом
STA $1 о начале работы.
LDA #$30 Устанавливаем скорость
STA $D приема данных 9600 бод.
LDA #18 Выбираем длину посылки 9 бит и метод
STA $E активизирования приемника по единичному биту.
LDA #$26 Разрешаем прерывания по приему
STA $F данных и включаем режим ожидания.
LDA #$10 Устанавливаем счетчик принимаемых пакетов
STA $70 равным $10.
CLR $71 Очищаем вспомогательный флаг.
CLI Разрешаем прерывания.
220 BRA $220 Ждем начала работы приемника.
Подпрограмма обработки прерывания:
800 LDA $10 Сбрасываем флаги
LDA $11 и загружаем полученное значение в регистрА.
LDX $71 Если вспомогательный флаг установлен,
BNE $816 то переход на обработку полученного пакета,
CMP #$2 иначе сравниваем полученный идентификатор с
BEQ $811 верным (2 для ОМ2 и 3 для ОМ3) и в случае совпадения переходим на $811.
LDA #$26 Если идентификатор ошибочен,
STA $F то устанавливаем режим ожидания
810 RTI и возвращаемся из подпрограммы.
811 COM $1 Сигнализируем о получении верного идентификатора,
COM $71 устанавливаем вспомогательный флаг
815 RTI и возвращаемся из подпрограммы.
816 LDX $70 Сохраняем полученный пакет
STA $4F,X по нужному адресу.
DEC $70 Декрементируем счетчик неполученных пакетов.
BEQ $840 Если получен последний пакет, то завершаем
81E RTI программу, иначе возвращаемся из подпрограммы.
Пояснения к программам:
·в программе 2 вспомогательный флаг (ячейка ОЗУ $71) используется подпрограммой обработки прерывания: если флаг в нуле, то принят идентификатор, если в единице, то принят очередной 9-битный пакет;
·если принят неверный идентификатор, то приемник опять переключается в режим ожидания;
·получаемые по сети данные сохраняются по адресам $50..$5F, что дает возможность проверить отсутствие ошибок при передаче.
Запишите в ячейки $1FF6, $1FF7 адрес подпрограммы обработки прерывания ($800), поставьте точки останова по адресам $222 в программе 1 и $840 в программе 2. Запустите сначала приемник, затем передатчик. После того, как программы закончат свою работу, убедитесь в правильности передачи данных, просмотрев содержимое памяти по адресам $50..$5F.