Здравствуйте, пишу под WinAVR. Может у кого есть СИшный исходник или хотя бы библиотека функций для работы с DS18B20. Буду очень признателен. ;)
Писал когда-то код для считывателя отпечатков пальце. На платку кроме самого считывателя поставил термодатчик DS18B20. В програме реализовано считывание температуры оп COM порту. Скорость UART и частота тактирования прописаны в исходнике, изначально проект написан под ATmega64, так что придётся немного поработать - подчистить код, по коментам там разобраться можно. Приём температуры по UART начинается после получения буквы "t" с компьютера. Сам СИшный исходник под WinAVR с makefile в прикреплённом архиве. Вот некоторые из функций:
char ds18b20_reset(void) {
char flag;
DQ_0;
delay_us(480); // 480us - Импульс сброса
DQ_1;
delay_us(80); // 80uS
if((PINB & 0b10000000) == 0b10000000) {
flag=FAIL; // если не подсажена шина то датчик не подключен
usart_transmit('D');
usart_transmit('S');
usart_transmit(' ');
usart_transmit('n');
usart_transmit('o');
usart_transmit('t');
usart_transmit(' ');
usart_transmit('c');
usart_transmit('o');
usart_transmit('n');
usart_transmit('n');
usart_transmit('e');
usart_transmit('c');
usart_transmit('t');
usart_transmit('e');
usart_transmit('d');
usart_transmit('!');
}
else {
flag=OK; // шина подсажена - датчик подключён
}
delay_us(480);
return flag;
}
void ds18b20_write(unsigned char data) {
unsigned char count;
for(count=0; count<8; count++) {
DQ_0;
delay_us(2); // 2us - синхроимпульс
if ((data & 0x01) == 0x01) DQ_1;
else DQ_0;
data = data >>1;
delay_us(70); // 70us - Time Slot
DQ_1; // отпустили шину
delay_us(2); // 2us - до след. бита (recovery time)
}
}
unsigned char ds18b20_read(void) {
unsigned char count, data=0x00;
for(count=0; count<8; count++) {
DQ_0;
delay_us(2);
DQ_1; // release bus
delay_us(8);
data = data >>1; //logic shift right
if ((PINB & 0b10000000) == 0b10000000){
data |= 0b10000000;
}
delay_us(70);
}
return data;
}
void ds_convert(void){
if (ds18b20_reset() == OK) {
ds18b20_write(0xCC); // Skip ROM command
ds18b20_write(0x44); // Start Convert
}
}
unsigned int ds_read_temperature(void){ ///!!!!!!
unsigned int value = OK;
if(ds18b20_reset() == OK) {
ds18b20_write(0xCC); // Skip ROM command
ds18b20_write(0xBE); // Read Scratchpad
ds[0] = ds18b20_read();
ds[1] = ds18b20_read();
}
return value;
}
void delay_ms(int ms){
int t;
for(t=0; t<ms; t++){
_delay_ms(1);
}
}
void delay_us(int us){
int t;
for(t=0; t<us; t++){
_delay_us(1);
}
}
Вот функции вызова и обработки данных с датчика в сыром виде (просто копирую из своего исходника):
{
cli(); // disable interrupts
ds_convert();
LED_ON;
delay_ms(760);
temp = ds_read_temperature();
if (temp == OK){ // опрос DS18B20 успешен
temp = ((ds[0]>>4) & 0x0F) | (( ds[1]<<4) & 0xF0);
part = ds[0]& 0x0F;
while (temp>0){ // BCD Convertion
if (temp >= 100){
temp = temp-100;
d100++;
}
while (temp >= 10){
temp = temp - 10;
d10++;
}
while (temp > 0){
temp--;
d++;
}
}
if (d100 != 48) usart_transmit(d100);
usart_transmit(d10);
usart_transmit(d);
if ( ((part >> 3) & 0x01) == 1){
usart_transmit(',');
usart_transmit('5');
}
Посмотрите вот эту ссылочку: http://www.elektroda.pl/rtvforum/topic657563.html
Header файл для работы с DS18B20 есть в архиве: https://radioded.ru/index.php?option=com_docman&task=doc_details&gid=62&Itemid=34
Вроде в даташитах на данные термодатчики был ассемблерный код.