TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: pepe-grillo en 10 de Julio de 2006, 00:22:50
-
Hola a todos!
Tengo un problema que ha sido mi dolor de cabeza todo el fin de semana.
Estoy trabajando en asm, con MPLAB 7.30, programando un sencillo pic 16F84A. La idea de mi programa es contar unos pulsos y guardar el último en la memoria EEPROM, y mostrarlo además en unos 7 segmentos, el dato debe quedar almacenado de forma tal que al existir un reset o apagar el pic, este arranque de nuevo desde el ultimo valor...
Mi problema es que todo va muy bien hasta que llega el momento de resetear... el pic muestra un numero muy diferente al que deberia mostrar... la cuestion es que sin resetear, puedo hacer algunas pruebas con un pin dedicado para interrumpir a proposito y hacer pruebas a los datos almacenasdos en la EEPROM... pero si quito la energio o pulso el reset... no hay último dato... siempre me sale un valor fijo (24)... que no comprendo de donde sale y además la simulación en MPLAB no colabora mucho.
Para escribir y leer las memorias eeprom he utilizado estrictamente las rutinas que los chicos de microchip sugieren en el datasheet del pic.
Les agradeco cualquier ayuda. Si lo necesitan puedo postear el codigo de la rutina de inicio posterior al reset o lo que crean conveniente.
Muchas gracias.
Pepe-grillo
-
Hola pepe. Si posteas el codigo seguro podremos ayudarte mas facilmente. Que pic estas usando? Saludos.
-
Hola BrunoF!
Como lo indique, estoy trabajando con un pic 16F84A...
He hecho algunos ensayos, aparentemente solo me esta quemando el primer dato... el siguiente simplemente no lo escribe... esto lo pude mirar utilizando el WinPic800 para mirar los datos almacenados
Para que no sea tan dificil de entender, la variable vuelta esta compuesta por una parte alta y una baja (vuelta_L y vuelta_H), ademas el registro llamado DIR_EEPROM, es el ancargado de almacenar por un momento la direccion donde deseo que se almacene el dato
Este es el codigo de la rutina para escribir la eeprom:
ESCRIBIR_EEPROM
BANKSEL EEDATA
MOVF VUELTA_L, W
MOVWF EEDATA
MOVF DIR_EEPROM,W
MOVWF EEADR
BCF INTCON, GIE
BANKSEL EECON1
BSF EECON1, WREN
MOVLW H'55'
MOVWF EECON2
MOVLW H'AA'
MOVWF EECON2
BSF EECON1, WR
BSF INTCON, GIE
BCF EECON1, WREN
BCF EECON1, EEIF
RETURN
Esta es la subrutina que utiliza dos veces el codigo anterior para crear 2 registros eeprom
BORRAR_EEPROM
MOVLW B'11101000'
MOVWF VUELTA_L
MOVLW B'00000000'
MOVWF DIR_EEPROM
CALL ESCRIBIR_EEPROM
MOVLW B'00000011'
MOVWF VUELTA_L
MOVLW B'00000001'
MOVWF DIR_EEPROM
CALL ESCRIBIR_EEPROM
RETFIE
Este es el final de la subrutina que se ejecuta despues de cada reset
....(otro codigo)...
BANKSEL INTCON
MOVLW B'10111000'
MOVWF INTCON
BSF CONTROL_DISPLAY, DIG_UNIDAD
CALL LEER_EEPROM
RETURN
Y por ultimo, esta es la subrutina leer_eeprom
LEER_EEPROM
BANKSEL EEADR
MOVLW B'00000000'
MOVWF EEADR
BANKSEL EECON1
BSF EECON1, RD
BANKSEL EEDATA
MOVF EEDATA, W
MOVWF VUELTA_L
MOVLW B'00000001'
MOVWF EEADR
BANKSEL EECON1
BSF EECON1, RD
BANKSEL EEDATA
MOVF EEDATA, W
MOVWF VUELTA_H
RETURN
Como pueden ver, es todo lo que dice en el pdf de microchip.
De nuevo muchas gracias!!
Pepe-grillo
-
Hola pepe-grillo, si no creo mal, tienes un problema con la rutina de grabación en la EEPROM, prueba con esta que te dejo:
GUARDAR
movf VUELTA_L, W
movwf EEDATA
movlw DIR_EEPROM,W
movwf EEADR
bcf INTCON, GIE
bsf STATUS,RP0
bcf EECON1,WRERR
bsf EECON1,WREN
movlw H'55'
movwf EECON2
movlw H'AA'
movwf EECON2
bsf EECON1,WR
ES1 nop
btfss EECON1,EEIF
goto ES1
nop
btfsc EECON1,WRERR
goto GUARDAR
nop
bcf EECON1,EEIF
bcf EECON1,WREN
bcf STATUS,RP0
bsf INTCON, GIE
return
Espero te sea de utilidad, un saludo.
Atte. CARLOS.
-
Hola pepe. Bueno, las EEPROM son bastante lentejas(lentas). Y en tu codigo mandas a hacer una grabacion inmediatamente despues de iniciada la anterior, un motivo de problema. Ahi Charly te agrego, entre otras cosas, las lineas para comprobar la finalizacion de la escritura de un dato antes de salir de la rutina de grabacion.
Charly esos "nop" van de regalo? :lol: :lol:
pepe:a la rutina BORRAR_EEPROM la haces volver con un RETFIE. El RETFIE es parecido al RETURN, pero a la vez activa las interrupciones globales(INTCON,GIE). Estas seguro que es lo que necesitas hacer?
No es necesario BANKSEL para algunos registros, tal como para el INTCON, que si miras el mapa de memoria se encuentra en ambos bancos del PIC.
pd. Por casualidad, no seras el pepegrillo de el primer foro de microcontroladores y electronica de melodysoft, no? hace como 6 años que andaba en ese foro xd! se me caen las lagrimas :mrgreen:
Saludos.
-
Hola Charly!
Muchas gracias por el codigo!
Lo probare enseguida.
Hola Bruno!
Te cuento que yo no soy ese pepegrillo... yo soy el pepe-grillo al que hace unos pocos meses le resolviste una duda (con una explicación excelente) sobre una tabla que cruzaba entre 2 bancos de un PIC 16F877... no se si me recuerdas.
Lo de la instrucción RETFIE yo lo entiendo, la cuestion es que a borrar memoria lo llama una interrupción en el pin RB6... lo del tiempo lo estuve mirando apenas despues de escribir el post... pero realmente no pense que fuera tan grave.
Bueno, no siendo mas, probare el código y en un momento les aviso.
Chao y muchas gracias
Pepe-grillo
PD: Lo del banksel es una casi mania....
-
¡¡¡Señores!!!
Ustedes son unos genios... eso fue plug and play... funciono de una, estoy que lloro... muchas gracias Chaly y Bruno, de verdad que no pense tener resuelto este problema tan pronto.
Muchas gracias, muchos exitos, que esten muy bien
Pepe-grillo
PD: Chaly, disculpame por haber escrito en el post anterior Charly... lei mal :)
De nuevo muchas gracias
-
Me alegro que hayas resuelto tu problema.
Ahora si te recuerdo.Perdona, mi memoria hace cortos a veces. :D
Lo de los tiempos si es un tema importante. Pensa que el tiempo promedio para grabar un dato en EEPROM es de 5ms, y eso es una eternidad para un PIC, asi que hay que asegurarse de que se haya terminado de grabar el dato antes de querer grabar otro.
Saludos.
-
Gracias Bruno!
Lo tendre muy en cuenta.
Chao
Pepe-grillo
-
Hola BrunoF, no te quedaste corto con los 5ms? :mrgreen:
Un saludo.
Atte. CARLOS.
-
jajaja como te gusta retrucarme a vos!
Y...dije "en promedio". Puede que lleve hasta 20ms, como puede que lleve menos. Saludos.
-
jajajaja, te sentiste tocado, y a vos te gusta sacarme mano por los nop, ahora se las aguanta señorito :D :D :D
Un saludo y no te cabrees tanto brunito (segun microchip las eeprom tardan en promedio 10 ms)
Atte. CARLOS.