Was ist der schnellste Weg, um in MPASM ein Bit 1 für den erweiterten 14-Bit-Befehlssatz umzuschalten? (Ich arbeite mit einem PIC16F1829)
Der Code muss eigenständig sein - ich meine, er kann jederzeit aufgerufen werden, ohne den Wert des Bits in diesem Moment zu kennen.
Hauptkriterium ist hier die Geschwindigkeit : Ein Programm mit weniger Befehlszyklen ist besser. Die Anzahl der Befehlszyklen wird berechnet als die Anzahl, wenn das Bit 0 ist + die Anzahl, wenn das Bit 1 ist, geteilt durch 2.
1: Mit Toggle meine ich, dass der Code ähnlich wie pin=!pin
in C sein muss
Antworten:
Sie können Folgendes mit einem XOR versuchen:
Eine exklusive ODER-Verknüpfung behält die Werte in Bits bei, bei denen die Bits im Arbeitsregister auf Null gesetzt sind, und invertiert die Werte, bei denen sie gesetzt sind. Sie können also auch dieselbe Technik verwenden, um mehrere Bits umzuschalten.
quelle
Ich habe mir das ausgedacht:
Dies dauert 4 oder 5 Anweisungszyklen. Ist etwas schneller möglich?
quelle
btfss
;bsf
;;bcf
? Dann würde das Bit unabhängig vom Zustand gelöscht. Was meinst du? :)Ich habe angenommen, dass das Bit, das Sie umschalten möchten, Teil eines Registers ist, das in den anderen Bits "egal" hat und daher Swap-Nibbles funktionieren würden. 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 ein Umschreiben des Codes oder ein MCU-Upgrade empfohlen.
Sie müssten zunächst 11110000 einrichten (jedes Muster würde dies tun, wenn bn nicht gleich bn + 4 ist), danach jedoch 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 im w-Register.
Natürlich müssten Sie im Rest des Programms diese Methode zum erneuten Ändern des Bits einhalten, ABER Sie haben nicht gesagt, dass Sie dies nicht können - mit anderen Worten, BCF- oder BSF-Anweisungen sind verboten.
Ich habe über Rotationen nachgedacht, aber sie drehen sich durch Carry und dies würde wahrscheinlich das Zeug beschädigen. Ich habe seit über 20 Jahren keinen PIC-Code mehr geschrieben, daher sollte Vergebung bei der Abstimmung im Vordergrund stehen !!!
quelle
Wenn Sie eine PIN invertieren möchten, müssen Sie den Status der PIN laden, sodass Sie zuerst die Bank für PORTA auswählen müssen. Hier ist der Code in C:
mit dem Ergebnis in ASM:
quelle