• Domingo 7 de Agosto de 2022, 23:47

Autor Tema:  Problemas Con I2c En Css Picc  (Leído 5679 veces)

jjcorps

  • Nuevo Miembro
  • *
  • Mensajes: 3
    • Ver Perfil
Problemas Con I2c En Css Picc
« en: Jueves 4 de Mayo de 2006, 22:51 »
0
Hola tengo problemas con el i2c para comunicar un maestro con un esclavo,esta comunicacion hace lo siguiente el maestro pide informacion al esclavo el cual le responde con (0xA0)  el problema esta en que el maestro recibe siempre la señal (0xFF)  es decir todo a 1 es como si no pudiese poner niveles bajos en las lineas de comunicacion i2c.

Uso PIC16F877A tanto para el maestro como para el esclavo y la resistencia pull-up que uso para i2c es 2K2

CODIGO DEL MAESTRO
Código: Text
  1.  
  2. //////////////////////////////////////////////////
  3. // I2C master                                   //
  4. // PIC16F877A                                   //
  5. //                                 PICmaster.C  //
  6. // Crea una comunicacion entre varios PICS      //
  7. // por i2c mandando lo leido al PC por el       //
  8. // el puerto serie.                             //
  9. //                                              //
  10. // Realizado por Juan José Chica Barrera        //
  11. //////////////////////////////////////////////////
  12.  
  13.  
  14. #include <16f877A.h>
  15. #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP
  16. #use delay(clock = 10000000)       // reloj 10MHz
  17. /*
  18.    Configuracion principal del I2C
  19.    Modo Maestro
  20.    Tasa de transferencia rapida, aunq puede tener problemas
  21.    I2c se hace por harwdware pa eso lo tenemos en el
  22. */
  23. #use i2c(MASTER,SDA=PIN_C4,SCL=PIN_C3,FAST,FORCE_HW)
  24. /*
  25.    Configuracion principal del puerto serie
  26.    velocidad de 9600 baudios
  27.    sin paridad
  28.    con un bit de parada
  29. */
  30. #use rs232(baud=9600, xmit=PIN_C6, rcv=PIN_C7)
  31.  
  32.  
  33.  
  34. /*
  35.    Rutina de ESCRITURA a un dispositivo conectado al i2c
  36.  
  37.    i2cdev --> Direccion del dispositvo
  38.    i2cdat --> Dato que le quiero enviar
  39. */
  40. void i2cw(int i2cdev, int i2cdat){
  41.  
  42.    i2c_start();                  // Inicializo comunicación I2C
  43.    i2c_write(i2cdev);            // Envio Dirección de dispositivo I2C + R/W
  44.    i2c_write(i2cdat);            // Envio byte a escribir
  45.    i2c_stop();                   // Cierro comunicacion
  46. }
  47.  
  48.  
  49. /*
  50.    Rutina de LECTURA a un dispositivo conectado al i2c
  51.  
  52.    i2cdev --> Direccion del dispositvo del que quiero leer
  53. */
  54. int  i2cr(int i2cdev){           // Rutina de lectura I2C
  55.  
  56.    int r=0x00;
  57.  
  58.    i2c_start();
  59.    i2c_write(i2cdev);
  60.    r=i2c_read();
  61.    i2c_stop();
  62.    return(r);
  63. }
  64.  
  65. unsigned int giro=80;
  66. main()
  67. {
  68.      output_float(PIN_C3);         //I2C pin float
  69.      output_float(PIN_C4);         //I2C pin float
  70.  
  71.      while(1)
  72.      {
  73.          //COMUNICACION CON EL ESCLAVO 1
  74.          giro = i2cr(0x02);           //Leo del dispositivo esclavo y lo muestro por el puerto B
  75.          printf("Prueba de i2c %U\n\r",giro);  //Lo muestro por el puerto serie
  76.          delay_ms(1000);            //Retardo de 1 segundo
  77.          giro = 0;                    //Reseteo la variable
  78.  
  79.      }
  80.  
  81.  
  82. }
  83.  
  84.  

CODIGO DEL ESCLAVO
Código: Text
  1.  
  2. //////////////////////////////////////////////////
  3. // I2C slave                                    //
  4. // PIC16F877A                                   //
  5. //                                 PICslave1.C  //
  6. // Crea una comunicacion entre varios PICS      //
  7. // siendo una comunicacion muy basica           //
  8. //                                              //
  9. // Realizado por Juan José Chica Barrera        //
  10. //////////////////////////////////////////////////
  11.  
  12. #include <16f877A.h>
  13. #fuses HS,NOWDT,NOPROTECT,PUT,BROWNOUT,NOLVP
  14. #use delay(clock = 10000000)       // reloj 10MHz
  15. #use fast_io(B)                    // cambio rapido de estados en los puertos
  16. /*
  17.    Configuracion principal del I2C
  18.    Modo Esclavo
  19.    Direccion 0b00000010  = 0x02  (Son 7 bits el bit que se desprecia es el de menor peso por tanto es 1)
  20.    Tasa de transferencia rapida, aunq puede tener problemas
  21.    I2c se hace por harwdware pa eso lo tenemos en el chip
  22. */
  23.  
  24. #use i2c(SLAVE,SDA=PIN_C4,SCL=PIN_C3,ADDRESS=0x02,FAST,FORCE_HW)
  25.  
  26. byte DATA = 69;  // antes era 0x0F
  27.  
  28. //Interrupcion provocada cuando algo ocurre en el i2c
  29. #INT_SSP
  30. void ssp_interupt (){
  31.      output_b(0xFF);
  32.      if(i2c_poll()){               //Si tenemos algo en el buffer de entrada
  33.            output_b(i2c_read());   //lo mostramos por el puerto B
  34.      }
  35.      else{
  36.  
  37.            i2c_write(0xA0);    //Si no esq el master quiere q le mandemos la info
  38.                                    //solamente la parte baja de un entero (1 byte)
  39.            output_b(0x00);
  40.      }
  41. }
  42.  
  43. void main (){
  44.  
  45.      set_tris_b(0x00);             //RB 7-0:OUT
  46.  
  47.      output_b(0);        //en un principio esta apagado
  48.  
  49.      enable_interrupts(GLOBAL);      //Activamos las interrupciones
  50.      enable_interrupts(INT_SSP);     //Activamos la interrupcion para el i2c
  51.  
  52.    while (1);  //bucle infinito
  53. }
  54.  
  55.  
  56.  

Envio los datos por el puerto serie para verlos en condiciones.

¿alguna idea de donde puede estar el error?

tejon1424118

  • Nuevo Miembro
  • *
  • Mensajes: 1
    • Ver Perfil
Re: Problemas Con I2c En Css Picc
« Respuesta #1 en: Viernes 3 de Septiembre de 2010, 04:10 »
0
qu etal.


ya checaste la dirrecion que le estas enviando del maestro al escalvo
porque el dato a enviar en esa parte no es la misma si quieres leer o escribir en es esclavo,
en tu codigo solo aparece la variable, peor no puedo ver cual es el valor que estas enviando

i2cdev=direccion+r/w,
si la direccion del escalvo es 0xa0

para que escriba en el esclavo queda igual 0xa0
pero si quieres leer del esclavo seria oxa1

allisap

  • Miembro MUY activo
  • ***
  • Mensajes: 259
  • Nacionalidad: mx
    • Ver Perfil
Re: Problemas Con I2c En Css Picc
« Respuesta #2 en: Viernes 3 de Septiembre de 2010, 17:44 »
0
Prueba la siguiente


1.-en el maestro la función i2c_write te devuelve el ACK es decir es cero si el esclavo
recibio los datos y 1 si no los recibio, asi que puedes hacer algo como esto

      if (i2c_write(0xB4)==0){   // direccion del sensor melexis para mandar comando
   output_toggle(PIN_B0);
   }
y coloca un led en el pin B0 si esta parpadeando cada que envias datos
quiere decir que el esclavo si recibe los datos

2.-en el esclavo coloca un toggle de un pin en la interrupción
y coloca un led tambien , con esto sabrias si el esclavo recibe los datos y si esta entrando a la interrupcion,

3.-no uses el pooling , mejor usa  la funcion i2c_isr_state();

4.- baja la velocidad,para ver si eso no es lo que te da problemas  (primero camina, luego corre )



prueba a usar simples toggles y leds para saber en que punto esta fallando el codigo
esto realmente te ayuda a depurar mas facilmente,


espero te sirva

Saludos

Victor Pasilla Campos
Puebla, Pue