с ds18b20, чтобы по максимуму в железе и без софтовых ожиданий/прерываний/ногодрыгов?
Возьмите и не мучайтесь: https://aliexpress.ru/item/100500748286 ... 97b2n9PHf1 И параметры импульсов правильные, и фронты правильные, и работает всё через DMA, и даже гальваническая развязка очень просто реализуется.
Это довольно подозрительная статья. В коде после старта преобразования сразу же считывается результат, хотя известно, что 12-битное преобразование занимает до 750 миллисекунд. Да и побитовое считывание с активным использованием ядра такая себе автоматика. Ногодрыг, только в профиль. Это уж не говоря, что HAL_UART_Transmit -- блокирующая функция, где процессор тупо молотит циклы, ожидая флага от юсарта. Я немного другим интересуюсь: мне нужно получать данные с ds18b20 минимально отвлекая ядро.
tonyk писал(а):
https://aliexpress.ru/item/1005007482869799.html?sku_id=12000044505946600&spm=a2g2w.productlist.search_results.0.224597b2n9PHf1 И параметры импульсов правильные, и фронты правильные, и работает всё через DMA, и даже гальваническая развязка очень просто реализуется.
Подозрительно или нет для вас, работает. И это не мешает менять то, что вам не нравится. 5 минут на включение, компиляцию и тестирование. Результат комнатной температуры - в Live Expresion.
Компания MEAN WELL пополнила ассортимент своей широкой линейки светодиодных драйверов новым семейством XLC для внутреннего освещения. Главное отличие – поддержка широкого спектра проводных и беспроводных технологий диммирования. Новинки представлены в MEANWELL.market моделями с мощностями 25 Вт, 40 Вт и 60 Вт. В линейке есть модели, работающие как в режиме стабилизации тока (СС), так и в режиме стабилизации напряжения (CV) значением 12, 24 и 48 В.
Не зная подробностей вашего запроса, просто предложил способ.
все подробности исчерпывающим образом я изложил здесь. как-то неожиданно услышать про "незнание подробностей".
Цитата:
Если вы так хорошо знакомы с методом, то предложите свой.
я в полной мере представляю, что должно быть сделано, но пока еще не задумывался, как это может быть сделано. есть понимание, что возбуждение шины 1-wire микроконтроллером полностью детерминировано. моменты, когда мк должен переключать ногу вниз, а когда отпускать, известны для всего цикла измерения. раз так, то нужен, по сути, незамысловатый секвенсор, который бы проигрывал всю последовательность целиком.
P. S. Для тех кто читает не внимательно. В даташите на DS2489B приведены примеры на С работы устройствами на шине I2C. Для тех кто в танке могу добавить, что работа через конвертер UART-I2C никак не связана с девайсом, который выполняет в данном случае функцию мастера шины, лишь бы у него были функции приёма-передачи блоков данных через UART.
tonyk, внутри напр. STM32G4xx есть 5 x USART, для чего нужна внешняя ИС, по цене почти как МК? USART аппаратный, с буфером, "на строке" - данные выводятся по мере наступления времени, плюс DMA все работает (почти) незаметно для центрального ядра. Конечно, для всего есть свои решения. DS2480 к 1-wire - ето еще одно решение.
Да. Даже заказал DS2480B и жду, после вашего сообщения. Интересная ИС. Просто в МК (STM32) есть много ресурсов, которые можно использовать без включения внешних компонентов.
Просто в МК (STM32) есть много ресурсов, которые можно использовать без включения внешних компонентов.
В STM32 нет схем формирования импульсов для OW, поэтому что вы там собрались использовать- не понятно. Рассчитывать на заявленные для OW 150м с банальным резистором, ИМХО, наивно. Ну и реализации шины OW с гальванической развязкой на DS2480B решается тривиально в отличие от огорода на внешних дискретных компонентах, которые в итоге займут на плате места больше, чем одна DS2480B.
Ничего толком не предлагал: нашел решение на первой странице поисковика, попробовал на STM32 на бредборде на столе за 5 минут, получил результа: комнатная температура, работа понравилась, и поделил ссылкой на использование DS18B20 с ресурсами UART в STM32. Если не нужно: 1-wire -> UART в STM32, не используйте, и всё.
никому не попадался код работы с ds18b20, чтобы по максимуму в железе и без софтовых ожиданий/прерываний/ногодрыгов?
в теории это выглядит так - аппаратный слот модулем сравненія таймера, чтение модулем захвата другого таймера. гдето даже пример попадался.
а почему другого? в таймере может быть несколько каналов и для каждого можно выбирать режим независимо от других. одним каналом семплы нарезаем, другим захват делаем. на такой код я и хотел поглядеть.
В STM32 нет схем формирования импульсов для OW, поэтому что вы там собрались использовать- не понятно.
Собрались использовать схему с открытым стоком и подтягивающий резистор, аккурат, как написано в наставлении о караульной службе. В общем, пока суд да дело, я набросал секвенсор из одного таймера и одного канала дма.
логика работы: таймер стартует, выход канала в ноль. так начинается reset pulse. регистр ccr содержит значение 480. совпадение перещелкивает выход и дергает канал дма, который грузит в регистр сравнения время следующего переключения и т.д.
вот такая последовательность полностью формирует всю циклограмму для старта преобразования:
Код:
const uint16_t ccr_seq[] = { // Timer starts LOW (line pulled low) 480, // [0] Release line (HIGH) at 480 µs — presence pulse start 980, // [1] Pull line LOW at 980 µs — presence pulse duration 500 µs
// 0xCC (11001100, LSB first: 0,0,1,1,0,0,1,1) 1040, // [2] Release (HIGH) after 60 µs LOW (bit 0) 1041, // [3] Pull LOW after 1 µs HIGH 1101, // [4] Release (HIGH) after 60 µs LOW (bit 1) 1102, // [5] Pull LOW after 1 µs HIGH 1103, // [6] Release (HIGH) after 1 µs LOW (bit 2, '1') 1163, // [7] Pull LOW after 60 µs HIGH 1164, // [8] Release (HIGH) after 1 µs LOW (bit 3, '1') 1224, // [9] Pull LOW after 60 µs HIGH 1284, // [10] Release (HIGH) after 60 µs LOW (bit 4) 1285, // [11] Pull LOW after 1 µs HIGH 1345, // [12] Release (HIGH) after 60 µs LOW (bit 5) 1346, // [13] Pull LOW after 1 µs HIGH 1347, // [14] Release (HIGH) after 1 µs LOW (bit 6, '1') 1407, // [15] Pull LOW after 60 µs HIGH 1408, // [16] Release (HIGH) after 1 µs LOW (bit 7, '1') 1468, // [17] Pull LOW after 60 µs HIGH
// 0x44 (01000100, LSB first: 0,0,1,0,0,0,1,0) 1528, // [18] Release (HIGH) after 60 µs LOW (bit 0) 1529, // [19] Pull LOW after 1 µs HIGH 1589, // [20] Release (HIGH) after 60 µs LOW (bit 1) 1590, // [21] Pull LOW after 1 µs HIGH 1591, // [22] Release (HIGH) after 1 µs LOW (bit 2, '1') 1651, // [23] Pull LOW after 60 µs HIGH 1711, // [24] Release (HIGH) after 60 µs LOW (bit 3) 1712, // [25] Pull LOW after 1 µs HIGH 1772, // [26] Release (HIGH) after 60 µs LOW (bit 4) 1773, // [27] Pull LOW after 1 µs HIGH 1833, // [28] Release (HIGH) after 60 µs LOW (bit 5) 1834, // [29] Pull LOW after 1 µs HIGH 1835, // [30] Release (HIGH) after 1 µs LOW (bit 6, '1') 1895, // [31] Pull LOW after 60 µs HIGH 1955 // [32] Release (HIGH) after 60 µs LOW (bit 7) };
на столе будет работать, а в реальных условиях я подожду 100мкс между стартами слотов
да понятно, что мегагерцовые частоты в проводах не уйдут далеко. но паузы можно делать, хоть по десять часов:
"If for any reason a transaction needs to be suspended, the bus MUST be left in the idle state if . Infinite recovery time can occur between bits so long as the 1-Wire bus is in the inactive (high) state during the recovery period."
предложенная схема легко настраивается под различные тайминги. ограничение -- разрядность таймера.
Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 12
Вы не можете начинать темы Вы не можете отвечать на сообщения Вы не можете редактировать свои сообщения Вы не можете удалять свои сообщения Вы не можете добавлять вложения