Драйвер Arduino One Wire Bus DS18B20 собственной разработки, в котором отсутствуют биты или посторонние биты

Недавно мне пришлось кодировать собственный драйвер для шины One-Wire-Bus специально с учетом вездесущего датчика температуры DS18B20 для приложения.

Я запускаю этот код на Arduino Mega 2560. Программирование выполняется в Atmel Studio 7 и AVR ISP mk2.

В вчерашней версии см. здесь при попытке отправить 0x55 One-Wire-Command (т.е. Match-Rom-Code). Похоже, что два младших бита отсутствуют (осциллограмма).

Сегодня я попытался разобраться с этой ошибкой и "исправил" ее, сосчитав до 9 вместо 8 (хотя я не могу объяснить, почему это должно работать, скорее это должно сломать что-то [оказывается, что работает]... ) и вычитание 1 из моей индексной переменной. (См. файл «OneWire.c», строка 83 и последующие для старой версии). Текущая версия находится здесь (сравните файл "OneWire.c", строка 81 и последующие).

В новой версии (на сегодняшний день) я могу получить код операции 0x33 (т. е. Send-Rom-Command), передаваемый по желанию, и получить идентификатор моего конкретного датчика на шине. (по крайней мере, мой осциллограф показывает правильную форму волны). В более новой версии я делаю следующую цепочку операций:

  • получить идентификатор единственного датчика, который я подключил в данный момент
  • отправить команду Match-Rom-Command (просто потому, что это действительно важно сделать)
  • после этого отправьте 64-битный Rom-Code (или, по крайней мере, то, что конечный автомат функции getID записал в выходной параметр)
  • отправить код операции 0x44 (т. е. начать преобразование температуры)

Этот сценарий показывает, что по шине не отправляется правильный ROM-код, по шине на один байт больше и еще на один бит слишком много по шине для кода операции преобразования температуры. Команда Match Rom Code передается, как и предполагалось, и не дает каких-либо посторонних или отсутствующих битов (для этого нет захвата прицела, поскольку было бы невозможно получить один кадр, который показывает все это [в рабочем масштабе]... ).

Я бы очень признателен любому, кто посмотрит на мой код и попытается понять, что здесь происходит не так, поскольку сейчас я в полном неведении.

Прежде чем кто-нибудь спросит:

Я специально не хотел использовать легкодоступные библиотеки One-Wire, поскольку они, как правило, раздуты и сильно зависят от функции задержки, что хорошо, если вы мало что делаете со своим чипом, но не больше. Поскольку у меня есть несколько датчиков для считывания (пока нет, но как только я заработаю драйверы), мне нужно выполнить некоторую постобработку необработанных данных (т.е. применить к ним какую-то математику) и передать эти данные через обычно медленный интерфейс (I2C, Serial, что угодно), что требует времени (и все это [периодически и как можно быстрее, конечно] на плохом 8-битном Micro, который работает на неутешительной частоте 16 МГц ...), я решил сведите к минимуму использование опросов и delay() и полагайтесь (сильно?) на прерывание таймера и ряд машин состояний...

Для меня совершенно не очевидно, почему код действует таким образом.

, 👍0

Обсуждение

Я не могу много сказать о вашей конкретной проблеме, так как у меня нет большого опыта работы с 1-wire. На самом деле, я всегда избегал его использования, потому что эти программные реализации обычно очень медленные и блокируют работу. Вот почему мне любопытно, чего вы пытаетесь достичь. Насколько я знаю, 1-wire требует очень точной синхронизации. Думаю, не хочется, чтобы что-то еще происходило, пока идет связь с 1-wire устройством. Думаю, чтение нескольких датчиков синхронно будет не тривиально, @Sim Son

да, они медленные и блокирующие (из-за использования функции задержки и подобных плохих методов (мы говорим о 500 мкс для импульса сброса и присутствия вместе, так что примерно 7500 тактовых циклов на 16 МГц uC…) это именно то, что я хочу чтобы обойти это, написав свой собственный код для задания и полагаясь на таймеры, где это возможно. Синхронное чтение нескольких датчиков не является обязательным и невозможным (если они находятся на одной шине, иначе это возможно, но в любом случае) я планирую прочитать их последовательно, как только я смогу заставить работать хотя бы один датчик.Сама проблема не связана с 1-wire ..., @der bender

что я именно пытаюсь заархивировать, так это измерение температуры для испытательного стенда двигателя. Мой руководитель выступал за однопроводные датчики температуры и дал мне Arduino Mega, чтобы все это работало. планируется сделать тестовую установку распределенной системой, чтобы на UC не происходило ничего другого, кроме считывания множества датчиков по одному, преобразования необработанных данных в натуральные единицы и отправки их на «главный» контроллер. . Может быть, какие-то статистические данные (средняя температура, dTemp/dTime и т.п.). Упомянутых выше 7500 циклов должно быть достаточно для математики., @der bender

Вот почему я не хочу тратить их впустую. реальная проблема заключается в том, что битовый шаблон на шине показывает больше (или меньше) битов, чем предполагается, и из кода я не могу понять, почему он ведет себя так, почему. хотя я думаю, что тот, кто когда-либо взглянет на код, должен легко увидеть, что я немного разбираюсь в написании кода, так что это не проблема..., @der bender

DS18B20 вам не датчик, он тормозит надо искать другой датчик!, @Carlmikael

@Carlmikael, я должен это использовать. это то, как установка, независимо от того, нравится вам это или нет. У меня есть наполовину работающий код для чтения и записи шины, и, насколько я могу протестировать его с неработающим базовым слоем, работающий код toplayer для чтения блокнота и, следовательно, температур. оставляйте полезные отзывы или не давайте их вообще. Кстати, динамика систем, связанных с температурой, низкая (я имею в виду действительно очень медленную), поэтому медленный датчик на медленной шине с медленным процессором абсолютно нормально, @der bender

Извините, не могу вам помочь., @Carlmikael


1 ответ


Лучший ответ:

0

Мне удалось найти ошибку и исправить ее. Я упустил из виду, что после импульса сброса мастер должен находиться в режиме RX не менее 480 мкс, несмотря ни на что, даже если импульс присутствия действительно возник и даже если его нарастающий край уже появился. Это рассогласование привело к отсутствующим битам, которые были исправлены путем отправки большего количества битов до сих пор (что, в свою очередь, привело к посторонним битам позже в передаче).

,