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.
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)
Mels
Tut
AEIO
Tut
Mels
AEIO
Mels
Nathan Wiebe
Benutzer82920