Autor Tema: Problema con r32 e i2c  (Leído 1329 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado jtinoco

  • PIC10
  • *
  • Mensajes: 2
Problema con r32 e i2c
« en: 12 de Julio de 2021, 21:16:02 »
Buenas tardes les comparto mi problema, es un proyecto en donde se tienen dos sensores de temperatura ds1601, estos son leídos por el protocolo i2c, hasta acá no tengo ningún problema, este viene cuando debo de seleccionar que sensor quiero que se muestre en un lcd, este es elegido desde mi teclado por rs32, aquí es en donde no se deja meter en el ciclo, les comparto mi código y muchas gracias de antemano


#include<16f877a.h>
#fuses XT, NOWDT , NOLVP ,NOPROTECT
#use delay(clock=4Mhz)
#use RS232(BAUD=9600, XMIT=PIN_C6,RCV=PIN_C7 ,BITS=8, PARITY=N,STOP=1)
#use I2C(MASTER, SCL=PIN_C3,SDA=PIN_C4)
#include <lcd.c>
#INT_RDA
#use standard_io(b)
#use standard_io(a)





void main (void){
//configuracion

int TH,TL, TH1,TL1;
   char ch;
   unsigned int value;
   int x=0, offset=10, x2=0;
   set_tris_b(0x00);
   set_tris_d(0xFF);
   set_tris_a(0x01);
   lcd_init();
 
     printf("Selecciona un sensor \n\r");
     
     
   while(1){
   //codigo
     getc();
     ch=getc();
   
    if((ch=='m'));{
      i2c_start();
   i2c_write(0x90);
   i2c_write(0xee);
        i2c_start(); 
   i2c_write(0x90);
   i2c_write(0xAA);
i2c_start();
i2c_write(0x91);
TH = i2c_read();
TL = i2c_read(0);
i2c_stop();

printf(lcd_putc,"\f\TH=%d\nTL=%d",TH,TL);
   delay_ms(1000);
    }
 if((ch=='c'));{
       i2c_start();
   i2c_write(0x92);
   i2c_write(0xee);
        i2c_start(); 
   i2c_write(0x92);
   i2c_write(0xAA);
i2c_start();
i2c_write(0x93);
TH1 = i2c_read();
TL1 = i2c_read(0);
i2c_stop();

printf(lcd_putc,"\f\TH1=%d\nTL1=%d",TH1,TL1);
   delay_ms(1000);   
      }
      }
   
 }

Desconectado remi04

  • PIC24F
  • *****
  • Mensajes: 657
Re:Problema con r32 e i2c
« Respuesta #1 en: 13 de Julio de 2021, 04:20:08 »
 Hay varias cosas.
1- no están definidos los puertos rs232 como entradas y salidas. Falta set_tris_c(); con su valor correspondiente.  Aunque la directiva #use_rs232 se supone que ya te los pone, es conveniente asegurarse.

2- los “if” en tu caso no necesitan dos paréntesis por que solo evalúan una condición. Aunque esto no tiene por qué ser un problema.

3- el “;”que pones al final del “if” supone una instrucción nula que se cumple si la condición es TRUE.  Lo que va entre llaves se te va a ejecutar siempre.  O nunca. Es más, no sé ni cómo te compila sin error.

  Es decir, no puedes poner:

Código: C
  1. if ((condicion == 1)); {
  2.        code;
  3.        code;
  4.        etc;
  5.       }

    Una forma correcta sería:

Código: C
  1. if (condicion == 1) {
  2.        code;
  3.        code;
  4.        etc;
  5.       }

Y una última cosa, ese getc(); que estás poniendo ahí solo te va a recibir un carácter que se va a perder. Luego pones debajo otro que ya si que sería correcto.

  Esto en verdad te está obligando a enviar dos caracteres para seleccionar la sonda.  El primero se pierde y el segundo ya si lo tiene en cuenta.

  Te pongo tu código modificado. Añádele el tris_c con las direcciones de los puertos usart y prueba.

  Un saludo.






Código: C
  1. #include<16f877a.h>
  2. #fuses XT, NOWDT , NOLVP ,NOPROTECT
  3. #use delay(clock=4Mhz)
  4. #use RS232(BAUD=9600, XMIT=PIN_C6,RCV=PIN_C7 ,BITS=8, PARITY=N,STOP=1)
  5. #use I2C(MASTER, SCL=PIN_C3,SDA=PIN_C4)
  6. #include <lcd.c>
  7. #INT_RDA
  8. #use standard_io(b)
  9. #use standard_io(a)
  10.  
  11.  
  12.  
  13.  
  14.  
  15. void main (void){
  16. //configuracion
  17.  
  18. int TH,TL, TH1,TL1;
  19.    char ch;
  20.    unsigned int value;
  21.    int x=0, offset=10, x2=0;
  22.    set_tris_b(0x00);
  23.    set_tris_d(0xFF);
  24.    set_tris_a(0x01);
  25.    lcd_init();
  26.  
  27.      printf("Selecciona un sensor \n\r");
  28.      
  29.      
  30.    while(1){
  31.      ch=getc();
  32.  
  33.      if (ch=='m') {
  34.       i2c_start();
  35.       i2c_write(0x90);
  36.       i2c_write(0xee);
  37.       i2c_start();  
  38.       i2c_write(0x90);
  39.       i2c_write(0xAA);
  40.       i2c_start();
  41.       i2c_write(0x91);
  42.       TH = i2c_read();
  43.       TL = i2c_read(0);
  44.       i2c_stop();
  45.       printf(lcd_putc,"\f\TH=%d\nTL=%d",TH,TL);
  46.       delay_ms(1000);
  47.     }
  48.  
  49.     if(ch=='c') {
  50.     i2c_start();
  51.     i2c_write(0x92);
  52.     i2c_write(0xee);
  53.     i2c_start();  
  54.     i2c_write(0x92);
  55.     i2c_write(0xAA);
  56.     i2c_start();
  57.     i2c_write(0x93);
  58.     TH1 = i2c_read();
  59.     TL1 = i2c_read(0);
  60.     i2c_stop();
  61.     printf(lcd_putc,"\f\TH1=%d\nTL1=%d",TH1,TL1);
  62.     delay_ms(1000);    
  63.     }
  64.   }  
  65. }
« Última modificación: 13 de Julio de 2021, 04:27:51 por remi04 »

Desconectado jtinoco

  • PIC10
  • *
  • Mensajes: 2
Re:Problema con r32 e i2c
« Respuesta #2 en: 13 de Julio de 2021, 10:58:36 »
Muchas gracias, problema resuelto. Te lo agradezco mucho