MCP9800 12bit I2C sıcaklık sensörü problemi

Başlatan SiVRiSiNEK, 27 Kasım 2011, 13:18:58

SiVRiSiNEK

Merhaba MCP9800 ile I2C haberleşmede şöyle bir problem yaşıyorum

Aşağıdaki kod ile MCP9800 in Temperature hysterisis registerine 0xAA ve 0x55 değerlerini yazıp sonra okuyup displayde gösterebiliyorum, demekki iletişim ile ilgili bir sıkıntı yok



#include <18F452.h>
#FUSES HS,PUT,NOBROWNOUT,NOWDT
#use delay(clock=8000000)
#use i2c(Master,fast,sda=PIN_C4,scl=PIN_C3)

int a,b;

void main()
{
  while(true)
  {
    i2c_start();
    i2c_write(0x90);
    i2c_write(0b00000010); // configuration register select 
    i2c_write(0x55);
    i2c_write(0xaa);
    i2c_start();
    i2c_write(0x91);
    a=i2c_read(1);
    b=i2c_read(0);
    i2c_stop();
    
    output_b(a);
    output_d(b);

    delay_ms(1000);
  }
}


fakat aşağıdaki kod ile Ambient temparature registerlerini okumak istediğimde sürekli 0x00 değerlerini okuyorum proteusta simülasyon esnasında herhangi bir hata yok, sebebini bulamadım MCP9801/9802/9803 hepsini denedim aynı



#include <18F452.h>
#FUSES HS,PUT,NOBROWNOUT,NOWDT
#use delay(clock=8000000)
#use i2c(Master,fast,sda=PIN_C4,scl=PIN_C3)

int a,b;

void main()
{
  while(true)
  {
    i2c_start();
    i2c_write(0x90);
    i2c_write(0b00000000); // ambient temperature register select 
    i2c_start();
    i2c_write(0x91);
    a=i2c_read(1);
    b=i2c_read(0);
    i2c_stop();
    
    output_b(a);
    output_d(b);

    delay_ms(1000);
  }
}

salih_arel

Merhaba Dostum. Bende buna benzer birşey yaptım belki işine yarar.

[IMG]http://img6.ressim.net/out.php/t5833811_sicak-jpg[/img]


kaynak kodlarıda burda:

#include <18F452.h>
#fuses HS,NOWDT,NOPROTECT,NOLVP
#use delay(clock=4000000)
#define FAST_GLCD    // Try commenting this out to see the differences
#include <HDM64GS12.c>
#include <graphics.c>
#define GLCD_WIDTH   128
#include <stdlib.h>
#include <stdio.h>
#include <math.h>

#use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
#use I2C(master, SCL=PIN_C3, SDA=PIN_C4)

char data;
int ack;

char ctrl;
long int fahr,celc;
char out[20];
char out2[20];

void main(){

glcd_init(on);
while (TRUE)
    {     
   printf("Okumayi Baslatmak icin Enter Basiniz \r\n\n");
   ctrl=getc();
   delay_ms(500);
      if(ctrl==13)
        {
        printf("Olcum Yapiliyor\r\n");
        i2c_start();
        ack = i2c_write(0x9a);
        ack = i2c_write(0x00);

        /* send start again */
        i2c_start();
        ack = i2c_write(0x9b);
        data = i2c_read(0);
        i2c_stop();

        // Convert the A/D value to fahrenheit
       
        celc = ((long)data);
        fahr = celc*9/5+32;
        sprintf(out,"Celcius = %ld C",(long)data);
        sprintf(out2,"Fahrenayt = %ld F",(long)fahr);
        glcd_fillScreen (0);       
        glcd_rect(0,0, 127, 63, NO, ON);           // dis cerceve ciz
         glcd_rect(1,1, 126, 62, NO, ON);           // dis cerceve ciz
         glcd_text57(5,36, out, 1, ON);
         glcd_text57(5,25, out2, 1, ON);
         glcd_update();
       
        printf ("Temperature  Celciosu   : %ld\r\n",celc); 
        printf ("Temperature  Fahrenheit : %ld\r\n",fahr);   
        printf("\r\n");
        delay_ms(200);
        }
    }
}

salih_arel

bu projede seri porttan bilgi okunuyor. aynı şekilde I2C ile sıcaklık bilgisi. enter tuşuna basıldığında hem pcde hem glcd ekranda sıcaklık bilgisi gösteriliyor.