Autor Tema: problema con muchas tablas en asm  (Leído 4019 veces)

0 Usuarios y 1 Visitante están viendo este tema.

Desconectado diego10

  • PIC10
  • *
  • Mensajes: 17
problema con muchas tablas en asm
« en: 30 de Junio de 2014, 08:03:52 »
Buenos dias gente!!
A ver si me pueden ayudar!! Estoy trabajando con pic16f877a y he creado varias tablas, el problema es que me tira mensajes que me lo dejan complilar pero cuando lo corro no hace lo que yo quiero que haga... Estuve buscando y por lo que he leido es que las tablas se me desbordan por eso el programa hace lo que quiere... Es un trabajo para la facultad de ruleta electronica con comunicacion por puerto serie... Espero que alguien me pueda ayudar... les adjunto el archivo en asm por si no me he expresado bien! gracias y saludos

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: problema con muchas tablas en asm
« Respuesta #1 en: 30 de Junio de 2014, 14:59:58 »
Hola Diego,

podrías adjuntar zipeado el Disassembly listing?

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 diego10

  • PIC10
  • *
  • Mensajes: 17
Re: problema con muchas tablas en asm
« Respuesta #2 en: 30 de Junio de 2014, 15:18:31 »
Hola bruno!
Disculpa pero no entiendo a que te refieres.... perdon!
saludos

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: problema con muchas tablas en asm
« Respuesta #3 en: 30 de Junio de 2014, 16:25:32 »
Hola. El Archivo .lst que deberías tener en el mísmo directorio donde está el .hex
"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 diego10

  • PIC10
  • *
  • Mensajes: 17
Re: problema con muchas tablas en asm
« Respuesta #4 en: 30 de Junio de 2014, 17:15:14 »
Ah ya entendi! Bueno ahi se lo adjunto!
Gracias

Desconectado diego10

  • PIC10
  • *
  • Mensajes: 17
Re: problema con muchas tablas en asm
« Respuesta #5 en: 30 de Junio de 2014, 19:54:31 »
Hola! Creo que el problema no es de tablas sino que el programa es muy extenso y sobrepasa la pagina 0.. podra ser??

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: problema con muchas tablas en asm
« Respuesta #6 en: 30 de Junio de 2014, 21:05:50 »
Sí que puede ser. Por eso te pedía el Disassembly, para ver dónde se ubica cada cosa en la FLASH del micro.

Le pego una mirada cuando pueda.

Saludos,

Bruno
"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 BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: problema con muchas tablas en asm
« Respuesta #7 en: 01 de Julio de 2014, 03:15:04 »
Efectivamente, tu programa excede los 2k(0x800) Words de FLASH (la primera página).

Te recomiendo que leas el apartado 2.3 del datasheet del micro en cuestión. Sólo 11 de los 13 bits del PC son cargados desde una instrucción CALL o GOTO, los 2 bits de mayor peso se cargan desde el valor en ese momento de los bits PCLATH<4:3>. Eso hace las cosas un poco más complicadas. Tendrías que pensar tal vez en ubicar directamente todas las subrutinas LEDxx en la próxima página (1) de FLASH (org 0x800). El return,retfie y retlw no traen problemas ya que se descargan del stack los 13 bits utilizados al momento de la llamada. El tema es que dentro de las subrutinas LEDxx, si por algún motivo alguno de los CALL o GOTO no se encuentran en la mísma página, hay que también modificar los bits del PCLATH<4:3> antes de ejecutar el CALL/GOTO.

Avisame si no entendés y te hago un ejemplo, pero hay que modificar código lamentablemente. Tal vez si las subrutinas o saltos que se llaman desde las subrutinas LEDxx sólo son llamadas o al menos llamadas en su gran mayoría sólo desde dichas subrutinas, te convenga ubicarlas también en la página 1 de la FLASH y dejar el resto en la página 0.

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 diego10

  • PIC10
  • *
  • Mensajes: 17
Re: problema con muchas tablas en asm
« Respuesta #8 en: 01 de Julio de 2014, 09:05:17 »
Buenos dias! Gracias Bruno por el tiempo y la ayuda!
Te hago otra consulta: en un foro estuve viendo que si a las llamadas call y goto que tiene los problemas de paginacion le agrego una l, osea, lcall o lgoto, automaticamente van a la pagina donde se encuentra la rutina sea pagina 0 o pagina 1. Es verdad?? porque me parece una rapida solucion a los problemas de paginacion..
Bueno desde ya muchas gracias
Saludos

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: problema con muchas tablas en asm
« Respuesta #9 en: 01 de Julio de 2014, 10:40:53 »
Citar
Te hago otra consulta: en un foro estuve viendo que si a las llamadas call y goto que tiene los problemas de paginacion le agrego una l, osea, lcall o lgoto, automaticamente van a la pagina donde se encuentra la rutina sea pagina 0 o pagina 1. Es verdad??

Si, hace algun tiempo me paso esto mismo y la solucion fue esto usar "lgoto" y "lcall", esto cuando van dentro de una tabla que llama a distintas subrutinas, te dejo aqui el enlace, a lo que puse en aquella ocasion, hay que tener cuidado cuando se llama a la tabla porque cuenta mas instrucciones cuando se usan estas directivas, lo explico aqui:

http://www.todopic.com.ar/foros/index.php?topic=37693.0

Tambien esta la solucion que te dice Bruno de setear los bits 3 y 4 del "PCLATCH" y tambien la directiva "PAGESEL" con cualquiera de ellas te deberia funcionar, por ejemplo.

PAGESEL   LED_1
CALL         LED_1   ;ya va a donde este la subrutina LED_1, este en la pagina que este.     

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: problema con muchas tablas en asm
« Respuesta #10 en: 01 de Julio de 2014, 21:59:05 »
Hola diego,

lcall y lgoto son MACROS, no instrucciones. Es decir que no son instrucciones nativas del microcontrolador, por lo que están conformadas por una o más instrucciones. En este caso precisamente te simplifican la escritura del código, pero el problema surge cuando las querés usar en tablas, ya que como tapi te dijo, ocupan en realidad más instrucciones entonces producen problemas con el salto. Hay opciones para generar el salto de la tabla teniendo en cuenta esto. Por ejemplo, si todas las subrutinas LEDXX están ubicadas en la página 1 de la FLASH (a partir de la dirección 0x800), podrías hacer en la tabla:

  
VISUA                   PAGESEL LED0
                            addwf   PC,F    
                            call    LED0    
                            call    LED1
                            ...

si mal no recuerdo, tendrías que tener cuidado luego, de volver los bits del PCLATH<4:3> a 0 antes de ejecutar un call o goto que se ubique en otra página de la ROM distinta a la 1. Por ejemplo, sin son pocas las apariciones del CALL VISUA, podrías hacer:

         ...
         CALL VISUA
         PAGESEL $                ;setear PCLATH<4:3> a los valores de la página actual (página 0?)


Además, es importante que lo simules al código para asegurarte que los saltos se producen correctamente. El MPLAB SIM es una muy buena herramienta para hacerlo.

« Última modificación: 01 de Julio de 2014, 22:06:08 por BrunoF »
"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 tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: problema con muchas tablas en asm
« Respuesta #11 en: 02 de Julio de 2014, 15:41:46 »
Citar
lcall y lgoto son MACROS, no instrucciones. Es decir que no son instrucciones nativas del microcontrolador, por lo que están conformadas por una o más instrucciones.

Si exacto, por ejemplo:

      lgoto   DELAY_45

Lo tarduce por estas instrucciones:

0034    120A     BCF 0xa, 0x4
0033    158A     BSF 0xa, 0x3       
  0035    2816     GOTO 0x16

Por eso hay que calcular los numeros a cargar en W al llamar la tabla, ya que logicamente para cada lgoto usa tres instrucciones, le llegaria con dos ya que solo tiene que setear un bit pero como lo hace automaticamenete siempre igual pues lo hace asi. Bueno la solucion es sencilla, al llamar a la tabla hay que cargar en W estas desviaciones entonces me queda que para DELAY_45 queda como esta pero a partir de ahi va asi:

DELAY_46  cargar 48
DELAY_47  cargar 51
DELAY_48  cargar 54
DELAY_49  cargar 57
DELAY_50  cargar 60

Como se ve en una tabla normal van correlativos, es decir el anterior +1, aqui es el anterior +3.

Yo en mi caso las use porque esta tabla tiene 50 "goto", hasta el 44 las rutinas que llama estan en PAGE 0, pero en la 45 ya estan en PAGE 1, fue la solucion que encontre en aquel momento y pienso que sigue siendo una buena solucion, aunque hay otras como poner todas las rutinas desde el comienzo de la PAGE 1 y setear el PCLATCH,3 siempre que se llaman.

Citar
si mal no recuerdo, tendrías que tener cuidado luego, de volver los bits del PCLATH<4:3> a 0 antes de ejecutar un call o goto que se ubique en otra página de la ROM distinta a la 1.

Si, cierto tambien me paso. de hecho en ese enlace puse esto:

Citar
Y ya funciona perfecto, al final de las rutinas de DELAY hay hacer un bcf PCLATH,3, porque retorna bien pero al hacer el siguiente call TABLA_DELAY va a una posicion erronea.

Desconectado diego10

  • PIC10
  • *
  • Mensajes: 17
Re: problema con muchas tablas en asm
« Respuesta #12 en: 05 de Julio de 2014, 10:08:44 »
Hola a todos nuevamente! Gracias por la ayuda que me han brindado! pude resolver el problema eliminando la tabla que llama a la subritina de led por simplemente llamadas.. y cuando se va de pagina lo he solucionado con las macro lcall y lgoto. Otra pregunta: el sistema funciona correctamente pero de vez en cuando llega a un punto que se reinicia... que sera? le puse filtros en la entrada de alimentacion porque crei que era por eso( los llamados diente de sierra) pero creo no lo he podido solucionar del todo..
Bueno gracias y saludos

Desconectado BrunoF

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3865
Re: problema con muchas tablas en asm
« Respuesta #13 en: 05 de Julio de 2014, 17:50:06 »
Los reinicios pueden ser problema tanto de hardware como de software. En el caso del software, asegurate que no ocurran stack underflow u overflow, que pueden ser fácilmente confundidos con reinicios en estos PICs, ya que no traen ningún bit ni sistema para detectar dichos casos.
"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 diego10

  • PIC10
  • *
  • Mensajes: 17
Re: problema con muchas tablas en asm
« Respuesta #14 en: 05 de Julio de 2014, 20:42:41 »
Si de seguro debe ser problemas de desborde no de hardware... como se puede hacer para controlar eso? ya que no pasan siempre en el mismo momento


 

anything