Библиотека работы с DS18B20 с возможностью работы нескольких датчиков на разных портах

Собственно библиотека реализует протокол 1-wire с возможностью подключить каждый датчик на свой порт.

Иногда просто необходимо подключить датчики к разным портам, например для упрощения определения места установки дачиков или по другим причинам, но стандартными средствами этого сделать не получится — во всяком случае в библиотеке компилятора CVAVR.

Для этого я разработал свою библиотеку, в которой также есть возможность разделить функции подачи команды на преобразование и считывание показаний, т.е. теперь можно послать команду на преобразование и не ожидая её окончания заниматься другими делами, а через время забрать результат или по флагу).

И так по библиотеке:

  • Подключение датчиков к разным выводам одного порта
  • Разделение функций записи и чтения результатов

В дальнейшем планирую доработать чтобы можно было подключать сеть датчиков на каждый вывод , например два на одном порту и два на другом, но пока это мне кажется не очень нужным функционалом).

Вот шапка библиотеки:

#define DS18B20_9BIT 0b00011111 #define DS18B20_10BIT 0b00111111 #define DS18B20_11BIT 0b01011111 #define DS18B20_12BIT 0b01111111

#define sei() #asm ("sei") #define cli() #asm ("cli")

#define ERROR_CRC 9999 //число возращаемое при ошибке crc #define ERROR_TMP -9999 //число возращаемое при ошибке чтения

volatile unsigned char pin=0; //глобальная переменная определяющая бит порта с которым работаем в данный момент

#define W1_PORT PORTB #define W1_DDR DDRB #define W1_PIN PINB #define W1_BIT pin

void init_w1_ds(signed char th, signed char tl, unsigned char raz); // init верхняя температура аварии, нижняя и разрядность датчика unsigned char w1_find();//функция определяет есть ли устройство на шине void w1_sendcmd(unsigned char cmd);//функция посылает команду на устройство 1-wire unsigned char w1_receive_byte();//функция читает один байт с устройства 1-wire int temp_18b20(unsigned char pinn);//функция преобразует полученные с датчика 18b20 данные в температуру (записать 0 для 1 датчика) unsigned char crc8(unsigned char d,unsigned char crc_s); //подсчет контрольной суммы void ds18b20_convert_t_rom(); // запустить конвертирование температуры int ds18b20_result_t_rom(); // прочитать результат конвертировани unsigned char w1_receive_bit(); // //функция читает один bit с устройства 1-wire void ds18b20_pin (unsigned char pin_ds); //определяет номер бита порта на котором весит шина и с которой в данный момент работают unsigned char ds18b20_convert_ok(unsigned char pin_ds); // возращает 0 если преобразование ещё незакончено и 1 если данные готовы для выдачи на шину float Ftemp_18b20(unsigned char pinn); //функция преобразует полученные с датчика 18b20 данные в температуру в формате float 0.0С 

Схема по которой проверялась библиотека:

Библиотека работы с DS18B20 с возможностью работы нескольких датчиков на разных портах: 2 комментария

  1. Пожалуй единственное решение которое вменяемо заработало 🙂 Единственный косяк, если вдруг какой то из датчиков замкнет на минус (ну мыши там провод перегрызут) то из-за того что присутствие датчика определяется только по наличию минуса на сигнальном проводе через 70мс то зависает все это дело при попытке считать температуру на функции ds18b20_convert_ok. Она никогда не отработает потому что датчика то нет. Решение в скриншоте. Добавил пару строк.

Добавить комментарий для Игорь Отменить ответ

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