MikroC y lectura de eeprom

Hola gente. Es mi primera vez en el foro.
Estoy programando un PIC 16f648A con mikroc 6 y 7. Logre grabar datos de un teclado matricial en la eeprom del pic, el problema es que uso la rutina de lectura que me sugiere el programa (PORTB=Eeprom_Read(addr)) y no obtengo los datos de la memoria en la variable asignada para tal fin. Lo comprobe tanto en hardware como en el debug del software.
Probe programando sin usar esa funcion, es decir por medio de los registros:

EEADR
EECON1
EEDATA

Pero cuando igualo EEDATA a la variable no le asigna ningun valor.
Estoy dudando seriamente del compilador, ya que es una version craqueada.
Por otro lado me parece importante destacar que la funcion para grabar los datos en la eeprom funciona perfectamante (Eeprom_Write(addr,dato))

Gracias... :rolleyes:
 
Hola amigo anibla82, adjunto a este post un ejemplito para hacer eso que tu dices, yo tambien me dedico a programar con MikroC y me va bien nomas en este momento estoy en i2c para una red de microcontroladores estoy dandole lucha ya estoy como dos semanas en eso... aver y tu sabes algo me avisas.....
 

Adjuntos

  • memoria_802.rar
    67.9 KB · Visitas: 266
Hola, pues quisiera pedir ayuda, ya que estoy aprendiendo a programar en c, y quiero programar la EEPROM del 16f84a. Programe en mikroc algo sencillo, que si detecta un 1 en el pin1 del porta, va almacernar un dato en la memoria Eeprom y dará lectura y lo reflejara encendiendo un led, y de lo contrario no. Sin embargo lo he simulado en el proteus y no pasa nada.

Código:
//Declaración de funciones

   void configuracion();
   void validar();
   void checar_entrada();
                  //Declaración de Variables
   unsigned char A;
   unsigned char direccion=0x22;
   unsigned char dato=0x56;
               //Programa Principal
   void main()
   {
     configuracion();

     while(1)
     {
      checar_entrada();
      validar();

     }
   }

   void configuracion()   // Configuración de puertos
    {TRISA = 0x1f;
     TRISB = 0x00;}
     
   void validar()         // Validacion de dato en memoria
     {
      A=Eeprom_Read(direccion);
      Delay_ms(500);


                 if(A=dato)              // Verificación del Dato en Memoria
                 {                           // Si dato en Memoria es igual a 0x56
                 PORTB.F0==1;      // Activa el Bit 0
                                             // Retorna
                  }
                 else
                 {
                 PORTB.F0==0;      // Si el Dato es desigual a 0x056
                                             // Desactiva el Bit 0
                 }                 // Retorna

      }
      
    void checar_entrada()         // Verifica si el bit 0 esta en alto
    {
                 if(PORTA.F0=1)   // Manda al proceso de grabación
                 {PORTB.F7=1;
                 }
                 else
                 {
                 PORTB.F7=0;
                 Eeprom_Write(direccion,dato);
                 
                 }
    }

Bueno señores, espero que me puedan ayudar, porque no he encontrado nada en internet, o no lo he comprendido.

Gracias por la atención
 
Hola, siento responderte con mucho retraso, pero no habia leido tu consulta. Creo que el problema lo tienes en las lineas de codigo de las instrucciones "if".
Ten en cuenta que en C, la comparación de igualdad se efectua con el operador == , no con un solo =. Si en lugar de dos signos =, pones solo uno, lo que haces es igualar la primera variable al valor de la segunda, por lo que la respuesta del 'if', será siempre verdadero excepto cuado la segunda variable valga cero.

También he visto algunas lineas como: PORTB.F0==1; // Activa el Bit 0. NO SON VALIDAS, el codigo correcto es PORTB.F0=1; // Activa el Bit 0 (un solo igual). Creo que tienes una confusión entre los operadores de comparación y de movimiento, revisa esos temas, corrige el código y te funcionará.

Espero haberte ayudado un poco.

Josep M. Sala Montalá.
 
Fijate que ya había resuleto el problema, y asi fué como me dijiste, estaba confundido en los operadores.

Te agradezco mucho tu amable respuesta.

Hasta pronto.

Atentamente

Sacc01
 
Atrás
Arriba