Arduino OneWire slave device emulator
Добавлено: Чт фев 13, 2014 9:07 am
В наше время 1-Wire сети сбавляют свою популярность и уступают рынок другим стандартам. Также есть тенденция использовать программируемые контролеры, что уменьшает привлекательность 1-Wire как конструктор с готовыми решениями. Из за этого Maxim перестает выпускать некоторые приборы.
Разбираться с предлагаемыми чипами не хочется, посему делаю попытку использовать Arduina для эмуляции 1-Wire устройств. В интернете есть куча примеров, но они в основном работы как мастер 1-Wire. Есть примеры и с эмуляцией слейвов. Но в исходниках представлена эмуляция только 1 устройства. Но использовать Ардуину для эмуляции 1 устройства слишком расточительно.
Вот и пришла мне такая идея. Т.к. в Ардуине реально много каналов, то почему бы ей не эмалировать несколько устройств
Когда я решил попробовать реализовать это я понял с чем столкнулись люди пытающиеся сделать подобное
1. Частота дискретизации. На сколько я понял копаясь в документации и делая следования. Ардуина еле справляется с частотой работы шины 1-Wire и на некоторых участках кода она просто не успевает.
2. Очень критичная по времени команда поиска устройств 0xF0 - Делать анализ и расчёты масок между отсылки битов практически нельзя
По этому и не было реализовано такой возможности. Скорей всего если написать программу на чистом СИ и было бы решением этой проблемы. Но тогда чем отличается взять предлагаемый контролер Maxim с портом 1-Wire и написать под конкретную задачу.
Поразмыслив немного я решил обойти узкие части алгоритма простым конвейером. То есть разложить нужные данные в массив и делать простые переходы по нему. К сожалению такой подход жрёт много памяти но зато не тратит драгоценные такты в узких местах.
После того как я смог реализовать алгоритм развёртки поиска в массив. Всё задышало. После чего я сделал некую структуру библиотеки где можно реализовать до 8 эмулируемых устройств одновременно.
https://github.com/Shagrat2/OneWireHub
Перечень реализованных устройств:
Закончен - DS18B20 - Digital Thermometer
Закончен - DS2401 - Serial Number
В разработке - DS2405 - Single adress switch - Не реализован поиск активных
В разработке - DS2408 - 8-Channel Addressable Switch
Закончен - DS2413 - Dual channel addressable switch
В разработке - DS2423 - 4kb 1-Wire RAM with Counter
В разработке - DS2433 - 4kb 1-Wire RAM with Counter
В разработке - DS2438 - Smart Battery Monitor
В разработке - DS2450 - 4 channel A/D
Закончен - DS2890 - Single channel digital panemtiometer
Многие устройства не реализованы из за того что не могу разобраться в алгоритме работы. Поэтому кому интересен этот проект и есть возможность разобраться. С удовольствием включу в библиотеку
Пример работы можно посмотреть в файле test.ino
Как запустить:
1. Создать эмулируемые объекты и привязать их в массив
2. Запустить расчёт конвейера hub->calck_mask();
3. В цикле запускать чтение шины hub->waitForRequest(false)
4. В прерываниях или по таймеру. Менять значения памяти устройств (Которые потом будет читать мастер)
Библиотека ещё не закончена и в ней есть ещё ошибки. Выложил по просьбе интересующихся
Разбираться с предлагаемыми чипами не хочется, посему делаю попытку использовать Arduina для эмуляции 1-Wire устройств. В интернете есть куча примеров, но они в основном работы как мастер 1-Wire. Есть примеры и с эмуляцией слейвов. Но в исходниках представлена эмуляция только 1 устройства. Но использовать Ардуину для эмуляции 1 устройства слишком расточительно.
Вот и пришла мне такая идея. Т.к. в Ардуине реально много каналов, то почему бы ей не эмалировать несколько устройств
Когда я решил попробовать реализовать это я понял с чем столкнулись люди пытающиеся сделать подобное
1. Частота дискретизации. На сколько я понял копаясь в документации и делая следования. Ардуина еле справляется с частотой работы шины 1-Wire и на некоторых участках кода она просто не успевает.
2. Очень критичная по времени команда поиска устройств 0xF0 - Делать анализ и расчёты масок между отсылки битов практически нельзя
По этому и не было реализовано такой возможности. Скорей всего если написать программу на чистом СИ и было бы решением этой проблемы. Но тогда чем отличается взять предлагаемый контролер Maxim с портом 1-Wire и написать под конкретную задачу.
Поразмыслив немного я решил обойти узкие части алгоритма простым конвейером. То есть разложить нужные данные в массив и делать простые переходы по нему. К сожалению такой подход жрёт много памяти но зато не тратит драгоценные такты в узких местах.
После того как я смог реализовать алгоритм развёртки поиска в массив. Всё задышало. После чего я сделал некую структуру библиотеки где можно реализовать до 8 эмулируемых устройств одновременно.
https://github.com/Shagrat2/OneWireHub
Перечень реализованных устройств:
Закончен - DS18B20 - Digital Thermometer
Закончен - DS2401 - Serial Number
В разработке - DS2405 - Single adress switch - Не реализован поиск активных
В разработке - DS2408 - 8-Channel Addressable Switch
Закончен - DS2413 - Dual channel addressable switch
В разработке - DS2423 - 4kb 1-Wire RAM with Counter
В разработке - DS2433 - 4kb 1-Wire RAM with Counter
В разработке - DS2438 - Smart Battery Monitor
В разработке - DS2450 - 4 channel A/D
Закончен - DS2890 - Single channel digital panemtiometer
Многие устройства не реализованы из за того что не могу разобраться в алгоритме работы. Поэтому кому интересен этот проект и есть возможность разобраться. С удовольствием включу в библиотеку
Пример работы можно посмотреть в файле test.ino
Как запустить:
1. Создать эмулируемые объекты и привязать их в массив
2. Запустить расчёт конвейера hub->calck_mask();
3. В цикле запускать чтение шины hub->waitForRequest(false)
4. В прерываниях или по таймеру. Менять значения памяти устройств (Которые потом будет читать мастер)
Библиотека ещё не закончена и в ней есть ещё ошибки. Выложил по просьбе интересующихся