¿Cuál es la forma más rápida de alternar un bit 1 en MPASM para el conjunto de instrucciones mejoradas 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.
El criterio clave aquí es la velocidad : 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 tiene que ser similar a pin=!pin
C
Podría 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 conservará los valores en bits donde los bits en el registro de trabajo se establecen en cero e invertirá los valores donde se establece. Entonces, también podría usar la misma técnica para alternar múltiples bits.
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 posible algo más rápido?
btfss
; bsf
; bcf
? Luego, el bit se borraría independientemente del estado. ¿Qué quieres decir? :)¿Cuál es la forma más rápida de alternar un bit1 en MPASM para el conjunto de instrucciones mejoradas 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.
El criterio clave aquí es la velocidad: 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 tiene que ser similar a pin=!pin en C
Supuse que el bit que desea alternar es parte de un registro que tiene "no importa" en los otros bits y, por lo tanto, el intercambio de nibbles funcionaría. Nunca dijo que no podría funcionar así y si tiene tan pocos registros que necesita los otros bits, se recomienda reescribir el código o actualizar la MCU.
Necesitaría configurar 11110000 (cualquier patrón funcionaría siempre que bn no sea igual a bn + 4) inicialmente, pero después de eso, cada vez que desee invertir uno de los bits que usa: -
intercambiarf 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 adherirte a este método de cambiar el bit PERO, de nuevo, no has dicho que no puedas; en otras palabras, las instrucciones BCF o BSF están prohibidas.
Pensé en las rotaciones, pero rotan a través del acarreo y esto probablemente corrompería las cosas. No he escrito el código PIC en más de 20 años, ¡así que el perdón debería estar al frente de su mente cuando vote negativamente!
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
Wouter van Ooijen
usuario17592
adam lorenzo
usuario17592
Andy alias
usuario17592
Andy alias