Antes de ver cual es el problema del programa, vamos a cambiar un par de cosas del mismo. Voy a tirar todas las ideas medias sueltas, vos tenes que organizarlas lueg.
De paso introducimos algunas otras cosas
Esto no posee sentido:
;---macros--banco---
BANCO0 MACRO
BCF STATUS,RP0
BCF STATUS,RP1
ENDM
BANCO1 MACRO
BSF STATUS,RP0
BCF STATUS,RP1
ENDM
BANCO2 MACRO
BCF STATUS,RP0
BSF STATUS,RP1
ENDM
BANCO3 MACRO
BSF STATUS,RP0
BSF STATUS,RP1
ENDM
El mismo compilador posee una pseudo-instruccion que luego la reemplaza por eso, haciendo lo mismo que la macro. Como se usa ?
Primero usas BANKSEL y luego le decis el nombre de algun registro que este en el banco que deseeas. ejemplo, si quiero ir al banco 2 por que ahi esta EEADR y EEDAT, hago:
Luego el compilador va a reemplazar ese BANKSEL por sus respectivos BSF/BCF, y vos te simplficas la vida.
Otro de los cambios que propongo es hacer una subrutina de escritura y una de lectura. Veo que lo hiciste con la escritura, pero veo un problema.
Cuando usas un CALL, si o si deberia haber un RETURN para que vuelva de ese CALL. Algo asi:
; Subrutina de escritura de EEPROM
;
; Entrada:
; - Direccion en el registro EEADR (Banco 2)
; - Dato en el registro EEDAT (Banco 2)
;
; Retorna:
; - Nada
EEPROM_ESCRITURA:
BANKSEL EECON1 ; banco 3
BCF EECON1,EEPGD ; limpio el bit EEPGD
BSF EECON1,WREN ; habilito la escritura
BCF INTCON,GIE ; deshabilito interrupciones
;secuencia requerida
MOVLW h'55'
MOVWF EECON2
MOVLW h'AA' ;AAh=170 en decimal o 10101010
MOVWF EECON2
BSF EECON1,WR
vacio
BTFSC EECON1,WR
GOTO vacio ; ENTRA AQUI SI aun no ha terminado de escribirse
;BSF INTCON,GIE ; habilito interrupciones si voy a utilizar
BCF EECON1,WREN ; debo limpiar el bit WREN
RETURN
; Subrutina de lectura de EEPROM
;
; Entrada:
; - Direccion en el registro EEADR (Banco 2)
;
; Retorna:
; - Valor de la EEPROM en W
EEPROM_LEER
BANKSEL EECON1 ;Banco 3
BCF EECON1,EEPGD
BSF EECON1,RD ;HABILITA EL BIT 0 (RD) DEL REGISTRO EECON1
BANKSEL EEDATA
MOVF EEDATA,W ;TRANSFIERE EL DATO EN EEDATA A W
RETURN
Observaras que quite TODO lo que es guardar el dato y la direccion dentro de estas rutinas, ya que esos datos van a variar ahora.
Entonces tu codigo si quisieras escribir y luego leer seria asi:
; Se que EEADR comienza en 0, asi que no lo cargo
BANKSEL EEDAT ; Banco 1
MOVLW COUNT ; Dato a escribir
MOVWF EEDATA ; escribo el dato
CALL EEPROM_ESCRITURA
;Ahora procedo a leer, ya escribi, y no hace falta escribir de nuevo EEADR, ya que antes ya lo elegi
CALL EEPROM_LEER ; Leo y el resultado va a W
MOVWF PORTD ; De W lo paso a PORTD
Ahora si vamos al programa en si,
cada q pulse un boton en el RB0 la direccion se incremente y escriba en la siguiente direccion pero lo he probado y no entiendo xq no pasa eso
Esto puede ser un problema... El decir cada ves que persione implica que esa presion puede ser de 1ms, 10ms o tal ves 5s. Esto puede traer problemas ya que al ser tan rapido el micro, en 10ms tal ves pase 100 veces por el codigo. Entonces es una ruleta lo que estas jugando.
Entonces existen 2 formas de poder proceder de una manera "sencilla" para hacer esto.
- La primera es preguntar por el pin, y bloquear el programa hasta que se suelte. Esto implica que el programa se queda encerrado en un loop. Asi:
INICIO:
BTFSS PORTB, 0 ; Si esta en 1 hace el codigo, sino sigue preguntando
GOTO INICIO
; Aca el codigo
ENCIERRO:
BTFSC PORTB, 0 ; Mientras se mantenga en 1 se queda encerrado aca, asi
GOTO ENCIERRO
GOTO INICIO
- La segunda, sin activar interrupciones, es configurar al RB0 para flanco ascendente, antes del loop principal pones a 0 el flag de RB0/INT, y preguntas por si esta en 1, cuando este en 1 ejecutas el codigo y lo pones a 0 al flag, solo se va a poner a 1 cuando vos presiones de nuevo. Esto es por FLANCO, el anterior es por NIVEL.
La inicializacion quedaria asi:
ORG 0x00 ; Vector de reset
GOTO CONFIGURACION
ORG 0x04 ; Vector de interrupcion
GOTO RETURN
CONFIGURACION:
;configuracion de puertos
CLRF PORTC ; Limpia PORTC
CLRF PORTD
CLRF PORTB
BANKSEL TRISA ; Banco 1
MOVLW b'00000000'
MOVWF TRISD
MOVLW b'11111111'
MOVWF TRISB
CLRF TRISC ; PortC0 Salidas
BANKSEL EEADR ;Banco 2
CLRF EEADR ;Inicializo el registro a 0
BANKSEL PORTA ;Banco 0
INICIO:
;Aca vas a poner tu codigo
GOTO INICIO
Que es lo que debo agregar para que incremente la direccion?
Solo debo agregar esto, cuando se presione el boton:
BANKSEL EEADR
INCF EEADR, F
Te respondo otra cosa:
me di cuenta haciendo el debug que al moemento de mover mi variable q se llama DIR a EEADR se mueve la direccion mas no el valor
Cuando definis algo con CBLOCK o EQU, le asignas un valor, una constante. Y luego depende de que instrucciones usas ejemplo,
Ahi lo que haces es lo mismo que
Ya que DIR es una constante igual a 0x22.
El problema esta en la instruccion, si usas MOVLW, el 0x22 es un literal y eso se copia a W, es decir W = 0x22
Si usas MOVF 0x22, le estas diciendo al micro que busque en la direccion 0x22 de la RAM (el contenido de DIR )
Ahi esta tu error. Ojo que 0x22 esta en el banco 0, mientras que las demas estan en el banco 2.