Нужна програмка на ...
 
Уведомления
Очистить все

Нужна програмка на Си для дермодатчика DS18B20

4 Посты
4 Пользователи
0 Likes
10.9 Тыс. Просмотры
e_diman
(@e_diman)
New Member
Присоединился: 15 лет назад
Сообщения: 2
Topic starter  

Здравствуйте, пишу под WinAVR. Может у кого есть СИшный исходник или хотя бы библиотека функций для работы с DS18B20. Буду очень признателен. ;)


Цитата
Мужик
(@yk)
Eminent Member
Присоединился: 15 лет назад
Сообщения: 39
 

Писал когда-то код для считывателя отпечатков пальце. На платку кроме самого считывателя поставил термодатчик 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');

}


ОтветитьЦитата
serge
(@serge)
Active Member
Присоединился: 15 лет назад
Сообщения: 6
 

Посмотрите вот эту ссылочку: http://www.elektroda.pl/rtvforum/topic657563.html
Header файл для работы с DS18B20 есть в архиве: https://radioded.ru/index.php?option=com_docman&task=doc_details&gid=62&Itemid=34


ОтветитьЦитата
новый
(@oi)
New Member
Присоединился: 14 лет назад
Сообщения: 3
 

Вроде в даташитах на данные термодатчики был ассемблерный код.


ОтветитьЦитата