Autor Tema: Tablas cuando el PC es de más de 8bits  (Leído 3161 veces)

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

Desconectado Neutrino

  • PIC10
  • *
  • Mensajes: 29
Tablas cuando el PC es de más de 8bits
« en: 17 de Noviembre de 2018, 23:16:09 »
Hola muchachos, resulta que estoy aprendiendo ASM y voy por las tablas, entiendo como funcionan, pero intentando implementar una en el pic16f1936 me encuentro con que el PC es de 15bits por lo que tiene asociado dos registros; el PCL donde se guardan los 8bits menos significativos del PC y PCLATH donde se almacenan los 7bits más significativos.

Ahora, lo primero que se me ocurrió, es simplemente implementar la tabla, sumando el índice del elemento que quiero obtener a los 8 bits menos significativos, pero me di cuenta que tendría un problema si se desborda la operación.

Si intento hacer la suma de más de ocho bits, tendría que sumar los dos bytes menos significativos y sumar el carry al byte más significativo lo que me toma más de una instrucción y tendría que operar primero el byte menos significativo del PC lo que me llevaría a una posición no deseada de la memoria.

Así que mi pregunta es, ¿cómo puedo implementar las tablas en estos casos?

Espero haberme hecho entender y muchas gracias de antemano.

Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Tablas cuando el PC es de más de 8bits
« Respuesta #1 en: 18 de Noviembre de 2018, 00:54:37 »
Disculpa que te conteste brevemente ya que lo hago desde el celular.

Para esos casos lo que se hace es pre computar el PCLATH necesario. Y a diferencia de las tablas comunes el cómputo del PCL no se encuentra junto a la tabla.

Código: ASM
  1. Table   movlw High(TStart)
  2.         addwf OffsetH,W
  3.         movwf PCLATH
  4.         movlw Low(TStart)
  5.         addwf OffsetL,W
  6.         skpnc
  7.           incf PCLATH,F
  8.  
  9.         movwf   PCL     ;computed goto with right PCLATH
  10.         ; end of Table subroutine.
  11.  
  12. ORG 0x???
  13. TStart:  ; Acá tu tabla

Desconectado Neutrino

  • PIC10
  • *
  • Mensajes: 29
Re:Tablas cuando el PC es de más de 8bits
« Respuesta #2 en: 18 de Noviembre de 2018, 15:16:44 »
Hola KILLERJC muchas gracias por responder. Voy a revisar el código con cuidado ya que hay un par de instrucciones que no conozco. De nuevo, muchas gracias por responder.

Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Tablas cuando el PC es de más de 8bits
« Respuesta #3 en: 18 de Noviembre de 2018, 15:42:40 »
High, Low toman la direccion de donde se encuentra ubicado TStart.

skpnc en realidad es un BTFSC STATUS, C , viene de skip no Carry, Lo demas es conocido.

Desconectado Neutrino

  • PIC10
  • *
  • Mensajes: 29
Re:Tablas cuando el PC es de más de 8bits
« Respuesta #4 en: 19 de Noviembre de 2018, 03:39:04 »
Hola KILLERJC de nuevo muchas gracias por responder, ahora entiendo el código, pero quedo con la misma duda que antes. En la tercer instrucción estoy modificando el valor del PCLATH lo que me modifica el PC y la siguiente instrucción podría ser cualquiera, no necesariamente la 4. ¿no?

Saludos.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Tablas cuando el PC es de más de 8bits
« Respuesta #5 en: 19 de Noviembre de 2018, 09:41:27 »
El PC unicamente se actualiza cuando:

- Se incrementa normalmente
- Se ejecuta un GOTO/CALL , en este caso en el opcode van 11bits, si tenes que direccionar mas, primero cargas en el PCLATH y luego usas las instrucciones GOTO/CALL
- Existen otras instrucciones como BRAW y BRA que usan el PC y los 8 bits de W o del opcode. Donde la parte alta queda fija. Util para tablas de menos de 8bits de longitud y dentro de la misma pagina
- Para aquellos que son computados como ADDWF, en W tenes 8 bits, y PCLATH lo que necesitas para llegar.
- RETURN que devuelve el PC completo

Lo unico que tenes que tenes que tener en cuenta es que el PCLATH, NO se escribe solo al PC.. Unicamente lo hace al momento de ejecutarse alguna otra instruccion como GOTO/CALL/ADDWF PCL/MOVWF PCL. Por eso mismo se computa primero el PCLATH para saber si paso o no de pagina, es decir:

Direccion de inicio de tabla + offset ? Ocurre un overflow al tratar de sumar el offset (se pasa de los 8 bits? )
Si? ----> Procedo a incrementar en 1 el PCLATH
No? ----> Dejo el PCLATH con el valor de la tabla

Al momento de ejecutar el MOVWF PCL, (resultado de lo que quedo de la operacion anterior) recien aca en el PC se carga el PCL con el valor de W y la parte alta del PC con el valor de PCLATH... Resumiendo, unicamente modificas el PC cuando escribis el PCL, o hay alguna instruccion como las que nombre arriba.

PD: El codigo que pase supone una tabla de menos de 512 entradas. Si ya tenes mas, primero que tu "indice" van a ser 2 registros, y segundo no vas a incrementar de a 1, sino la posibilidad de incrementar en mas.

Desconectado Neutrino

  • PIC10
  • *
  • Mensajes: 29
Re:Tablas cuando el PC es de más de 8bits
« Respuesta #6 en: 20 de Noviembre de 2018, 02:55:37 »
De nuevo muchas gracias por responder, con esta duda he aprendido mucho y me han surgido muchas más dudas. ¿Conoces algún libro o recurso que me puedas recomendar sobre ASM y/o la arquitectura de los PICs? Estoy aprendiendo de tutoriales en internet, pero todos se dejan algo, por ejemplo, gracias al datasheet y algunos hilos en este foro logré entender (op eso creo) como funcionan los bancos de memoria pero gracias a tu respuesta y un diagrama en el datasheet me enteré que también existen las páginas de memoria, pero no las entiendo muy bien y no encuentro mucha información en internet.

Saludos y de nuevo muchas gracias por contestar.

Desconectado KILLERJC

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8242
Re:Tablas cuando el PC es de más de 8bits
« Respuesta #7 en: 20 de Noviembre de 2018, 07:01:33 »
Seguramente existan libros que lo traten... yo se que la arquitectura y el funcionamiento del PIC esta todo escrito en el datasheet, por ahi un poco medio resumido, pero explicado en fin. Asi que si quisieras saber su arquitectura, en el datasheet tenes TODO.

Por ejemplo, todo lo de saltos esta en la pagina 53 del datasheet. Le sigue el uso del stack (si es que lo vas a usar manualmente ) sino podes dejarlo al uso del micro nomas.

Un ejemplo del uso del stack, primero explico como funciona el CALL y el RETURN, cuando uno hace un CALL el CPU del micro guarda la direccion en el stack, y al hacer uso del RETURN saca esa direccion que puso al ultimo y lo pone en el PC.
Hasta ahora para "saltar" lo que haciamos era computar el PC nuevo, modificar PCLATH y luego modificar el PCL, asi se cargaba en PC todo completo.
Otra forma es.... Calcular la direccion.. Es decir : (Direccion inicio + indice ), sumarlo y guardarlo en el stack, ejecutar un RETURN y listo, tenes tu tabla funcionando, ya que el RETURN va a sacar la direccion que nosotros pusimos y lo va a poner en el PC, cuando ejecute esa direccion seguramente tengas un RETLW, por eso esto requiere que si o si tengas un CALL antes a la funcion de la tabla.

Si seguis en el datasheet tenes explicado la parte de acceso indirecto a la memoria. En PICs mas antiguos este acceso era unicamente con la RAM, en los mas nuevos tambien se puede leer la FLASH.. Y si puedo leer la FLASH tambien puede leer una TABLA!! Esto es MUY util en el caso que necesites todos tus valores de forma ordenada y continua (seguidas) o Tambien en el caso de que necesites computar el valor, de esta forma no necesitas "saltar". Solo cargas la direccions en los FSR y luego de alli tomar el dato en el INDF.

En fin en este PIC tenes varias formas de implementar una tabla... yo me centre en el uso del PCL, pero como ves existen varias mas. Solo es cuestion de practica, imaginacion y tambien haber visto otros codigos como para darse una idea de como usarlos para distintas cosas.

Desconectado Neutrino

  • PIC10
  • *
  • Mensajes: 29
Re:Tablas cuando el PC es de más de 8bits
« Respuesta #8 en: 26 de Noviembre de 2018, 17:21:56 »
Entiendo, de nuevo muchas gracias por tu ayuda KILLERJC

Saludos.


 

anything