Autor Tema: Problemas para leer y escribir EEPROM de un PIC16F877A  (Leído 6682 veces)

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

Desconectado Loudness

  • PIC16
  • ***
  • Mensajes: 147
Problemas para leer y escribir EEPROM de un PIC16F877A
« en: 03 de Julio de 2012, 10:40:53 »
Me rindo :oops:. Estre unas cosas y otras estoy a punto de rendirme con esto de los pics. Os cuento:

OBJETIVO: Estoy intentado hacer pruebas con la EEPROM de un 16F877A. Para ello he escrito un programa en assembler (ni idea de c) que incrementa un registro (CONTADOR) cada vez que un pulsador (PORTC ,0) es accionado. El resultado de este registro se visualiza por un LCD (PORTD). Cada vez que el pulsador se acciona y se incrementa el registro, este deberia guardarse en la posicion 0x00 de la eeprom para que cuando el PIC se encienda otra vez despues de un reset o un apagado no se pierda el numero de veces.

PROBLEMA: EL pulsador funciona, y cada vez que se pulsa se ve el incremento en la pantalla... el caso es que el resultado no se guarda en la eeprom asi que cuando reseteo, el contador esta a cero :shock:  Probando en el simulador del MPLAB parece que la cosa no va mal (a lo mejor me equivoco en la forma de probar) pero probado con proteus y en un protoboard no funciona.....

He probado con las rutinas que vienen en el datasheet de microchip, con las del libro de pic16f84 (desarrollo de proyectos) intentando adaptarlas, con otras que encontre en el almacen del assembler y hasta me anime a escribir las mias propias..... nada, que no lo consigo. Cada vez que reseteo se pone a cero :?

Se que es Julio y la gente ya esta de vacaciones pero si hay alguien por aqui le agradecere cualquier ayuda o consejo. Adjunto el programa:



   LIST      P=16F877A
   INCLUDE      <P16F877A.INC>
   
   __CONFIG    _CP_ALL & _DEBUG_OFF & _WRT_OFF & _CPD_ON & _LVP_OFF & _BODEN_ON & _HS_OSC & _WDT_OFF & _PWRTE_ON

CONTADOR         equ      0x049      
EEPROM_GuardaINTCON   equ      0x04A

#DEFINE   Pulsador   PORTC, 0         

V_RESET      org          0x000
         nop
         nop
             goto         main

main   bcf      STATUS,   RP0
      clrf   PORTC
      clrf   PORTD
      bsf      STATUS,   RP0
      clrf   PORTD
      movlw   b'11111111'
      movwf   PORTC
      bcf      STATUS, RP0

;****************************** INICIO *********************************

Inicio   
      call      LCD_Inicializa
      movlw      0x00            ;carga la posicion de memoria donde esta el dato
      call      EEPROM_LeeDato      ;lee el dato y lo trae a w
      movwf      CONTADOR         ;mueve el dato al registro contador
      call       LCD_Linea1   
      movfw      CONTADOR
      clrf      NumH
      movwf      NumL
      call       LCD_Dec      
      movfw      Tenk
      call      LCD_Caracter
      movfw      Thou   
      call       LCD_Caracter   
      movfw      Hund
      call       LCD_Caracter
      movfw      Tens
      call       LCD_Caracter
      movfw      Ones
      call       LCD_Caracter

Principal
      btfss   Pulsador            ; Lee el pulsador.
      call   IncrementaVisualiza      ; Salta a incrementar y visualizar el contador.
      goto   Principal

IncrementaVisualiza
      call   Retardo_20ms
      btfsc   Pulsador
      goto   Fin_Visualiza
      call       LCD_Linea1   
      incf   CONTADOR,F   
      movfw      CONTADOR
      clrf      NumH
      movwf      NumL
      call       LCD_Dec      
      movfw      Tenk
      call      LCD_Caracter
      movfw      Thou   
      call       LCD_Caracter   
      movfw      Hund
      call       LCD_Caracter
      movfw      Tens
      call       LCD_Caracter
      movfw      Ones
      call       LCD_Caracter         ; Incrementa el contador y lo visualiza.
Visualiza
      movlw   b'00000000'
      movwf   EEADR               ; datos donde se guarda el turno. En este caso en
      movfw   CONTADOR            ; la posici 00h de la EEPROM.
      call   EEPROM_EscribeDato
EsperaDejePulsar
      btfss   Pulsador
      goto   EsperaDejePulsar
Fin_Visualiza
      return

;***********************************RUTINAS PARA LA MEMORIA EEPROM**************************************
;************************************RUTINA DE LECTURA**************************************************
; Entrada: En (W) la direcci de la memoria EEPROM a leer.
; Salida :  En (W) el byte le冝o.
EEPROM_LeeDato
   bsf      STATUS, RP1
   bcf      STATUS, RP0         ; Asegura que trabaja con el Banco 0.
   movwf   EEADR            ; Direcci a leer.
   bsf      STATUS,RP0         ; Banco 1.
   bcf      EECON1,EEPGD
   bsf      EECON1,RD         ; Orden de lectura.
EEPROM_SigueLeyendo
   btfsc   EECON1,RD         ; El PIC indica que ha terminado la lectura
   goto   EEPROM_SigueLeyendo   ; poniendo en bajo este bit.
   bcf      STATUS,RP0         ; Banco 0.
   movf   EEDATA,W         ; El byte le冝o al registro W.
   bcf      STATUS,RP1
   return

;*************************************RUTINA DE ESCRITURA**********************************************
; Entradas:   En el registro EEADR la direcci de la memoria EEPROM a escribir.
;      En el registro W el byte a escribir.
;
EEPROM_EscribeDato
   bsf      STATUS,RP1
   bcf      STATUS,RP0         ; Asegura que trabaja con el Banco 0.
   movwf   EEDATA            ; El byte a escribir.
   bcf      STATUS,RP1
   movlw   b'00000100'
   bsf      STATUS,RP1
   movwf   EEADR
   bsf      STATUS,RP0
   bcf      EECON1, EEPGD
   bsf      EECON1,WREN         ; Habilita escritura.
   movlw   0x55
   movwf   EECON2
   movlw   0xAA
   movwf   EECON2
   bsf      EECON1,WR         ; Inicia la escritura.
;   movf   INTCON,W         ; Reserva el valor anterior de INTCON
;   movwf   EEPROM_GuardaINTCON
DES   btfsc   EECON1,WR         ; Comprueba que termina de escribir en la EEPROM.
   goto   DES
   goto   EEPROM_TerminaEscribir

;   bsf      STATUS,RP0         ; Acceso al Banco 1.
;   bcf      INTCON,GIE         ; Deshabilita todas las interrupciones.

EEPROM_TerminaEscribir
   bcf      EECON1,WREN         ; Desautoriza la escritura en EEPROM.
;   bcf      EECON1,EEIF         ; Limpia este flag.
   bcf      STATUS,RP0         ; Acceso al Banco 0.
   bcf      STATUS,RP1
;   movf   EEPROM_GuardaINTCON,W ; Restaura el valor anterior de INTCON.
;   movwf   INTCON
   return

   #INCLUDE  <LCD_4BIT.INC>         
   #INCLUDE  <RETARDOS.INC>
   #INCLUDE  <BIN_DEC.INC>

   END                        


Si es necesario os puedo enviar las rutinas <LCD_4BIT>, <BIN_DEC> y <RETARDOS>, pero siempre utilizo las mismas y hasta ahora ningun problema asi que de momento no las pongo.

Gracias por adelantado.
Saludos.

Desconectado CRISTOBALMUNOZ

  • PIC10
  • *
  • Mensajes: 2
Re: Problemas para leer y escribir EEPROM de un PIC16F877A
« Respuesta #1 en: 24 de Enero de 2015, 23:47:13 »
Prueba apagando los bits de proteccion de escritura en EEPROM, que tienes prendidos.
Suertehttp://www.todopic.com.ar/foros/Smileys/default/bounce.gif


 

anything