interfaz DS1621 con PIC18F26J50

0

Aquí tengo un problema relacionado con el termómetro digital DS1621 que se interconecta con el controlador PIC18F26J50.

A continuación, puede ver mi código y este código que compilo en MPLAB X v.1.4 IDE con compilador C18:

 unsigned char i2c_read(void)
 {
    char buf[20];
    unsigned char i,j;
    j=0;
    i=DATA;
    for(i=0;i<8;i++)
    {
        j<<=1;
        CLOCK = HIGH;
        j|=DATA;
        delay_ms(100);
        CLOCK = LOW;
    }
    //////////////////////
    **sprintf(buf,"%d",j);    // 255
    transmit_str1(buf); //UART transmit string**
    /////////////////////
    return buf;//return j;
  }


main()
{      
while(1)
{
    i2c_start();
    i2c_write(0x90);
    i2c_write(0xAC);
    i2c_write(0x02);
    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);     
    ch = i2c_read();
    i2c_stop();
 ///////////////////
     temperature = 0;
     convert(ch); //convert binary to Decimal

     if(flag==FALSE_)
     {
         flag = TRUE_;
         tmp=temperature;
         //itoa(tmp,buffer);
         sprintf(tmp,"%s",temperature);
     }
     else
     {
         if(tmp!=temperature)
         {
             tmp=temperature;
             sprintf(str,"%d%s",temperature,"Centigrade");
         }
     }
   } 
 }

Aquí estoy conectando el termómetro DS1621 con PIC18F26J50.

y estoy haciendo la comunicación I2C entre ellos. y veo este resultado en UART, pero obtengo datos "255".

Esta cadena de datos "255" que obtuve de la función "i2c_read (void)".

Aquí adjunto una captura de pantalla del osciloscopio del software Proteus. (AMARILLO: SDA | AZUL: SCL).

¿Puede decirme cómo obtener la lectura de DS1621?

    
pregunta Pratik

3 respuestas

1

Desde la página 15 de la hoja de datos, el período BAJO de la señal del reloj debe ser de 1.3 uS como mínimo en modo rápido y de 4.7 uS en modo estándar. Sin demora después de tu

CLOCK = LOW; 

La línea del reloj vuelve a ser alta después de algunos ciclos del reloj de tu sistema. Puedes ver esto en tu rastro azul. Ponga un retraso de más de 10 en nosotros después de esta instrucción, también puede acortar el retraso después de

CLOCK = HIGH; 

comando o vas a estar esperando un segundo por 10 bits de datos ...

    
respondido por el Tim Mottram
0

Obtuve la solución de este enlace:

enlace

Este es el controlador AT89C52 pero hago algunos pequeños cambios en el código de acuerdo con los pines del controlador PIC18.

y no vea los datos de I2C en UART siempre obtiene "255" solamente.

Si desea ver los datos de I2C use LCD o Osciloscopio o el depurador I2C en proteus.

Eso es todo!

Gracias a la comunidad de intercambio de pila por su gran respuesta.

    
respondido por el Pratik
0

A juzgar por los datos de su forma de onda, la línea de su reloj no se mantiene baja durante el tiempo suficiente. Tu línea de datos tampoco parece muy estable. Su línea de reloj tiene que bajar durante un cierto período de tiempo, como han sugerido otros, por lo que debe crear demoras para tener en cuenta los siguientes criterios de la hoja de datos:

Hora alta del reloj (min) Hora baja del reloj (min) Tiempo de subida SDA / SCL (max) Tiempo de caída SDA / SCL (máx.)

Esta es probablemente la razón por la que está obteniendo el valor incorrecto en la salida de UART que muestra una constante 1 porque los datos no se sincronizan y solo se leen como un 1 en todo.

¿Está recibiendo un acuse de recibo del IC? Si aún no ha hecho esto con la condición de inicio, tendrá problemas.

    
respondido por el Bilal

Lea otras preguntas en las etiquetas