Autor Tema: Problema con Row Erase en 18F6722  (Leído 2365 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Problema con Row Erase en 18F6722
« 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.

Código: [Seleccionar]
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

Código: [Seleccionar]

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.

Desconectado Sispic

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
Re: Problema con Row Erase en 18F6722
« Respuesta #1 en: 30 de Abril de 2007, 16:03:29 »
Yo interpreo que :

Step 4: Repeat step 3, with address pointer incremented by 64 until all rows are erased.

Código: [Seleccionar]

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;

}

« Última modificación: 30 de Abril de 2007, 16:07:30 por Sispic »

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: Problema con Row Erase en 18F6722
« Respuesta #2 en: 30 de Abril de 2007, 16:45:59 »
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.

Desconectado Sispic

  • Moderador Local
  • PIC24H
  • *****
  • Mensajes: 1685
    • winpic800
Re: Problema con Row Erase en 18F6722
« Respuesta #3 en: 01 de Mayo de 2007, 02:43:56 »
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

Desconectado omix

  • Colaborador
  • PIC16
  • *****
  • Mensajes: 244
Re: Problema con Row Erase en 18F6722
« Respuesta #4 en: 01 de Mayo de 2007, 06:30:39 »
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.