Was bewirkt, dass das Einschalten eines einzelnen Ausgangspins am Microchip PIC16F690 spontan einen anderen Pin am selben Port ausschaltet? Ich kann dieses Problem umgehen, indem ich ein Byte in den gesamten Port schreibe und alle Pins gleichzeitig steuere, anstatt nur ein bisschen, um den Pin-Status zu steuern. Ich verwende hier den Hi-Tech C-Compiler. Ich bestimme den Zustand des Pins mit 9 LEDs, die jeweils 3 mA verbrauchen. Dies liegt weit unter den maximalen Leistungsspezifikationen.
In der mplab-Headerdatei ist der 0-Pin an Port A als solcher deklariert:
volatile bit RA0 @ ((unsigned)&PORTA*8)+0;
Ich schalte den Stift ein, indem ich einen hohen Wert darauf schreibe.
RA0 = 1;
Ist das Problem, dass der Complier die "1" als Byte behandelt und in den gesamten Port schreibt? Muss ich es besetzen? Wenn ja, hätte der Complier mir keinen Fehler geben sollen?
RA0 = (bit) 1;
Wenn ich an den gesamten Port schreibe, funktioniert alles wie erwartet:
PORTA = 0b00000001;
quelle
Stellen Sie sicher, dass der von Ihnen verwendete Port als digital definiert ist. ANSEL = 0;
Wenn ein Port als analog definiert ist und Sie einen digitalen Lesevorgang ausführen, wird 0 zurückgegeben. Wenn der PIC F16xxx die Lese-, Änderungs- und Schreiboperation ausführt, wird an allen analogen Pins 0 angezeigt. Dann wird 0 zurück in alle diese Pins geschrieben.
Wenn Sie ANSEL für PORT B auf 1 gesetzt haben, schaltet der folgende Code PORT B für 500 ms ein. Lesen Sie dann PORTB als 0b00000000 (da es analog ist). Schalten Sie dann PORTB aus, weil es dachte, es sei ausgeschaltet.
Stellen Sie sicher, dass Sie das entsprechende ANSEL-Bit für jeden Pin, den Sie als digital verwenden möchten, auf 0 setzen!
quelle
Ich benutze den Compiler von Microchip. Es hat eine Header-Datei, in der alle Register eine Vereinigung mit den definierten Bits haben. Also schreibe ich in meinen Code:
Außerdem würde ich das Latch-Register anstelle des PORT-Registers verwenden, um die Ausgabe einzustellen. Ich denke, einige Chips kümmern sich nicht darum, andere jedoch.
quelle
Ich bin mir zu 99% sicher, dass der Compiler dies tut. Unabhängig davon, welche Struktur für den Zugriff auf den Pin definiert ist, besteht eine Mehrdeutigkeit, die der Compiler auflöst, um dieses Verhalten zu erstellen. Das Bit-Casting könnte helfen, aber ich weiß nicht, wie (Bit) definiert ist, daher kann ich nicht sicher sein. Der Compiler gibt Ihnen nicht unbedingt einen Fehler, wenn der Wert, der in den Pin geschrieben wird, vom richtigen Typ ist. Ich vermute, dass die (Bit-) Maske möglicherweise eine Logik auslöst, um den Status der anderen Pins beizubehalten, aber dennoch denselben zurückzugeben Geben Sie als Ihre Konstante ein.
Es ist nicht überraschend, dass das Schreiben in den Port selbst funktioniert - aber das Arbeiten mit einzelnen Pins ist viel komplizierter. Entweder enthält der bereitgestellte Code einen Fehler, er sollte nicht mit diesem Compiler verwendet werden, oder Sie verwenden ihn einfach nicht richtig.
quelle
Wenn Sie den gesamten Port auf 1 schreiben, sehen Sie das Problem. In der Binärdatei ist das 0b00000001, also setzen Sie tatsächlich die ersten sieben Bits aus und das letzte Bit ein.
Sie müssen binäre Operatoren verwenden, um sicherzustellen, dass Sie nur die Änderung an diesem bestimmten Bit vornehmen. Mach das:
Wenn die Pins 2-8 derzeit hoch sind, gibt die ODER-Verknüpfung true zurück und das Bit bleibt gesetzt.
Verwenden Sie eine binäre UND-Verknüpfung, um ein wenig zu niedrig zu machen:
Beachten Sie, dass einige Compiler bestimmte Makros haben, um dies zu tun (dh _BV () auf avr-gcc), und einige Mikros spezifische Adressen haben, die auf jedes Peripheriebit ausgerichtet sind, so dass Sie diesen Lese-, Änderungs- und Schreibzyklus nicht ausführen müssen ( Bitband-Speicher auf Cortex-M3)
quelle