Página 1 de 1

Valor negativo no LM92

MensagemEnviado: 23 Jan 2009 14:00
por rudsomlima
Não consigo ler temperaturas negativas com o LM92. Mostra um valor completamente diferente do correto. Já estou a vários dias tentando achar o que está errado e nada. Temperaturas positivas funcionam muito bem. Alguém consegue ver algum erro no código?

Código: Selecionar todos
#ifndef DAL_SCL
#define DAL_SCL PIN_C3
#define DAL_SDA PIN_C4
#endif

#use i2c(master, sda=DAL_SDA, scl=DAL_SCL, slow)

#define sensor1 0x90
#define sensor2 0x92

int16 temp=0;

void init_temp(int sensor) {
   output_high(DAL_SDA);
   output_high(DAL_SCL);
   i2c_start();
   i2c_write(sensor);
   i2c_write(0x01);
   i2c_write(0x00);
   i2c_stop();
}

int16 le_temperatura(int sensor) {
   int8 temph=0, templ=0;
   
   i2c_start();
   i2c_write(sensor);               
   i2c_write(0x00);
   delay_ms(500);                   //conforme datasheet, sao 500ms para conversao
   i2c_stop();
   i2c_start();
   i2c_write(sensor | 0x01);                  //w=1=leitura
   temph=i2c_read();
   templ=i2c_read(0);                //sem acknoledge
   i2c_stop();
   temp=make16(temph,templ);
   temp=temp>>3;
           
   if (bit_test(temph,4))   //se for temperatura negativa
      {
      temp=temp^0x0FFF;
      temp=(temp&0xFFF)+1;
      temp=temp*-10;
      temp=temp>>4;
      }
   else    //se for temperatura positiva
      {
      temp=temp*10;
      temp=temp>>4;
      }
     
   return(temp);
}

MensagemEnviado: 25 Jan 2009 19:39
por turuna
O valor lido parece ser o mesmo do positivo, apenas o bit de sinal passa para 1...........não seria o caso de apenas acrescentar negativo no visor se o sinal for 1 e da pra utilizar a mesma rotina de tratamento do positivo.

TURUNA

MensagemEnviado: 26 Jan 2009 10:32
por rudsomlima
É que é complemento de 2:

Imagem

MensagemEnviado: 26 Jan 2009 13:52
por RobL
No soft verifique se bit 13 = 1. Se sim faça um NOT do valor lido + 1 e leia como se fosse positivo, acrescentando o símbolo "-" no display.

Por exemplo -25* <=> 1E70h
NOT E70h = 18Fh //operação not
18Fh + 1h = 190h <=> +25*

O código basta ter a leitura positiva. Quando bit13 for zero le direto se for 1 faz a operação acima e le o valor com a mesma rotina de leitura valor positivo, acrescentando sinal negativo no display.

MensagemEnviado: 26 Jan 2009 23:08
por rudsomlima
Eu estava testando o bit 5 de "temph" e tava dando errado. Utilizei o teste ao bit 13 diretamente da variável "temp" e deu certo. Acho que o problema estava ai. Fiz ainda o NOT como RobL falou para o complemento de dois, o que também é o mesmo de fazer o XOR.

Resolvido! Obrigado pela ajuda de todos.