Autor Tema: Tablas, salto de pagina, lcall, lgoto  (Leído 3006 veces)

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

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Tablas, salto de pagina, lcall, lgoto
« en: 28 de Febrero de 2012, 06:47:47 »
Bueno estoy haciendo un programa en el que me ocurria lo siguiente,tengo una tabla con 50 llamadas a subrrutinas:

Código: [Seleccionar]
TABLA_DELAY ; tabla donde se escoge el delay correspondiente para cada

addwf PCL,1 ; Dutty segun la frec, de 1Hz a 50Hz
nop
goto DELAY_1
goto DELAY_2
goto DELAY_3
goto DELAY_4
goto DELAY_5
goto DELAY_6
goto DELAY_7
goto DELAY_8
goto DELAY_9
goto DELAY_10
goto DELAY_11
goto DELAY_12
goto DELAY_13
goto DELAY_14
goto DELAY_15
goto DELAY_16
goto DELAY_17
goto DELAY_18
goto DELAY_19
goto DELAY_20
goto DELAY_21
goto DELAY_22
goto DELAY_23
goto DELAY_24
goto DELAY_25
goto DELAY_26
goto DELAY_27
goto DELAY_28
goto DELAY_29
goto DELAY_30
goto DELAY_31
goto DELAY_32
goto DELAY_33
goto DELAY_34
goto DELAY_35
goto DELAY_36
goto DELAY_37
goto DELAY_38
goto DELAY_39
goto DELAY_40
goto DELAY_41
goto DELAY_42
goto DELAY_43
goto DELAY_44
goto DELAY_45
goto DELAY_46
goto DELAY_47
goto DELAY_48
goto DELAY_49
goto DELAY_50

Asi la tenia en un principio, pero haciendo pruebas me di cuenta que funciona bien hasta goto DELAY_45, pero a partir de esa posicion ya no va bien porque esos 5 DELAYS estan en pag. 1 y por tanto hay que setear el PCLATH, entonces encontre unas instrucciones, mas bien directivas del MPLAB que hacen eso: lcall y lgoto, ellas setean el PCLATH para direccionar ese salto par lo que la tabla queda asi:

Código: [Seleccionar]
TABLA_DELAY ; tabla donde se escoge el delay correspondiente para cada

addwf PCL,1 ; Dutty segun la frec, de 1Hz a 50Hz
nop
goto DELAY_1
goto DELAY_2
goto DELAY_3
goto DELAY_4
goto DELAY_5
goto DELAY_6
goto DELAY_7
goto DELAY_8
goto DELAY_9
goto DELAY_10
goto DELAY_11
goto DELAY_12
goto DELAY_13
goto DELAY_14
goto DELAY_15
goto DELAY_16
goto DELAY_17
goto DELAY_18
goto DELAY_19
goto DELAY_20
goto DELAY_21
goto DELAY_22
goto DELAY_23
goto DELAY_24
goto DELAY_25
goto DELAY_26
goto DELAY_27
goto DELAY_28
goto DELAY_29
goto DELAY_30
goto DELAY_31
goto DELAY_32
goto DELAY_33
goto DELAY_34
goto DELAY_35
goto DELAY_36
goto DELAY_37
goto DELAY_38
goto DELAY_39
goto DELAY_40
goto DELAY_41
goto DELAY_42
goto DELAY_43
goto DELAY_44
lgoto DELAY_45
lgoto DELAY_46
lgoto DELAY_47
lgoto DELAY_48
lgoto DELAY_49
lgoto DELAY_50

Bueno ya estaba tan contento cuando al hacer pruebas veo que hasta lgoto DELAY_45 funciona perfecto pero a partir de ahi no, si la llamo con 50 en W me va al DELAY_25 creo recordar, como es la primera vez que uso el lgoto, digo joder que raro, entonces abro el dssasembly listing y me encuentro que traduce por esto.


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

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

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.
Bueno solo es por si le pasa a alguien que no se coma el coco como me lo comi yo.  :lol:

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Tablas, salto de pagina, lcall, lgoto
« Respuesta #1 en: 29 de Febrero de 2012, 15:51:56 »
Gracias por el aporte1
Creo que lo más facil sería asegurar que el inicio de la rutina este alineado, de este modo la dirección terminará en 0x0, 0x00, o 0x000 por ejemplo. Esto lo logras con la directiva ALIGN. Si la direccion termina en 0x00 por ejemplo, sumandole W no caeras fuera de rango.
@fabianjsm is on twitter

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Tablas, salto de pagina, lcall, lgoto
« Respuesta #2 en: 02 de Marzo de 2012, 14:09:05 »
No entiendo bien esa directiva nunca la use,¿quieres decir poner todos los DELAYS en pag. 1?, ¿o donde se pondria ALIGN?

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Tablas, salto de pagina, lcall, lgoto
« Respuesta #3 en: 03 de Marzo de 2012, 19:08:14 »
Si tienes una tabla que ocupa 4 palabras por ejemplo, y mucho código precedente, el compilador podría ubicarla en la dirección 255 (o cualquier otra, por considerar el peor caso). Ya sabrás cual es el problema: Al ejecutar “ADDWF PCL, F” el PC vuelve atrás en vez de avanzar. La mejor dirección para ubicar este código sería en una que fuera múltiplo de 4, de modo que siempre puedas sumar hasta 3 sin salir del marco de la página. En este caso 4 sería tu valor de alineación.

Disculpa, no encontré la directiva ALIGN en al manual de MPASM (tal vez tenga otro nombre... si alguien sabe nos comentará). Pero de todos modos puedes lograrlo con la directiva ORG. Con  “ORG N” te desplazas al offset N. El offset actual es $, de modo que “ORG $” no tiene efecto. Con “ORG ($ & 4)”  haces que el offset sea múltiplo de 4 (en binario terminará en 00, y esto lo hace múltiplo de 4), pero si estas en el offset 15 por ejemplo, regresarías al 12. Lo que puedes hacer es sumar 3, así afectaras el tercer bit siempre que no este alineado. Tu tabla tendría alineación 4, y sin importar el código que la preceda, no saldrá del marco de una página (podrá ser movido al inicio de la próxima o caer fuera de memoria si tu código es muy extenso):

Código: ASM
  1. ORG ($ + 3) & 4   ; Semejante a la directiva ALIGN 4
  2. tabla:
  3.         ADDWF PCL, F
  4.         RETLW   D'07'
  5.         RETLW   D'11'
  6.         RETLW   D'13'

Otros ejemplos:

Código: ASM
  1. ORG ($ + 7) & 8     ; Semejante a la directiva ALIGN 4
  2.         ORG ($ + 15) & 16  ; Semejante a la directiva ALIGN 4
  3.         ORG ($ + 31) & 32  ; Semejante a la directiva ALIGN 4

Disculpa que sea extenso, espero que te sirva.
« Última modificación: 03 de Marzo de 2012, 19:11:05 por fabianjsm »
@fabianjsm is on twitter

Desconectado tapi8

  • Colaborador
  • PIC24H
  • *****
  • Mensajes: 1506
Re: Tablas, salto de pagina, lcall, lgoto
« Respuesta #4 en: 05 de Marzo de 2012, 14:54:48 »
Ahhhh ya entiendo, pero mi problema no es exactamente en la tabla, ya que esta al principio del programa y tiena 50 lineas. Mi problema era que las rutinas a donde va desde la tabla a partir de goto  DELAY_46  estan en pag. 1, y hay que hacer los seteos del PCLATH. Gracias de todos modos.

Desconectado fabianjsm

  • PIC18
  • ****
  • Mensajes: 255
    • fabianjsm is on twitter
Re: Tablas, salto de pagina, lcall, lgoto
« Respuesta #5 en: 05 de Marzo de 2012, 18:10:55 »
haa, ok... jaja :lol:
@fabianjsm is on twitter


 

anything