TODOPIC
Microcontroladores PIC => Todo en microcontroladores PIC => Mensaje iniciado por: Jorge_Loa en 04 de Marzo de 2007, 21:25:20
-
Hola a todos, aunque soy nuevo usuario hace bastante tiempo que he venido resolviendo dudas a traves de los mensajes de los foros que he leido; por dicha razón decidí registrarme y colaborar en lo que pueda. Sin embargo empiezo por comentar un problema que tengo:
Actualmente intento programar un Pic que basicamente debe monitorear, controlar y registrar T° y HR en un galpón, el sistema debe "saber" la fecha y la hora para determinar en que dia de produccion se tienen los pollos y de acuerdo a este dato debe controlar unos ventiladores y unos calefactores;.............. además debe (y es la parte donde en este momento tengo un problema) cada quince minutos almacenar fecha, hora, valor de T° y valor de HR que deben ser guardados en un PC, sin embargo y dado que el PC no estará conectado siempre la idea es que mientras el PC se encuentra conectado los datos se almacenan directamente en el, y cuando no lo esté, los datos se almacenaran en el Pic para que cuando el Pc sea encendido pasen al disco duro.
En mis calculos debo almacenar los datos en la memoria FLASH (por que la EEPROM no me alcanza), a modo de prueba he escrito unos datos en unas direcciones y cuando voy a leer en una de esas direcciones el Pic me muestra la direccion mas no el dato guardado en ella. La verdad es que es la primera vez que uso la opción de almacenar en memoria y no se en que estoy fallando asi es que agradecería mucho su colaboración, :lol:..............y desde luego en lo que yo pueda ayudar aqui estaré. :lol:
Anexo el codigo correspondiente a la parte de lectura y escritura en Flash, esta en asm porque con el lenguaje C no es que me vaya muy bien :?
;--------------------------- LECTURA DE UN DATO EN FLASH ------------------------------;
LEER_FLASH bsf STATUS,RP1 ; Selección del Banco 2
bcf STATUS,RP0
movf DIRECCION_H_L,W ; Se introduce en EEADRH la parte alta de la dirección
movwf EEADRH ; a leer
movf DIRECCION_L_L,W ; Se introduce en EEADRH la parte baja de la dirección
movwf EEADR ; a leer
bsf STATUS,RP0 ; Selección del Banco 3
bsf EECON1,EEPGD ; Se selecciona el acceso a la memoria FLASH
bsf EECON1,RD ; Se da la orden de leer.
nop ; Se tarda 3 ciclos en tener el dato por lo que cualquier
nop ; instruccion es ignorada
nop
bcf STATUS,RP0 ; Se pasa al banco 2
movf EEDATA,W ; Se lee el dato, solo los 8 bits de menor peso ya que los
movwf DATO_LEIDO ; datos son de 1 Byte, por eso no se usa EEDATAH
return
-
bueno pess, si tas haciendolo al pie de la letra como indica el datasheet no deberia haber errores en esa zona, desahbilitas interrupciones durante esa rutina de escritura? lamentablemente no he utlizado ese recurso aun, pero se seguro la gente va a contestar. exitos :-/
-
Jorge_Loa, solo has subido la parte de la lectura que es idéntica hasta donde veo a lo que hay en el datasheet y debieran funcionar.
De todas forams, te tengo algunas preguntas para ver cómo te va el tema.
1) DIRECCION_H_L y DIRECCION_L_L en dónde están declarados?
2) Estás probando con el simulador? SI es así , ¿estás realmente usando un 16F877 o un 16F877A ?
-
Hola a todos, les cuento que mi primer problema ha sido solucionado; el error consistia en que sin darme cuenta estaba moviendo al registro de los datos el valor de la direccion y no el dato, por tanto era obvio que siempre me mostraba la dirección :lol:....todo por que no habia visto una instruccion que decia MOVF Dato y que debia decir MOVF Dato,w.............pero en fin ahi sigo. De todas formas agradezco a todos y ofrezco disculpas por el tiempo que sin querer les haya hecho perder.
-
Hola a todos, les cuento que mi primer problema ha sido solucionado; el error consistia en que sin darme cuenta estaba moviendo al registro de los datos el valor de la direccion y no el dato, por tanto era obvio que siempre me mostraba la dirección :lol:....todo por que no habia visto una instruccion que decia MOVF Dato y que debia decir MOVF Dato,w.............pero en fin ahi sigo. De todas formas agradezco a todos y ofrezco disculpas por el tiempo que sin querer les haya hecho perder.
De nada, lo más importante es que te hayas dado cuenta solo. Así se aprende muchisimo y de eso también se trata este foro ;)
Saludos
-
tambien podrias poner MOVFW dato
-
tambien podrias poner MOVFW dato
Es lo mismo que movf dato,w , es solo un macro abreviación del MPASM pero no es una nueva instrucción.
Si haces
movfw DATO
se ensamblará como
movf DATO,w
Saludos