Си библиотека для работы с 1-Wire устройствами

   Для работы с устройствами, поддерживающими 1-Wire протокол уже давным-давно написаны библиотеки. Поэтому нет смысла изобретать велосипед (лично я это уже делал, когда программировал  на ассемблере) и писать что-то свое. На сайте фирмы ATMEL есть замечательный application note AVR318: Dallas 1-Wire, в котором рассмотрены два варианта реализации 1-Wire протокола на микроконтроллерах AVR – программная и аппаратная. Программная реализация позволяет использовать однопроводный протокол на любых микроконтроллерах. Аппаратная – только на тех, на которых есть модуль UART. Аппаратной поддержки 1-Wire протокола «в чистом виде» микроконтроллеры AVR не имеют, однако, используя модуль UART неким хитрым образом, эту поддержку можно организовать. К application note идет проект. Я взял из этого проекта исходные файлы библиотеки, добавил, изменил несколько функций и написал файл compilers.h, чтобы можно было использовать эту либу с любым из трех компиляторов – IAR AVR, GNU GCC (WINAVR), CodeVision.

   Библиотека состоит из следующих файлов
 
OWISWBitFunction.h
OWISWBitFunction.c
OWIUARTBitFunction.c
 
OWIHighLevelFunction.h
OWIHighLevelFunction.c
 
OWIPolled.h
compilers.h
 
OWIdefs.h
OWIdevicespecific.h
OWIcrc.h
OWIcrc.c

Как подключить библиотеку к проекту

Процесс интеграции 1-Wire библиотеки с проектом заключается в следующем:

- переписываем файлы библиотеки в папку проекта

- подключаем сишные файлы к проекту
OWIHighFunction.c
OWISWBitFunction.c
OWIUARTBitFunction.c
OWIcrc.c

- добавляем заголовочные файлы в main.c
#include "OWIPolled.h"
#include "OWIHighLevelFunctions.h"
#include "OWIBitFunctions.h"
#include "common_files\OWIcrc.h"

- настраиваем файл OWIPolled.h

- выбираем реализацию OneWire интерфейса – программную 
       #define     OWI_SOFTWARE_DRIVER    
       //#define     OWI_UART_DRIVER

- задаем тактовую частоту микроконтроллера
       #define     CPU_FREQUENCY   16.000

- задаем порт, к которому подключена OneWire шина
       #define     OWI_PORT      PORTD   //!< 1-Wire PORT Data register.
       #define     OWI_PIN         PIND    //!< 1-Wire Input pin register.
       #define     OWI_DDR        DDRD    //!< 1-Wire Data direction register.

- в main.c задаем вывод, к которому подключена OneWire шина
      #define BUS   OWI_PIN_7
 
Для GCC проектов в makefile нужно будет добавить все сишные файлы. 
Например, так:
 
SRC = $(TARGET).c bcd.c lcd_lib.c OWISWBitFunctions.c OWIHighLevelFunctions.c OWIUARTBitFunctions.c  common_files/OWIcrc.c

Файлы

Application note AVR318: Dallas 1-Wire

Проекты проверялись в железе и никаких нареканий не вызывали. В Proteus`е я их тоже запустил, но не сразу. Оказывается по умолчанию датчикам DS18B20 присваиваются одинаковые адреса. При использовании нескольких датчиков адреса нужно подправить ручками.

Подробное описание проектов будет уже в новом году...

У вас недостаточно прав для комментирования.