Autor Tema: grabar datos en la memoria flash del 877A  (Leído 5986 veces)

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

Desconectado marcelo_gre

  • PIC10
  • *
  • Mensajes: 19
grabar datos en la memoria flash del 877A
« en: 09 de Diciembre de 2005, 22:02:00 »
tengo un problema grabndo datos en la memoria flash del pic 16f877A, copie la rutina del datasheet 16f87X, y me funciona muy bien en el 877 activando el bit WRT de la palbra de configuracion al momento de grabar, pero en el 877A no funciona (no activo ningun bit en la palabra de configuracion), lo unico que logro es q mi pic se cuelgue...... a q se debe esta diferencia??? y pq en la hora de gabar la las opciones del la palabr de configuracion son diferentes para el 877 y para el 877A (mi programa para grabar es el winpic 800 y el grabador es el GTP macho).

gracias de antemano

Desconectado pietrodilaccua

  • PIC10
  • *
  • Mensajes: 46
RE: grabar datos en la memoria flash del 877A
« Respuesta #1 en: 12 de Diciembre de 2005, 18:42:00 »
HOLA MARCELO: SI NO HAS RESUELTO TU PROBLEMA TE INDICO LO SGTE:
LAS PALABRAS DE CONFIGURACION DEL 877 Y LAS DEL 877A SON DISTINTAS. ESTO ULTIMO LO ENCUENTRAS EN EL DATA SHEET DEL 16F877A EN LA WEB DE MICROCHIP.
EN TODO CASO PRUEBA CARGANDO LA PALABRA "3F72HX" EN LA POSICION DE MEM "2006HX" LUEGO DE DECLARAR EL PROCESADOR AL INICIO DEL PROGRAMA. ESTO CONFIGURA AL CHIP PARA 20MHZ Y DESPROTEGE LA EEPROM  Y LA FLASH. CON EL ENSAMBLADOR MPASM SE HACE CON LA DIRECTIVA "CONFIG"
                          LISTP=16F877A
                     __CONFIG     OX3F72  ; (DOBLE GUION BAJO SEGUIDO DE CONFIG)
LO OTRO IMPORTANTE ES QUE LAS DIRECCIONES "EEADR" Y EEADRH" PARA LA MEM FLASH SE CARGAN EN EL BANCO 2 , PERO W DEBES CARGARLO EN EL BANCO 0, A DIFERENCIA DE EL 877 QUE W LO CARGAS EN EL MISMO BANCO 2: EJ

WRFLASH                                        ; ESTAMOS EN BANCO 0

                   MOVF         DIRECCIONBAJA,W
                   BSF            STATUS,RP1               ; BANCO 2
                   MOVWF      EEADR                    
                   BCF            STATUSRP1               ; BANCO 0
                   MOVF         DIRECCIONALTA,W
                   BSF            STATUS,RP1              ; BANCO 2
                   MOVWF      EEADRH                  

LO MISMO CON EL REGISTRO DE DATOS Y LUEGO CONTINUAS CON LA SECUENCIA NORMAL DE GRABACION DE LA FLASH. TAMBIEN SE REPITE ESTO PARA LEER LA MEM.

AHORA ::::: ¿¿¿¿¿POR QUE OCURRE ESTO ??????......., NO TENGO LA MAS MINIMA IDEA SOLO TE CUENTO QUE TARDE 1 SEMANA INTENTANDO HACER TRABAJAR UN PROGRAMA QUE TENIA EN UN 16F874 EN UN 877A. Y CON LO ANTERIOR   FUNCIONA PERFECTAMENTE.
ESPERO TE SIRVA, ME CUENTAS

UN GRAN SALUDO     PIETRODILACCUA                      
     




Desconectado marcelo_gre

  • PIC10
  • *
  • Mensajes: 19
RE: grabar datos en la memoria flash del 877A
« Respuesta #2 en: 22 de Enero de 2006, 16:12:00 »
gracias por tu ayuda Pietro pero t comento q mi problema persiste,ya paso mas de un mes y aun no logro grabar en la memoria flash a lo mucho graba 4 u 8 words y luego se cuelga el microcontrolador.

Hice lo q dijiste arriba pero no paso absolutamente nada, pero lo extraño es que cuando borro las siguientes instrucciones el proceso de grabado funciona.

   bsf   RCSTA,CREN
   bsf    RCSTA,SPEN
No entiendo pq paso eso ya q este registro esta realcionadoa solamente con la USART.

Ya logre manejar la flash de un 877, y en datasheet de 877A dice q el proceso es similr solo q el grabado se hace de 4 en 4 words.

No se q mas hacer por favor alguien ayudeme.

Desconectado marcelo_gre

  • PIC10
  • *
  • Mensajes: 19
RE: grabar datos en la memoria flash del 877A
« Respuesta #3 en: 22 de Enero de 2006, 16:20:00 »
aqui les mando mi codigo fuente .......ayudenme a encontrar el error..


   list p=16f877A
   include<p16f877A.inc>


;///////////declaracion de variables//////////7777777

retar_20      equ   30h
retar1_20      equ   31h

direccion_EEl   EQU   0x71
dato_EEl      EQU   0x72
direccion_EEh   EQU   0x73
dato_EEh   EQU   0x74
W_Temp         equ   7Ch
Status_Temp      equ   7Dh
PClatch_Temp   equ   7Eh
FSR_Temp      equ   7Fh
   
;///////////////////////////vectores

   org 0x00
    goto inicio

   org 0x04
   goto inter
   
;configuracion de registros
inicio
   
   call   iniciar_perifericos
   call   iniciar_puertos
   call   iniciar_variables
   goto   principal

   
;programa principal

principal
   bsf      PORTB,4
   call   graba_flash

   goto   principal

;/////////////////interrupciones/////////////

inter

   movwf   W_Temp               
   swapf   STATUS,w            ;Intercambiar STATUS guarda en w
   clrf   STATUS               ;va al banco 0
   movwf   Status_Temp            ;lleva el valor de w a Status_Temp
   movf    PCLATH,w      
   movwf    PClatch_Temp         ;lleva el valor de w a PClatch_Temp
   clrf   PCLATH               ;Pagina cero
   movf    FSR,w      
   movwf    FSR_Temp            ;lleva el valor de w a   FSR_Temp

;///////////////////verifica a q interrupcion ir//////////////

   
   btfsc   PIR1,TMR1IF   ;ve si es la interrupcion del timer2
   goto   intertimer1   ;va a la interrupcion del timer1

   btfsc   INTCON,INTF   ;ve si es la interrupcion externa
   goto    interext   ;va a la interrupcion externa
   
   btfsc   PIR1,TMR2IF   ;ve si es la interrupcion del timer2
   goto   intertimer2   ;va a la interrupcion del timer1
   
   btfsc   PIR1,RCIF   ;ve si es la interrupcion del puerto serial
   goto   interserial   ;va a la interrupcion del timer1

   btfsc   INTCON,T0IF   ;ve si es la interrupcion del puerto serial
   goto    intertimer0   ;va a la interrupcion del timer0

;//////////////////salida de las interrupciones///////////

fininter

   movf    FSR_Temp,w             
   movwf   FSR                ;reestablece FSR
   movf    PClatch_Temp,w          
   movwf   PCLATH                ;restablece PCLATH
   swapf   Status_Temp,w         
   movwf   STATUS               
   swapf   W_Temp,f            
   swapf   W_Temp,w            ;restablece w

   retfie

;////////////////////////interrupcion timer2////////////////
intertimer2
   
   bcf      PIR1,TMR2IF   ;limpia la bandera de la interrupcion del timer2


   goto   fininter
;////////////////////////interrupcion timer1////////////////

intertimer1
   
   bcf      PIR1,TMR1IF   ;limpia la bandera de la interrupcion del timer2







   
   goto   fininter

;////////////////////////interrupcion externa////////////////

interext

   bcf      INTCON,INTF
   
   



   goto   fininter

;///////////////////////////interrrupcion puerto serial///////////////7
interserial
   
   bcf      PIR1,RCIF
   
   
   goto   fininter
;///////////////////////////interrrupcion timer0///////////////7
intertimer0
   
   
   goto   fininter





   ;/////////////////////rituna q inicializa los perifericos/////////////////////   
iniciar_perifericos

   bcf      STATUS,RP0
   movlw   b"11010000"
   movwf   INTCON
   bsf      RCSTA,CREN
   bsf    RCSTA,SPEN
   
   bsf      STATUS,RP0         ;seleccion del banco 1
   movlw   b"00100000"   
   movwf   PIE1            ;permiso de interrupciones para el T1 y T2
   movlw   b"00011001"
   movwf   SPBRG            ;indica q la transmision serial se realiza a 9600 baudios
   bsf      TXSTA,TXEN
   bsf    TXSTA,BRGH
   bcf      OPTION_REG,INTEDG
   bcf      STATUS,RP0         ;va al banco 0
   
   return

;/////////////////////rituna q inicializa los puertos/////////////////////   

iniciar_puertos
   
   bcf      STATUS, RP0         ;va al banco 0
   clrf   PORTA            
   clrf   PORTB            
   clrf   PORTC
   clrf   PORTD            
   clrf   PORTE            
         
   bsf      STATUS, RP0         ;va al banco 1
   movlw   b"00000111"         ;RA0,RA1,RA2,RA3,RA4,RA5,RE0,RE1,RE2 digitales
   movwf   ADCON1            ;Mover el valor al registro
   movlw   b"00000100"         ;0,1,2,3 entradas 4 salida
   movwf   TRISA            
   movlw   b"11000011"         ;0,1,2,3 entradas 4,5,6,7 salidas
   movwf   TRISB            
   movlw   b"10000000"         ;0,1,2,3,4,5,6 salidas 7 entrada
   movwf   TRISC            
   movlw   b"00000000"         ;0,1,2,3,4,5,6,7 salidas  entrada
   movwf   TRISD
   movlw   b"00000000"         ;0,1,2,3,4,5,6,7 salidas  entrada
   movwf   TRISE
   bcf      STATUS,RP0

   return



;/////////////////////rituna q inicializa las variables/////////////////////   


iniciar_variables

   bcf      STATUS,RP0         ;va al banco 0
      
   movlw   0x10
   movwf   direccion_EEh   
   movlw   0x00
   movwf   direccion_EEl   
   movlw   0x00
   movwf   dato_EEh   
   movlw   0xAA
   movwf   dato_EEl


   movlw   0xFF
   movwf   retar_20
   movlw   0x50
   movwf   retar1_20
   
   return

;//////////////////////////////graba fash/////////////7
graba_flash

   ;call   retardo_20

   ;bsf      STATUS,RP1
   ;bcf      STATUS,RP0

   
   movf   direccion_EEh,w
   bsf      STATUS,RP1
   movwf   EEADRH
   bcf      STATUS,RP1
   movf   direccion_EEl,w
   bsf      STATUS,RP1
   movwf   EEADR
   bcf      STATUS,RP1
   

   movf   dato_EEh,w
   bsf      STATUS,RP1
   movwf   EEDATH
   bcf      STATUS,RP1
   movf   dato_EEl,w
   bsf      STATUS,RP1
   movwf   EEDATA
   ;bcf      STATUS,RP1

   ;bsf      STATUS,RP1
   ;bcf      STATUS,RP0



   bsf      STATUS,RP0
   bsf      EECON1,EEPGD
   bsf      EECON1,WREN
   bcf      INTCON,GIE
   movlw   0x55
   movwf   EECON2
   movlw   0xAA
   movwf   EECON2
   bsf      EECON1,WR
   nop
   nop
   nop
   bsf      INTCON,GIE
   bcf      EECON1,WREN
   bcf      STATUS,RP1
   bcf      STATUS,RP0
   incf   direccion_EEl
   

   return
;///////////////////retardo de 20ms/////////7
retardo_20

retardo22
   decfsz   retar_20
   goto   retardo22
   movlw   0xFF
   movwf   retar_20
   decfsz   retar1_20
   goto   retardo22
   movlw   0x50
   movwf   retar1_20
   return



   
   end

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: grabar datos en la memoria flash del 877A
« Respuesta #4 en: 23 de Enero de 2006, 17:38:00 »
Los pics de la familia A, graban de a 4 palabras de 14 bits por vez.  El proceso debe ser secuencial, es decir 4 words a la vez.  Luego de esto, deberás espera a que la grabacion se complete, creo que son 4 mseg o por ahí.  

En esto difiere bastante de los 7x simples.  No son iguales estos microprocesadores como muchos piensan.  De hecho esta facilidad de grabar 4 words por vez los hace mucho más veloces de ser programados.  

Otra cuestión que es IMPORTANTE es que el primer address debe ser con los dos ultimos bits en b"00"  .  Al llegar al address b"11" se inicia la secuencia de escritura.
Si no cumples con las 4 address en forma consecutiva, la grabación simplemente no se hará.  Te lo advierto porque tuve que modificar mis rutinas de autograbado de pics por esta misma razón.

Otro tema es que si no vas a grabar 4 bytes consecutivos, debes completar la secuencia de 4 bytes con reads.  Entonces si quieres grabar el 2do byte y el 1ro, 3ro y 4to dejarlo como estan, debes leer el primero, grabar el 2do y leer el 3ro y cuarto.  Todo en el mismo bucle.  Recien al salir del mismo se iniciará la grabación.  Esto es algo interno y no lo puedes modificar.

Si aún así no puedes hacer funcionar tu código (el cual no he revisado) ,  te ofrezco revisarlo pero postealo como un .asm en un archivo .zip  
Y por favor que sea un código que al menos compile Sonrisa .  Verlo así me cuesta y además tendria que indentarlo todo en mi IDE con las tabulaciones para que compile correctamente.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado marcelo_gre

  • PIC10
  • *
  • Mensajes: 19
RE: grabar datos en la memoria flash del 877A
« Respuesta #5 en: 23 de Enero de 2006, 21:15:00 »
Gracias Mauricio, segui todas tus indicaciones pero aun tengo el mismo problema, ya cambie mi codigo fuente para que la grabacion se realice secuencialmente de 4 en 4 words, ademas de empezar con la b´00´ y terminar en b´11´, pero el problema persiste solamente me graba 8 words de 14 bits y cuando coloco un retardo despues de la rutina de grabado solo me graba 4 word y despues de eso se cuelga en microcontrolador, el programa funciona bastante bien cuando deshabilito el bit RCSTA,SPEN, pero esto ademas de ilogico pq este bit es de la USART, tampoco es practico puesto q necesito el puerto serial y este bit justamente habilita el puerto serial.

Bueno te comento que no puedo subir mi archivo te agradeceria q me pases tu correo electronico para q t envie por ese medio mi codigo fuente modificado.

Gracias de antemano Marcelo

Desconectado marcelo_gre

  • PIC10
  • *
  • Mensajes: 19
RE: grabar datos en la memoria flash del 877A
« Respuesta #6 en: 23 de Enero de 2006, 21:22:00 »
Mauricio te mande mi programa a traves de unmensaje privado pq no pude subirlo mediante el foro te agradezco tu ayuda Marcelo

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: grabar datos en la memoria flash del 877A
« Respuesta #7 en: 24 de Enero de 2006, 09:57:00 »
Escrito originalmente por marcelo_gre
Gracias Mauricio, segui todas tus indicaciones pero aun tengo el mismo problema, ya cambie mi codigo fuente para que la grabacion se realice secuencialmente de 4 en 4 words, ademas de empezar con la b´00´ y terminar en b´11´, pero el problema persiste solamente me graba 8 words de 14 bits y cuando coloco un retardo despues de la rutina de grabado solo me graba 4 word y despues de eso se cuelga en microcontrolador, el programa funciona bastante bien cuando deshabilito el bit RCSTA,SPEN, pero esto ademas de ilogico pq este bit es de la USART, tampoco es practico puesto q necesito el puerto serial y este bit justamente habilita el puerto serial.

Bueno te comento que no puedo subir mi archivo te agradeceria q me pases tu correo electronico para q t envie por ese medio mi codigo fuente modificado.

Gracias de antemano Marcelo


Bueno Marcelo, ni bien me haga un tiempito me pondré con paciencia a ver tu código.

De seguro lo que comentas del SPEN no tiene nada que ver con que la grabación funcione o no.  Es decir no es un módulo relacionado al grabado de la memoria.  Lo que puede estar pasando es que al habilitar la usart se te dispare alguna interrupción o algo por el estilo que impida que se te ejecute bien el código.

Dejame que lo revise y te podré dar una opinión mas precisa del problema.

Saludos
- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado marcelo_gre

  • PIC10
  • *
  • Mensajes: 19
RE: grabar datos en la memoria flash del 877A
« Respuesta #8 en: 24 de Enero de 2006, 19:11:00 »
Mauricio t agradezco tu ayuda y creo q tienes toda la razon en decir que el bit RCSTA,SPEN no ocaciona el error directamente, si no q es una falla relacionada con alguan interrupcion.

Te escribo para comentarte que cundo simulo el programa en el MPLAB 6.42, todo corre bien, pero cuando simulo en el MPLAB 7.21 verifique q se activa la bandera de la interrupcion PIR1,TXIF sin q manden ningun dato por el puerto serial, la unica interrupcion q activo es la de el puerto serial pero para recepcion(PIE1,RCIE), que es muy importante para mi programa final.

Bueno nunca esta de mas agradecer tu paciencia y tu ayuda y ojala que estos datos sea utiles, y t agardeceria que meayudes a solucionar este problema puesto q mis plazos para entrega de proycto ya se estan venciendo.

mil gracias Marcelo

Desconectado marcelo_gre

  • PIC10
  • *
  • Mensajes: 19
RE: grabar datos en la memoria flash del 877A
« Respuesta #9 en: 24 de Enero de 2006, 19:26:00 »
ah...un detalle importante estoy alimentando mi pic con 3,3[V], sera que esto esta influyendo????, en el datasheet, nenciona q el pic puede trabajar de 2 a 5,5 [V], sera q mi error es ocasionado por eso???

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: grabar datos en la memoria flash del 877A
« Respuesta #10 en: 25 de Enero de 2006, 05:05:00 »
Escrito originalmente por marcelo_gre
ah...un detalle importante estoy alimentando mi pic con 3,3[V], sera que esto esta influyendo????, en el datasheet, nenciona q el pic puede trabajar de 2 a 5,5 [V], sera q mi error es ocasionado por eso???


Que modelo de pic exactamente estás utilizando?

Los únicos que funcionan en ese rango con los de la familia L!

Ayer no tuve tiempo para verte el problema pero espero hoy tenerlo.

La pregunta de rigor es, te funciona en el simulador al menos? SI es así que simulador usas?


- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado marcelo_gre

  • PIC10
  • *
  • Mensajes: 19
RE: grabar datos en la memoria flash del 877A
« Respuesta #11 en: 25 de Enero de 2006, 15:44:00 »
Mauricio el modelo de pic q estoy usando es el 16f877A, pero es su hoja de datos menciiona q este pic se puede usara de 2 a 5,5 Voltios, sera q ese rango no es real??? y el simulador q uso es el MPLAB6.42 pero tb lo probe en el MPLAB7.21, pero lo raro es q los otros programas me corrieron de buena manera solo cuando intento graba en el a memoria flash es q existe el problema, espero tu respuesta y mil gracias nuevamente...

Marcelo

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
RE: grabar datos en la memoria flash del 877A
« Respuesta #12 en: 25 de Enero de 2006, 18:04:00 »
Escrito originalmente por marcelo_gre
Mauricio el modelo de pic q estoy usando es el 16f877A, pero es su hoja de datos menciiona q este pic se puede usara de 2 a 5,5 Voltios, sera q ese rango no es real??? y el simulador q uso es el MPLAB6.42 pero tb lo probe en el MPLAB7.21, pero lo raro es q los otros programas me corrieron de buena manera solo cuando intento graba en el a memoria flash es q existe el problema, espero tu respuesta y mil gracias nuevamente...

Marcelo


A ver, no creo que el MPLAB sea el problema pero podrías actualizar a la versio 7.30 por las dudas.

Debiera andar en el simulador, yo tengo el 7.22 y me anda.  

En cuanto a lo de los pics,  hice un post y subí unna imagen y no quedó puesta así que lo tengo que reescribir.

El punto es así.  Los micros 16LF87xA van de 2.0 a 5.5V (aunque esto depende de la frecuencia en que los utilices, ya que a 10Mhz deben operar a 3V como minimo).

Los 16F87xA solamente van de 4V a 5.5V.  Si te fijas en la DS39582, Capitulo  Electrical Characteristics, podrás ver un gráfico que explica exactamente lo que acabo de exponer.

Espero te sirva de ayuda.

- La soberbia de un Einstein es entendible.. la de un salame es intolerable (A.Dolina)
- En teoría no hay diferencia entre la teoría y la práctica. En la práctica... si la hay.
- Lee, Lee, Lee y luego pregunta.(maunix)
- Las que conducen y arrastran al mundo no son las máquinas, sino las ideas (V. Hugo)
- Todos los hombres se parecen por sus palabras; solamente las obras evidencian que no son iguales.(Moliere)
- Todo debería ser hecho tan simple como sea posible pero no mas simple que eso.(A.Einstein)

Desconectado Rakamail

  • PIC12
  • **
  • Mensajes: 54
Proteus simula la grabación en memoria flash?
« Respuesta #13 en: 07 de Febrero de 2009, 13:52:36 »
¿Proteus simula la grabación en memoria flash? Es que no consigo que lo haga, y estoy venga a revisar el soft y no pillo el fallo.
La rutina que he escrito lo que hace es leer desde la posición 00 hasta la 11 guardando en buffers de memoria de datos. Modifico el que necesito modificar en este buffer y luego procedo a escribir los cuatro buffer en la memoria flash. Los bit están revisados, y el error que me sale es este:

La gracia es que me indica un error de EEPROM, pero el bit EEPGD está a 1 cuando toca escribir.