Autor Tema: Rotación con Carry - ASM y C  (Leído 4987 veces)

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

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Rotación con Carry - ASM y C
« en: 10 de Marzo de 2009, 20:48:29 »
Hola

Estoy optimizando un código en C usando #asm y #endasm para un PIC18F2550.

Necesito mover bit por bit un byte a diferentes bytes y lo pienso hacer con RRCF, que es una rotación a la derecha a través del carry. Pero tengo una duda en ensamblador de PIC18 porque nunca lo he usado. La definición de RRCF es:

RRCF f,d,a

donde:
- f es el registro a rotar direccionado con 8 bits
- d es el destino de la operación
- If ‘a’ is ‘0’, the Access Bank is selected.
  If ‘a’ is ‘1’, the BSR is used to select the
  GPR bank
(default).
  If ‘a’ is ‘0’ and the extended instruction
  set is enabled, this instruction operates
  in Indexed Literal Offset Addressing
  mode whenever f ≤ 95 (5Fh).

No conozco la arquitectura de los bancos de ram de los PIC18 pero mi objetivo es que el resultado quede de nuevo en f.

Ejemplo...

Código: [Seleccionar]
RRCF Dout,f,a ;Rota a la derecha a través del carry y guarda el resultado en Dout
RRLF ADC,f,a ;Rota a la izquierda a través del carry y guarda el resultado en ADC

El truco es que el bit0 de Dout entre al bit0 de ADC a través del carry, pero no sé qué debo escribir en la variable 'a'.

Uso CCS 4.084 como compilador.

Gracias.  :mrgreen:

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Rotación con Carry - ASM y C
« Respuesta #1 en: 26 de Marzo de 2009, 17:47:54 »
Bueno, después de unas cuantas pruebas encontré la solución... no declarar f ni a, ya que en ensamblador se puede hacer así.

La a indica si se usará el banco de acceso, que me imagino es el banco donde están la mayoría de registros de trabajo.

Antes de escribir el código en asm, ejecuté una operación sobre un registro involucrado para "forzar" al pic a trabajar sobre el banco en que se encuentra y así me despreocupe por el valor de a.

Dejo el código por si a alguien le es de ayuda.

Código: [Seleccionar]
//Inicia conversión de 12 bytes a 5 bytes
adc[0][0]=0; //solo para ver la dirección de memoria en archivo .lst
#asm ASIS
;Deposita a en ADC Alto
rrcf dout[0]
rlcf adc[0][0]
rrcf dout[0]
rlcf adc[1][0]
rrcf dout[0]
rlcf adc[2][0]
rrcf dout[0]
rlcf adc[3][0]
rrcf dout[0]
rlcf adc[4][0]
;Deposita b en ADC Alto
rrcf dout[1]
rlcf adc[0][0]
rrcf dout[1]
rlcf adc[1][0]
rrcf dout[1]
rlcf adc[2][0]
rrcf dout[1]
rlcf adc[3][0]
rrcf dout[1]
rlcf adc[4][0]

Lo que hace es que va depositando bit por bit en otros bytes, lo cual es mejor en asm ya que en c implicaría más funciones.

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Rotación con Carry - ASM y C
« Respuesta #2 en: 26 de Marzo de 2009, 18:12:45 »
Citar
.. no declarar f ni a...

¿Quisiste decir d ni a?
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Rotación con Carry - ASM y C
« Respuesta #3 en: 26 de Marzo de 2009, 18:50:34 »
Perdón, d ni a.  :mrgreen:  :D

Desconectado Leon Pic

  • Colaborador
  • DsPIC30
  • *****
  • Mensajes: 3610
    • Impresiones en 3D
Re: Rotación con Carry - ASM y C
« Respuesta #4 en: 26 de Marzo de 2009, 19:42:11 »
Al menos, el compilador MPASIM del MPLAB, cuando no se declara el destino, asume que el destino, es el propio registro con que se está trabajando, por eso se lo puede omitir y al hacer esto, nos avisa con warning.

Hay que tener cuidado con esto, porque puede llegar a la confusión esperando que el registro se guardara en un registro distinto y se guardó en otro.
Jesús dijo, yo soy el CAMINO, la VERDAD y la VIDA, nadie llega al PADRE si no es por mi.

Desconectado migsantiago

  • Colaborador
  • DsPIC33
  • *****
  • Mensajes: 8257
    • Sitio de MigSantiago
Re: Rotación con Carry - ASM y C
« Respuesta #5 en: 26 de Marzo de 2009, 19:52:41 »
Sí, yo estaba con dudas porque nunca he programado asm para pic18, pero bueno, ya está resuelto  :mrgreen: