Autor Tema: Tablas en ASM  (Leído 4840 veces)

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

Desconectado FirmSoft

  • PIC16
  • ***
  • Mensajes: 118
Tablas en ASM
« en: 03 de Enero de 2005, 19:33:00 »
   Alguien sabe por casualidad que cantidad maxima de tablas puedo tener en un codigo asm?

   Tengo 2 tablas de 83 filas, las cuales devuelven diferente info:

tabla1
   addwf   PCL,1    ;agrega al cont. programa el valor de w
   retlw    00h
   retlw   0x00
   retlw   0x00
   retlw   0x00
   retlw   0x00
   retlw   0x00
   retlw   0x00

tabla2
   addwf   PCL,1    ;agrega al cont. programa el valor de w
   retlw    00h
   retlw   0xFA
   retlw   0xDE
   retlw   0x0E
   retlw   0xD0
   retlw   0x00
   retlw   0x0F

   Una es llamada despues de la otra... en un codigo,  la primer parte consulta a la tabla 1 ... al terminar, el siguiente fragmento de codigo consulta a la 2.

   El problema es que el programa hace cualquier cosa, se reinicia constantemente... son 2 tablas de 83 saltos cada una y si a los fragmentos de codigos que llaman a las tablas les pongo una llamada a una misma tabla el programa funciona bien... osea.. al ignorar una tabla el programa funca, hay algun limite de largo en las tablas?.. podria yo tener 6 tablas de 84 filas cada una sin problemas???... Perdon por este extenso mensaje, si no fui claro me avisan.. SOCORRO!!! .. Gracias y Saludos! Llorando

Desconectado FirmSoft

  • PIC16
  • ***
  • Mensajes: 118
RE: Tablas en ASM
« Respuesta #1 en: 03 de Enero de 2005, 23:42:00 »
   Puede ser que el problema sean las paginas del PIC??... estoy trabajando con un PIC16F84A, alguien podria darme una manito?. Gracias antisipadas Payaso

Desconectado PicKetero

  • PIC12
  • **
  • Mensajes: 80
RE: Tablas en ASM
« Respuesta #2 en: 04 de Enero de 2005, 00:02:00 »
   Hola hola !!!!

    Te cuento que eso que te está pasando es un problema clásico que tarde o temprano tendremos nos veremos obligados a resolver, lo digo por experiencia propia.
     Te paso a contar que como seguramente habrás leido en los manuales de microchip los pic cuentan con un registro que lleva un conteo de nuestro programa y es el famoso PCL.  Cuando nosotros hacemos un "CALL  Subrrutina" lo que estamos haciendo de "fondo" es cargarle a nuestro PCL la dirección donde se encuentra "Subrrutina" y como la instrucción CALL utiliza solo los 8 bits del registro PCL, "Subrrutina" tendrá que localizarse dentro de las primeras 256 lineas de nuestro código porque si no saltaría a cualquier parte de nuestro código. También tenes que tener en cuentra que si la "Subrrutina" le sigue una tabla, el utimo renglón de esta tabla no deberá sobrepasar las 256 linas ya que también nuetro contador pasaría a la linea 0 porque al desplazarse por la tabla estaríamos incrementando en una unidad el PCL y de 255 pasaríamos a 0 nuevamente, por lo que equivaldría a un reset Giño

     Despues de todo esto que espero que se pueda entender quería agregar que siempre es de buena costumbre localizar todas las rutinas que son accesedidas mediante una instrucción CALL en el pricipio de nuestro código.
     La otra otra cosa a tener en cuenta y que depende del pic que estemos utilizando es la cantidad de bancos que este tenga, en el caso de que nuestro PIC tenga mas de uno podremos agregar mas subrrutinas en el comienzo de estas por el mismo problema que expliqué antes.
   
          org   0x00
 
  goto    INICIO
           
          org   0x04
   
  goto    INTERR    

          org   0x05
;// Sección dedicadas a las subrrutinas

Subrrutina1                         ; este código comienza en la direccion 0x05
  ....                                     ; de nuestro código
  ....
   return

Subrrutina2
  ....
  ....
   return                               ;Límite de nuestras subrrutinas hasta la posición
                                            ; 0xFF

;//----------  Fin sección subrruitnas ---------------

INTERR
 ...
 ...
 ...
 ...
    retfie


INICIO
    ....
    ....
 
    call      Subrrutina1
    nop
    call      Subrrutina2
   ...  
    goto   $
   
    END



      Espero que te haya servido !!!!


 

Desconectado PicKetero

  • PIC12
  • **
  • Mensajes: 80
RE: Tablas en ASM
« Respuesta #3 en: 04 de Enero de 2005, 00:25:00 »
  Hola nuevamente !!!
    Se me olvidaba algo, ..... algo que resultó muy instructivo a la hora de entender de una forma mas analitítica lo que te explicaba anteriormente, y es que mires el archivo de extensión ".lst"  que te genera el mplab cuando compilas tu programa, y mira la primer columna a la izquierda donde aparece la ubicación de cada linea de código de nuestro programa, y podrás comprobar tu tabla donde tu dices que a partir de cierta linea de tu tabla se resetea el código,  casí seguro que se debe a que esa linea antes del "desastre" está en la ubicación   " 00FF "   o  " 255 ".
     Este archivo te dice también cuanta memoria de programa has utilizado en  tu progrma.

     Creo que esto es todo, ademas tienes para consultar en la pagina de microchip un datasheet sobre la utilización de tablas.

     Ahora si me retiro, son las 3:26 de la madrugada asi que me voy a dormir.

     Saludos !!!!

Desconectado carlyvalente

  • PIC16
  • ***
  • Mensajes: 108
RE: Tablas en ASM
« Respuesta #4 en: 04 de Enero de 2005, 03:55:00 »
Exactamente como dicen los genios del foro.
Pero ya creo que conoceis una instrucción del MPLAB: el dt

Description
Generates a series of RETLW instructions, one instruction for each <expr>. Each <expr> must be an 8-bit value. Each character in a string is stored in its own RETLW instruction.

Example
dt "A Message", 0

dt FirstValue, SecondValue, EndOfValues

O sea, que hace lo mismo y según acabo de comprobar en el archivo list ocupa solo una linea de programa. Aquí os muestro 2 ejemplos : una tabla con el DT (tabledat1) y otra en forma normal (tabledat).
Debo advertir que en esta pantalla (copy y paste) muestra la linea de DT en varios renglones pero DEBEREIS ponerlo en una misma linea.
Lo que me quedaría por comprobar es si comete el mismo fallo de salto del 255 al 0 igualmente si se ubica en posición indebida.

tabladat1    addwf   PCL,F
      dt 0x00,0x0c,0xff,0x8f,0x3a,0x10,0x01,0x3a,0x3a,0x1a,0xab,0x3a,0x44,0x51,0x9b,0xc6,0x2f,0x61,0x55,0x2f,0x33,0x41,0x78,0x47,0x54,0x22,0xae,0x35,0xff,0x00,0x00,0x00,0x00

tabladat addwf   PCL,F
      retlw   0x00   ;main (no se usa pero debo ponerlo) 00h
      retlw   0x0C   ;interface 01h
      retlw   0xff   ;reset 02h
      retlw   0x8f   ;sequencing 03h
      retlw   0x3a   ;freq 2a 04h
      retlw   0x10   ;freq 1a 05h
      retlw   0x01   ;freq 0a 06h
      retlw   0x3a   ;clock a 07h
      retlw   0x3a   ;freq 2b 08h
      retlw   0x1a   ;freq 1b 09h
      retlw   0xab   ;freq 0b 0Ah
      retlw   0x3a   ;clock b 0Bh
      retlw   0x44   ;VCO     0Ch
      retlw   0x51   ;MODEM    0Dh
      retlw   0x9b   ;deviation 0Eh
      retlw   0xc6   ;AFC CONTROL 0Fh
      retlw   0x2f   ;FILTER 10h
      retlw   0x61   ;VGA1 11h
      retlw   0x55   ;VGA2 12h
      retlw   0x2f   ;VGA3 13h
      retlw   0x33   ;VGA4 14h
      retlw   0x41   ;LOCK 15h
      retlw   0x78   ;FRONTEND 16h
      retlw   0x47   ;ANALOG 17h
      retlw   0x54   ;Buff Swing 18h
      retlw   0x22   ;Buff Current 19h
      retlw   0xAE   ;PLL BW 1Ah
      retlw   0x35   ;Calibrate 1Bh
      retlw   0xff   ;PA POWER 1Ch
      retlw   0x00   ;MATCH 1Dh
      retlw   0x00   ;PHASE COMP 1Eh
      retlw   0x00   ;GAIN COMP 1Fh
      retlw   0x00   ;POWERDOWN 20h   

saluditos   

Desconectado carlyvalente

  • PIC16
  • ***
  • Mensajes: 108
RE: Tablas en ASM
« Respuesta #5 en: 04 de Enero de 2005, 04:07:00 »
Pues si, acabo de comprobar que hace lo mismo: salta al incrementar el PCL mas allá del 255 lógicamente .
Sea que sirve unicamente para minimizar el largo del programa, jeeje.
Aunque para tablas largas viene bien saberlo Sonrisa

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
RE: Tablas en ASM
« Respuesta #6 en: 04 de Enero de 2005, 04:36:00 »
Hola, los colegas te han pasado una serie de datos que son fundamentales y muy bien explicados.... pero hay otra mas...  ¿verificas cuantas llamadas le realizaste a la tabla?, en tu caso, no llamaras 84 veces????loco alli si seria un desastre y de una tabla saltaria a la otra.... un desastre.... Sonrisa Gigante

Verifica paso a paso con el MPLAB, y mira los estados de los registros....

Suerte!

Norberto
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado FirmSoft

  • PIC16
  • ***
  • Mensajes: 118
RE: Tablas en ASM
« Respuesta #7 en: 04 de Enero de 2005, 12:39:00 »
   Las respuestas son realmente espectaculares.. carlyvalente eso del "dt" pues ni sabia que existia... es super util.. lo probe y funciona perfectamente bien, y es verdad que el limite es 255, porque el programa me hace lo mismo, pero para tablas extensas es increiblemente util.

   Norberto, mira, esto que dijiste me parecio interesante:

pero hay otra mas... ¿verificas cuantas llamadas le realizaste a la tabla?, en tu caso, no llamaras 84 veces???? alli si seria un desastre y de una tabla saltaria a la otra.... un desastre.... Verifica paso a paso con el MPLAB, y mira los estados de los registros..

Lo que tengo es esto... miralo y dime, para mi manera de ver, no encuentro errores.. pero talves los tenga.. esta mal que llame a una tabla asi?.

   clrf contadorp1
adata1
   incf contadorp1,1
   movf contadorp1,0
   xorlw 0x53       ;A los 15 bytes salta
   btfsc STATUS,Z
   goto otra1
   movf contadorp1,0   
   call tabla1tabla
   movwf afisaj
   call   lcdta
   goto adata1


   Mil Gracias por todas las respuestas... PicKetero, probare de  poner todas las rutinas que son llamadas en el principio, talves eso sea una salucion. Gracias a todos por esta mano que me han tendido y Feliz 2005 Para todos. Rebotado

Desconectado FirmSoft

  • PIC16
  • ***
  • Mensajes: 118
RE: Tablas en ASM
« Respuesta #8 en: 04 de Enero de 2005, 15:04:00 »
   Si bajo las llamadas a 32, me funciona perfecto :"( .. pero necesito 84 por cada una... llamo una vez y retorno con el valor, eso es lo que hago, y necesito que sean 84 veces por cada tabla... todo esto es porque estoy trabajando con un lcd grafico y necesito pintar 84 columnas cada 6 renglones, es para hacer graficos.. el lcd es el de nokia, al fin logre hacerlo funcionar, el codigo es asm puro, aun no programo en C, me gusta complicarme, asi es como mejor se aprende. Gracias y Saludos!

Desconectado lafe

  • PIC10
  • *
  • Mensajes: 40
RE: Tablas en ASM
« Respuesta #9 en: 04 de Enero de 2005, 18:13:00 »
Hola, lo que te pasa es logico estas usando mas recursos que los que tienes
en ese micro ,estas pisando tus registros ,los datos que cargas en cada
posiciones de tus tablas estan consumiendo los registros de proposito general
no se que micro usas pero tendrias que pensar en cambiarte a uno mayor con mas paginas o volcar todo a una memoria externa .
salu2

Desconectado FirmSoft

  • PIC16
  • ***
  • Mensajes: 118
RE: Tablas en ASM
« Respuesta #10 en: 04 de Enero de 2005, 22:15:00 »
   Hola Nuevamente... estoy usando un PIC16F84A y la cantidad de llamadas que hago serian en total 168... hay limites para llamadas a tablas???.. mire el archivo .lst y dice:

Program Memory Words Used:   216
Program Memory Words Free:   808

  Eso me dice que los recursos del pic van bien... en verdad debo cambiar de micro? Enfurruñado .. bueno, Gracias por tu ayuda. Saludos! Flash

Desconectado todopic

  • Administrador
  • DsPIC30
  • *******
  • Mensajes: 3495
    • http://www.todopicelectronica.com.ar
RE: Tablas en ASM
« Respuesta #11 en: 04 de Enero de 2005, 23:18:00 »
Hola Firsoft, como estas?

Es seguro que tu tabla cayo justo en un cambio de pagina....loco
asi que como ya te comenytaron arriba, coloca tu tabla bien al principio del programa (luego de la direccion org 05h del reset!!! je je)
Y algo muy practico, es que repartas tu programa en 4 porciones... por ejemplo subrutinas de comunicacion, temporizaciones etc... y los separes con org
(origen)
entonces te quedaria

org 05
programa
"
tablas
tablas
"
   org   0100
"
sigue el programa
"
"
org 0200

programa
"
"
"
org 0300
continua programando

end

luego, al compilar, podras ver el hexa, con todos los espacios como 3FFF que es libre...
asi puedes distribuir tus rutinas, y si hay superposicion, enseguida salta!!!! Sonrisa GiganteRebotado

espero esto te se util

Norberto
pd.  tu programa asi esta bien....
Firmat - Santa Fe - Argentina

www.TodoPic.net

Solo se tiran piedras, al arbol que tiene frutos...

Desconectado FirmSoft

  • PIC16
  • ***
  • Mensajes: 118
RE: Tablas en ASM
« Respuesta #12 en: 04 de Enero de 2005, 23:37:00 »
  Gracias Norberto, eso es lo que me queda por intentar.. ahora una pregunta.. pongo las tablas despues del org 5... y apartir de org 0x100 el programa principal.. ahora bien.. despues del org 0x00 cuando pongo "goto inicio".. para saltar el vector de interrupcion, debo especificar algo mas??.. porque la etiqueta inicio se encontraria en el otro banco si no me equivoco.. osea.. apartir de 0x100. Bueno, Espero no ser tan molesto Enfurruñado.. Mil Gracias por toda la ayuda que me han brindado.. esto si que esta poniendo loco :"(.. y parece tan facil :P .. Saludos! y Gracias!

Desconectado FirmSoft

  • PIC16
  • ***
  • Mensajes: 118
RE: Tablas en ASM
« Respuesta #13 en: 05 de Enero de 2005, 15:40:00 »
SIIII!!! Despues de los 1500 intentos realizados todo funciona perfecto!... aparte aprendi cositas nuevas Sonrisa ... Mil Gracias a TOdos.. la pregunta anterior se contesto sola, no necesitas hacer nada para llamar a una tabla que se encuentra en la pagina 1... todo funciona perfecto!!!!!!!!!!!!!!..............GRACIAS A TODOS!!! Y SALUDOS!!!

Desconectado FirmSoft

  • PIC16
  • ***
  • Mensajes: 118
RE: Tablas en ASM
« Respuesta #14 en: 06 de Enero de 2005, 23:12:00 »
   He descubierto un error en el uso de DT para tablas:

Codigo:

Pero ya creo que conoceis una instrucción del MPLAB: el dt

Description
Generates a series of RETLW instructions, one instruction for each <expr>. Each <expr> must be an 8-bit value. Each character in a string is stored in its own RETLW instruction.

Example
dt "A Message", 0

dt FirstValue, SecondValue, EndOfValues

O sea, que hace lo mismo y según acabo de comprobar en el archivo list ocupa solo una linea de programa. Aquí os muestro 2 ejemplos : una tabla con el DT (tabledat1) y otra en forma normal (tabledat).
Debo advertir que en esta pantalla (copy y paste) muestra la linea de DT en varios renglones pero DEBEREIS ponerlo en una misma linea.
Lo que me quedaría por comprobar es si comete el mismo fallo de salto del 255 al 0 igualmente si se ubica en posición indebida.

tabladat1 addwf PCL,F
dt 0x00,0x0c,0xff,0x8f,0x3a,0x10,0x01,0x3a,0x3a,0x1a,0xab,0x3a,0x44,0x51,0x9b,0xc6,0x2f,0x61,0x55,0x2f,0x33,0x41,0x78,0x47,0x54,0x22,0xae,0x35,0xff,0x00,0x00,0x00,0x00




   Esto es lo que me explicaron aqui, esta perfecto, muy util para no hacer extensas tablas en el codigo fuente, pero tiene 2 problemas.. el primero es que en el archivo .lst figura en una sola linea, por lo tanto no puedes ver hasta donde se extiende.
   El segundo, y del cual no estoy seguro, es que tengo un espacio de codigo en un programa que estoy haciendo, para insertar tablas, entran solo 2 tablas de 84 caracteres.. es desde el ORG 5 hasta antes del ORG 100 ... aunque no lo crean, puedo colocar 3 tablas con DT desde org 5 a org 100 y en ningun momento el Mplab me tira errores en la compilacion, pero al probar el programa en el protoboard, este  no hace lo que debe... ahora bien, colocando 3 tablas exactamente las mismas usadas como DT, pero con el famoso retlw, Mpab me arroja el siguiente error:

Codigo:

Error[118]   D:LCDPROGRAMAICONO.ASM 319 : Overwriting previous address contents (0100)
Error[118]   D:LCDPROGRAMAICONO.ASM 319 : Overwriting previous address contents (0100)



   La verdad no entiendo com pueden hacer una directiva para la facil creacion de tablas, que no verifique por si sola si hay sobreescritura en direcciones utilizadas por otros fragmentos de codigos... Alguien puede explicarme porque al hacer tablas con DT, no hay avisos de peligro???... Esto si es raro, creo que aunque el codigo quede extenso y poco entendible, continuare con los retlw y las extensas tablas.

   Espero le sea util esta experiencia... los invito a que comprueben ustedes mismos.. el micro que uso es un PIC16F84A ... Saludos y Gracias a todos los que me ayudaron con mis problemitas. Un Abrazo!Rebotado