воскресенье, 28 декабря 2014 г.

Пример кода чтения данных датчика ds18b20

Пример кода чтения данных датчика ds18b20.
          В данном обзоре используется компилятор, со своей средой, “ WinAVR-20100110” для Cи  . Для образца, указана переменная “termo”, где скомпонован результат измерения температура, только целая часть. Вся программа оптимизирована под контроллер attiny13a, и хорошо просматривается в “ PROTEUS”.


/*
 * prog_example_ds18b20_attiny13a
 *
 * Created: 26.06.2014
 *  Author: alexander
 */
 //определяем частоту
#define F_CPU 4800000L
//подключаем заголовочные файлы
#include <avr/io.h>
#include <avr/signal.h>
#include <util/delay.h>
#include <stdio.h>
#include <stdlib.h>
#include <stdint.h>
//задаёмся прототипом функции, чтения данных датчика ds18b20
void temperature(void);
int8_t volatile termo; //переменная для данных температуры


int main(void)
{

                        
  while(1)
 {    
      temperature() ; //  функцию read ds18b20  
         
 }


 return 0;
}
 //-----------------------------------------------------------------------
 uint8_t therm_reset() //функция подготовки  ds18b20
{
uint8_t i;            // переменная
PORTB&=~(1<<3);      //устанавливаем порт PB3 как низкий уровень
 DDRB|=(1<<3);         //активируем   PB3 как выход
_delay_us(480);//--480  // ждём
DDRB&=~(1<<3);          //активируем   PB3 как вход
_delay_us(60);//--60
  i=(PINB & (1<<3));    //читаем
_delay_us(420);//--420

return i; // возвращаем "1" ok
}
//-------------------------------------------------------------------------
//запись бита
void therm_write_bit(uint8_t bit)
{
PORTB&=~(1<<3);
  DDRB|=(1<<3);
_delay_us(2);//---2
if(bit) DDRB&=~(1<<3);
_delay_us(60);//--60
 DDRB&=~(1<<3);
}
//----------------------------------------------------------------------
//запись байта
void therm_write_byte(uint8_t byte)
{
uint8_t i=8;
while(i--)
{
therm_write_bit(byte&1);
byte>>=1;
}
}          
 //-----------------------------------------------------------------------
 //чтение бита
uint8_t therm_read_bit(void)
{
uint8_t bit=0;
PORTB&=~(1<<3);
 DDRB|=(1<<3);
_delay_us(2);//2
DDRB&=~(1<<3);
_delay_us(14);//--14
if(PINB&(1<<3)) bit=1;
_delay_us(45);//--45
return bit;
}
//---------------------------------------------------------------------

//чтение байта
uint8_t therm_read_byte(void)
{
uint8_t i=8, n=0;
while(i--)
{
n>>=1;
n|=(therm_read_bit()<<7);
}
return n;
}
//----------------------------------------------------------------------
  void temperature(void)
  {
   asm("cli");
  
 uint8_t temperature[2];
 therm_reset();
 therm_write_byte(0xcc);
 therm_write_byte(0x44);
 while(!therm_read_bit());
 therm_reset();
 therm_write_byte(0xcc);
 therm_write_byte(0xbe);
 temperature[0]=therm_read_byte();
 temperature[1]=therm_read_byte();

  therm_reset();
 // обрабатываем полученные данные в читаемый вид 
  termo=temperature[0]>>4;
  termo|=(temperature[1]&0xf)<<4;
  }
 //---------------конец обработки ds18b20---------------- 

Здесь собраны все файлы для WinAVR, а также схема в “ PROTEUS”.
Здесь рабочий вариант устройства  для точного измерения температуры.       

     Мой контакт: avt48@yandex.ua