ESP32 Урок 48. ULP. 1-Wire. Передача данных



Продолжаем работу с сопроцессором ULP и на данном уроке мы продолжим работу с устройством, взаимодействующим с контроллером по шине 1-Wire, а именно с датчиком температуры DS18B20.

И на на данном уроке мы попытаемся передать данные из нашего контроллера в датчик. Это могут быть команды, а также любые данные.

Схема наша осталась та же, что и в прошлом уроке — отладочная плата с контроллером esp32, подключенный к ней датчик температуры DS18B20, а также логический анализатор, подключенный к сигнальной ножке датчика для анализа обмена данными по шине

 

 

Проект за основу мы также возьмём из прошлого урока с именем ULP_FSM_ONEWIRE_INIT и дадим ему новое имя ULP_FSM_ONEWIRE_SEND.

Откроем проект в Espressif IDE, откроем файл ulp_assembly_source_file.S и в процедуре rst_pulse удалим сохранение регистра в память

 

move r2, dataR0
st r0, r2, 0

 

Переменную для сохранения пока оставим, вдруг пригодится.

После процедуры get_temp добавим ещё одну для отправки байта в шину, в которой для начала скопируем значение регистра r2, в котором будет находиться байт, который мы будем отправлять в шину, в регистр r1, а затем обнулим значение регистра r0

 

 

 

Добавим метку для цикла, так как нам надо будет передавать каждый бит отдельно и сдвинем значение регистра r1 вправо на значение, находящееся в регистре r0 (при первом входе в метку ничего не сдвинется, так как в r0 у нас 0) и запишем результат в регистр r2

 

 

У нас новая команда

 

 

Инструкция RSH выполняет логический сдвиг вправо исходного регистра на количество битов из другого исходного регистра или 16-битного знакового значения и сохраняет результат в регистре назначения.

При помощи следующей команды мы в регистре r2 оставим только значение нулевого бита

 

 

Ниже процедуры send_byte добавим процедуру, которая будет отправлять в шину бит, значение которого будет находиться в регистре r2

 

 

В данной процедуре мы настроили ножку на выход и установили на ней низкий уровень.

Подождём немного и вычтем ноль из регистра r2 и в него же запишем

 

 

Здесь возникает вопрос, зачем мы вычли ноль из регистра и записали в него же. Вроде бы ничего не произошло, значение осталось. Но зато мы тем самым узнаем значение в регистре r2 и можем результат использовать в условии, которое будет ниже.

А ниже мы добавим две метки

 

 

Если мы не перейдём во вторую метку, то мы сразу установим высокий уровень, а если перейдём, то только через примерно 80 микросекунд, тем самым обеспечим условие передачи бита (низкий уровень — ноль, высокий — единица).

 

 

Выше перейдём на вторую метку при условии, что у нас ноль

 

 

Возвращаемся в процедуру send_byte и, сохранив регистры r0 и r1 в стеке, вызовем нашу процедуру передачи бита, после чего вернём значения регистров из стека

 

 

Инкрементируем значение r0, и если не достигли 8, то повторяем цикл

 

 

Подождём немного на случай, если вдруг придётся ещё что-то передавать, так как между переданными байтами должны быть паузы

 

 

В процедуре get_temp передадим две команды

 

 

Команду 0xCC (SKIP ROM) мы передаём, чтобы сказать датчику, что мы пропусканием чтение ROM, а команду 44 (Convert T) — чтобы скомандовать датчику, чтобы он начал конвертацию значения температуры в цифровую последовательность (запустил АЦП).

В файле main.c в функции app_main удалим вывод значения регистра r0 в терминал

 

printf("R0: %5d\n", ulp_dataR0 & UINT16_MAX);

 

Попробуем собрать код и прошить контроллер.

Вот результат работы нашего кода

 

 

Отлично! Нам удалось отправить команды в датчик.

Всем спасибо за внимание!

 

Данная статья в Дзен.

 

 

Предыдущий урок Программирование МК ESP32 Следующий урок

 

Исходный код

 

 

Недорогие отладочные платы ESP32 можно купить здесь:

На AliExpress Недорогие отладочные платы ESP32

На Яндекс.Маркет Недорогие отладочные платы ESP32

Датчик температуры в экране с проводом можно приобрести здесь:

На AliExpress DS18B20 в экране с проводом

На Яндекс.Маркет DS18B20 в экране с проводом

Логический анализатор 16 каналов можно приобрести (AliExpress) здесь

 

 

Смотреть ВИДЕОУРОК в YouTube (нажмите на картинку)

ESP32 ULP. 1-Wire. Передача данных

 

Смотреть ВИДЕОУРОК в Дзен (нажмите на картинку)

ESP32 ULP. 1-Wire. Передача данных

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

*