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

по МК и не только
Ответить
e_diman
Сообщения: 1
Зарегистрирован: 23 дек 2008, 13:09

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

Сообщение e_diman » 23 дек 2008, 13:22

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

Аватара пользователя
Мужик
Сообщения: 39
Зарегистрирован: 15 ноя 2008, 21:36

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

Сообщение Мужик » 23 дек 2008, 13:44

Писал когда-то код для считывателя отпечатков пальце. На платку кроме самого считывателя поставил термодатчик 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');
			
		}
Вложения
FingerPrint.rar
Исходник считывателя отпечатков пальцев на AT77C104, НО в нём есть функции для работы с DS18B20
(71.64 КБ) 1279 скачиваний

Аватара пользователя
alex
Сообщения: 1
Зарегистрирован: 24 дек 2008, 20:37

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

Сообщение alex » 24 дек 2008, 20:45

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

новый
Сообщения: 3
Зарегистрирован: 08 окт 2009, 19:49

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

Сообщение новый » 08 окт 2009, 20:02

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

Ответить

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость