Autor Tema: ¿Como grabar la eeprom interna del PIC16F877A?  (Leído 3973 veces)

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

Desconectado Oscarinv

  • PIC10
  • *
  • Mensajes: 8
¿Como grabar la eeprom interna del PIC16F877A?
« en: 14 de Junio de 2009, 14:16:09 »
He probado algunas rutinas y códigos, incluso siguiendo el datasheet he hecho lo siguiente:

Código: [Seleccionar]
LIST p=16F877A
INCLUDE <P16F877A.INC>

ORG 0X00

DATA_EE_ADDR EQU 0X00
DATA_EE_DATA EQU 0X07
comparador EQU 0x07

BSF STATUS,RP0
CLRF TRISA
BCF STATUS,RP0

CALL Escribe_Eeprom
CALL Lee_Eeprom
SUBLW comparador ; W - comparador > W
BTFSS STATUS,2 ; Si el resultado de la sustracción es 0
CALL Apagar_LED
GOTO Prender_LED

Prender_LED
BCF PORTA,0
CALL Retardo_50ms
GOTO Prender_LED

Apagar_LED
BSF PORTA,1
CALL Retardo_50ms
RETURN

Escribe_Eeprom
BSF STATUS,RP1
BSF STATUS,RP0
BTFSC EECON1,WR
GOTO $-1
BCF STATUS,RP0
MOVF DATA_EE_ADDR,W
MOVWF EEADR
MOVF DATA_EE_DATA,W
MOVWF EEDATA
BSF STATUS,RP0
BCF EECON1,EEPGD

BSF EECON1,WREN
BCF INTCON,GIE
MOVLW 55h
MOVWF EECON2
MOVLW 0xAA
MOVWF EECON2
BSF EECON1,WR

BSF INTCON,GIE
BCF EECON1,WREN
RETURN

Lee_Eeprom
BSF STATUS,RP1
BCF STATUS,RP0
MOVF DATA_EE_ADDR,W
MOVWF EEADR
BSF EECON1,EEPGD

BSF EECON1,RD
BCF STATUS,RP0
MOVF EEDATA,W
RETURN

INCLUDE <Retardos.inc>
END

Pero ahora, ¿como compruebo de que en realidad he grabado la eeprom?, supongo que en Mplab abres la ventana View > EEPROM (pienso que mi código es incorrecto ya que no se modifica ningún valor), ah y he realizado la simulación en Isis y no me sale. De antemano gracias por sus respuestas.

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: ¿Como grabar la eeprom interna del PIC16F877A?
« Respuesta #1 en: 14 de Junio de 2009, 15:51:16 »
Hola. No va a funcionarte, porque hay varios errores.

Para empezar, parece que no tenes en claro que un uC PIC posee dos grupos de memoria de datos principalmente:

Los registros especiales(SFR) que ya vienen predeterminados por el fabricante;
y los registros comunes(GPR) que son los que puede usar el usuario para su programa.

En el 16F877, la primera posición de memoria que podés usar para tus registros, es la 0x20. Por lo que las variables que declarás están mal porque están ocupando las posiciónes de registros FSRs. Las posiciones 0x00 y 0x07 están reservadas para ellos(INDF y PORTC respectivamente). Si declarás dos variables con el mísmo valor(0x07), en realidad es la mísma variable con dos nombres distintos, así que sólo vas a almacenar un valor, no dos. Si bien en tu programa utilizás este recurso, ojo! que muchas veces conlleva a confusiones...Deberías usar las posiciones 0x20,0x21 y 0x22 para las 3 variables que declaras.

Te recomiendo que te bajes el datasheet y mires el tiempo que te haga falta la sección Memory Organization->Data Memory Organization.

Por otro lado, tenés que esperar un cierto tiempo después de mandar a grabar un dato en la EEPROM. Te hace falta cambiar de banco cuando lees datos que están en distintos bancos...:
Código: ASM
  1. LIST p=16F877A
  2. INCLUDE <P16F877A.INC>
  3.  
  4. DATA_EE_ADDR EQU 0X20
  5. DATA_EE_DATA EQU 0X21
  6. comparador EQU 0x22
  7.  
  8. ORG 0X00
  9.  
  10. BSF STATUS,RP0
  11. clrf TRISB
  12. BCF STATUS,RP0
  13.  
  14.         movlw    0xFF
  15.         movwf    PORTB               ;comenzar con todo el puertoB encendido
  16.  
  17.         call Retardo_50ms
  18.  
  19.         clrf   DATA_EE_ADDR
  20.         movlw 0xAA
  21.         movwf comparador
  22.         movwf DATA_EE_DATA         ;mandar a grabar el valor 0xAA en la posición 0 de la EEPROM
  23. CALL Escribe_Eeprom
  24.  
  25. CALL Lee_Eeprom
  26.  
  27.         xorwf comparador,W ; si comparador(0xAA) es igual a W(valor leido) entonces la XOR dará 0
  28.         movwf PORTB              ;Mostrar en el puertoB el resultado de la XOR. Si todo el puertob está en cero hemos grabado y leido exitosamente. Sino algún pin del puertob estará en 1.
  29.         goto       $             ;loop eterno acá
  30.  
  31. Escribe_Eeprom
  32.         BSF STATUS,RP1
  33.         BSF STATUS,RP0
  34.         BTFSC EECON1,WR
  35.         GOTO $-1
  36.  
  37.         BCF STATUS,RP1
  38.         BCF STATUS,RP0
  39.         MOVF DATA_EE_ADDR,W
  40.         BSF STATUS,RP1
  41.         MOVWF EEADR
  42.  
  43.         BCF STATUS,RP1
  44.         MOVF DATA_EE_DATA,W
  45.         BSF STATUS,RP1
  46.         MOVWF EEDATA
  47.  
  48.         BSF STATUS,RP0
  49.         BCF EECON1,EEPGD
  50.  
  51.         BSF EECON1,WREN
  52.         BCF INTCON,GIE
  53.         MOVLW 55h
  54.         MOVWF EECON2
  55.         MOVLW 0xAA
  56.         MOVWF EECON2
  57.         BSF EECON1,WR
  58.  
  59.         BSF INTCON,GIE
  60.         BTFSC EECON1,WR      ;Esperar a que finalice la escritura....
  61.         GOTO $-1
  62.  
  63.         BCF EECON1,WREN
  64.         BCF STATUS,RP1
  65.         BCF STATUS,RP0
  66.         RETURN
  67.  
  68. Lee_Eeprom
  69.         BCF STATUS,RP1
  70.         BCF STATUS,RP0
  71.         MOVF DATA_EE_ADDR,W
  72.         BSF STATUS,RP1
  73.         MOVWF EEADR
  74.  
  75.         BSF STATUS,RP0
  76.         BSF EECON1,EEPGD
  77.  
  78.         BSF EECON1,RD
  79.         BCF STATUS,RP0
  80.         MOVF EEDATA,W
  81.         BCF STATUS,RP1
  82.         BCF STATUS,RP0
  83.         RETURN 
  84.  
  85.         INCLUDE <Retardos.inc>
  86.         END

No lo probés así que puede que no funcione.

Saludos.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado Oscarinv

  • PIC10
  • *
  • Mensajes: 8
Re: ¿Como grabar la eeprom interna del PIC16F877A?
« Respuesta #2 en: 14 de Junio de 2009, 20:13:43 »
Gracias BrunoF, realmente estaba perdido con eso de los registros de propósito general y especiales. Yo pensaba que se podían declarar constantes con EQU.

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ¿Como grabar la eeprom interna del PIC16F877A?
« Respuesta #3 en: 14 de Junio de 2009, 20:31:28 »
Gracias BrunoF, realmente estaba perdido con eso de los registros de propósito general y especiales. Yo pensaba que se podían declarar constantes con EQU.
Si se pueden declarar Constantes: Valor  equ  75 y cuando lo uses realizalo por ejemplo así: movlw Valor ; 75 -> Wreg
No contesto mensajes privados, las consultas en el foro

Desconectado Oscarinv

  • PIC10
  • *
  • Mensajes: 8
Re: ¿Como grabar la eeprom interna del PIC16F877A?
« Respuesta #4 en: 14 de Junio de 2009, 21:10:20 »
Umm, ya estoy un poco confundido Suky, ¿Entonces se pueden declarar constantes poniendo solo el valor? y posiciones de memoria utilizando hexadecimal, binario o decimal?

Por ejemplo si pongo:

valor EQU 5 ; ¿Sería lo mismo que poner?
valor EQU 0x05
valor EQU b'00000101'

¿y que estoy haciendo?

1.- Le doy valor 5 a valor y no afecto al registro especial PORTA
ó
2.- Configuro el PORTA con ese valor

¿Espero que me haya dado a entender?
« Última modificación: 14 de Junio de 2009, 21:21:29 por Oscarinv »

Desconectado Suky

  • Moderador Local
  • DsPIC33
  • *****
  • Mensajes: 6758
Re: ¿Como grabar la eeprom interna del PIC16F877A?
« Respuesta #5 en: 14 de Junio de 2009, 21:21:35 »
Puedes colocarlo en decimal, hexadecimal o binario, y también asignarlo un 5. Pero esta claro que esa definición que has realizado es una constante y si la usas de manera correcta no afectará a PORTA.
No contesto mensajes privados, las consultas en el foro

Desconectado Oscarinv

  • PIC10
  • *
  • Mensajes: 8
Re: ¿Como grabar la eeprom interna del PIC16F877A?
« Respuesta #6 en: 14 de Junio de 2009, 21:27:21 »
Gracias Suky  :).


 

anything