TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: marcelo_gre 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
-
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
-
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.
-
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
-
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
. Verlo así me cuesta y además tendria que indentarlo todo en mi IDE con las tabulaciones para que compile correctamente.
Saludos
-
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
-
Mauricio te mande mi programa a traves de unmensaje privado pq no pude subirlo mediante el foro te agradezco tu ayuda Marcelo
-
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
-
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
-
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???
-
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?
-
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
-
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.
-
¿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.