Pagina 1 di 3

LM92 I2C problema lettura temperatura

MessaggioInviato: 7 dic 2011, 10:23
da Rana
Buon giorno,

Mi potete aiutare alla programmazione? Uso un LM92 (sensore di temperatura) e un Stamp che ho fatto con un PIC 16F690.

Devo leggere un signal I2C della temperatura del LM92 con un oscillioscopio.
Non capisco perche quando faccio read_i2c(); e guardo sul oscillioscopio e mi da sempre una data FF, anche se disconnetto il mio print LM92.

Scusa se c'è dei commenti in francese
Codice: Seleziona tutto
//---------------------------------------------------------------------
//                          Definitions & byte                 
//---------------------------------------------------------------------
#byte OSCCON = 0x8F

#define LM92_RD    0x91     // lm92 addresse de lecture
#define LM92_WR    0x90     // lm92 addresse d'écriture
#define LM92_TEMP_PTR  0x00 //adresse du registre pointer Read
//---------------------------------------------------------------------
//                           Variable Globale                       
//---------------------------------------------------------------------
int temp_msb , temp_lsb;
int val;

//---------------------------------------------------------------------
//                           Fonction                       
//---------------------------------------------------------------------

void LM92_RD_TEMP() 
{
    i2c_start();              // debut
    i2c_write(LM92_WR);       // adresse du LM92 en écriture
    i2c_write(LM92_TEMP_PTR); // adresse du registre pointer
    //i2c_start();              // re-start
    i2c_write(LM92_RD);       // adresse du LM92 en lecture
    temp_msb = i2c_read(1);   // stockage du msb temperature +ACK
    temp_lsb = i2c_read(0);   // stockage du Lsb sans ACK
    i2c_stop();               // fin
}

//---------------------------------------------------------------------
//                           Programme principal                     
//---------------------------------------------------------------------

void main()
{
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_128|RTCC_8_bit);      //32.7 ms overflow
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   enable_interrupts(GLOBAL); 

   bit_set(OSCCON,4);
   bit_set(OSCCON,5);
   bit_set(OSCCON,6);

   delay_ms(100);
   
   while(TRUE)
   { 
     LM92_RD_TEMP();
     
     val = temp_msb;
     val = val<<8;//prendre les premiers 8 bits
     val = val +(temp_lsb&0b11111000);//faire un masque sans utilisé les 3 premiers bits
     val = val>>3;// enlever les 3 premiers bits
     
     val = val * 0.0625;
   
   }
}


Re: LM92 I2C problema lettura temperatura

MessaggioInviato: 7 dic 2011, 10:56
da AjKDAP
Quando scolleghi il sensore dal bus I2C è normale ricevere in lettura il valore 0xFF perché la linea dati è normalmente alta e quindi tutti i bit letti sono settati ad 1.

Rana ha scritto:Non capisco perche quando faccio read_i2c();


Intendi dire che richiami la routine read_i2c(); da sola? se è così stai commettendo un errore.

oppure stai analizzando il comportamento di read_i2c(); all'interno della funzione LM92_RD_TEMP()?

Re: LM92 I2C problema lettura temperatura

MessaggioInviato: 7 dic 2011, 11:21
da Rana
Sto controlando al interno della mia funzione LM92_RD_TEMP() !
Al oscilloscoppio trovo
90W address 00~A 91~A FFA FF~A

Il mio problema e la programmazione.
Non riesco a leggere la temperatura su 16 bits e fare la convezione su 13 bits

Re: LM92 I2C problema lettura temperatura

MessaggioInviato: 7 dic 2011, 13:54
da AjKDAP
la funzione sembrerebbe ok, ma ho un po' di domande:

  • che compilatore/ambiente di sviluppo usi?
  • la funzione i2c_read(); l'hai creata tu? se si, puoi riportarla qui?
  • se i2c_start(); fa parte di una libreria del tuo compilatore, non vedo nessun pezzo di codice che inizializza il modulo i2c hardware, ed inoltre i pin collegati al bus i2c non vengono inizializzati, almeno nella porzione di codice che hai postato.
  • sei sicuro che i pin dell'indirizzamento del bus I2C (pin 6 e 7) siano entrambi collegati a massa?
  • potresti provare a leggere il Manufacturer's ID all'indirizzo 0x07 durante i test così conosci esattamente il valore che devi aspettarti in lettura (0x8001)

Re: LM92 I2C problema lettura temperatura

MessaggioInviato: 7 dic 2011, 14:11
da Rana
Uso CCS COMPILER come compilatore,
i2c_read() e i2c_start() sono nella libreria del compilatore.
Per i pin 6 e 7 sono sicurissimo li ho messo a la massa (GND).

Re: LM92 I2C problema lettura temperatura

MessaggioInviato: 7 dic 2011, 14:16
da Rana
come posso mettere un immagine della mia schema?

Re: LM92 I2C problema lettura temperatura

MessaggioInviato: 7 dic 2011, 14:19
da TardoFreak
Dovresti disegnarlo con FidoCadJ e QUI c'è scritto come fare. Eventualmente puoi caricare l' immagine come allegato dopo averla ridotta a 640x480 pixel.

Re: LM92 I2C problema lettura temperatura

MessaggioInviato: 7 dic 2011, 14:45
da Rana
potresti provare a leggere il Manufacturer's ID all'indirizzo 0x07 durante i test così conosci esattamente il valore che devi aspettarti in lettura (0x8001)


Non capisco troppo!

In i2c ho fatto solo i2c_write();

Per leggere ho solo capito che devo utilisare i2c_read();

Che vuole dire Manufacturer's ID ? Serve a che cosa?
Prima devo scriverlo come il POINTER REGISTER?

Codice: Seleziona tutto
void LM92_RD_TEMP() 
{
    i2c_start();             
    i2c_write(LM92_WR);       
    i2c_write(0b00000111);   // POINTER REGISTER
   //i2c_start();             
    i2c_write(LM92_RD);       
    temp_msb = i2c_read(1);   
    temp_lsb = i2c_read(0);   
    i2c_stop();               
}

Re: LM92 I2C problema lettura temperatura

MessaggioInviato: 7 dic 2011, 14:46
da Rana
(0x8001)

Da dove esce quest indirizzo ?

Re: LM92 I2C problema lettura temperatura

MessaggioInviato: 7 dic 2011, 14:50
da AjKDAP
Non conosco il CCS, comunque come immaginavo, guardando un po' di esempi in rete ho notato questo:

Codice: Seleziona tutto
#use i2c(SLAVE,sda=PIN_C4,scl=PIN_C3,address=0xA0, force_hw)


ovviamente non ti sto consigliando di copiare pari pari quello che ho scritto sopra, ma di leggerti il manuale del compilatore e capire bene come funziona e come deve essere utilizzata la libreria per l'I2C.

Non conoscendo il CCS non posso aiutarti molto.

Rana ha scritto:Da dove esce quest indirizzo ?


Non e' un indirizzo, ma il numero identificativo del produttore. Leggendo l'indirizzo 0x07 dovresti leggere sempre due byte uguali: 0x80 e 0x01.

Ciao