Страница 1 из 1

Термостат

Добавлено: Пн апр 09, 2012 22:15:52
master3763
Привет всем котам ! Помогите пжалуйста разобратся с термостатом. Хочу собрать простой термостат с двумя лампочками. Одна бурет загоратся когда температура будет меньше 18 а другая больше 28.

После кампиляции и визуализации в proteus есть сигнал на D.0 (+5V). Он некогда не гаснет при любом измененее температуры датчика.

Делаю так:

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

#include <mega8.h>
#include <delay.h>
#asm
   .equ __w1_port=0x18 ;PORTB
   .equ __w1_bit=0
#endasm
#include <1wire.h>

#include <ds18b20.h>
void main(void)
{

  unsigned char devices;
  int temp;
  devices = w1_init();
 
PORTD = 0x00; //Выставляем все выходы порта D на 0, то есть, выключаем весь порт D
DDRD = 0xFF;
while (1)
{           
            
      temp=ds18b20_temperature(0);  //читаем температуру                      
      
          if (temp>1000)                      //если датчик выдаёт больше 1000
            {             
                temp=4096-temp;            //отнимаем от данных 4096
                temp=-temp;                //и ставим знак "минус"
             }

       if (temp<18)                          // устанавливаем нижней порог
         PORTD.0 = 1;    
         else PORTD.0=0;
       if (temp>28)                         // установим верхний порог
          PORTD.1=1;
       else PORTD.1=0;
     
        }    

} 
В чем проблема ? Чего я недоучел ?

Re: Термостат

Добавлено: Пн апр 09, 2012 22:34:36
pyzhman
В хелп не заглядывали?
unsigned char ds18b20_init(unsigned char *addr,signed char temp_low,signed char temp_high,usigned char resolution)


this function sets the low (temp_low) and high (temp_high) temperature alarms and specifies the temperature measurement resolution of the DS18B20.
The resolution argument may take the value of one of the following macros defined in the ds18b20.h header file:


DS18B20_9BIT_RES for 9 bit tempearture measurement resolution (0.5°C)
DS18B20_10BIT_RES for 10 bit tempearture measurement resolution (0.25°C)
DS18B20_11BIT_RES for 11 bit tempearture measurement resolution (0.125°C)
DS18B20_12BIT_RES for 12 bit tempearture measurement resolution (0.0625°C)

Re: Термостат

Добавлено: Пн апр 09, 2012 22:44:46
master3763
Заглядывал но не разобрался. С Английским не дружу..

Объясните пожалуйста, что все это значит ? Что тут к чему ?

Re: Термостат

Добавлено: Вт апр 10, 2012 08:07:45
pyzhman
Прежде чем читать данные, надо DS запараметрировать.

Re: Термостат

Добавлено: Вт апр 10, 2012 09:28:52
s_black
Здесь есть пример работы с DS18b20.

Re: Термостат

Добавлено: Вт апр 10, 2012 10:38:19
master3763
КАК пораметрировать DS18b20 ?

Re: Термостат

Добавлено: Вт апр 10, 2012 12:03:43
mr_smit
master3763 писал(а):КАК параметрировать DS18b20 ?
наверное:

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

ds18b20_init( 0, 0, 60, DS18B20_10BIT_RES )
:)

Re: Термостат

Добавлено: Вт апр 10, 2012 13:20:33
master3763
А причем тут " ds18b20_init( 0, 0, 60, DS18B20_10BIT_RES ) " ??

Это же переключения термометра в 10 битный режим..

Re: Термостат

Добавлено: Вт апр 10, 2012 14:24:46
master3763
Изменил немного код :

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

#include <mega8.h>                         
#include <delay.h>                        
#asm                                                     
                .equ __w1_port=0x18; PORTB
                .equ __w1_bit=0
#endasm                           

#include <1wire.h>                        
#include <ds18b20.h>                     
#include <stdio.h>                        

void main(void)                           
{
unsigned char devices;         
int temp;                                            
                              
devices=w1_init();                         
while(devices>0)                                 
          {
                  temp=ds18b20_temperature(0); 
                  if (temp>1000)
                  {                          
                         temp=4096-temp;                        
                         temp=-temp;                            
                  }   
                  
                  //if
                          
                  if (temp<18)                          
                         { PORTD.0 = 1; }  
                         else
                         { PORTD.0 = 0; }       
                   
                  if (temp>28)                         
                        { PORTD.1 = 1; }
                        else 
                        { PORTD.1 = 0; }
                
            // end if
                  
          };
}
Сейчас вообще не один индикатор не загорается. :( Блин что я не так делаю ? Вроде все правильно сейчас, нет и синтасических ошибок..

Re: Термостат

Добавлено: Вт апр 10, 2012 16:46:37
Аlex
Трудно судить по строкам, которые компилятор разворачивает в неизвестно что.
Пишите свои функции для работы с датчиком, тогда проблемы все уйдут.
А вот это

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

                  if (temp>1000)
                  {                          
                         temp=4096-temp;                        
                         temp=-temp;                            
                  }   
Что такое ?
Не знаю что там возвращает ds18b20_temperature, но сам датчик возвращает нормальное и правильное отрицательное значение.
Кстати, у Вас, мне кажется, порты не проинициализированы.

Re: Термостат

Добавлено: Вт апр 10, 2012 18:46:30
Dr. Alex
При работе с датчиком отключите прерывания!!!!!!!!!

Re: Термостат

Добавлено: Вт апр 10, 2012 19:19:03
master3763
Так по идее определяется температура в градусах 0C . Если что не так прошу исправить меня.

Как отключить прерывания ? В коде накаких прерываний нет !

Re: Термостат

Добавлено: Вт апр 10, 2012 20:46:41
phanis

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

#include <mega8.h>                     
#include <1wire.h>                  
#include <ds18b20.h>                     
#asm                                                     
   .equ __w1_port=0x18; PORTB
   .equ __w1_bit=0
#endasm   
void main(void) {int temp; DDRD = 0x03;
while(1){  if (w1_init()) { temp=ds18b20_temperature(0);            
       if (temp>1000)  {temp=4096-temp; temp=-temp; }                                         
       if (temp<18)  PORTD.0 = 1;else PORTD.0 = 0;                      
       if (temp>28)  PORTD.1 = 1;else PORTD.1 = 0; }}}     
Тактовая частота в проекте и протеусе должна быть выбрана одна и та же .

Re: Термостат

Добавлено: Вт апр 10, 2012 21:20:18
master3763
Компиляция проходит успешно но в proteus не работает..

Выставляю файлы проекта. Посмотрите пожалуйста что я не так накрутил.. ?

Re: Термостат

Добавлено: Вт апр 10, 2012 21:30:55
master3763
Спасибо большое ! Получилось !
Я в протеусе частоту не туже самую ставил что в CodeVision . :)