Autor Tema: Problemas con una EEPROM I2C externa con el Pic 16F877  (Leído 2785 veces)

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

Desconectado pablojolo

  • PIC10
  • *
  • Mensajes: 1
Problemas con una EEPROM I2C externa con el Pic 16F877
« en: 02 de Junio de 2008, 08:53:19 »
¡Buenos dias!

Encontré el programa en internet, que guardaba solo un unico caracter y lo mostraba a traves de un hyperterminal. Yo lo he modificado para que en vez de guardar un dato, guarde una cadena, pero parece que no guarda en la eeprom ya que al sacar su contenido muestra unos caracteres que no corresponden. Aqui va el programa si alguien le hecha un vistazo se lo agradeceria.

Por si sirve de algo, el programa lo cargo en la PicDem 2 Plus con el ICD2 de Microchip.

Aqui os adjunto mi codigo. Necesito que alquien ajeno le heche un vistazo porque me estoy centrando tanto en ello que me vuelvo ciego.

////////////////////////////////////////////////////////////////////////////////////////
// Programa que almacena y extrae bytes de una memoria EEPROM externa con interface I2C,
// también recibe y emite mediante una comunicación Serie Asíncrona
// con los pines RC6 (transmisión) y RC7 (recepción) y se comunica con el
// puerto serie de un PC, trabajando éste como emulador de terminal. Entre el
// puerto del microcontrolador y el PC se intercala un circuito de adaptación
// a RS232 (MAX232)
//
// Se tienen dos estados posibles: "guardando", de manera que se reciben los caracteres mediante
// comunicación RS232 y se guardan en la EEPROM externa en posiciones correlativas a partir
// de la dirección 0x1F00. El otro estado posibles es "sacando", de manera secuencial se
// van leyendo los valores previamente almacenados en la EEPROM a partir de la
// dirección interna 0x1F00 y se envían a través del puerto serie para su visualización
// en un terminal
////////////////////////////////////////////////////////////////////////////////////////

// En el fichero de cabeceras están definidas las comunicaciones RS232 e I2C
#include "EEPROM_I2C.h"

//Incluimos el fichero de "driver" para memoria 24256
#include "24256.c" //Incluimos fichero con funciones para manejo de EEPROM I2C
#include "string.h"
void main() {

   char  caracter,leido,texto;
   int   str,i;
   long int dir=0x1F00; //Dirección interna en la EEPROM a partir de la cual se graba
   enum que_hace {guardando,sacando} estado; //Definimos 2 estados posibles

   setup_adc_ports(NO_ANALOGS);
   setup_adc(ADC_CLOCK_DIV_2);
   setup_spi(FALSE);
   setup_psp(PSP_DISABLED);
   setup_counters(RTCC_INTERNAL,RTCC_DIV_2);
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_ccp1(CCP_OFF);
   setup_ccp2(CCP_OFF);
   init_ext_eeprom();   //Inicializamos la memoria eeprom externa

   while(1) //Bucle continuo de ejecución
   {
      do
      {
            printf("\n\r Guardamos ? (G) o Sacamos (S)?\n\r"); //Mostramos mensaje
            while(!kbhit());     //Esperamos a que se recibe byte por RS232
            caracter=getch();    //lo recogemos
      } while ((caracter!='S')&&(caracter!='G')); //Repetimos hasta que se introduzca 'S' ó 'G'
//Si el carácter era 'S' y hay cambio de estado colocamos el puntero de direcciones al principio
      if((caracter=='S')&&(estado==guardando)){ 
      printf("\n\r cambiamos a sacar\n\r");
      dir=0x1F00;
      printf("\n\r redireccionado\n\r");}

//Si el carácter era 'G' y hay cambio de estado colocamos el puntero de direcciones al principio
      if((caracter=='G')&&(estado==sacando)){
      printf("\n\r cambiammos a guardar\n\r");
     dir=0x1F00;
      printf("\n\r redireccionado\n\r");}

      switch(caracter)  //En función del carácter leído nos vamos a:
      {
         case 'S':      //Sacar, leyendo posiciones correlativas de la EEPROM
                  estado=sacando;
              for(i=0;i<str;i++){
              leido=read_ext_eeprom(dir);   //Recogemos el byte almacenado en la dirección indicada
                 delay_ms(100);
              dir++; //Incrementamos contador de direcciones
              if (dir==0x2000)
                  dir=0x1F00;      
                  putc(leido); //Lo enviamos a través del puerto serie
                  }
              break;

      case 'G':      //Guardar, pedimos carácter
                  estado=guardando;
              delay_ms(100);
              printf("\n\r Introduce texto y presiona Enter\n\r");
              gets(texto);
              str=strlen(texto);
              printf("\n\r texto:%s. La cadena mide %d \n\r",texto,str);
                  write_ext_eeprom(dir, texto); //Lo grabamos en EEPROM
               break;
         default: break;
       }
   }
}


Muchas gracias amigos! :-/


 

anything