Escrito originalmente por evolutionzxb
hola amigos tengo unas cuantas preguntas que hacer
1. como le hago para manejar la Eeprom del 16f84 (quiero checar si en la posicion 0X00) osea en el Byte 0 de la Eeprom hay un 0xFF
la Eeprom la llendo de la siguiente manera
org 2100
DE 0xFF,0xAA,0XAA,0xAA,0xAA,0xAA,0xAA,0xAA
DE 0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB,0xBB
ahora en este ejemplo en el Byte 0 de la Eprom tengo FF y lo que quiero hacer es que cuando en la posicion del Byte 0 de la Eeprom haiga FF del Byte 16 al Byte 64 se llene de FF
ahora solo se hacerlo de la siguiente manera y es como estar haciendolo manual muchas veces por eso quiero que me ayuden con una rutina tipo while o de bucle en c para llenar la Eeprom
asi es como lo se hacer:
MOVLW 0xFF
MOVWF EEDATA ;se carga EEDATA
MOVLW 0x16 ;se carga la direcion
MOVWF EEADR ;EEADR apunta a la dir 0x16
CALL Eeprom ;rutina
MOVLW 0xFF
MOVWF EEDATA ;EEDATA= 0xFF
INCF EEADR ;incremento (16+1)
CALL Eeprom ;rutina
Eeprom bsf ESTADO,RP0 ; Guarda el bit en la eeprom
bsf EECON1,WREN
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
Wcomp btfss EECON1,EEIF ; Espera a que finalize la operacion de
goto Wcomp ; esritura
bcf EECON1,EEIF
bcf EECON1,WREN
bcf ESTADO,RP0 ;Bank 0
return
en este ejemplo solo lleno los campos 16 y 17 de le Eeprom los pongo a FF esa rutina seria demasiado larga si quiero llenar desde el 16 al 64 por eso les digo que como lo hago para meterla a un bucle n veces para que llene la Eeprom
?
???????????????
Un bucle en C tipo while o loop hara exactamente lo mismo, la cuestion es que a ti t falta codigo en esta rutina:
Codigo:
MOVLW 0xFF
MOVWF EEDATA ;se carga EEDATA
MOVLW 0x16 ;se carga la direcion
MOVWF EEADR ;EEADR apunta a la dir 0x16
next_b CALL Eeprom ;rutina
incf eeadr, f ;incrementa la direccion
movf eeadr, w ;verifica si la direccion llego a 64
xorlw .64
btfss status, z ;EEADR = 64??
goto next_b ;NO: Continua con el sig byte
return ;SI: Sale de la rutina
la parte en negrita es la parte q necesitas agregar a tu codigo, este bloque solo es necesario una vez por lo que tu programa lucira:
Codigo:
MOVLW 0xFF
MOVWF EEDATA ;se carga EEDATA
MOVLW 0x16 ;se carga la direcion
MOVWF EEADR ;EEADR apunta a la dir 0x16
next_b CALL Eeprom ;rutina
incf eeadr, f ;incrementa la direccion
movf eeadr, w ;verifica si la direccion llego a 64
xorlw .64
btfss status, z ;EEADR = 64??
goto next_b ;NO: Continua con el sig byte
return ;SI: Sale de la rutina
Eeprom bsf ESTADO,RP0 ; Guarda el bit en la eeprom
bsf EECON1,WREN
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
Wcomp btfss EECON1,EEIF ; Espera a que finalize la operacion de
goto Wcomp ; esritura
bcf EECON1,EEIF
bcf EECON1,WREN
bcf ESTADO,RP0 ;Bank 0
return
bueno lo q podemos hacer es cargar el registro eedata con el dato q necesitemos y ejecutar la rutina de esta forma:
1) Leemos el dato en la posicion 00h
2) Si el dato es =EEh entonces el nuevo dato es FFh sino 00h
3) Ejecutar rutina de escritura
Resumiendo iria asi:
Codigo:
comp_e movf eedata, w
xorlw 0xeeh
btfss status, z
goto noigual
movlw 0xff
goto ee_fill
noigual movlw 0x00h
ee_fill MOVWF EEDATA ;se carga EEDATA
MOVLW 0x16 ;se carga la direcion
MOVWF EEADR ;EEADR apunta a la dir 0x16
next_b CALL Eeprom ;rutina
incf eeadr, f ;incrementa la direccion
movf eeadr, w ;verifica si la direccion llego a 64
xorlw .64
btfss status, z ;EEADR = 64??
goto next_b ;NO: Continua con el sig byte
return ;SI: Sale de la rutina
Eeprom bsf ESTADO,RP0 ; Guarda el bit en la eeprom
bsf EECON1,WREN
movlw 0x55
movwf EECON2
movlw 0xAA
movwf EECON2
bsf EECON1,WR
Wcomp btfss EECON1,EEIF ; Espera a que finalize la operacion de
goto Wcomp ; esritura
bcf EECON1,EEIF
bcf EECON1,WREN
bcf ESTADO,RP0 ;Bank 0
return
Esta rutina asume que ya has leido la memoria eeprom y el dato recien leido esta en eedata, lo q hace entonces es cargar el dato actual de eedata en w, luego escribe 0x00h en eedata, entonces se compara el registro W con 0xeeh, si el dato diferente entonces se sale de la rutina con el dato 0x00h listo en eedata, si es igual entonces se escribe 0xffh en eedata y sale de la rutina.
Uniendo