Autor Tema: Saltos largos en 16F877  (Leído 5516 veces)

0 Usuarios y 2 Visitantes están viendo este tema.

Desconectado renzo_er69

  • PIC10
  • *
  • Mensajes: 4
Saltos largos en 16F877
« 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

Desconectado KALLITOS

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1256
Re: Saltos largos en 16F877
« Respuesta #1 en: 11 de Septiembre de 2008, 02:15:23 »
Hola renzo, creo mejor pegas tu codigo completo para que todos puedan verlo y te puedan ayudar mejor  :)
A un microcontrolador hay que sacarle hasta el ultimo byte....(YO)

Cómo puede ser que un pic24EP512 me quede corto de memoria, señores de MICROCHIP saquen pics con más memoria flash

Más de 45 mil lineas de codigo y aun no termino el equipo, asu mare!!

S34ML08G1TFI200 no necesito mas memoria externa.

Desconectado sansanoloko

  • PIC10
  • *
  • Mensajes: 48
Re: Saltos largos en 16F877
« Respuesta #2 en: 11 de Septiembre de 2008, 12:23:06 »
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.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Saltos largos en 16F877
« Respuesta #3 en: 11 de Septiembre de 2008, 12:51:52 »
También asegúrate de no estar desbordando la pila (Stack)
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado renzo_er69

  • PIC10
  • *
  • Mensajes: 4
Re: Saltos largos en 16F877
« Respuesta #4 en: 11 de Septiembre de 2008, 13:24:33 »
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!

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: Saltos largos en 16F877
« Respuesta #5 en: 11 de Septiembre de 2008, 16:42:13 »
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.
"All of the books in the world contain no more information than is broadcast as video in a single large American city in a single year. Not all bits have equal value."  -- Carl Sagan

Sólo responderé a mensajes personales, por asuntos personales. El resto de las consultas DEBEN ser escritas en el foro público. Gracias.

Desconectado renzo_er69

  • PIC10
  • *
  • Mensajes: 4
Re: Saltos largos en 16F877
« Respuesta #6 en: 12 de Septiembre de 2008, 00:05:40 »
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!

Desconectado maunix

  • Moderadores
  • DsPIC33
  • *****
  • Mensajes: 4751
    • Mi Sitio Web Personal
Re: Saltos largos en 16F877
« Respuesta #7 en: 20 de Octubre de 2008, 10:16:14 »

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  :)
- 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)


 

anything