TODOPIC

Microcontroladores PIC => Lenguaje C para microcontroladores PIC => Mensaje iniciado por: pocher en 28 de Junio de 2008, 06:17:34

Título: Tratamiento de tablas en ensamblador con PIC18F4550
Publicado por: pocher en 28 de Junio de 2008, 06:17:34
A ver si los que habeis tratado el ensamblador para PICs18 me podeis hechar una mano.

Tengo un programa en C donde aparece una parte en ensamblador con una tabla:

Código: [Seleccionar]
#asm
.
.
.
goto tabla:
.
.
.
tabla   movf   indice,0
          addwf  PCL,1
          goto    A
          goto    B
          goto    C
          etc
#endasm

Esto que con PICs16 funcionaría aquí le falta algo y no va.

¿Qué le falta? ¿Cuando me pondré con el ensamblador para PICs18  :D ?

Un saludo
Título: Re: Tratamiento de tablas en ensamblador con PIC18F4550
Publicado por: Leon Pic en 28 de Junio de 2008, 06:57:39
Asegurate de que estés en el banco 0 cuando trabajes con el PCL.  :-/
Título: Re: Tratamiento de tablas en ensamblador con PIC18F4550
Publicado por: pocher en 29 de Junio de 2008, 15:24:41
No, no es eso. Estoy en el banco 0.
Título: Re: Tratamiento de tablas en ensamblador con PIC18F4550
Publicado por: Leon Pic en 29 de Junio de 2008, 22:45:20
¿Qué es lo que exactamente ocurre?, el PC no salta?

A mi me pasaba que siempre saltaba una de mas, entonces lo que hise, poner un NOP justo debajo del addwf pcl. Quedaría así:

Código: [Seleccionar]
       addwf    pcl,1
        nop
       goto    a
       goto    b
       goto    c
Título: Re: Tratamiento de tablas en ensamblador con PIC18F4550
Publicado por: Vayadespiste en 30 de Junio de 2008, 06:40:32
El pc en la serie 16 se incrementa en 1 y en la serie 18 se incrementa de 2, no se si será eso lo que causa el problema.
Título: Re: Tratamiento de tablas en ensamblador con PIC18F4550
Publicado por: pocher en 30 de Junio de 2008, 11:37:26
No lo sabía ... entre otras muchas cosas.

El problema está en que al cargar un valor 6 en el índice se va fuera del alcance de los GOTOs. Entonces la solución sería poner un NOP entre GOTO y GOTO para que accediese a ellos de dos en dos. Voy a probarlo, gracias muchachos.
Título: Re: Tratamiento de tablas en ensamblador con PIC18F4550
Publicado por: pocher en 30 de Junio de 2008, 12:30:32
Nada, así támpoco va, valga lo que valga el índice el PCL después de la suma siempre se carga con el mismo valor errático.

Sé que Palitroquez lo hizo con punteros pero me gustaría primero intentarlo de una forma más sencilla ... pero no sale.
Título: Re: Tratamiento de tablas en ensamblador con PIC18F4550
Publicado por: pocher en 30 de Junio de 2008, 13:48:39
¡Vale ya está! googleando lo encontré.

No era tan fácil como parecía, con razón a la gente le cuesta entrarle al ensamblador para PICs18.
Título: Re: Tratamiento de tablas en ensamblador con PIC18F4550
Publicado por: Leon Pic en 30 de Junio de 2008, 19:24:02
¿Y que era?

Así aprendo yo también.
Título: Re: Tratamiento de tablas en ensamblador con PIC18F4550
Publicado por: pocher en 01 de Julio de 2008, 01:40:42
Se hace así:

Código: ASM
  1. ; Ejemplo de acceso a tabla
  2. ; ...
  3. ; Supongamos que inicialmente WREG=3
  4. rlncf WREG,W,0
  5. ; el valor en el acumulador se multiplica x2
  6. ; mediante un desplazamiento lógico a izquierdas
  7. ; ya que cada retlw ocupa 2 posiciones de memoria
  8. ; al final:-> (WREG=6)
  9. call
  10. tabla
  11. ; Llamamos a tabla y nos devuelve en W
  12. ; el contenido de la posición 3.
  13. org 0x100
  14. tabla
  15. movff PCL,0
  16. ;antes de saltar hay que leer PCL e iniciar PCLATH:PCLATU
  17. addwf PCL,F
  18. ; Sumamos PCL y W, el resultado a PCL-> PCL=PCL+6
  19. retlw 0x00
  20. ; con lo que se salta a la posición
  21. retlw 0x01
  22. ; indicada por W
  23. retlw 0x01
  24. retlw 0x02---
  25. ; PCL=PCL+6 Este (0x02) es el valor devuelto en WREG.
  26. retlw 0x01
  27. retlw 0x02
  28. retlw 0x02
  29. retlw 0x03
  30. retlw 0x01
  31. retlw 0x02
  32. retlw 0x02
  33. retlw 0x03
  34. retlw 0x02
  35. retlw 0x03
  36. retlw 0x02
  37. retlw 0x04
Título: Re: Tratamiento de tablas en ensamblador con PIC18F4550
Publicado por: maunix en 01 de Julio de 2008, 08:08:26
Buenas, llegué algo tarde al hilo pero quería aportar que en los 18F los registros de uso general del microcontrolador están en ACCESS BANK es decir que se pueden acceder siempre sin importar en qué banco estemos.



Título: Re: Tratamiento de tablas en ensamblador con PIC18F4550
Publicado por: flacoclau en 09 de Julio de 2008, 12:09:56
la parte de tu código que no entiendo es la de leer el PCL para iniciar el pclath y el pclatu, entiendo que estos se actualizan solamente leyendo el pcl, ahora ¿me puedes explicar para que se necesitan actualizar si solo se trabaja con el PCL? y este se puede acceder directamente o hay algo que leí mal en el DS?

modifico para agregar el link del programita que hice, el tema es que en MPLAB trabaja muy bien pero en la vida real me produce efectos erráticos como dices.

http://www.todopic.com.ar/foros/index.php?topic=22396.msg177735#msg177735
Título: Re: Tratamiento de tablas en ensamblador con PIC18F4550
Publicado por: flacoclau en 09 de Julio de 2008, 12:23:10
JEjeje leído y entendido moy bien el DS ahora si.
lo que ocurre es que al escribir el pcl también se me transferían el pclath y el pclatu a sus correspondientes pclh y pclu.
por lo tanto el procedimiento es primero leer el pcl y después recién sumerle el offset.
cosas de la vida...