La forma más rápida de alternar un poco en ASM

7

¿Cuál es la forma más rápida de alternar un poco 1 en MPASM para el conjunto de instrucciones mejorado de 14 bits? (Estoy trabajando con un PIC16F1829)

El código debe ser independiente, quiero decir que se puede llamar en cualquier momento, sin saber el valor del bit en ese momento.

Los criterios clave son velocidad aquí: un programa con menos ciclos de instrucción es mejor. El número de ciclos de instrucciones se calcula como el número cuando el bit es 0 + el número cuando el bit es 1, dividido por 2.

1: con toggle quiero decir que el código debe ser similar a pin=!pin en C

    
pregunta Keelan

4 respuestas

14

Puedes intentar lo siguiente usando un XOR:

movlw 0x01 ; move 0x01 to W register
xorwf lat, F ; XOR W with port & store result in port latch

Una operación OR exclusiva mantendrá los valores en bits donde los bits en el registro de trabajo se ponen a cero e invierte los valores donde se establece. Por lo tanto, también podría usar la misma técnica para alternar varios bits.

    
respondido por el PeterJ
1

Se me ocurrió esto:

;                                                           Cycles if 1 | Cycles if 0
btfss    port, pin  ; skip next instruction if 1            1           | 1
goto     $+3        ; pin=0, goto PC+3                      1           | 2
bcf      port, pin  ; pin=1, clear pin and...               1           | 
goto     $+2        ;   ...proceed program                  2           |
bsf      port, pin  ; pin=0, set pin and proceed program                | 1           +
; ...                                                       ---------------------------
;                                                           5             4

Esto toma 4 o 5 ciclos de instrucciones. ¿Es algo más rápido posible?

    
respondido por el Keelan
1
  

¿Cuál es la forma más rápida de alternar un bit1 en MPASM para el de 14 bits?   conjunto de instrucciones mejoradas? (Estoy trabajando con un PIC16F1829)

     

El código debe ser independiente, quiero decir que se puede llamar en cualquier   momento, sin saber el valor del bit en ese momento.

     

Los criterios clave son la velocidad aquí: un programa con menos ciclos de instrucción es   mejor. El número de ciclos de instrucciones se calcula como el número   cuando el bit es 0 + el número cuando el bit es 1, dividido por 2.

     

1: con alternar quiero decir que el código debe ser similar a pin =! pin en C

He asumido que el bit que desea cambiar es parte de un registro que tiene "no importa" en los otros bits y, por lo tanto, los nibbles de intercambio podrían funcionar. Nunca dijo que no podría funcionar de esta manera y si está tan corto de registros que necesita los otros bits, se recomienda volver a escribir el código o actualizar MCU.

Necesitaría configurar 11110000 (cualquier patrón haría si bn no es igual a bn + 4) inicialmente, pero luego cada vez que quiera invertir uno de los bits que usa:

swapf f, d

Es una operación de un ciclo y no necesita 1 en la configuración del registro w.

Por supuesto, en el resto del programa tendrías que seguir este método de cambiar el bit PERO otra vez, no has dicho que no puedes, en otras palabras, las instrucciones de BCF o BSF están prohibidas.

Pensé en rotar, pero giran a través del transporte y esto probablemente corrompería las cosas. ¡No he escrito el código PIC en más de 20 años, por lo que el perdón debería estar en la vanguardia de su mente cuando se vota! p>     

respondido por el Andy aka
0

Si desea invertir un PIN, debe cargar el estado del pin, por lo que primero deberá seleccionar el banco para PORTA. Así que aquí está el código en C:

// PORTAbits.RA5=~PORTAbits.RA5;
PORTA=PORTA ^ 0b00100000;

con el resultado en ASM:

 MOVLB 0x0
 MOVF PORTA, W
 XORLW 0x20
 MOVWF PORTA
    
respondido por el Spell

Lea otras preguntas en las etiquetas