Помогите разобратся с терморегулятором на ds18b20

Обсуждаем цифровые устройства...
Ответить
Родился
Сообщения: 6
Зарегистрирован: Ср ноя 14, 2012 00:31:24

Сообщение Bagum_Bagum »

Нужно организовать сравнение температуры, передаваемой с датчика

Код: Выделить всё

#include <mega8.h>		//библиотека ввода\вывода 
#include <delay.h>		//библиотека задержки 
#asm				//сообщаем куда подключен датчик 
        .equ __w1_port=0x15; PORTC 
        .equ __w1_bit=3 
#endasm                  
#asm				//сообщаем куда подключен экран 
	.equ __lcd_port=0x18 
#endasm 
#include <lcd.h>		//библиотека для LCD 
#include <1wire.h>		//библиотека работы с 1Wire 
#include <ds18b20.h>		//библиотека для работы с датчиком ds18b20 
#include <stdio.h>		//стандартная библиотека
char lcd_buffer[33];		//массив с данными для экрана

void main(void)                  
{
unsigned char devices;		//переменная в которой количество присоеденённых датчиков
int temp;
int izm;
DDRD = 0x01;
PORTD.0=0;   
ADCSRA |= (1 << ADEN) //Включение АЦП
|(1 << ADPS1)|(1 << ADPS0); // предделитель преобразователя на 8
ADMUX |= (0 << REFS1)|(0 << REFS0) // внешний ИОН
|(0 << MUX0)|(0 << MUX1)|(0 << MUX2)|(0 << MUX3); // вход PC0
lcd_init(16);			//инициализация LCD, и говорим что он на 16 символов
devices=w1_init();		//ищем датчики 
while(devices>0)		//бесконечный цикл, если датчик подключен 
	{
    unsigned int u; 
	temp=ds18b20_temperature(0);	//читаем температуру
    PORTD.0=0;  
	if (temp>1000)			//если датчик выдает больше 1000
	    {                
             	temp=4096-temp;		//отнимаем от данных 4096 
		temp=-temp;		//и ставим знак "минус" 
          	} 
	sprintf(lcd_buffer,"t=%i.%u\xdfC",temp,temp%1);	//записываем массив для экрана 
	lcd_clear();						//чистим дисплей перед выводом 
	lcd_puts(lcd_buffer);					//выводим массив на LCD 
    ADCSRA |= (1 << ADSC);    //Начинаем преобразование
    while ((ADCSRA&(1 << ADIF))== 0); //Ждем флага окончания преобразования   
    u = (ADCL|ADCH << 8);  // Считываем  ADC
    if (u > 128)                 //0.625V
      {izm = 0x140;
        while(izm!=temp)
        {
        PORTD.0=1;
        }
        }         
    if (u > 256)                  //1.25V
      {izm = 0x150;
       while(izm!=temp)
        {
        PORTD.0=1;
        }
        }     
    if (u > 384)                  //1.875V 
      {izm = 0x160;
         while(izm!=temp)
          {
          PORTD.0=1;
          }
        }    
    if (u > 512)                  //2.5V
      {izm = 0x170;
            while(izm!=temp)
            {
            PORTD.0=1;
            }
        }    
    if (u > 640)                  //3.125V
      {izm = 0x180;
            while(izm!=temp)
            {
             PORTD.0=1;
            }
        }    
    if (u > 768)                  //3.75V
      {izm = 0x190;
        while(izm!=temp)
        {
        PORTD.0=1;
        }
        }    
    if (u > 896)                  //4.375V
      {izm = 0x1B0;
        while(izm!=temp)
        {
        PORTD.0=1;
        }
        }    
    if (u > 1020)                 //5V
      {izm = 0x1C0;
        while(izm!=temp)
        {
        PORTD.0=1;
        }
        }    
    delay_ms(500);
    }
}
не могу понять в какой системе счисления записывается temp

вроде как датчик передает шестнадцатеричный код, но сравнения с izm не происходит получается
Реклама
Вымогатель припоя
Сообщения: 536
Зарегистрирован: Пт ноя 05, 2010 12:53:36
Откуда: Беларусь Витебск

Сообщение Minor/2 »

Долго не всматривался,но и так понятно,что оно (сравнение) не пройдет...
Функция ds18b20_temperature(0) "отдаёт" Вам температуру в градусах Цельсия (
float ds18b20_temperature(unsigned char *addr)
this function returns the temperature of the DS18B20 sensor with the ROM code stored in an array of 8 bytes located at address addr.
The temperature is measured in °C. In case of error the function returns the value -9999.
If only one DS18B20 sensor is used, no ROM code array is necessary and the pointer addr must be NULL (0).

), а Вы пытаетесь сравнить её с результатом АЦПреобразования :

u = (ADCL|ADCH <<...); // Считываем ADC
if (u > 128) //0.625V
{izm = 0x140; // izm Вы присвоили значение в 320 градусов (0x140==320)
while(izm!=temp) // вечный цикл,учитывая данные из доки на DS18B20:
{ // Measures temperatures from -55°C to+125°C
PORTD.0=1;
}
}
Контактная информация:
Реклама
Ответить

Вернуться в «Цифровая техника»