Autor Tema: Libreria EEPROM en HiTech  (Leído 4511 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: Libreria EEPROM en HiTech
« Respuesta #15 en: 18 de Abril de 2011, 17:51:13 »
AngelGris, por lo que veo lo estás haciendo por hardware, yo los codigos que he puesto son por software.

He intentado también hacerlo por hardware, pasando a c el ejemplo del libro de Angulo, pero ni siquiera saca un dato bién por el puerto. Este es otro codigo que traduje de un ejemplo en asm:

Código: [Seleccionar]
//--------------------------------------------------------------------------------------
/*
Function: I2CInit
 Return:
 Arguments:
 Description: Initialize I2C in master mode, Sets the required baudrate
 */
void I2CInit(void){
         TRISC3 = 1;      /* SDA and SCL as input pin */
         TRISC4 = 1;      /* these pins can be configured either i/p or o/p */
SSPCON = 0x28; // seteo como MASTER
SSPSTAT=0b10000000;
SSPEN = 1; // módulo SSP habilitado.
SSPADD = 19; // Baud Rate Generator: 100 kHz fosc 8MHz.
/* SSPEN = 1, I2C Master mode, clock = FOSC/(4 * (SSPADD + 1)) */
}
//--------------------------------------------------------------------------------------
/*
Function: I2CStart
 Return:
 Arguments:
 Description: Send a start condition on I2C Bus
 */
void I2CStart(){
        // start condition MASTER
SEN = 1; // Start Condition Enabled
while (SSPIF==0) // mientras no se levante la bandera que indica el fin de
continue; // envío de la start condition no hago nada.
SSPIF=0; // la bandera se debe bajar por software.
}
//--------------------------------------------------------------------------------------
/*
Function: I2CStop
 Return:
 Arguments:
 Description: Send a stop condition on I2C Bus
 */
void I2CStop(){
// stop condition MASTER
PEN = 1; // Stop Condition Enabled
while (SSPIF==0) // mientras no se levante la bandera que indica el fin de
continue; // envío de la stop condition no hago nada.
SSPIF=0;
}
//--------------------------------------------------------------------------------------
/*
Function: I2CSend
 Return:
 Arguments: dat - 8-bit data to be sent on bus
            data can be either address/data byte
 Description: Send 8-bit data on I2C bus
 */
signed char I2CSend(unsigned char dat){
SSPBUF = dat; // envío dato.
while (SSPIF==0) // mientras no se levante la bandera que indica el fin de
continue; // envío de la dirección no hago nada.
SSPIF=0; // la bandera se debe bajar por software.

// luego del envío chequeo el error viendo el ACKSTAT
if (ACKSTAT != 0)
return -1;// ocurrió un error…
return 1;

}
//--------------------------------------------------------------------------------------
/*
Function: I2CRead
 Return:    8-bit data read from I2C bus
 Arguments:
 Description: read 8-bit data from I2C bus
 */
unsigned char I2CRead(void){
unsigned char dato;
RCEN = 1; // Recepción habilitada, para recibir cada dato.

// Recepción de un dato.
while (SSPIF==0) // mientras no se levante la bandera que indica el fin de
continue; // recepción de un dato no hago nada.
SSPIF=0; // la bandera se debe bajar por software.
dato = SSPBUF; // el dato recibido esta en el SSPBUF.

// Envío el ACK FINAL.
ACKDT = 1;
ACKEN = 1;
while (SSPIF==0) // mientras no se levante la bandera que indica el fin de
continue; // envío del ACK FINAL no hago nada.
SSPIF=0; // la bandera se debe bajar por software.
return dato;
}
//--------------------------------------------------------------------------------------

Saludos.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Libreria EEPROM en HiTech
« Respuesta #16 en: 18 de Abril de 2011, 19:47:51 »
  Tené en cuenta que la librería que trae HiTech puede funcionar tanto por SoftWare como por HardWare.

  Esto es una parte de dicha librería.

Código: C
  1. /* Uncomment the next line to use the PIC's SSP Module*/
  2. #define I2C_MODULE 1
  3.  
  4. #ifdef I2C_MODULE
  5. /* I2C module uses PORT C */
  6. #define SCL             RC3             /* clock on port C bit 2 */
  7. #define SCL_DIR         TRISC3
  8. #define SDA     RC4                     /* data on port C bit 1 */
  9. #define SDA_DIR         TRISC4
  10. #define I2CTRIS TRISC
  11. #define MASTER_MODE     0B1011          /* I2C firmware controlled Master Mode (slave idle) */
  12. #define SSPMode(val)   SSPCON &=0xF0; SSPCON|=(val & 0xf)

  Tus rutinas parecen estar bien excepto la de lectura ya que siempre se envía un NOACK, pero en ocasiones que se necesiten leer mas de un byte, es necesario poder enviar ACK.

  Esta es la librería que yo uso......

Código: C
  1. /**************************************************************************
  2. *      Libreria para protocolo I2C Master por HardWare para HiTech        *
  3. ***************************************************************************
  4.  
  5. ***************************************************************************
  6. *                                                                         *
  7. * Antes de incluir este archivo en nuestro programa hay que definir       *
  8. * algunos parametros. Estos son                                           *
  9. *                                                                         *
  10. * PIC_CLK        (se usa para calcular el valor de SSPADD)                *    
  11. * I2C_BAUD       (velocidad de transferencia)                             *
  12. *                                                                         *
  13. ***************************************************************************
  14.  
  15. ***************************************************************************
  16. *                                                                         *
  17. * En esta libreria se encuentran las siguientes funciones                 *
  18. *                                                                         *
  19. * setup_i2c(char)               (inicializa el puerto I2C)                *
  20. * start_i2c()                   (envia start, inicia transmision)         *
  21. * rstar_i2c()                   (envia restart, reinicia transmision)     *
  22. * stop_i2c()                    (envia stop, termina transmision)         *
  23. * write_i2c(char)               (envia un byte)                           *
  24. * read_i2c(char)                (recibe un byte y envia ack o noack)      *
  25. *                                                                         *
  26. *  La funcion write_i2c() devuelve 0 si el dispositivo responde o 1 si el *
  27. * dispositivo no responde.                                                *
  28. *                                                                         *
  29. *  A la funcion read_i2c() hay que pasarle 0 si se quiere responder al    *
  30. * disipositivo o 1 si no se quiere responder                              *
  31. *                                                                         *
  32. *  En esta libreria estan definidos los parametros I2C_MASTER, I2C_SLAVE, *
  33. * I2C_10BIT_ADDRESS. Eston son utilizados en la funcion setup_i2c(char)   *
  34. *                                                                         *
  35. *  Tambien estan definidos ACK y NOACK que son los utilizados para        *
  36. * responder o no al dispositivo                                           *
  37. *                                                                         *
  38. ***************************************************************************
  39.  
  40. * Ejemplo de configuracion y utilizacion
  41.  
  42.  #define PIC_CLK   10000000   // cristal 10MHz
  43.  #define I2C_BAUD  100000     // velocidad 100 KHz
  44.  #include "HardI2c.c"
  45.  
  46.  void main (void);
  47.  {
  48.    unsigned char respuesta;
  49.    unsigned char dato;  
  50.  
  51.    ......
  52.    ......
  53.    ......
  54.    setup_i2c (I2C_MASTER);
  55.    start_i2c();
  56.    respuesta = write_i2c (0b10101110);    // comunicacion para escribir en una 24C02C
  57.    if (respuesta == ACK)
  58.    {
  59.      write_i2c (0x00);                    // indico la direccion a escribir
  60.      write_i2c (0xF5);                    // escribo el dato F5
  61.      write_i2c (0x06);                    // escribo el dato 06
  62.    }
  63.    stop_i2c();
  64.  
  65.    // colocar un delay necesario para que termine de grabar la memoria
  66.  
  67.    start_i2c();
  68.    respuesta = write_i2c (0b10101110);    // comunicacion para escribir en una 24C02C
  69.    if (respuesta == ACK)
  70.    {
  71.      write_i2c (0x00);                    // indico la direccion de memoria
  72.      rstart_i2c();                       // reinicio la transmisión
  73.      respuesta = write_i2c (0b10101111);  // comunicacion para leer en una 24C02C
  74.      if (respuesta == ACK)
  75.      {
  76.        dato = read_i2c (ACK);             // leo el dato y respondo
  77.        dato = read_i2c (NOACK);           // leo el dato y no respondo
  78.      }
  79.    }
  80.    stop_i2c();
  81.  }
  82.  
  83. */
  84.  
  85. #if defined (PIC_CLK) && defined (I2C_BAUD)
  86.  
  87.   #define I2C_MASTER          0x38
  88.   #define I2C_SLAVE           0x26
  89.   #define I2C_10BIT_ADDRESS   0x01
  90.  
  91.   #ifndef ACK
  92.     #define ACK   0
  93.   #endif
  94.   #ifndef NOACK
  95.     #define NOACK 1
  96.   #endif
  97.  
  98.  
  99.   void setup_i2c (char x)
  100.   {
  101.     TRISC3 = 1;
  102.     TRISC4 = 1;
  103.     SSPSTAT = 0;
  104.     SSPCON = x;
  105.     SSPCON2 = 0;
  106.     if (SSPM3 == 1) SSPADD = (unsigned char)((PIC_CLK/(4*I2C_BAUD)) - 1);
  107.   }
  108.  
  109.   char start_i2c (void)
  110.   {
  111.     while (( SSPCON2 & 0x1F ) || RW );
  112.     SEN = 1;
  113.     return !BCLIF;
  114.   }
  115.  
  116.   void rstart_i2c (void)
  117.   {
  118.     while (( SSPCON2 & 0x1F ) || RW );
  119.     RSEN = 1;
  120.   }
  121.  
  122.   void stop_i2c (void)
  123.   {
  124.     while (( SSPCON2 & 0x1F ) || RW );
  125.     PEN = 1;
  126.   }
  127.  
  128.   char write_i2c (unsigned char data)
  129.   {
  130.     while (( SSPCON2 & 0x1F ) || RW );
  131.     SSPBUF = data;
  132.     while (RW == 1);
  133.     return ACKSTAT;
  134.   }
  135.  
  136.   unsigned char read_i2c (unsigned char respuesta)
  137.   {
  138.     unsigned char dato;
  139.  
  140.     while (( SSPCON2 & 0x1F ) || RW );
  141.     RCEN = 1;
  142.     while (( SSPCON2 & 0x1F ) || RW );
  143.     dato = SSPBUF;
  144.     while (( SSPCON2 & 0x1F ) || RW );
  145.     ACKDT = respuesta;
  146.     ACKEN = 1;
  147.     return dato;
  148.   }
  149. #else
  150.   #error Faltan definir parametros
  151. #endif
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: Libreria EEPROM en HiTech
« Respuesta #17 en: 19 de Abril de 2011, 09:00:27 »
 
  Esta es la librería que yo uso......


No entiendo lo que está pasando, he probado a hacer un nuevo proyecto de prueba con el mismo codigo que pusiste, y en la simulación no escribe ninguna trama, tan solo una ristra de "????????" Adjunto lo que estoy haciendo, pediria por favor que alguien lo simule.

Saludos.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡

Desconectado AngelGris

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 2480
Re: Libreria EEPROM en HiTech
« Respuesta #18 en: 19 de Abril de 2011, 09:47:08 »
  Acabo de probar tu programa y esquema y funcionó bien, pero haciendo los siguientes cambios

Las resistencias de pullup del bus las dejé de 4.7K y las puse como digitales en lugar de analógicas, ya que eso suele generar bastantes problemas en el Proteus, de hecho yo suelo utilizar el componente PULLUP para esas resistencias.
De vez en cuando la vida
nos besa en la boca
y a colores se despliega
como un atlas

Desconectado micro_pepe

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3206
Re: Libreria EEPROM en HiTech
« Respuesta #19 en: 19 de Abril de 2011, 16:37:00 »
  Acabo de probar tu programa y esquema y funcionó bien, pero haciendo los siguientes cambios

Las resistencias de pullup del bus las dejé de 4.7K y las puse como digitales en lugar de analógicas, ya que eso suele generar bastantes problemas en el Proteus, de hecho yo suelo utilizar el componente PULLUP para esas resistencias.

Muchas gracias, efectivamente era eso, no conocia esas resistencias, con las analogicas hasta ahora me habian simulado bien los circuitos.

Saludos.
Se obtiene más en dos meses interesandose por los demás, que en dos años tratando de que los demás se interesen por ti.

新年快乐     的好奇心的猫死亡