Autor Tema: c30 i2c problema un poco raro  (Leído 3266 veces)

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

Desconectado ablanco93

  • PIC10
  • *
  • Mensajes: 15
c30 i2c problema un poco raro
« en: 12 de Julio de 2010, 19:30:02 »
Hola que tal, antes que nada gracias por el tiempo que se toman en leer este nuevo tema. La cosa es que estoy utilizando un pic24fj128ga010 para leer y escribir en una memoria EEprom de microchip la 24FC1025 utilizando el protocolo de comunicacion i2c. Yo se que hay muuuucha informacion en toooda la red, pero me pasa un error muy raro, puedo escribir los dos primeros bytes (el byte de control, y un byte de direccion) pero despues de escribir esos dos bytes, el pic se traba, se queda escribiendo el siguiente byte y ya no hace nada :s! no se por que haga esto, si estoy utilizando exactamente la misma funcion para escribir el primer byte, el segundo byte y el tercero, pero el tercer byte ya no hace nada, se traba. No se que pueda ser, les dejo el codigo, lo trate de hacer lo mas corto posible para quitarles el menor tiempo. gracias.

#include<p24fj128ga010.h>         //LIBRERIA QUE USA EL PIC
#include<stdlib.h>               //LIBRERIA PARA CONVERSIONES
#define FCY 2000000UL            //MITAD DE LA FRECUENCIA DE OSCILACION
#include<libpic30.h>
#include<i2c.h>


_CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx2 & FWDTEN_OFF & WINDIS_OFF & FWPSA_PR128 & WDTPS_PS32768);
_CONFIG2( FNOSC_PRI & FCKSM_CSDCMD & POSCMOD_HS );



unsigned int  config1=0, config2=0, v1 ;
unsigned char dato=50, v2[10];

 
void write_eeprom()
{
   
   IdleI2C1();                        //FUNCION QUE GENERA UNA ESPERA HASTA QUE EL BUS DE COMUNICACION ESTA DESOCUPADO
   StartI2C1();                      //INICIO DE LA COMUNICACION
        while(I2C1CONbits.SEN );             //WAIT TILL START CONDITION IS OVER
   
   IdleI2C1();                        //FUNCION QUE GENERA UNA ESPERA HASTA QUE EL BUS DE COMUNICACION ESTA DESOCUPADO      
   MasterWriteI2C1(0xA1);               //CONTROL BYTE

   IdleI2C1();
   MasterWriteI2C1(0x00);               //ADDRESS1
///////////////////////////////////////////////////////////////ESCRIBE HASTA AQUI,
            
   IdleI2C1();
   MasterWriteI2C1(0x01);               //ADDRESS2 SE TRABA EN ESTA LINEA!!!!!!!!!

   IdleI2C1();
   MasterWriteI2C1(0x03);               //BYTE DE DATOS
   StopI2C1();
   
}


void main()
{
   //ConfigIntI2C1(MI2C_INT_OFF);  //Disable I2C interrupt
   
   CloseI2C1();                     //CERRAR CONEXIONES EN  ANTERIORES I2C1

   config2 =(39);                     //CONFIGURACION DEL REGISTRO I2C1BRG I2C1 ENABLE, I2CADD is 7 bit address
   config1 =(I2C_ON  | I2C_7BIT_ADD);      //CONFIGURACION DEL REGISTRO I2C1CON                     
   OpenI2C1(config1,config2);            //CONFIGURATION OF THE MICROCONTROLLER AS MASTER AND WITH VELOCITY OF 100KHZ (SLEW RATE DISABLED)
   write_eeprom();
   

   while(1)
   {         
      
   }

}

Lo simule en proteus. muchas gracias por su tiempo

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: c30 i2c problema un poco raro
« Respuesta #1 en: 13 de Julio de 2010, 13:41:37 »
Puede ser problema de la simulación, prueba en algo real  :tongue: Creo recordar que hay problemas en la simulación de las memorias 1024..  :?


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado ablanco93

  • PIC10
  • *
  • Mensajes: 15
Re: c30 i2c problema un poco raro
« Respuesta #2 en: 29 de Julio de 2010, 14:43:48 »
Hola que tal, yo aqui de nuevo, con lo mismo :P . La verdad ya lei que encontraron un problema para la simulación de este tipo de memorias externas en el proteus, en las versiones 6.4 y 6.5 pero yo creo que para la version 7.4 ya lo solucionaron. Bueno de todos modos te describo mas detalladamente mi problema, a ver si fuera un error en mi programación. Estoy usando el pic24fj128ga010 con el compilador de mplab c30, utilizo la libreria que por default te da microchip para el manejo de i2c, esta libreria es la <i2c.h>, en ella esta la funcion que sirve para escribir un byte de datos, la que uso es la  MasterWriteI2C1(0xA1);  la cual escribe el dato en el bus de transmision  y espera hasta que se escribio el dato.


   IdleI2C1();                  //WAIT TILL THE COMUNICATION BUS IS FREE
   StartI2C1();                       //COMUNICATION START!
      while(I2C1CONbits.SEN );             //WAIT TILL START CONDITION IS OVER
   
   IdleI2C1();                  //WAIT TILL THE COMUNICATION BUS IS FREE      
   MasterWriteI2C1(0xA0);            //CONTROL BYTE

   
   IdleI2C1();                  //WAIT TILL THE COMUNICATION BUS IS FREE
   MasterWriteI2C1(0xA1);            //BYTE

//////////////////////////////////HASTA AQUI ESCRIBE LOS DOS BYTES DE MANERA CORRECTA//////////////////////////////////////////////////////////////////////////////////


Se que escribe los dos bytes de manera correcta por que en el proteus le pongo un I2C debugger y me muestra que manda los dos bytes y recibe los dos bits ACK que debe de recibir. mas sin embargo, cuando vuelvo a mandar la funcion MasterWriteI2C1(0x02); el pic se traba, y ya lo depure paso a paso, y donde se traba es en la condicion del MasterWriteI2C1(); en donde espera a que el dato haya terminado de escribir. Despues de los bytes estos que le mando no le puedo mandar ni un Stop, ni un Start ni nada, ya intente reiniciar la conexion con la funcion RestartI2C1(); y nada, ya intente cerrar la conexion CloseI2C1(); y volverla a abrir con el OpenI2C1(); y nada sigue funcionando hasta ahi. No entiendo por que la funcion masterWriteI2C1(); funciona bien las dos primeras veces, y despues ya no :O! no se si mi programacion este bien, me gustaria que me dijeras si mas o menos si esta bien la programacion para evitarme de simular y armarlo, seria un gran avance saber que mi programa esta bien. Muchas gracias por tu tiempo, y a ver que pasa! :P Les dejo el programa completo y una foto del I2C debugger para que vean lo que sale. Gracias.

PROGRAMA COMPLETO///////////////////////////////////////////////////////////////////////////////////

#include<p24fj128ga010.h>         
#include<stdlib.h>               
#include<lcd_ams24.h>            
#define FCY 2000000UL            //THIS IS FOR THE USE OF THE DELAY LIBRARY "libpic30.h"
#include<libpic30.h>
#include<i2c.h>                  //INCLUDE OF THE I2C LIBRARY


_CONFIG1( JTAGEN_OFF & GCP_OFF & GWRP_OFF & BKBUG_OFF & COE_OFF & ICS_PGx2 & FWDTEN_OFF & WINDIS_OFF & FWPSA_PR128 & WDTPS_PS32768);
_CONFIG2( FNOSC_PRI & FCKSM_CSDCMD & POSCMOD_HS ); //CONFIGURATION BYTES

unsigned int  config1=0, config2=0, v1 ;
unsigned char dato=50, v2[10];

 
void write_eeprom()
{   
   IdleI2C1();                        //WAIT TILL THE COMUNICATION BUS IS FREE
   StartI2C1();                      //COMUNICATION START!
      while(I2C1CONbits.SEN );             //WAIT TILL START CONDITION IS OVER
   
   IdleI2C1();                        //WAIT TILL THE COMUNICATION BUS IS FREE      
   MasterWriteI2C1(0xA0);               //CONTROL BYTE

   
   IdleI2C1();                        //WAIT TILL THE COMUNICATION BUS IS FREE
   MasterWriteI2C1(0xA1);               //BYTE

/

   IdleI2C1();                        //WAIT TILL THE COMUNICATION BUS IS FREE
   MasterWriteI2C1(0xA2);               //CONTROL BYTE


   IdleI2C1();                        //WAIT TILL THE COMUNICATION BUS IS FREE
   MasterWriteI2C1(0xA3);               //CONTROL BYTE

   __delay_ms(5);                     //DELAY TO WAIT FOR THE WRITE OF THE MEMORY
   
   StopI2C1();                        //COMUNICATION STOP!
   
}


void main()
{
   lcd_init();                        //INITIALIZATION OF THE LCD
   __delay_ms(1);                        //DELAY FOR THE CORRECT INITALIZATION OF THE LCD

    /* Turn off I2C modules */
    CloseI2C1();                      //Disbale I2C1 mdolue if enabled previously
   config2 =(37);                     //CONFIGURE OF THE I2C1BRG REGISTER: 100KHZ
   config1 =(I2C_ON  | I2C_7BIT_ADD );      //CONFIGGURE OF THE I2C1CON REGISTER: I2C1 ENABLE, I2CADD IS 7 BIT ADDRESS                                       
   OpenI2C1(config1,config2);            //CONFIGURATION OF THE MICROCONTROLLER AS MASTER AND WITH VELOCITY OF 100KHZ (SLEW RATE DISABLED)
   write_eeprom();
 
   while(1)
   {         
      
   }

}

Utilizo PRoteus V7.4

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: c30 i2c problema un poco raro
« Respuesta #3 en: 29 de Julio de 2010, 15:00:05 »
Yo he utilizado la version 7.4 y no me tomaba las direcciones de 24-bits, solamente 16-bits  :(  Por eso aconsejo probarlo en hard real.


Saludos!
No contesto mensajes privados, las consultas en el foro

Desconectado ablanco93

  • PIC10
  • *
  • Mensajes: 15
Re: c30 i2c problema un poco raro
« Respuesta #4 en: 29 de Julio de 2010, 19:06:01 »
Tenias toda la razon Suky! muchas muchas gracias! de verdad que me salvaste horas y horas de trabajo! la verdad que yo le tengo siempre mucha Fe al proteus! pero esta ves les fallo! :S ya les mande un correo a los de labcenter electronics para que solucionaran la falla, a ver que pasa, por lo mientras, yo ya probe fisicamente la memoria 24fc1025 y les puedo asegurar que con el codigo que puse! suerte y cualquier cosa aqui andamos! gracias suky! :D


 

anything