Was ist der schnellste Weg, um ein Bit 1 in MPASM für den erweiterten 14-Bit-Befehlssatz umzuschalten? (Ich arbeite mit einem PIC16F1829)
Der Code muss eigenständig sein - ich meine, dass er jederzeit aufgerufen werden kann, ohne den Wert des Bits in diesem Moment zu kennen.
Entscheidendes Kriterium ist hier die Geschwindigkeit : Ein Programm mit weniger Befehlszyklen ist besser. Die Anzahl der Befehlszyklen wird berechnet als die Zahl, wenn das Bit 0 ist + die Zahl, wenn das Bit 1 ist, dividiert durch 2.
1: mit toggle meine ich, dass der Code ähnlich wie pin=!pin
in C sein muss
Sie könnten Folgendes mit einem XOR versuchen:
movlw 0x01 ; move 0x01 to W register
xorwf lat, F ; XOR W with port & store result in port latch
Eine exklusive ODER-Operation bewahrt die Werte in Bits, wo die Bits im Arbeitsregister auf Null gesetzt sind, und invertiert die Werte, wo sie gesetzt sind. Sie könnten also dieselbe Technik auch verwenden, um mehrere Bits umzuschalten.
Ich bin darauf gekommen:
; 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
Dies dauert 4 oder 5 Befehlszyklen. Geht etwas schneller?
btfss
; bsf
; bcf
? Dann würde das Bit unabhängig vom Status gelöscht. Was meinen Sie? :)Was ist der schnellste Weg, um ein Bit1 in MPASM für den erweiterten 14-Bit-Befehlssatz umzuschalten? (Ich arbeite mit einem PIC16F1829)
Der Code muss eigenständig sein - ich meine, dass er jederzeit aufgerufen werden kann, ohne den Wert des Bits in diesem Moment zu kennen.
Entscheidendes Kriterium ist hier die Geschwindigkeit: Ein Programm mit weniger Befehlszyklen ist besser. Die Anzahl der Befehlszyklen wird berechnet als die Zahl, wenn das Bit 0 ist + die Zahl, wenn das Bit 1 ist, dividiert durch 2.
1: mit toggle meine ich, dass der Code ähnlich wie pin=!pin in C sein muss
Ich bin davon ausgegangen, dass das Bit, das Sie umschalten möchten, Teil eines Registers ist, das in den anderen Bits "egal" enthält, und daher würden Swap-Nibbles funktionieren. Sie haben nie gesagt, dass es so nicht funktionieren könnte, und wenn Sie so wenig Register haben, dass Sie die anderen Bits benötigen, wird eine Codeumschreibung oder ein MCU-Upgrade empfohlen.
Sie müssten zunächst 11110000 einrichten (jedes Muster würde ausreichen, wenn bn nicht gleich bn + 4 ist), aber danach jedes Mal, wenn Sie eines der verwendeten Bits invertieren möchten: -
swapf f,d
Es ist eine Ein-Zyklus-Operation und benötigt keine 1 in der Einrichtung des w-Registers.
Natürlich müssten Sie sich im Rest des Programms an diese Methode zum Ändern des Bits halten, ABER noch einmal, Sie haben nicht gesagt, dass Sie es nicht können - mit anderen Worten, BCF- oder BSF-Befehle sind verboten.
Ich dachte an Rotationen, aber sie rotieren durch Carry und das würde wahrscheinlich das Zeug beschädigen - ich habe seit über 20 Jahren keinen PIC-Code mehr geschrieben, also sollte Vergebung bei der Ablehnung im Vordergrund stehen !!!
Wenn Sie eine PIN invertieren möchten, müssen Sie den Zustand der PIN laden, also müssen Sie zuerst die Bank für PORTA auswählen. Also hier ist der Code in C:
// PORTAbits.RA5=~PORTAbits.RA5;
PORTA=PORTA ^ 0b00100000;
mit dem Ergebnis in ASM :
MOVLB 0x0
MOVF PORTA, W
XORLW 0x20
MOVWF PORTA
Wouter van Ooijen
Benutzer17592
Adam Lawrence
Benutzer17592
Andi aka
Benutzer17592
Andi aka