Autor Tema: problema con i2c  (Leído 3606 veces)

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

Desconectado aldoMO

  • PIC10
  • *
  • Mensajes: 18
problema con i2c
« en: 11 de Septiembre de 2014, 20:48:55 »
hola a todos, me encuentro trabajando con 2 pic's 18f26j50, y necesito comunicarlos por i2c.
la idea es enviar un dato tipo float desde el esclavo al maestro.
el problema es que me anda mal, (en la simulación) ya que el esclavo me envia siempre FF.
no se cual podrá ser la falla, probé enviando datos del tipo int, float, y string, y siempre me llega un FF al maestro.
También note en la simulación que el esclavo no me manda un ACK, esto lo vi usando el i2c debuger.
espero puedan ayudarme.
adjunto la simulación con la programación de ambos pic's.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re: problema con i2c
« Respuesta #1 en: 15 de Septiembre de 2014, 16:50:30 »
¿Cómo es eso que quieres enviar un dato tipo float si las funciones I2C envían y reciben un byte (unsigned char)? O estoy mal????
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado aldoMO

  • PIC10
  • *
  • Mensajes: 18
Re: problema con i2c
« Respuesta #2 en: 15 de Septiembre de 2014, 17:20:08 »
hola DominusDRR, gracias por responder... no sabia q solo se podian enviar y recibir un byte... voy a intentar hacer eso...

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re: problema con i2c
« Respuesta #3 en: 15 de Septiembre de 2014, 17:34:27 »
Si tu variable float es de 32 bits, por ejemplo, tendrás que descomponer cada variable a transmitir en 4 bytes para transmitirla. Y reconstruirla en el receptor.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado aldoMO

  • PIC10
  • *
  • Mensajes: 18
Re: problema con i2c
« Respuesta #4 en: 15 de Septiembre de 2014, 19:03:04 »
bueno, aki sigo con un problema...
hice un codigo simple, solo para verificar que existe la comunicación entre los pic's, y resulta que no hay conexion.
el maestro pide un dato al esclavo (un string), pero en el esclavo nunca entra la interrupcion SSP.
podrian ayudarme?
aki les dejo los codigos que hice para cada pic.
tambien les adjunto la simulacion en proteus.

maestro:               cada 10 seg el maestro pide un dato al esclavo

#include <18F26J50.h>
#device adc=16

#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(clock=20000000)

#use rs232(baud=9600,parity=N,xmit=PIN_B1,rcv=PIN_B2,bits=8,stream=PORT1)
#use i2c(Master,Fast,sda=PIN_B5,scl=PIN_B4)
int segundo=0;
int segfive=0;
//unsigned char cadena;
char valor=0;

#int_timer0
void  tiempo(void)               //interrupcion de 1 segundo
{
segundo++;
if(segundo==5)                   //cuento 5 seg
   {
   segfive++;
   segundo=0;
   }
set_timer0(46100);
delay_ms(100);

if(segfive==2)                   //cuento 10 segundos
   {
   
   i2c_start();                  //esto es para pedir los datos al esclavo
   i2c_write(0xA0);       
   delay_ms(10);
   i2c_start();
   i2c_write(0x0A+1);
   valor=i2c_read();
   i2c_stop();
   
   //valor = atof(cadena);
   fprintf(PORT1,"VELOCIDAD PROMEDIO %s",valor);      //muestro lo que lee del i2c
   puts("\r");
   segfive=0;
   }

set_timer0(46150);
}



void main()

   set_tris_b(0xff);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);      //3.4 s overflow

   setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
   setup_timer_4(T4_DISABLED,0,1);
   enable_interrupts(INT_TIMER0);
   setup_comparator(NC_NC_NC_NC);// This device COMP currently not supported by the PICWizard
   //enable_interrupts(INT_RTCC);
   disable_interrupts(INT_EXT);
   disable_interrupts(INT_EXT1);
   disable_interrupts(INT_EXT2);
   enable_interrupts(GLOBAL);
    set_timer0(46100);

   while(TRUE)
   {
      //TODO: User Code
   }

}









esclavo:

#include <18F26J50.h>
#device adc=16
#include <math.h>


#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)

#use delay(clock=20000000)

#use rs232(baud=9600,parity=N,xmit=PIN_B1,rcv=PIN_B2,bits=8,stream=PORT1)
#use i2c(Slave,Fast,sda=PIN_B5,scl=PIN_B4,address=0x0A)
#priority SSP
float valor;
char string[5];
int i=0;
typedef enum {NOTHING, CONTROL_READ,ADDRESS_READ} I2C_STATE;
I2C_STATE fstate;
#int_SSP
void  SSP_isr(void)
{puts("funcion SSP");            // esto es para ver si entra la interrupcion
fstate=i2c_isr_state();          //en caso de entrar deberia enviar el primer nro (1)
if(fstate==0x80)
   {
   i2c_write(string);         //escribo el primer nro en el puerto
   i++;
   }
}
void main()

   set_tris_b(0xff);
   output_float(pin_b0);
   ext_int_edge(H_TO_L);
   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_256);      //3.4 s overflow

   setup_timer_3(T3_DISABLED | T3_DIV_BY_1);
   setup_timer_4(T4_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);                  // This device COMP currently not supported by the PICWizard
   disable_interrupts(INT_TIMER0);
   disable_interrupts(INT_EXT);
   disable_interrupts(INT_EXT1);
   disable_interrupts(INT_EXT2);
   enable_interrupts(INT_SSP);
   enable_interrupts(GLOBAL);
   set_timer0(46100);
   while(TRUE)
   {
    valor=17.53;                          //defino un valor flotante
    sprintf(string,"%01.2f",valor);       //convierto el flotante a un string
    printf("string=");                   
    fprintf(PORT1,"%c ",string);       //muestro el primer numero, o sea el 1
    puts(" ");                            //todo esto es solo para vefiricar que valor se convirtio a string
    delay_ms(1000);
   }

}

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re: problema con i2c
« Respuesta #5 en: 16 de Septiembre de 2014, 10:07:16 »
Puedes comprobar si se crea el código en ensamblador para las dos líneas siguientes:



#use rs232(baud=9600,parity=N,xmit=PIN_B1,rcv=PIN_B2,bits=8,stream=PORT1)
#use i2c(Master,Fast,sda=PIN_B5,scl=PIN_B4)
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado aldoMO

  • PIC10
  • *
  • Mensajes: 18
Re: problema con i2c
« Respuesta #6 en: 17 de Septiembre de 2014, 16:56:18 »
hola DominusDRR, gracias por responder... la verdad soy bastante nuevo en esto y no entiendo bien a lo que te refieres.

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re: problema con i2c
« Respuesta #7 en: 17 de Septiembre de 2014, 17:02:51 »
Pues resulta que una vez, hace tiempo atrás trabajé con PICC y declaraba 2 puertos serial, el uno el propio del microcontrolador y uno por software.

Uno a continuación del otro usando #use.

No recuerdo cuál funcionaba, pero sólo era uno.

Cuando revise el código ensamblador que produce el PICC comprobé que sólo se creaba el código para un puerto serial, para el otro nada. Era un error de PICC, la solución fue declarar otras cosas después del primer #use y de ahí usar el #use para crear el otro puerto serial.

No sé si las versiones actuales hayan corregido ese error, pero al ver tu código me recordó ese problema.

Me supongo que si sabes que es lenguaje ensamblador o tienes una idea de que es.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado aldoMO

  • PIC10
  • *
  • Mensajes: 18
Re: problema con i2c
« Respuesta #8 en: 25 de Septiembre de 2014, 19:46:54 »
hola  DominusDRR, por suerte ya pude solucionar lo del i2c...pero ahora tengo una duda...
el dato a enviar en un tipo float, pero antes de enviarlo tengo q convertirlo a 4 bytes para poder enviarlo.. podrias ayudarme con eso?
 o sea pasar un dato tipo float a 4 bytes?
gracias!

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re: problema con i2c
« Respuesta #9 en: 26 de Septiembre de 2014, 10:07:52 »
De cuantos bits es un float para tí???
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado aldoMO

  • PIC10
  • *
  • Mensajes: 18
Re: problema con i2c
« Respuesta #10 en: 26 de Septiembre de 2014, 11:21:02 »
yo defino una variable como float, y hasta donde tengo entendido es de 32.

por ejemplo

float velocidad;

es asi o estoy equivocado?

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re: problema con i2c
« Respuesta #11 en: 26 de Septiembre de 2014, 11:42:06 »
Si es de 32 bits, implica que está conformada por 4 bytes

FuncionEscribirUnByteEnSPI((unsigned char)(Velocidad & 0xFF)); // Obtengo el primer byte
FuncionEscribirUnByteEnSPI((unsigned char)((Velocidad & 0xFF00)>> 8 )); // Obtengo el segundo byte

FuncionEscribirUnByteEnSPI((unsigned char)((Velocidad & 0xFF0000)>>16));// Obtengo el tercer byte
FuncionEscribirUnByteEnSPI((unsigned char)((Velocidad  & 0xFF000000)>>32));// Obtengo el cuarto byte
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32

Desconectado inventor1967

  • PIC10
  • *
  • Mensajes: 16
Re: problema con i2c
« Respuesta #12 en: 01 de Octubre de 2014, 02:11:47 »
Por alguna  razón no confío en los simuladores uso proteus y tengo un circuito base para trabajar con microcontroladores que básicamente consta de un pic y una pantalla lcd 2x16 y no me funciona la simulación pero si va perfecto en físico

Desconectado DominusDRR

  • PIC24H
  • ******
  • Mensajes: 1937
    • Sicoy
Re: problema con i2c
« Respuesta #13 en: 01 de Octubre de 2014, 12:51:44 »
Yo prefiero debuggar con un PICkit3 o ICD3. De esa manera "simulas" con tu hardware de mejor manera.
Tengo una idea algo difusa sobre MPLAB Harmony, XC32 con PIC32