Hola
Estoy tratando de escribir y leer datos de una EEPROM externa (24256) (Los datos los introduzco por VTERM de Proteus) en CCS pic 16F877, Tengo el mismo programa para escribir y leer en la memoria interna EEPROM del 16F877 y funciona bien. El programa debe hacer lo siguiente:
* Introduzco datos (a traves deL VTERM "PBX") y los almaceno en un buffer (Variable) hasta que introduzca "enter"
*Una vez presionado "enter" se escriben los datos en la EEPROM
*Para leer datos de EEPROM entro "I" (En VTERM "PC")
El programa para memoria externa:
#include <16f877.h> // Selecciona el PIC
#fuses HS,NOWDT,NOPROTECT,NOLVP,PUT,BROWNOUT // Opciones de configuración
#use delay(clock=20000000)
#use rs232(baud=1200,parity=N,xmit=PIN_B1,rcv=PIN_B0,bits=8,stream=PC)
#use rs232(baud=1200,parity=N,xmit=PIN_C6,rcv=PIN_C7,bits=8,stream=PBX)
#define EEPROM_SDA PIN_A1 //pines para...
#define EEPROM_SCL PIN_A0 //...manejo de eeprom 24LC256
#include <24256.c> //libreria eeprom 24LC256
////////////////////////////////////////////////////////////////////////////////
// Constantes y definiciones ////////////////////////////////////////////////////////////
int const MAXLENBUFF=68; // Maxima longitud del buffer de recepción RS232
int commandx=0;
// Variables Globales ///////////////////////////////////////////////////////////////////
char buffrec[MAXLENBUFF]; // Buffer de Recepcion
int xbuffrec=0x00; // índice del Buffer de Recepcion
int xbuffrecw=0x00;
int1 new_command=0; // Flag para indicar comando disponible
void Add_buffrec(char c); // Añade un caracter al buffer de recepción
void Escribir_EEPROM(void); // Procesado de comandos
// INTERRUPCIONES ///////////////////////////////////////////////////////////////////////
/******************************************************************************/
/* Definicion de buffers para recibir los chars de los puertos PC/PBX */
int fila=0;
int pagact=0;
int t=0;
int conta=0;
/// Declaracion de Funciones /////////////////////////////////////////////////////////////
void Ini_buffrec(void); // Borra el buffer de recepción
void Add_buffrec(char c); // Añade un caracter al buffer de recepción
void Leer_buffrec(char s); // Añade un caracter al buffer de recepción
/******************************************************************************/
///Atender Interrupcion puerto serial recepcion de datos desde PBX
#int_rda
rda_isr() {
char vari;
vari=fgetc(PBX); // Guarda en vari dato recibido desde PBX
Add_buffrec(vari); //Linea datos llamada
}
/********* Rutina de atencion de Interrupcion puerto serie del PC ************/
#int_EXT // Interupcion Externa en RB0. Llega de PC order para leer EEPROM
ext_isr() {
char varif;
varif=fgetc(PC);
Leer_buffrec(varif);
}
//********************************************************************************
void Add_buffrec(char c){ // Añade caracter al Buffer de Recepcion
switch(c){
case 0x0D: // Chequear que llego LF
buffrec[xbuffrec++]=c; // Añade LF a buffer
new_command=1; // Habilita Flag para indicar fin de Linea y luego escribir EEPROM
conta=conta+1;
break;
default:
buffrec[xbuffrec++]=c; // Añade caracter recibido al Buffer
// fputc(c,PC);
// fprintf(PBX,"%U",conta);
conta=conta+1;
}
}
//****************************************************************************************
///Escribir datos desde PBX a EEPROM*********************
void Escribir_EEPROM(void){ // Añade caracter al Buffer de Recepcion
int i;
if (fila>=186){ //Si se lleno la EEPROM empezar desde 0
fprintf(PC,"%U",fila);
fila=0;
t=0;
pagact=0;
fprintf(PC,"Fila=0\n\r");
}
for(i=0;i<conta;i++){ // Bucle para escribir en EEPROM lo que estaba en buffer
write_ext_eeprom(fila,buffrec);
fila=fila+1;
}
conta=0;
}
//********************************************
//Leer datos de EEPROM y enviar al PC
void Leer_buffrec(char s){
if(s=='I'){ //Esperar Caracrter 'I' de Envio de datos a PC
for(t=pagact; t<fila; t++){
fputc(read_ext_eeprom(t),PC); // Leer dato de EEPROM/
}
pagact=t; //Llevar registro de ultima direccion leida
}
}
// Control del Buffer de recepción ---------------------------------------
void Ini_buff_rec(void){ // Inicia a "\0" el Buffer de Recepción
int i;
for(i=0;i<MAXLENBUFF;i++){ // Bucle que pone a 0 todos los
buffrec=0x00; // caracteres en el Buffer de Recepción
}
xbuffrec=0x00; // Inicializo el índice de siguiente carácter recibido
conta=0x00; // Inicializo el índice de siguiente carácter recibido
}
/*************** Rutina Principal ************************/
void main() {
ext_int_edge(H_TO_L); // Habilita interrupcion por flanco H_to_L para Pin RB0
enable_interrupts(INT_EXT); // Habilita interrupcion externa en RB0 (rcv=PIN_BO)
enable_interrupts(int_rda); // Habilita interrupcion por RDA(received Data Available)
enable_interrupts(GLOBAL); // Habilita interrupciones global
init_ext_eeprom();
Ini_buff_rec();
fprintf(PBX,"Probando PBX\n\r");
fprintf(PC,"Probando PC\n\r");
do {
// Deteccion de la necesidad de procesar comandos pendientes ///////
if(new_command==1){ // Si hay un nuevo comando ...
new_command=0; // deshabilito el aviso y ...
Escribir_EEPROM(); // Escribir lo almacenado en Buffern EEPROM Interna
Ini_buff_rec(); // inicializo buffer
}
} while(TRUE);// FIN funcion de LOOP infinito
}
Anexo están programas en CCS y proteus para memoria interna y externa