Autor Tema: Escribir y Leer EEPROM Externa  (Leído 3844 veces)

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

Desconectado lexer

  • PIC10
  • *
  • Mensajes: 11
Escribir y Leer EEPROM Externa
« en: 21 de Marzo de 2007, 13:45:53 »
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

Desconectado lexer

  • PIC10
  • *
  • Mensajes: 11
Re: Escribir y Leer EEPROM Externa
« Respuesta #1 en: 21 de Marzo de 2007, 13:48:10 »
Olvide mencionar que cuando leo las posiciones que escribí en la memoria externa solo me aparace FF

Desconectado vszener

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 2395
Re: Escribir y Leer EEPROM Externa
« Respuesta #2 en: 23 de Marzo de 2007, 06:39:18 »
Intenta escribir los datos en hexadecimal, así no tendrás problemas.


Suerte!!! ;)
· Nos vemos en los bares!!!!!
· Mi Blog: Aqueronte

Desconectado lexer

  • PIC10
  • *
  • Mensajes: 11
Re: Escribir y Leer EEPROM Externa
« Respuesta #3 en: 28 de Marzo de 2007, 16:50:29 »
Gracias Vszener, El problema era la version del Proteus, probé mi programa con Proteus 6.9 SP4 y SP5 y no funcionó, Probe con Proteus 6.5 SP5 y trabajo bien (Gracias a elreypic2)


 

anything