TODOPIC
Microcontroladores PIC => Programadores => Mensaje iniciado por: omix en 30 de Abril de 2007, 15:16:27
-
Hola a todos, tengo un problemita un tanto extraño. Estoy intentando implementar el metodo de borrado de la flash de un 18F6722 por el método de single row erase, para poder borrar la flash con voltajes mejores de 4.5v. He implementado el algoritmo que dice el documento de programming specification del 18F6722 y no hay manera de que funcione bien del todo.
El problema es el siguiente, segun el algoritmo en cada pasada se borra el bloque de 64bytes al que el TBLPTR apunta, para ello tengo un blucle donde se va cargando en el TBLPTR la dirección del sisguiente bloque a borrar, pero no borra todos los bloques, me borra los bloques de las direcciones 0, 128, 256, etc (bloque si bloque no). Para colmo si en vez de empezar a borrar en la dirección 0 empiezo en la 64, me borra los bloques de las direcciones 64, 192, 320, etc (bloque no bloque si), con lo cual ya estoy desquiciado por que no se que es lo que pasa y le he dado miles de vueltas al código y esta igual que dice el pdf.
Codigo a ejecutar según el pdf de microchip.
Step 1: Direct access to code memory and enable writes.
BSF EECON1, EEPGD
BCF EECON1, CFGS
BSF EECON1, WREN
Step 2: Point to first row in code memory.
CLRF TBLPTRU
CLRF TBLPTRH
CLRF TBLPTRL
Step 3: Enable erase and erase single row.
BSF EECON1, FREE
BSF EECON1, WR
NOP – hold PGC high for time P9 and low for time P10.
Step 4: Repeat step 3, with address pointer incremented by 64 until all rows are erased.
Mi codigo, modificado para cargar en cada pasada en TBLPTR la dirección del bloque a borrar
Step 1: Direct access to code memory and enable writes.
BSF EECON1, EEPGD
BCF EECON1, CFGS
BSF EECON1, WREN
Step 2: Point to first row in code memory.
MOVLW addr<21:16>
MOVWF TBLPTRU
MOVLW addr<15:8>
MOVWF TBLPTRH
MOVLW addr<7:0>
MOVWF TBLPTRL
Step 3: Enable erase and erase single row.
BSF EECON1, FREE
BSF EECON1, WR
NOP – hold PGC high for time P9 and low for time P10
Step 4: addr = addr + 64, y repetir los pasos 2 a 4, mientras queden bloques por borrar
Agradeceria una manita de alguien que sepa algo o lo haya implementado.
Saludos.
-
Yo interpreo que :
Step 4: Repeat step 3, with address pointer incremented by 64 until all rows are erased.
Addr=??????;
addr_final=????;
Step 1: Direct access to code memory and enable writes.
BSF EECON1, EEPGD
BCF EECON1, CFGS
BSF EECON1, WREN
Step 2: Point to first row in code memory.
MOVLW addr<21:16>
MOVWF TBLPTRU
MOVLW addr<15:8>
MOVWF TBLPTRH
MOVLW addr<7:0>
MOVWF TBLPTRL
while(addr < addr_final){
Step 3: Enable erase and erase single row.
BSF EECON1, FREE
BSF EECON1, WR
NOP
Start Erase Sequence and Hold PGC High for Time P9
Hold PGC Low for Time P10
Addr=addr+64;
}
-
Hola Sispic, esa opcion tambien la habia probado pensando en que el TBLPTR se autoincrementaba el solo, pero no es asi, de esa forma solo se borra el primer bloque de 64bytes, ya que el TBLPTR siempre apunta a la dirección 000000h.
Un saludo y gracias por la respuesta.
-
Microchip suele tener muchos errores en sus Data Sheet .
Yo les preguntaria haver que dicen .
http://support.microchip.com/scripts/slxweb.dll/external?name=webticketcust
De lo contrario deveras inventarlo , aumentar tiempos etc .
saludos
-
Gracias de nuevo por tu respuesta Sispic. Al final he conseguido solucionarlo añadiendo un NOP adicional al final del paso 3, ya que he visto que en el caso del bulk erase se tienen que ejecutar dos NOPs y me ha dado por probar. Al ver que de esta forma si funcionaba pensaba que era culpa de los tiempos de espera P9 y P10, pero parece que no es asi, pues los he incrementado y continuaba pasando lo mismo. A si que de momento se quedará con el NOP adicional.
Un saludo.