TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: FER_CBA en 04 de Diciembre de 2007, 13:10:04
-
Buenas, estoy probando por primera vez grabar en la eeprom interna de un 16F877 en assembler. los registros q estan en el banco 0 los pude grabar perfectamente por direccionamiento indirecto, peor los que se encuentran en el banco 2 no. Estoy usando los 96 bytes de registros del banco 2. Si no me equivoco el problema viene por la direccion de estos registros que comienzan en 0x110 y sobreasa la capacidad del FSR. probe tambien cargar el FSR con 0x10 (es la equivalente a 0x110 del banco 0), pero ademas poniendo IRP a 1 y FSR, 7 a 0, peor tampoco lo consigo.
No encuentro mas documentacion sobre como hacerlo y copiar el contenido de cada registro a EEDATA genera una rutina muy larga si no es por direccionamiento indirecto. Desde ya muchas gracias.
-
Hola, las declare con
cblock 0x0110
REGISTRO1
REGISTRO2
REGISTRO3
endc
Yo probe con pasarle la dir 0x110 a al FSR pero el mplab me avisa que sale de rango
-
Les dejo las rutinas de grabacion para ver si se encuentra algun error. La rutina GRABAR es la que deberia copiar los registros del banco 2 a la eeprom , desde 0x110 hasta el final del banco.
La rutina GRABARB0 es la que funciona, y copia los registros restantes q deseo guardar, q estan en el banco 0 a la eeprom, esa funciona ok. Indudablemente no esta leyendo los tados del banco 2 me imagino.
-
;-------------------------------------------------------------------------------------
; Rutinas para cambiar de bancos
;-------------------------------------------------------------------------------------
BANCO0 bcf STATUS,RP0 ;
bcf STATUS,RP1 ;
return ;
BANCO1 bsf STATUS,RP0 ;
bcf STATUS,RP1 ;
return ;
BANCO2 bcf STATUS,RP0 ;
bsf STATUS,RP1 ;
return ;
BANCO3 bsf STATUS,RP0 ;
bsf STATUS,RP1 ;
return ;
;-------------------------------------------------------------------------------------
; Rutinas para grabar en EEPROM
;------------------------------------------------------------------------------------
GRABAR call BANCO0 ;
movlw .94 ;
movwf CONTA_EE ;Cargo el contador para grabar
clrf DIR_EE ;
call BANCO2 ;
movlw 0x10 Copio la direccion del registro a W
movwf FSR ;
REPETIR bsf STATUS, IRP ;
bcf FSR,7
call BANCO3 ;
ESPERAR btfsc EECON1, WR ;Verifico si termino de grabar
goto ESPERAR ;Espero a que termine de grabar
call BANCO0 ;
movf DIR_EE,w ;Copio la direccion de la EEPROM en donde voy a
call BANCO2 ;grabar el dato.
movwf EEADR ;Cargo la direccion al registro
movf INDF,w ;Muevo el
movwf EEDATA ;
call BANCO3 ;
bcf EECON1, EEPGD ;Indico que voy a grabar en EEPROM
bsf EECON1, WREN ;Habilito la escritura
bcf INTCON, GIE ;Deshabilito las interrupciones
movlw 0x55 ;Ingreso la clave para grabar
movwf EECON2 ;
movlw 0xAA ;Ingreso la clave para grabar
movwf EECON2 ;
bsf EECON1, WR ;Comenzo la grabacion
bsf INTCON, GIE ;Habilito las interrupciones
decfsz CONTA_EE,1 ;
goto FALTA ;Sigo con el banco 2
goto GRABARB0 ;Terminne con los registros del banco 2
FALTA call BANCO0 ;
incf DIR_EE,1 ;Incremento la direccion de la EEPROM
;call BANCO2 ;
incf FSR,1 ;Incremento la direccion
goto REPETIR ;
GRABARB0 call BANCO0 ;
movlw .32 ;
movwf CONTA_EE ;Cargo el contador para grabar
movlw .94 ;
movwf DIR_EE ;
bcf STATUS, IRP
;call BANCO0 ;
movlw MOLDE48_A ;Copio la direccion del registro a W
movwf FSR ;
REPETIRB0 bcf FSR,7
bcf STATUS, IRP
call BANCO3 ;
ESPERARB0 btfsc EECON1, WR ;Verifico si termino de grabar
goto ESPERARB0 ;Espero a que termine de grabar
call BANCO0 ;
movf DIR_EE,w ;Copio la direccion de la EEPROM en donde voy a
call BANCO2 ;grabar el dato.
movwf EEADR ;Cargo la direccion al registro
movf INDF,w ;Muevo el
movwf EEDATA ;
call BANCO3 ;
bcf EECON1, EEPGD ;Indico que voy a grabar en EEPROM
bsf EECON1, WREN ;Habilito la escritura
bcf INTCON, GIE ;Deshabilito las interrupciones
movlw 0x55 ;Ingreso la clave para grabar
movwf EECON2 ;
movlw 0xAA ;Ingreso la clave para grabar
movwf EECON2 ;
bsf EECON1, WR ;Comenzo la grabacion
bsf INTCON, GIE ;Habilito las interrupciones
decfsz CONTA_EE,1 ;
goto FALTAB0 ;Sigo con el banco 2
call BANCO0 ;
return ;
FALTAB0 incf FSR,1 ;Incremento la direccion
call BANCO0 ;
incf DIR_EE,1 ;Incremento la direccion de la EEPROM goto REPETIRB0 ;