AVR8 asignar bit en ensamblador

1

Quiero simplemente asignar (copiar) un bit en el registro IO de algún otro bit de registro (o marca, o como resultado de alguna comparación). Ahora estoy usando lo siguiente ( PORTD[2] := r0[3] ):

    sbrc r0, 3      ; Skip if Bit in Register is Cleared
    sbi  PORTD, 2   ; Set Bit in I/O Register
    sbrs r0, 3      ; Skip if Bit in Register is Set
    cbi  PORTD, 2   ; Clear Bit in I/O Register

¿Pero es óptimo? ¿Hay mejor manera? ¿Cómo hacerlo con otras fuentes - alguna bandera, por ejemplo, C o T?

    
pregunta johnfound

1 respuesta

2

En muchos AVR, esto se puede hacer más rápido (pero no más pequeño) a través del bit T del registro de estado:

bst  r0, 3      ; Store bit 3 of r0 into T
in   r2, PORTD  ; Read the current value of PORTD
bld  r2, 2      ; Load bit 2 of r1 from T
out  PORTD, r2  ; Write the updated value back to PORTD

Esto requiere solo 4 ciclos (vs. 5: 2 + 0 + 1 + 2 o 1 + 2 + 2 + 0) y siempre actualiza PORTD en el cuarto ciclo independientemente del valor del bit.

Advertencias:

  • Si un ISR actualiza PORTD entre las instrucciones in y out , esa actualización será revertida por el out .
  • Se requiere otro registro de CPU si el valor de r0 se debe conservar ( r2 en este ejemplo, pero puede ser cualquiera).
  • Los dispositivos XMEGA y AVR de núcleo reducido tienen instrucciones de cbi y sbi de ciclo único, por lo que no hay diferencia de velocidad en esos objetivos.
respondido por el lumato

Lea otras preguntas en las etiquetas