TODOPIC
Microcontroladores PIC => Almacén del Assembler => Mensaje iniciado por: renzo_er69 en 10 de Septiembre de 2008, 22:43:59
-
Hola, tengo un problema con el PIC 16F877.
Uso el pic para controlar la rutina de una maquina y controlar un display LCD. El programa tiene muchos saltos y llamados, y al realizarlos se cuelga, como si el PIC se perdiera (siempre en el mismo lugar).
Ya controle todos los goto, call y sus correspondientes return; y no hay problemas con eso.
Si necesitan le paso el archivo .asm...el programa pesa 4kb.
De que forma puedo solucionar esto?
P/d: uso el compilador del MPLAB y para quemarlo el IC-Prog junto con el quemador PIPO2.
Saludos
-
Hola renzo, creo mejor pegas tu codigo completo para que todos puedan verlo y te puedan ayudar mejor :)
-
Holas renzo!!
Creo saber lo que le pasa a tu programa. A mi me pasó algo parecido hace tiempo, cuando estaba haciendo un programa para el pic16f648a (estaba migrando del 16f84). Despues de mucho batallar, aprendí a palos lo que es la "paginación de memoria de programa", algo necesario en esta gama de los pic para ocupar toda la memoria de programa.
En palabras simples son cosas de números:
- Cada posición de la memoria de programa tiene un ancho de palabra de 14 bits, entre los cuales se reparte el opcode de la instrucción y el operando, ya sea un literal, posición de ram ó posición de memoria de programa.
- En el caso de las instrucciones de salto (call y goto), los 14 bits de reparten en 3 bits de opcode y 11 bits de dirección.
- El contador de programa tiene un ancho de palabra de 13 bits (repartidos en los registros PCL y PCLATH).
Aqui notamos una incongruencia. El contador de programa es de 13 bits (para direccionar 8KB), pero en las instrucciones de salto la dirección es de 11 bits, con los cuales solo puedo direccionar 2KB...!!!
Asi que, cuando nuestro programa alcance tal complejidad que requiera más de 2KB, hay que entra a estudiar a fondo el datasheet del pic en cuestión, ya que están muy bien documentados, y encontramos el concepto de "paginación de memoria", donde lo que se hace es dividir la memoria de programa en páginas, para el caso de pic16f877 son 4 páginas de 2KB cada una. Para acceder a una página en particular, hay que cargar directamente en la parte alta del contador de programa los 2 bits que faltan para completar la dirección de destino (PCLATH).
Por ejemplo, tenemos una subrutina llamada "envia_trama" ubicada en la página 2, y nos encontramos en la página 0 en este momento. Entonces para llamar a la subrutina procedemos así:
movlw b'00010000' ; aqui se manipulan los bits 3 y 4 para cambiar de página
movwf PCLATH
call envia_trama
Al momento de retornar desde la subrutina, volverá de nuevo a la página 0, ya que la pila tiene un ancho de palabra igual al contador de programa (13 bits).
Pero surge la pregunta...... Como controlo que tal subrutina esté en la página que yo quiero?? simple, jugando con la directiva ORG del ensamblador.
Bueno, por el momento puedo aportar esto, espero te sirva de algo... :)
Suerte con y proyecto, y saludos a quienes nos leen.
-
También asegúrate de no estar desbordando la pila (Stack)
-
Gracias por las respuestas!
Creo que el problema viene por el lado que dijo sansanoloko... No me quedo muy claro como controlo que la subrutina esta en la pagina que quiero!! Me podrian ayudar con eso?
Con la pila no hay problema!
Voy a probarlo esta tarde/noche y les cuento!
Muchas Muchisimas gracias!
-
Hola renzo.
Si, el problema es por lo que ya te ha comentado sansanoloko. Te recomiendo que aprendas sobre la instrucción pagesel que te va a ahorrar todo el trabajo a la hora de cargar el PLCATH para realizar los cruces de páginas.
Saludos.
-
Creo que solucione el problema! Por lo menos no se tilda, tiene otros detallesitos pero no se cuelga como antes!
Antes de cada salto coloque lo siguiente:
movlw high salto_largo ; (coloque el HIGH porque no se a que pagina salta; como saberlo?)
movwf pclatch
goto salto_largo
Ademas de eso, me tome un tiempo para organizar el programa, es decir, corriendo de lugar los distintos "bloques" para que esten mas cerca de su llamada. De esta manera en vez de hacer un salto de una pagina, solo tiene que saltar algunas lineas.
Todavia me queda la duda de como usar los ORG!!
Muchas gracias a todos!
-
Creo que solucione el problema! Por lo menos no se tilda, tiene otros detallesitos pero no se cuelga como antes!
Antes de cada salto coloque lo siguiente:
movlw high salto_largo ; (coloque el HIGH porque no se a que pagina salta; como saberlo?)
movwf pclatch
goto salto_largo
También puedes usar el macro
pagesel salto_largo
goto salto_largo
Eso generará el seteo de los bit de página adecuados en el PCLATH.
Todavia me queda la duda de como usar los ORG!!
El ORG se usa simplemente como ORG xxxx , donde xxxx es la dirección de memoria de programa a partir de la cual se comenzará a ubicar el código que acabas de escribir.
Si te siguen quedando dudas, vuelve a preguntar :)