I2C Protokolü ile DS1621 Dijital Termosmetre

Başlatan ovaliiismail, 24 Mart 2018, 19:15:14

ovaliiismail

Merhaba arkadaşlar.I2C protokolünü kullanarak ds1621 ile dijital termosmetre tasarladım.Ama iki sorunla karşı karşıyayım.Birincisi buçuklu derecelerde ortam sıcaklığı TH'dan küçük olsa bile Tout lojik 1 oluyor.İkincisi TH veya TL buçuklu ayarlarsam Tout çıkışı hep lojik 0 oluyor.
#include <16f877.h>

#fuses XT,NOWDT,NOPROTECT,NOBROWNOUT,NOLVP,NOPUT,NOWRT,NODEBUG,NOCPD

#use delay (clock=4000000)

#define use_portb_lcd TRUE

#include <lcd.c>

#use i2c(master,sda=pin_c1,scl=pin_c0,slow=100000)

float ds1621_oku(void)
{
   float th,tl;
   float sicaklik;
   
   i2c_start();
   i2c_write(0x90);
   
   i2c_write(0x22);
   i2c_stop();
   i2c_start();
   i2c_write(0x90);
   
   i2c_write(0xee);
   i2c_stop();
   
   i2c_start();
   i2c_write(0x90);
   i2c_write(0xaa);
   i2c_start();
   i2c_write(0x91);
   
   th=i2c_read(0);
   
   i2c_start();
   i2c_write(0x91);
   
   tl=i2c_read(0);
   
   i2c_stop();
   
   if(tl==0x80)
   {
      sicaklik=th+0.5;
   }
   else
   {
      sicaklik=th;
   }
   
   delay_ms(11);
   return(sicaklik);
}

void yaz_ds1621_th_tl(byte th_h, byte th_l, byte tl_h, byte tl_l)
{
   if(th_l==0x05)
   {
      th_l=0x80;
   }
   if(tl_l==0x05)
   {
      tl_l=0x80;
   }
   
   i2c_start();
   i2c_write(0x90);
   
   i2c_write(0xa1);
   i2c_write(th_h);
   
   i2c_write(th_l);
   
   i2c_stop();
   delay_ms(11);
   
   i2c_start();
   i2c_write(0x90);
   i2c_write(0xa2);
   i2c_write(tl_h);
   
   i2c_write(tl_l);
   
   i2c_stop();
   delay_ms(11);
}

void yaz_ds1621_ayar (byte deger)
{
   i2c_start();
   i2c_write(0x90);
   i2c_write(0xac);
   
   i2c_write(deger);
   i2c_stop();
   delay_ms(11);
}

byte oku_ds1621_ayar(void)
{
   byte con;
   
   i2c_start();
   i2c_write(0x90);
   
   i2c_write(0xac);
   
   i2c_start();
   i2c_write(0x91);
   con=i2c_read(0);
   i2c_stop();
   return(con);
   
}

char sonuc[17];
byte ayar;

void main()
{
   setup_psp(PSP_DISABLED);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_OFF);
   setup_CCP1(CCP_OFF);
   setup_CCP2(CCP_OFF);
   
   lcd_init();
   delay_ms(5);
   
   ayar=oku_ds1621_ayar();
   
   bit_set(ayar,1);
   
   bit_clear(ayar,0);
   
   yaz_ds1621_ayar(ayar);
   
   yaz_ds1621_th_tl(24,0,21,0);
   
   while(1)
   {
      sprintf(sonuc,"\fSicaklik=%0.1fC",ds1621_oku());
      printf(lcd_putc,"%s",sonuc);
      delay_ms(500);
   }

}