2017-08-07 1 views
0

Gibt es eine Möglichkeit, bestimmte Port-Pins zu setzen, ohne andere Pins am selben Port zu beeinflussen?PIC24F - LATx-spezifische Pins setzen, ohne die anderen Pins zu beeinflussen

Zum Beispiel:

verwendet I LATB [13: 6] für 7-Segment-LCD, der Rest LATB Bits für andere Zwecke verwendet werden.

Jetzt muss ich setzen LATB = 0x003F für die Anzeige "0", wenn ich dies tun, wird der Rest der Bits geändert.

Jemand kann mir helfen?

Antwort

2

Sie müssen die Operation aufteilen, da Sie die Bits 6 bis 13 in einem 16-Bit-Register nicht adressieren können. Angenommen, LATB ist ein 16-Bit-Register, bei dem die Bits 6 bis 13 (ein Bereich von 8 Bits) einer 7-Segment-Anzeige mit einer Periode zugeordnet sind (8 Segmente bilden), und diese Pins insbesondere auf 0x3f = gesetzt werden sollen 0b00111111, was wir tun können:

LATB = (LATB & ~(0xff<<6)) | (0x3f<<6); 

0xff ist eine Bitmaske, welche Bits wir beeinflussen möchten, 8 Bits repräsentieren, die wir in die richtige Position verschieben 6-13 <<6 verwenden.

Dies ist jedoch nicht atomar; wir lesen, maskieren die Bits, die wir anpassen wollen, setzen sie auf neue Werte und schreiben das gesamte Register einschließlich der erhaltenen anderen Bits zurück. Daher müssen wir zum Beispiel Interrupts um eine solche Leitung deaktivieren.

Für viele MCUs gibt es spezielle Codepfade, die die Änderung einzelner Bits unterstützen, oder dedizierte Logik für clear/set. Diejenigen, könnte bedeuten, dass Sie die Einstellung ohne zu riskieren, eine weitere Änderung durchführen konnte trampeln, wenn Sie zu schlichteren Operationen halten, wie zum Beispiel:

val = 0x3f; 
LATB |= (val<<6); // set bits which should be set 
LATB &= (val<<6) | ~(0xff<<6); // clear bits that should be clear 

In diesem Beispiel sind wir tun das Display Update nicht in einem Schritt, aber jedes Update Wir machen in einer Form gelassen, die der Compiler in der Lage sein könnte, auf einen einzelnen Befehl (IOR bzw. AND) zu optimieren.

Einige Prozessoren verfügen auch über Anweisungen zum Zugriff auf Abschnitte eines Wortes wie dieses, häufig als Bitfeldoperationen bezeichnet. Ich glaube nicht, dass PIC24 zu diesen gehört. Es hat zwar Single-Bit-Zugriffsbefehle, aber sie scheinen entweder mit der Arbeitsdatei zu arbeiten oder erfordern feste Bitpositionen, was bedeutet, dass die Einstellung Bit für Bit abgewickelt werden müsste.

C hat auch ein Konzept von Bitfeldern, was bedeutet, dass es möglich ist, eine Strukturinterpretation des Latch-Registers zu definieren, die einen Namen für die Bits hat, die Sie beeinflussen wollen, aber es ist eine ziemlich zerbrechliche Methode. Sie schreiben ohnehin architekturspezifischen Code, wenn Sie sich auf die jeweiligen Registernamen verlassen. Es ist wahrscheinlich am besten, die Dokumentation für Ihre Compiler- und Plattformbibliotheken zu überprüfen.