Autor Tema: Problema con escritura en Memoria 24LC256  (Leído 1851 veces)

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

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Problema con escritura en Memoria 24LC256
« en: 22 de Octubre de 2010, 13:01:03 »
Hola foro tengo un problema con el código de escritura en una memoria 24lc256

estoy usando las funciones de ejemplo que vienen en el tutorial del compañero Suky que son por i2c por hardware (los pines que ya trae destinado el microcontrolador para tal propósito) y no lo he podido echar a andar.... y pareciera que se queda hasta ciclado...

Código: [Seleccionar]
#include <p18f4610.h>

#include <delays.h> //Libreria para los retardos
#include <stdlib.h> //Libreria para conversiones a string
#include <stdio.h>
#include <sw_uart.h>
#include <string.h>
#include <math.h>
#include <i2c.h>
#include "./Include/lcd_serial.h"
#include "./Include/LCD_CRYSTAL.h"
#include "./Include/Teclado.h"
#include "./Include/ds1302.h"

#pragma config OSC=HS,FCMEN=OFF,IESO=OFF
#pragma config PWRT=ON,BOREN=OFF,BORV=0,WDT=OFF,WDTPS=32768
#pragma config MCLRE=ON,LPT1OSC=OFF,PBADEN=OFF,CCP2MX=PORTBE
#pragma config STVREN=OFF,LVP=OFF,XINST=OFF,DEBUG=OFF
#pragma config CP0=OFF,CP1=OFF,CP2=OFF,CP3=OFF,CPB=OFF
#pragma config WRT0=OFF,WRT1=OFF,WRT2=OFF,WRT3=OFF,WRTB=OFF,WRTC=OFF
#pragma config EBTR0=OFF,EBTR1=OFF,EBTR2=OFF,EBTR3=OFF,EBTRB=OFF

unsigned char Data;

void ByteWriteI2C(unsigned char ByteControl,unsigned char HighDireccion,unsigned char LowDireccion,unsigned char DataI2C);
unsigned char ByteReadI2C(unsigned char ByteControl,unsigned char HighDireccion,unsigned char LowDireccion);

void main(void)
{
ADCON1=15;
ds1302_init(); //Inicializa el reloj ds1302 para su funcionamiento
    OpenUART(); //Habilita los puerto de comunicación serial por software
OpenI2C(MASTER,SLEW_OFF);
SSPADD=49;                         //Fosc=20 MHz y Clock=100 KHz
// TRISCbits.TRISC3=1;
// TRISCbits.TRISC4=1;

Data=10;

Delay_ms(500);
WriteUART(0xFE);
WriteUART(0x01);
WriteLCD(" Prueba a Memoria",17);

ByteWriteI2C(0xA0,0x00,0x00,Data);
Delay1KTCYx(5);

//ByteReadI2C(0xA0,0x00,0x00);
Delay_ms(500);
WriteUART(0xFE);
WriteUART(0x01);
WriteLCD(" Prueba a Memoria 1",19);
}

void ByteWriteI2C(unsigned char ByteControl,unsigned char HighDireccion,unsigned char LowDireccion,unsigned char DataI2C)
{
IdleI2C();
StartI2C();
while(SSPCON2bits.SEN);
putcI2C(ByteControl);
putcI2C(HighDireccion);
putcI2C(LowDireccion);
putcI2C(DataI2C);
StopI2C();
while(SSPCON2bits.PEN);
while(EEAckPolling(ByteControl));
}

unsigned char ByteReadI2C(unsigned char ByteControl,unsigned char HighDireccion,unsigned char LowDireccion)
{
unsigned char Valor;

IdleI2C();
StartI2C();
while(SSPCON2bits.SEN);
WriteI2C(ByteControl);
WriteI2C(HighDireccion);
WriteI2C(LowDireccion);
RestartI2C();
while(SSPCON2bits.RSEN);
WriteI2C(ByteControl | 0x01);
Valor=ReadI2C();
NotAckI2C();
while(SSPCON2bits.ACKEN);
StopI2C();
while(SSPCON2bits.PEN);
return (Valor);
}
Lo que no me destruye, me fortalece

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Problema con escritura en Memoria 24LC256
« Respuesta #1 en: 22 de Octubre de 2010, 13:50:10 »
Hola, ¿cuentas con algún depurador (ICD, Pickit, etc.)?

Con las memorias I2C es mejor implementar subrrutinas de espera cada que se guarda un byte o una página. Se recomienda un delay de 5ms. Cuando implementas subrrutinas de recepción de ACKnowledge... a veces no sirven.

Otra sugerencia es que leas la sección de tiempos de la memoria. Ahí muestran trenes de pulsos con los start, stop y bits que conlleva I2C. Verifica que tales bits se implementen correctamente en tu PIC. También mídelos con osciloscopio.

No olvides las R pull-up de 10k para 5V o de 4.7k para 3.3V.

Filtros de 0.1uF en la fuente del PIC y de la memoria.

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema con escritura en Memoria 24LC256
« Respuesta #2 en: 23 de Octubre de 2010, 02:26:08 »
Upsss.... :oops: el codigo corre bien, el motivo por el cual no me corria bien era porque en otra librería (ds1302.h) estaba utilizando el pin C3 y por lo tanto me fallaba la comunicación con la memoria ya que estaba usando un mismo pin para los dos propositos jejej. Suele pasar no?

Saludos
Lo que no me destruye, me fortalece

Desconectado Palomino86

  • PIC16
  • ***
  • Mensajes: 180
Re: Problema con escritura en Memoria 24LC256
« Respuesta #3 en: 25 de Octubre de 2010, 16:38:34 »
Hola foro;

Alguien sabe cual seria el equivalente a un NotAckI2C() de C18.

Lo que pasa que estado probando las funciones y me di cuenta que la Funcion de AckI2C(); ya en fisico no me estaba funcionando correctamente, para corregir esto tuve que cambia AckI2C(); por un Delay de 5 milisegundos y al parecer ya me corrio bien la escritura de la memoria, pero me falta verificar la lectura y creo que ahora mi problema va por la funcion  NotAckI2C(). En proteus me funciono de maravilla pero en físico es mi problema y ya verifique las conexiones y todo esta bien. Alguien podría dar un tip?

Saludos

Escritura:

Código: [Seleccionar]
void ByteWriteI2C(unsigned char ByteControl,unsigned char HighDireccion,unsigned char LowDireccion,unsigned char DataI2C)
{
IdleI2C(); //Nos aseguramos que el modulo este disponible
StartI2C(); //Inicializa la condicion de START
while(SSPCON2bits.SEN); //Espera hasta que la condición de inicio termine
WriteI2C(ByteControl);
Delay_ms(5);
WriteI2C(HighDireccion);
Delay_ms(5);
WriteI2C(LowDireccion);
Delay_ms(5);
WriteI2C(DataI2C);
Delay_ms(5);
StopI2C();

/*WriteI2C(ByteControl);
WriteI2C(HighDireccion);
WriteI2C(LowDireccion);
WriteI2C(DataI2C);
StopI2C();
while(SSPCON2bits.PEN);
while(EEAckPolling(ByteControl));*/
}

Lectura:

Código: [Seleccionar]
unsigned char ByteReadI2C(unsigned char ByteControl,unsigned char HighDireccion,unsigned char LowDireccion)
{
unsigned char Valor;

IdleI2C();
StartI2C();
while(SSPCON2bits.SEN);
WriteI2C(ByteControl);
Delay_ms(5);
//AckI2C();
WriteI2C(HighDireccion);
Delay_ms(5);
//AckI2C();
WriteI2C(LowDireccion);
Delay_ms(5);
//AckI2C();
RestartI2C();
IdleI2C();
StartI2C();
while(SSPCON2bits.SEN);
WriteI2C(0xA1);
Delay_ms(5);
//AckI2C();
Valor=ReadI2C();
//NotAckI2C();
SSPCON2bits.ACKDT=1;
    SSPCON2bits.ACKEN=1;
while(PIR1bits.SSPIF==0);
    PIR1bits.SSPIF=0;

while(SSPCON2bits.ACKEN);
//SSPCON2bits.ACKDT=1;
    //SSPCON2bits.ACKEN=1;
//while(PIR1bits.SSPIF==0);
    //PIR1bits.SSPIF=0;
StopI2C();
//while(SSPCON2bits.PEN);
return (Valor);

/* WriteI2C(ByteControl);
WriteI2C(HighDireccion);
WriteI2C(LowDireccion);
RestartI2C();
while(SSPCON2bits.RSEN);
WriteI2C(ByteControl | 0x01);
Valor=ReadI2C();
NotAckI2C();
while(SSPCON2bits.ACKEN);
StopI2C();
while(SSPCON2bits.PEN);
return (Valor);*/
}
Lo que no me destruye, me fortalece

Desconectado nahuelgdy

  • PIC10
  • *
  • Mensajes: 2
Re:Problema con escritura en Memoria 24LC256
« Respuesta #4 en: 08 de Octubre de 2018, 13:51:15 »
Yo tengo el mismo problema con el código del tutorial suky para el c18. Estoy probando con el docklight mediante rs232 y i2c hacia mi memoria 24lc256 y no recibo respuesta. Nose que puede ser

Desconectado Fer_TACA

  • Moderadores
  • DsPIC30
  • *****
  • Mensajes: 3231
Re:Problema con escritura en Memoria 24LC256
« Respuesta #5 en: 08 de Octubre de 2018, 16:24:57 »
Yo tengo el mismo problema con el código del tutorial suky para el c18. Estoy probando con el docklight mediante rs232 y i2c hacia mi memoria 24lc256 y no recibo respuesta. Nose que puede ser
Has colocado la misma pregunta en  varios sitios. No por ello  se te va a responder antes.