На Рис. 12.25 тот же микроконтроллер управляет полудуплексной линией связи стандарта RS-485, используя преобразователь уровней МАХ485 фирмы Maxim. Оба буфера имеют собственные входы разрешения с противоположными активными уровнями (буфер передатчика — ВЫСОКИЙ, а буфер приемника — НИЗКИЙ). Микроконтроллер может включать соответствующий буфер в зависимости от направления обмена. Также с помощью микросхемы МАХ485 можно реализовать дуплексный канал с использованием двух линий связи.
Данные по интерфейсу RS-485 можно передавать и по синхронному протоколу. При этом, разумеется, необходимо будет выделить отдельный буфер для передачи тактового сигнала.
Рис. 12.25.
В Примере 11.2 мы написали подпрограмму, сравнивающую фиксированное значение TRIP с байтом, считанным из порта В. В ряде случаев может потребоваться подстройка программы под изменяющиеся условия работы путем модификации порогового значения по командам извне. Вместо того чтобы использовать второй порт ввод/вывода, было предложено передавать новое значение в последовательном виде на вывод RA4, используя вывод RA3 для подключения к линии тактовых сигналов. Предполагая, что состояние линии данных стабильно при ВЫСОКОМ уровне на линии тактового сигнала, напишите подпрограмму, считывающую новое значение и записывающую его в ячейку TRIP.
Решение
Один из возможных вариантов решения этой задачи приведен в Программе 12.17. Эта подпрограмма отслеживает появление ВЫСОКОГО уровня на линии тактового сигнала, при котором, согласно условию задания, сигнал на линии данных стабилен. Изменяя значение бита переноса в соответствии с состоянием линии данных и выполняя операцию сдвига через перенос, осуществляется побитовая загрузка нового значения в память. Причем очередная итерация цикла завершается только после того, как на линии тактового сигнала вновь появляется НИЗКИЙ уровень.
; ***************
; * ФУНКЦИЯ: Задвигает значение порога TRIP, которое затем используется в качестве операнда п/п СОМР *
; * ВХОД: Изменение значения битов данных на RA4 происходит при НИЗКОМ уровне на RA3 *
; * ВЫХОД: COUNT = 00, принятое значение — в TRIP *
; ***************
SER_TRIP movlw 8; Счетчик битов
movwf COUNT
SER_TRIP_LOOP
btfss PORTA,3; Ждем 1 на такт, линии
goto SER_TRIP_LOOP
bcf STATUS,С; Обнуляем флаг переноса
btfsc PORTA,4; На линии данных 1?
bsf STATUS,С; ЕСЛИ да, ТО устанавливаем флаг переноса
rlf TRIP,f; Вдвигаем бит
SER_TRIP_LOOP2
btfsc PORTA,3; Дожидаемся появления 0 на такт, линии
goto SER_TRIP_LOOP2
decfsz COUNT,f
goto SER_TRIP_LOOP
return
Эта подпрограмма похожа на подпрограмму SPI_READ (см. Программу 12.3), за исключением того, что тактовый сигнал формируется внешним устройством, т. е. микроконтроллер PIC в данном случае выступает в роли ведомого. В реальных системах, где ведомый микроконтроллер должен обладать возможностью сообщать ведущему о необходимости передачи нового байта, такая схема может вызвать определенные проблемы. Указанную возможность можно реализовать, используя дополнительную линию порта ввода/вывода для передачи квитирующего сигнала CTS. Этот сигнал будет генерировать прерывание на стороне ведущего и инициировать обмен. Конечно же, этим ведущим может быть другой микроконтроллер PIC, и в этом случае мы получим очень простой вариант объединения двух микроконтроллеров. При использовании микроконтроллера с встроенным последовательным портом прерывания могут генерироваться автоматически — такой подход наиболее часто используется для реализации многопроцессорных сетей.
Напишите подпрограмму I2C_IN, обратную по своему действию подпрограмме I2C_OUT из Программы 12.9. Предполагается, что в вашем распоряжении имеются те же переменные, а принятое значение должно сохраняться в регистре DATA IN.
Решение