; *************
; * ФУНКЦИЯ: Передает 1-байтное значение ведомому 1-Wire *
; * РЕСУРСЫ: Макрокоманда Delay_us, формирующая задержку N мкс *
; * ВХОД: Передаваемй байт в DATA_OUT *
; * ВЫХОД: DATA_OUT обнуляется; W, STATUS изменяются *
; *************
WRITE_1W movlw 8; Количество проходов цикла
movwf COUNT
W_LOOP bcf INDF,DAT; Спадающий фронт — СТАРТ
Delay_us 1; Ждем 1 мкс
rrf DATA_OUT,f; Выдвигаем байт через перенос
btfsc STATUS,С; Бит равен 1?
bsf INDF,DAT; ЕСЛИ да, ТО выставляем ВЫСОКИЙ уровень
Delay_us d’60’; Удерживаем в течение 60 мкс
bsf INDF,DAT; Высвобождаем линию
Delay_us 1; Ждем 1 мкс
decfsz COUNT,f; Повторяем восемь раз
goto W_LOOP
return
; ******************
; * ФУНКЦИЯ: Принимает 1-байтное значение от ведомого 1-Wire *
; * РЕСУРСЫ: Макрокоманда Delay_us, формирующая задержку N мкс *
; * ВХОД: Нет *
; * ВЫХОД: Принятый байт в DATA_IN; W, STATUS изменяются *
; ******************
READ_1W movlw 8; Количество проходов цикла
movwf COUNT
R_LOOP bcf INDF,DAT; Спадающий фронт — СТАРТ
Delay_us 1; Ждем 1 мкс
bsf INDF,DAT; Высвобождаем линию
Delay_us 8; Ждем 8 мкс, чтобы дать возможность ведомому выставить данные
bcf STATUS,С; Сбрасываем флаг переноса
bcfsc INDF,DAT; Проверяем состояние входа
bsf STATUS,С; ЕСЛИ 1, TO устанавливаем флаг переноса
rrf DATA_IN,f; Задвигаем бит в регистр
Delay_us d’48’; Ждем до конца слота
goto R_LOOP
decfsz COUNT,f ; Повторяем восемь раз
return
; ********************
; * ФУНКЦИЯ: Сбрасывает ведомого 1-Wire *
; *********************
RESET_1W bcf INDF,DAT; Выставляем НИЗКИЙ уровень
Delay_us d’140’; Ждем 480…960 мкс
Delay_us d’140’; С помощью макрокоманды можно получить
Delay_us d’140’; величину задержки (3*0.2)*255, только
Delay_us d’80’; если процессор работает на 20 МГц
bsf INDF,DAT; Высвобождаем линию
Delay_us d’60’; Ведомый выставляет НИЗКИЙ уровень через 15…60 мкс
RESET_LOOP
btfss INDF,DAT; А затем высвобождает линию
goto R_LOOP; Ждем, пока на линии не появится ВЫСОКИЙ уровень
return;
12.1. Перепишите Программу 11.5 со стр. 351, но с использованием модуля SPI, показанного на Рис. 12.4. Подсказка: вместо проверки итоговых 1-байтных значений более эффективным решением может стать побитовая проверка вдвигаемого значения.
12.2. Покажите, как можно подключить четыре АЦП МАХ518 (см. Рис. 12.16) к одной шине I2С и как можно загрузить значение 1-го канала третьего АЦП.
12.3. Обмен по шине 1-Wire начинается с формирования ведущим импульса сброса, при котором ведущий выставляет на линию НИЗКИЙ уровень на время 480…960 мкс, после чего линия высвобождается. В ответ на это ведомый выставляет на линию НИЗКИЙ уровень с задержкой не более 60 мкс. Это состояние удерживается на линии в течение 60…240 мкс, после чего ведомый высвобождает линию. Напишите подпрограмму, выполняющую описанные действия. Предполагается, что в вашем распоряжении имеются ресурсы Программы 12.20.