VGA-Schnittstelle mit PIC

Ich suche nach einer Möglichkeit, einen VGA-Bildschirm mit einem PIC zu steuern. Externe Komponenten sind in Ordnung, also ist ein VGA-Chip mit I2C oder SPI oder so auch in Ordnung.

Anforderungen:

  • Auflösung: max. 1024 x 768, kein Minimum
  • Sprache: C (C18-Compiler) oder Jalv2
  • Nur Text, keine Grafiken nötig (wäre aber auch okay, wenn es das hätte)
  • Eine Farbe reicht aus, daher ist die DA-Konvertierung nicht Gegenstand dieser Frage

In meinem Projekt habe ich einen Textpuffer, den ich auf einem Bildschirm haben möchte. Sie können es mit der Verwendung eines LCD-Displays zur Textanzeige vergleichen, jetzt jedoch mit VGA.

Was versuchst du zu machen? Ein PIC hat keine Videohardware, und es wird auch keine De-facto-Standard-Videohardware mit PICs verwendet. Jede Software ist spezifisch für ein bestimmtes Hardware-Setup.
In meinem Projekt werde ich einen Textpuffer haben. Ich möchte diesen Text auf dem Bildschirm haben. Ich möchte die Möglichkeit eines VGA-Ausgangs anstelle eines LCD-Bildschirms haben, wenn ich das Gerät an einen Beamer oder ähnliches anschließen möchte. Ich weiß, dass es möglich ist , aber das ist mit ASM, und ich möchte eine C/Jalv2-Bibliothek. Aber als Antwort auf Ihre Frage: Ich möchte einen Textpuffer auf den Bildschirm legen.
Der richtige PIC kann bei sorgfältiger Codierung möglicherweise VGA-Signale erzeugen, aber das wird nicht einfach sein. Welche Hardware beabsichtigen Sie, zwischen dem PIC und dem VGA-Ausgang bereitzustellen?
Daran habe ich eigentlich nicht gedacht, also keine Einschränkungen im Rahmen des Zumutbaren. Es ist auch OK, wenn ein VGA-Chip vorhanden ist. Gibt es? (Außerdem habe ich den Beitrag bearbeitet, um dies klarzustellen)
Ein Textpuffer mit welchen Abmessungen? Können Sie den größten Teil der Prozessorleistung für die Wartung des Displays verwenden? Aus dem Kopf sind mir keine eigenständigen "VGA-Chips" bekannt, aber Sie könnten einen eigenständigen SPI- oder seriellen Display-Slave mit entweder einem kleinen FGPA oder einem zweiten Mikrocontroller erstellen, entweder mit einer sehr hohen Taktrate und /oder DMA (vielleicht einige der ARM-Cortex-Teile) oder eines, das für seltsame Aufgaben wie einen Parallaxenpropeller entwickelt wurde. Wenn Sie mit begrenzten Farben einverstanden sind, kann Ihre elektrische Schnittstelle nur aus wenigen Widerständen bestehen.
Ich würde die Abmessungen so groß ändern, wie die Lösung verarbeiten kann, aber ich brauche mindestens 60 Zeichen horizontal und 16 vertikal. Ich kann den größten Teil der Leistung des Controllers der Wartung des Displays widmen. Diese Frage soll einen I2C-Slave bauen. Ich verstehe nicht ganz, was du mit FGPA meinst?
+1 für Parallax-Propeller! Wirklich schöner und wirklich leistungsfähiger Mikrocontroller, aber der Entwicklungsprozess ist etwas skurril. Auf der anderen Seite kostet es etwa 7 US-Dollar und erfordert ein externes EEPROM und Kristall für VGA. Es kann eine ganze Reihe von Farben erzeugen, wenn nur Widerstände für DAC verwendet werden.
Entschuldigung, vergessen zu erwähnen, dass eine Farbe ausreicht. Habe den Beitrag bearbeitet und entschuldige mich für die entstandene Verwirrung. @ChrisStratton warum sollte ich einen Parallaxenpropeller anstelle eines PIC verwenden?
Erstens, um einfach die sehr geschäftige Aufgabe des ständigen Neulackierens des Displays zu entlasten, damit Ihr primärer Prozessor frei darüber nachdenken kann, was auf dem Display angezeigt werden soll. Zweitens, weil es schneller ist, mehrere Kerne hat und Leute damit Videoanzeigen gemacht haben. Ein FPGA würde noch mehr Flexibilität bieten, hat aber eine hohe Lernkurve und ist einschließlich Support-Komponenten wesentlich teurer.
Okay, das kannst du als Antwort einreichen. Haben Sie einen Link zu einer funktionierenden Sache mit der Parallaxe, die an einen VGA-Bildschirm angeschlossen ist? Bitte teilen! Ich werde es akzeptieren, es sei denn, es gibt bessere Antworten (z. B. mit einem PIC, was billiger wäre).
@Camil Staps Schauen Sie sich zum Beispiel den Code für das Propeller Demo Board an. Es kann PS/2-Tastatur und -Maus, Displays auf Composite-Ausgang und VGA, Samples von einem Mikrofon und Wiedergabe, alles gleichzeitig. Ein weiterer Ort, an dem Sie nachsehen sollten, ist die Objektbörse . Dort stehen viele VGA-Objekte kostenlos zur Verfügung. Außerdem gibt es VGA-Demos, die auch mit der IDE geliefert werden.
Ooh, dieser Objektaustausch ist eine sehr schöne Sache, danke fürs Verlinken! Jetzt nur noch auf die Parallaxe als Antwort / eine PIC-basierte Antwort / eine andere Antwort warten.
So sehr ich den Propeller-Chip mag (ich habe eines ihrer Professional Development Boards bekommen, als sie für 100 Dollar im Angebot waren), wenn Sie den Propeller als Peripheriegerät verwenden möchten, um den Hauptprozessor zu entlasten, dann hat der Propeller gewonnen Ohne denselben zusätzlichen Speicher funktioniert es nicht sehr gut. Der Propeller hat nur 32 KB globalen RAM, und Sie benötigen wirklich einen vollständigen Frame-Puffer: 1024 x 768 = 768 KB, damit das Video kontinuierlich aktualisiert werden kann.
Wie kommst du auf 768Kbytes? Ich würde sagen 1024 * 768 / (6*8) = 16384, also 16,4 KB, da ich eine 5x7-Schriftart verwenden würde. Sie brauchen kein Byte pro Pixel, oder? Auch die 1024x768 war ein Maximum, weniger ist auch in Ordnung.
@tcrosley - eigentlich glaube ich nicht, dass diese Anwendung überhaupt einen Bildspeicher benötigt. Stattdessen kann man einen Zeichenpuffer (64*16=1K) verwenden und während des Abtastens der Anzeige eine On-the-Fly-Rasterung auf Pixel durchführen. Dies wäre vergleichbar damit, eine PC-Anzeige im Textmodus anstatt im Bitmap-Grafikmodus zu betreiben. Fügen Sie eine kleine Cursorsteuerungslogik hinzu und richten Sie sie so ein, dass sie über eine serielle Schnittstelle oder Mailbox-Register / Fifos eine Schnittstelle zum interaktiven Teil herstellt ...
@ChrisStratton Du hast recht, ich hatte vergessen, dass er nur testen will. Dann sieht der Propeller nach einer guten Lösung aus. Die Chips kosten in Einzelmengen nur 8 $ pro Stück , und Sie können sie in einem DIP-Paket erhalten.
DarioG hat in den Foren von Microchip.com einen Videogenerator aus einem DSPIC erstellt und das Projekt für andere zur Verwendung bereitgestellt. microchip.com/forums/m880978.aspx

Antworten (2)

Wenn es für Ihre Anwendung nicht übertrieben ist, können Sie Ihrem PIC eine ISA-Schnittstelle hinzufügen und irgendwo eine alte Grafikkarte aufheben.

Supercat weist jedoch darauf hin, dass es keinen PC gibt, um das Video-BIOS auszuführen, also würde dies wahrscheinlich nicht funktionieren.

Ich habe auf Hackaday einen Beitrag gefunden , der etwas Ähnliches mit einem AVR gemacht hat, der als Inspiration dienen könnte.

Oh, schön! Muss bei zukünftigen Projekten auf jeden Fall darüber nachdenken, danke fürs Verlinken & +1! Ich fürchte, es ist ein Overkill für dieses Projekt.
Wirklich nett, das alles vergessen. Ich denke, es könnte sogar VGA-Karten geben, die nur mit dem angeschlossenen 8-Bit-ISA funktionieren; Es gibt sicherlich Hercules-, EGA- usw. Karten, die möglicherweise auf die erforderlichen Timings umprogrammiert werden können.
Eine ausreichend antiquierte VGA-Karte sollte mit einem 8-Bit-Bus funktionieren, aber die I/O-Anforderungen selbst für einen 8-Bit-Bus werden so groß sein, dass man sich genauso gut für einen 16-Bit-Zugriff entscheiden kann. Ein Problem, das man bei VGA-Karten haben kann, besteht jedoch darin, herauszufinden, welche Initialisierungssequenz für eine bestimmte Karte erforderlich ist. Sogar Karten, die "100 % VGA-kompatibel" sind, müssen oft vor der Verwendung auf verschiedene nicht standardisierte Weise initialisiert werden. Da jede VGA-Karte ein BIOS-ROM enthält, ist dies kein Problem, wenn die Karte in einen PC gesteckt wird; Der PC führt den Code im ROM aus, was ...
... führen Sie die entsprechende Initialisierung für alle Register durch, die auf dem ursprünglichen VGA nicht vorhanden waren. Wenn Sie jedoch nicht vorhaben, eine 8086-Emulationsbibliothek für Ihren PIC zu schreiben, sind die im ROM bereitgestellten Initialisierungsroutinen ziemlich nutzlos.
@supercat du hast wahrscheinlich recht, ich habe das Video-BIOS vergessen.
@PhilFrost: Es gibt Zeiten, in denen die Anbindung an ISA-Bus-Geräte ziemlich gut funktionieren kann, ohne eine völlig unverschämte Anzahl von Pins zu verwenden (z. B. wenn ich mich erinnere, würde ein 8-Bit-Gerät, das 4 E / A-Adressen zuordnet, 8 Bit benötigen für Daten, 2 für Adresse, /IORD und /IOWR (zwölf Bits.) Eine 8-Bit-VGA-Karte würde mindestens 8 Daten, 17 Adressen, /IORD, /IOWR, /MEMRD, /MEMWR erfordern. Dreißig Bits. Vielleicht könnte man /IORD weglassen und in manchen Fällen vielleicht /MEMRD, aber trotzdem – das ist viel.
@supercat: Viele Mikrocontroller schaffen es sowieso, mit ISA-Geräten zu kommunizieren. Schieberegister für den Sieg.
@PhilFrost: Das Austakten von 32 Bit für jeden Anzeigevorgang scheint kein Rezept für Geschwindigkeit zu sein. Ich nehme an, man könnte Schieberegister für einige Bits verwenden, während die Daten, die unteren acht Adressbits und /MEMWR als dedizierte Ports beibehalten werden. Der VGA könnte die Anzahl der Zeichen pro virtueller Zeile auf 128 setzen (unabhängig von der Anzahl der angezeigten Zeichen), sodass keine Zeile eine 256-Byte-Grenze überschreiten würde. Wenn man nur Text verwenden würde, könnte man den 16-Bit-Modus verwenden, aber ein Schieberegister für den oberen Datenbus verwenden; das würde das Schreiben vieler Zeichen mit der gleichen Farbe beschleunigen.

Es ist wahrscheinlich, dass die Schaltung, die zum Hinzufügen eines VGA-Displays zu einem PIC erforderlich ist, die Kosten und die Komplexität der Verwendung eines anderen Chips übersteigt, der ein Display bereitstellen und auch alles tun könnte, was der PIC tun würde, oder sonst etwas wie eine Himbeere Pi, um das Display bereitzustellen und es über einen UART oder ähnliches mit dem PIC kommunizieren zu lassen (ich denke, der Raspberry PI hat mindestens einen UART unter seinen E / A-Pins).

Wenn es Ihr Ziel ist, sich ein VGA-Subsystem zu bauen, damit Sie lernen können, wie solche Dinge funktionieren, erfordert eine VGA-Schnittstelle bei 640 x 480 die Fähigkeit, etwa 32 Millionen Pixel/Sekunde auszutakten. Das wird die Fähigkeiten eines "unassisted" PIC ein gutes Stück übersteigen; Sie müssten einem PIC wahrscheinlich nicht viel Hardware hinzufügen, damit er Text ausgeben kann, wenn es Ihnen nichts ausmacht, wenn das Display den Prozessor während des größten Teils jedes Frames in Beschlag nimmt, aber der PIC hätte wahrscheinlich keine Zeit für irgendetwas anders; Jede Abtastzeile würde erfordern, dass sie eine 160-Anweisungsfolge wie folgt ausführt:

movf  POSTINC0,w,c
movwf PORTC,c

Starten Sie genau im richtigen Zyklus und laufen Sie ohne Unterbrechung [Hardware würde blind Zeichendaten von PORTC in dem Moment holen, in dem sie dort sein sollten, sie durch ein zeichenförmiges ROM leiten und in ein Schieberegister laden].

Wenn Sie so etwas getan haben, ist es für einen 32-MHz-PIC möglicherweise möglich, 80 x 25-Text mit etwas wie einem schnellen (25 ns) 32 K x 8-ROM zu generieren, um Zeichenformen zu speichern und sie zu serialisieren, einem 3-Bit-Zähler, um die Pixel jedes Zeichens auszutakten , und ein paar verschiedene Tore; Man könnte wahrscheinlich eines der PWM-Module des PIC verwenden, um die horizontale Synchronisation zu handhaben. Dieser Ansatz würde eine 80 × 25-Matrix von Kacheln bereitstellen, die jeweils eine von 256 Formen haben könnten; Jede Form wäre 8 x 16 Pixel und jede Kombination von 256 Farben [der Einfachheit halber stellen Sie sich vor, die Farben wären wahrscheinlich RRRGGGBB oder so ähnlich]. Wenn man Schwierigkeiten hat, ein ausreichend schnelles 32Kx8-ROM zu finden, könnte man stattdessen ein schnelles 32Kx8-RAM verwenden und einen Mechanismus zum Einspeisen von Daten beim Systemstart bereitstellen.

Aber Raspberry Pi macht kein VGA.
@AndrejaKo: Ah, okay. Wenn Sie insbesondere VGA benötigen, gibt es wahrscheinlich noch einige andere Einplatinencomputer, die die Arbeit für weniger als die Kosten für die Entwicklung einer kundenspezifischen Lösung erledigen könnten. Den PIC-Weg zu gehen, kann jedoch lehrreich sein. Die Menge an Schaltkreisen sollte nicht unangemessen sein, und Sie könnten wahrscheinlich immer noch alles finden, was Sie in einfach zu handlötenden Durchgangslochteilen benötigen. Übrigens, das Hinzufügen einiger Zähler, eines Off-Chip-RAM und einer kleinen Klebelogik würde es ermöglichen, das Video kontinuierlich ohne PIC-Beteiligung zu generieren, mit der Einschränkung, dass der PIC ...
... müsste seine Display-Schreibvorgänge richtig timen, um sicherzustellen, dass sie mit den Zeiten zusammenfielen, zu denen Display-Daten verfügbar waren; Das Hinzufügen von etwas mehr Schaltkreisen könnte diese Anforderung erleichtern.