TODOPIC
Microcontroladores PIC => Primeros pasos - Iniciación a los microcontroladores => Mensaje iniciado por: Loudness 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.
-
Prueba apagando los bits de proteccion de escritura en EEPROM, que tienes prendidos.
Suertehttp://www.todopic.com.ar/foros/Smileys/default/bounce.gif