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

по МК и не только

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

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

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

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 КБ) Скачиваний: 1251
Аватара пользователя
Мужик
 
Сообщения: 39
Зарегистрирован: 15 ноя 2008, 21:36

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
Аватара пользователя
alex
 
Сообщения: 1
Зарегистрирован: 24 дек 2008, 20:37

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

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

Вроде в даташитах на данные термодатчики был ассемблерный код.
новый
 
Сообщения: 3
Зарегистрирован: 08 окт 2009, 19:49


Вернуться в Общие вопросы



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

Зарегистрированные пользователи: Yahoo [Bot]

cron