Atmega8, две кнопки, и датчик температуры DS18B20

Обсуждаем контроллеры компании Atmel.
Ответить
Родился
Сообщения: 3
Зарегистрирован: Вт май 27, 2014 11:00:52

Сообщение Alchemist »

В программировании микроконтроллеров недавно. Поставил задачу построить что-то вроде климат-контроля. Существует датчик DS18B2, по которому считывается информация о температуре. Если температура ниже установленной, то включается система охлаждения (в упрощенном варианте Диод), в противном случае включается система обогрева (в упрощенном варианте Диод). Значение промежуточной температуры, по которой происходит условие включения систем охлаждения и обогрева (Диоды) устанавливается программно, и затем изменяется при помощи 2 кнопок. Использовал контроллер Atmega8. В коде есть комментарии, которыми я отключил показ температуры на дисплее. Симулирую все в PROTEUS. Проект прилагается. Подскажите где ошибки.

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

#include <math.h>
#include <io.h>
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <1wire.h>            

//////////////////////////////////////////////
//Дисплей на порт D                         //
//#asm                                        //
//    .equ __lcd_port=0x12 ;PORTD             //
//#endasm                                     //
//#include <lcd.h>                            //
//////////////////////////////////////////////
//Датчик подключен к порту B, бит номер 2   //
#asm                                        //
   .equ __w1_port=0x18 ;PORTB               //
   .equ __w1_bit=2                          //
#endasm                                     //
#include <ds18b20.h>                        //
//////////////////////////////////////////////

//char lcd_buf[17];
int dvoich(int x1)   //функция перевода десятичного числа в двоичное 
{
    int i,b;
    long  c=0;
     for(i=0; x1>0; i++) 
     {
      b=x1%2;
      x1=(x1-b)/2;
      c+=b*pow(10,i); 
      return c;
     }
}
void main() 
{
int a=20;
float temper;   
DDRC=0x01;
//lcd_init(16);   
w1_init();      //поиска датчика
ds18b20_init(0,-20,50,DS18B20_12BIT_RES);    //настройка датчика(id, -, +, режим работы)                
while (1) 
        while (PINB.3==1) 
        {
    }
         if (PINB.3==0)
        {
     a=a++;
     }
        while (PINB.3==0)
        {
    }
        while (PINB.4==1)
        {
        } 
         if (PINB.4==0)
        {
     a=a--;
     }
        while (PINB.4==1)
        {
    }    
    {
     temper=ds18b20_temperature(0); 
     dvoich(a);
       if (temper<a) {
          PORTC.0=1; }
        
       else {
          PORTC.0=0; }
       
//     sprintf(lcd_buf,"t=%.1f\xdfC",temper);    
//     lcd_clear();                
//     lcd_puts(lcd_buf);        
//     delay_ms(1500);
    };
}
Вложения
ds18b20.rar
(29.92 КБ) 125 скачиваний
Реклама
Вымогатель припоя
Сообщения: 602
Зарегистрирован: Ср янв 06, 2010 10:01:46

Сообщение metan »

Во-первых, со скобками и отступами черте-что - скачут аж в глазах рябит, расставлены как-то экзотически, типа: Почему после while (1) нету скобки, открывающей блок?
Почему мы циклимся, и нифига не меряем, пока не нажаты кнопки?
Моя рекомендация - яростно читать тему "Помогите опросить кнопку" http://radiokot.ru/forum/viewtopic.php?f=61&t=79801
И еще рекомендую задуматься над тем фактом, что прибор с такой программой настраивать будет почти невозможно еще по одной причине -
он большую часть времени будет висеть в функции чтения температуры ( temper=ds18b20_temperature(0);) , и кнопки работать в это время не будут.
Реклама
Родился
Сообщения: 3
Зарегистрирован: Вт май 27, 2014 11:00:52

Сообщение Alchemist »

metan писал(а):Во-первых, со скобками и отступами черте-что - скачут аж в глазах рябит, расставлены как-то экзотически
Тут я извращенец, исправлюсь)
metan писал(а):Почему после while (1) нету скобки, открывающей блок?
Глупая ошибка - исправил.
metan писал(а):Почему мы циклимся, и нифига не меряем, пока не нажаты кнопки?
Не меряем в смысле температуры или что-то другое. Не понял.
metan писал(а):И еще рекомендую задуматься над тем фактом, что прибор с такой программой настраивать будет почти невозможно еще по одной причине - он большую часть времени будет висеть в функции чтения температуры ( temper=ds18b20_temperature(0);) , и кнопки работать в это время не будут.
Если он будет всегда висеть в функции чтения температуры, то как тогда можно сделать? Проверять температуру через определенный промежуток времени?
Родился
Сообщения: 3
Зарегистрирован: Вт май 27, 2014 11:00:52

Сообщение Alchemist »

Посмотрел, подумал... Действительно программа застревает в этом огромном количестве while. Поправил так.

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

#include <math.h>
#include <io.h>
#include <mega8.h>
#include <delay.h>
#include <stdio.h>
#include <1wire.h>            

//Датчик подключен к порту B, бит номер 2  
#asm                                        
   .equ __w1_port=0x18 ;PORTB               
   .equ __w1_bit=2                          
#endasm                                     
#include <ds18b20.h>                        


int dvoich(int x1) {
    int i,b;
    long  c=0;
    for(i=0; x1>0; i++) {
      b=x1%2;
      x1=(x1-b)/2;
      c+=b*pow(10,i); 
      return c; } }

void main() {
    int a=20;
    float temper;   
    DDRC=0x01;   
    w1_init();      //поиск датчика
    ds18b20_init(0,-20,50,DS18B20_12BIT_RES);    //настройка датчика(id, -, +, режим работы)                

while (1) {        
       temper=ds18b20_temperature(0);
         if (PINB.3==0) {
             a=a++;
             delay_ms(2000); }
            
         if (PINB.4==0) {
             a=a--;
             delay_ms(2000);}  
       dvoich(a);
         if (temper<a) {
           PORTC.0=1; }
         
         else {
           PORTC.0=0; };
          };
}
P.S. - поправил сейчас что смог, и иду читать тему, ссылку на которую мне скинули.
Реклама
Эиком - электронные компоненты и радиодетали
Ответить

Вернуться в «AVR»