PIC 24F-Ausgangsport nicht löschbar

Ich arbeite an einem VGA-Treiber für einen PIC 24F-Mikrocontroller. Ich habe alle B- und C-Ports für OUTPUT mit TRISB = 0 und TRISC = 0 gesetzt. Nach dem Scoping ist mir aufgefallen, dass einer meiner Pins immer hoch bleibt, nachdem er nur einmal gesetzt wurde, während die anderen Pins korrekt reagieren.

Genauer gesagt, PORTCbits.RC3 = 0 und PORTCbits.RC3 = 1 funktionieren einwandfrei, PORTCbits.RC4 = 1 funktioniert, bleibt aber nach dem ersten Umschalten hoch, und PORTCbits.RC4 = 0 bewirkt nichts.

Der von mir verwendete Prozessor ist ein PIC 24FJ64GA004, falls dies relevant ist. Alle Ports werden über die Tris-Register gleich konfiguriert und vorher gelöscht.

Tut mir leid, wenn diese Frage nicht allgemein genug ist, dies ist das erste Mal, dass ich etwas auf dieser Seite stelle.

Klingt so, als ob dieser bestimmte Pin auf diesem bestimmten PIC defekt ist. Hast du schon versucht, es gegen ein anderes des gleichen Typs auszutauschen? Ist das Problem dort reproduzierbar?
Was passiert, wenn Sie in LATCbits statt in PORTCbits schreiben? Ich habe PIC24 nicht speziell verwendet, aber dies sieht nach einem möglichen Lese-, Änderungs- und Schreibproblem aus.
Ich habe bereits versucht, die LATC-Bits zu verwenden, aber das hat nicht geholfen. Das Austauschen des Pins würde wahrscheinlich helfen, da die anderen Pins zu funktionieren scheinen (obwohl ich nicht alle gemessen habe), aber die Platine war mit Signalwandlern vorgelötet und dies sind die einzigen verfügbaren Pins, sodass ich keine anderen verwenden kann.
Ok ... nicht die Lösung, aber ich empfehle trotzdem dringend, dass Sie bei der Ausgabe die LAT-Register verwenden. Dafür sind sie da. Es hält den Leseteil von Read-Modify-Write intern auf dem Chip ... zuverlässiger.
Ich meinte, den ganzen PIC zu ersetzen, nicht den Pin. Nur um einen Hardwaredefekt als Ursache auszuschließen.
Danke fürs Lesen, werde das im Hinterkopf behalten. Edit: @Mels Ein Austausch des PIC ist an dieser Stelle nicht möglich, das Board ist nicht von mir. Ich werde sie kontaktieren und ihnen mitteilen, dass es möglicherweise Hardwareprobleme gibt, aber die Erfahrung hat mich gelehrt, dass das Problem meistens in der Software und nicht in der Hardware liegt, wenn etwas nicht stimmt.
Sehr richtig. Aber nachdem ich viele Stunden damit verbracht habe, S/W zu debuggen, die überhaupt nicht kaputt war, habe ich auf die harte Tour gelernt, H/W-Probleme nach Möglichkeit auszuschließen.
Tut: Obwohl es ratsam ist, das LAT-Register anstelle des PORT-Registers zu verwenden, halte ich eine genauere Beschreibung des Grundes für möglich. Das kann kein Read-Modify-Write-Problem sein. Die LAT-Register SIND immer noch anfällig für ein Read-Modify-Write-Problem, wenn Interrupts oder präventive Threads beteiligt sind. Andererseits besteht die einzige zusätzliche Gefahr beim Lesen, Ändern und Schreiben im Zusammenhang mit einem PORT-Register über einem LAT-Register darin, dass etwas die Spannung des RC4-Pins gegen den Willen des LAT-Registers erzwingt und Sie versuchen, ein weiteres Bit zu ändern - aber in diesem Fall würde PORTCbits.RC4 = 0 immer noch LATC4 setzen.
Ähnliches Problem bei einem PIC24FJ647GA002 auf RB11. Verwenden Sie LATB = 0x0000 als Ausgang, aber RB11 bleibt bei 1,3 V, wenn alle auf 0 sein sollten.

Antworten (2)

Ich würde empfehlen, dass Sie das Datenblatt überprüfen und nachsehen, ob es irgendwelche Fehler gibt, die mit diesem bestimmten Mikro verbunden sind.

Soweit ich (in der Vergangenheit) weiß, war es früher so, dass ich lesen/ändern/schreiben und dann (in einigen Fällen) zweimal in einen Port schreiben musste, um sicherzustellen, dass es dauerte.

Abgesehen davon, können Sie den Port isolieren, um sicherzustellen, dass nichts anderes diesen Port-Pin beeinflusst? Wenn Sie ein Entwicklungsboard haben, an dem NICHTS angeschlossen ist, ist es möglicherweise einen Versuch wert, den Code dort auszuführen und zu sehen, ob er von außen beeinflusst wird oder nicht.

PIC-Pins sind "mehrfach verwendbar" und können (standardmäßig) USART OSC I2C usw. usw. zugewiesen werden. Wenn dies nicht der Fall ist, liegt der Grund, warum E / A-Port-Bits "hängen bleiben", häufig im Laden der Stecker ...

Der Trick besteht jedoch darin, zu erkennen, dass Sie während der sichtbaren VGA-640-Pixel-Zeile überhaupt keine Zeit haben, um zu 'zählen' oder zu 'schleifen'. !

Fügen Sie jedoch ein externes Schieberegister (74HC166) hinzu und stellen Sie es so ein, dass jeweils 1 Byte von 8 PIC-E / A-Pins "geladen" wird, und es wird möglich, 80 FONT-zugeordnete (8x8) ASCII-Zeichen in jeder der 48 Zeilen anzuzeigen.

Sie takten die Verschiebungsregistrierung mit 24 MHz (was innerhalb der meisten VGA-Anzeigegrenzen liegt) und führen den PIC mit einem CPU-Clk (OSC / 2) von 15 MHz aus (also OSC ist 30 MHz), und das bringt Ihnen "genau" 5 CPU-Zyklen zum Aktualisieren die Byte-I/O-Pins.

5 CPU-Zyklen bedeutet kein Zählen, Aufrufen, Zurückgeben oder andere nutzlose Zeitverschwendung. Stattdessen „bauen“ wir die 8x8-Zeichen-Fonttabelle aus „Sätzen“ von 5 Anweisungen, die ein Byte an die I/O-Pins ausgeben, und „springen“ dann zur nächsten Schriftartposition, die ausgegeben werden muss.

Jeder Eintrag in der Schriftarttabelle enthält also 8 Sätze 5 Anweisungen, die "ein Byte ausgeben" und dann "das nächste Byte finden" ... speziell: -

Litteralbyte nach W laden, W-Byte nach PORT ausgeben (2)

W-Wort aus Index++ laden, W-Wort zu PCL hinzufügen (3)

Um diese Sequenz zu „steuern“, laden Sie 80 Indexregister mit den Offsets, die die Ausführung von einer Schriftartposition zur nächsten führen. Das letzte Index-Register enthält einen Offset, der Sie zum Line-Sync-Code führt, während dessen Sie die Index-Register für die nächste auszugebende Zeile laden müssen, dh den Inhalt der 80 Index-Register mit 80 neuen Offsets modifizieren.

Innerhalb einer Zeile von Zeichen bedeutet „Ändern der Indexregister“, dass das ERSTE zurückgesetzt wird, sodass es auf den nächsten „Start der Schriftzeilentabelle“ „zeigt“ (dh nächste Abtastung „Zeile nach unten in der Schrift“) – alle anderen Sprünge sind „ relativ', also bleib gleich.

Wenn Sie Schriftarten mit 8 x 8 Zeichen anzeigen, haben Sie normalerweise eine 2-Raster-Scanzeile zwischen den Zeichenzeilen „Lücke“ (480 Scanzeilen zeigen also 48 Zeilen mit 80 Zeichen Text) und 2 Zeilen sind ausreichend Zeit, um das „relative“ zu ermitteln offsets' für den nächsten Satz von 80 Zeichen.

Beachten Sie, dass dies für einfarbigen Schwarzweißtext gilt == es kann nicht einmal Schwarzweiß-Drahtgitter-Bitmap-Grafiken ohne die Hilfe von externem RAM erstellen (8 KB ist nicht genug Speicherplatz, um alle Bitmap-Daten zu speichern, die Sie benötigen mindestens 640*480/8 = 38.400 Bytes)