Video Display Controller MC6847

unilein

Mitglied
01. Dez. 2013
74
6
8
54
Henau
Sprachen
  1. ANSI C
  2. Assembler
  3. PHP
Hallo zusammen,

die frühen Heimcomputer hatten häufig einen Baustein für die Bildgenerierung. Ganz oft war das ein VDC vom Typ MC6847. Dieser kann direkt mit einem Speicherbaustein verbunden werden und erzeugt aus dem Speicherinhalt ein Bild für einen Monitor oder mit einem entsprechenden Modulator auch für einen Fernseher.

Einige dieser Bausteine habe ich in meiner Sammlung und ich würde gerne mal einen Solchen mit einem AtMega162 zusammen bringen und Informationen aus einem externen Speicherbaustein auf einen Monitor zaubern.

Nun meine Frage: Haltet Ihr das für möglich/machbar? (Nicht ob Ihr es für sinnvoll haltet ;-) )

Ich habe natürlich ein Datenblatt vorliegen und auch ein paar Referenzschaltungen mit einem MC6809 µP und einem MC6883 (SN74LS783) als Adressmultiplexer. Dennoch bin ich unsicher, ob die Technik von Damals mit einem µC von heute zusammenarbeiten möchte.

Besten Dank schonmal für Eure Einschätzung.

Beste Grüße
Uni
 
Kannst Du uns die Datenblätter zugänglich machen, oder müssen wir selbst gurgeln um "mitzuspinnen"?
 
Hmm...

ich hab da jetzt nur mal kurz quergelesen...
Prinzipiell scheint das gehen zu können, die beiden ICs kümmern sich mit 'nem DRAM und einem eventuellen weiteren IC selbst um die Ausgabe auf 'nem Display(?) oder TV.
Der Controller speist den DRAM, verwaltet vom MC6883.

Elektrisch scheint das zu passen.
Der Controller darf den RAM füttern... wann?
Im ersten PDF findet sich ein Hinweis auf Zeitfenster außerhalb des Bildbereiches (sowas wie'ne Abtastlücke), im 2ten ein Interleaved Mode.
Zeiten, wo der VDG den DRAM "freigibt"

ABER selbst wenn Du Dich da eingearbeitet hast, und das alles geht, bleibt noch, daß der SAM Deinem Controller irgendwie 'n Takt für das Übertragen vorzugeben scheint, selbst im slowMode mit fcrystal /16. fcrystal ist dabei ein Takt, der das vierfache des TV-subcarriers ist - ca 14MHz.

Dein Controller muß also mit irgendwas irgendwie auf ein knappes MHz reagieren können.

In ASM möglicherweise machbar - aber ich behaupte mal: Das wird kniffelig. Klingt jedenfalls interessant.
Du bleibst dran, und berichtest weiter? Dann werf ich mal'n genaueren Blick in die beiden Datenblätter
 
Hallo,

Prinzipiell scheint das gehen zu können, die beiden ICs kümmern sich mit 'nem DRAM und einem eventuellen weiteren IC selbst um die Ausgabe auf 'nem Display(?) oder TV.
Der Controller speist den DRAM, verwaltet vom MC6883.
... genau das. Der Controller (in diesem Fall AVR) kann nur SRAM ansprechen. Es MUSS also der 6883 dazwischen, der das dann auf die RAS/CAS-Adressen des DRAM umsetzt und das Timing für den Speicher erzeugt. Außerdem muß er sich dann auch um das Refreshing des DRAM kümmern da das beim SRAM ja garnicht benötigt wird und es der Controller darum auch nicht erzeugt. Nur der MC6847 ohne den MC6883 wird also nichts werden.

Es könnte auch noch mit nem Z80 gehen da der auch DRAM ansprechen kann. Außerdem kann er den BUS für DMA-Zugriff freigeben. Ist allerdings schon etwas älter. Es gibt mittlerweile aber auch welche mit 8MHz und CMOS oder sogar noch mehr Takt. Ist nen schöner Prozessor.

Gruß
Dino
 
Ich gehe davon aus, daß er VDG UND SAM UND DRAM mit dem AVR nutzen will. Eventuell auch noch diesen HF-IC (?) für den Fernseher.
Sorry...Und weil die Beiden ja irgendwie zusammen gehören, hier auch noch das Datenblatt vom SN74LS783...
Die Frage nach dem Sinn bzw anderen (inzwischen) einfacheren Lösungen (Dirks Thouch-Displays mit serieller Ansteuerung zB) hat er ja ausgeschlossen...
Er will mit diesen ICs "spielen". Die Frage war: Geht das? Ich denke schon, wenn er die Herausforderung annimmt;)
 
Hallo,

erstmal herzlichen Dank für Eure Einschätzung. Das war schonmal recht hilfreich. Meine Gedanken kreisen schon seit einigen Tagen um das Thema und ich bin zu ganz ähnlichen Einschätzungen gekommen. Allerdings sind da auch ein paar Punkte, die mich stutzig machen. Speziell das RAM-Thema (Static/Dynamic).

Ich besitze einen VZ/200 aus dem Jahre 1983. Das ist ein Z80-basierter Heimcomputer, der für die Bilderzeugung auf den MC6847 zurück greift. Interessant ist, dass sich im Inneren dieses Rechners KEIN MC6883 befindet. Dafür aber RAMs vom Typ M58725P/UM6114 (2K x 8, http://pdf1.alldatasheet.com/datasheet-pdf/view/128974/ETC1/UM6114.html ). Das ist Static RAM. Für eine kleine Hardware-Frickelei zur Verbesserung der Grafikmöglichkeiten des VZ200 wird ein 6264 verbaut (8K x 8 Static, http://users.ece.utexas.edu/~valvano/Datasheets/6264.pdf).

Die Seite mit den Infos zum VZ/200 ist diese: http://www.wolkenkratzerhaus.de/VZ/Basteln/Hardware.htm

Dort findet sich übrigens auch eine Bauteileliste und ein Plänchen (besagtes ohne MC6883):

http://www.wolkenkratzerhaus.de/VZ/Basteln/Bauteile.jpg
http://www.wolkenkratzerhaus.de/VZ/Basteln/VZ200.png

Soviel erstmal von meiner Seite.
 
Mal etwas Halbwissen meinerseits - bitte korrigiert mich, und ergänzt.
RAM beschreibt als Speicher mit wahlfreiem Zugriff eben einen Speicher in dem beliebige Bytes adressiert werden können. Das muß jetzt nicht unbedingt, wie umgangssprachlich verwendet, volatiler Arbeitsspeicher sein. Auch ein fiktiver NurLeseSpeicher (ROM) mit direkt adressierbaren Bytes wäre ein RAM.

SRAM und DRAM verwenden unterschiedliche (elektronische) Bitspeicher, beim SRAM sind diese eben statisch, d.h. bei anliegender Betriebsspannung bleiben sie erhalten. Beim DRAM nur kurz, die Bits (Bytes) müssen regelmäßig aufgefrischt werden. Die DRAM-Bitspeicher lassen sich kleiner realisieren, der IC wäre also kleiner (bzw eine größere Kapazität auf derselben Fläche möglich).
Möglicherweise auch billiger.

Zu den Timings habe ich nicht viel gefunden, letztendlich "macht" der 6883 aus dem DRAM für Controller (und VDG?) einen SRAM. Er kümmert sich um das Auffrischen.

WENN Du einen SRAM findest, der schnell genug ist (und groß genug), könnte man untersuchen, ob man mit 'nem AVR schnell genug Daten in den SRAM bekommt.

Der VDG scheint zu bestimmten Zeiten zu signalisieren, daß er keinen Zugriff auf den Speicher braucht.
Seine Adressleitungen können (durch den AVR) auf tristate gezwungen werden.
Im Elektronischen Sinne sollte es keine Probleme geben, die zulässigen Zeitfenster zu verletzen - würde solange zu Darstellungs-Artefakten führen.
Unklar ist, wie Du Dir das Speichermanagement im AVR vorstellst.
Auf den ersten Blick könnte man den externen SRAM direkt über den AVR verwalten lassen - wie internen SRAM. Aber dann muß man sich für alle Zugriffe an die Fenster halten. Wie ist das dann mit dem internen SRAM? Kann man auf den Zugreifen, und Adress- und Datenleitungen bleiben dabei Tristate?

Der VDG kann bis zu 6KBytes Speicher verwenden - mit eben 13 Adressleitungen, der AVR kann 64K nutzen. Du könntest also einen großen SRAM verwenden, der teilweise als VRAM genutzt wird, und teilweise als externer "Arbeitsspeicher".
Allerdings kannst Du bei geforderter ungestörter Darstellung auch auf die Arbeitsspeicherbereiche nur innerhalb der zulässigen "Zugriffsfenster " zugreifen.
Ein weiterer Ansatz wäre, einen 64K SRAM zu verwenden, und den verwaltungstechnisch als 8*8K-Speicher zu nutzen.
Der VDG setzt ja nur die unteren 13 Adressleitugen (also bis 8K, wobei er nur 6K nutzt), Der AVR kann jetzt trotzdem die oberen 3 Leitungen umschalten, und damit zwischen 23=8 Frames umschalten. Der AVR könnte während der "Zugriffsfenster" also PageX langsam mit Daten füllen, und Außerhalb der Fenster PageY auf den SRAM (und damit den VDG) legen - in etwa klar, was ich damit meine?

Bleibt trotzdem noch die Frage, ob der AVR außerhalb der Zugriffsfenster seinen eigenen internen Speicher nutzen kann/darf, also ohne Adress- und Datenleitungen zu beeinflussen.

Der VDG benötigt ein 4,xyzMHz-Takt.
 
Mal etwas Halbwissen meinerseits - bitte korrigiert mich, und ergänzt.
RAM beschreibt als Speicher mit wahlfreiem Zugriff eben einen Speicher in dem beliebige Bytes adressiert werden können. Das muß jetzt nicht unbedingt, wie umgangssprachlich verwendet, volatiler Arbeitsspeicher sein. Auch ein fiktiver NurLeseSpeicher (ROM) mit direkt adressierbaren Bytes wäre ein RAM.

Da gehe ich gerne mit. Meine Überlegung war genau umgekehrt: Mein ROM kann auch ein RAM sein, hauptsache, die Adressierung passt. Ich denke hier ist als plausibles Beispiel der C64 zu nennen, der im Grunde über 64KB RAM verfügt, diese Bereiche jedoch von ROM überlagert werden. Per POKE ließ sich das so einstellen, dass mal RAM, mal ROM an den jeweiligen Adressen gefunden wurde.

SRAM und DRAM verwenden unterschiedliche (elektronische) Bitspeicher, beim SRAM sind diese eben statisch, d.h. bei anliegender Betriebsspannung bleiben sie erhalten. Beim DRAM nur kurz, die Bits (Bytes) müssen regelmäßig aufgefrischt werden. Die DRAM-Bitspeicher lassen sich kleiner realisieren, der IC wäre also kleiner (bzw eine größere Kapazität auf derselben Fläche möglich).
Möglicherweise auch billiger.

Ja, passt aus meiner Sicht auch.

Zu den Timings habe ich nicht viel gefunden, letztendlich "macht" der 6883 aus dem DRAM für Controller (und VDG?) einen SRAM. Er kümmert sich um das Auffrischen.

Das habe ich auch so verstanden. Und er kümmert sich um das Bankswitching und um die allgemeine Speicherkonfiguration.


WENN Du einen SRAM findest, der schnell genug ist (und groß genug), könnte man untersuchen, ob man mit 'nem AVR schnell genug Daten in den SRAM bekommt.

Der VDG scheint zu bestimmten Zeiten zu signalisieren, daß er keinen Zugriff auf den Speicher braucht.
Seine Adressleitungen können (durch den AVR) auf tristate gezwungen werden.
Im Elektronischen Sinne sollte es keine Probleme geben, die zulässigen Zeitfenster zu verletzen - würde solange zu Darstellungs-Artefakten führen.
Unklar ist, wie Du Dir das Speichermanagement im AVR vorstellst.
Auf den ersten Blick könnte man den externen SRAM direkt über den AVR verwalten lassen - wie internen SRAM. Aber dann muß man sich für alle Zugriffe an die Fenster halten. Wie ist das dann mit dem internen SRAM? Kann man auf den Zugreifen, und Adress- und Datenleitungen bleiben dabei Tristate?


Der VDG kann bis zu 6KBytes Speicher verwenden - mit eben 13 Adressleitungen, der AVR kann 64K nutzen. Du könntest also einen großen SRAM verwenden, der teilweise als VRAM genutzt wird, und teilweise als externer "Arbeitsspeicher".
Allerdings kannst Du bei geforderter ungestörter Darstellung auch auf die Arbeitsspeicherbereiche nur innerhalb der zulässigen "Zugriffsfenster " zugreifen.
Ein weiterer Ansatz wäre, einen 64K SRAM zu verwenden, und den verwaltungstechnisch als 8*8K-Speicher zu nutzen.
Der VDG setzt ja nur die unteren 13 Adressleitugen (also bis 8K, wobei er nur 6K nutzt), Der AVR kann jetzt trotzdem die oberen 3 Leitungen umschalten, und damit zwischen 23=8 Frames umschalten. Der AVR könnte während der "Zugriffsfenster" also PageX langsam mit Daten füllen, und Außerhalb der Fenster PageY auf den SRAM (und damit den VDG) legen - in etwa klar, was ich damit meine?

Mein Idee war, grob beschrieben, folgende: Ich verpasse einem AVR 64 KB externes SRAM (2 x 32KB). Oder alternativ 1 x 32 KB und 1 x 8KB. Wobei ich die 8KB für den VDC verwenden würde. Grundsätzlich würde ich vom externen RAM 8 KB abzwacken wollen. Dem AVR kann ich ja mitteilen, wann er auf welchen Chip zugreifen darf. Mit einem kleinen Hilfsgatter könnte ich dem VDC sagen, wann er zugreifen darf und wann nicht.

Zugegebenermaßen seid Ihr mit Eurem Wissen und der Erfahrung weit vor mir und ich benötige etwas länger um die Thematik in Gänze zu verstehen und die Grenzen zu erkennen. Die Datenblätter der Bausteine liegen mir vor und ich bin gewillt an der Lösung zu arbeiten und dabei zu lernen. Bestimmt werde ich ein paar mal aufs Gesicht fallen :)

VG
Uni
 
Hallo zusammen,

also mal aus meinem "Halbwissen" :rolleyes: ... SRAM / DRAM

SRAM hat FlipFlop-Speicherstellen. Der Speicher kann mit beliebig niedrigen Frequenzen bedient werden. Dem gegenüber besteht ein DRAM aus Kondensator-Zellen. DRAM benötigt in einem bestimmten Zyklus für jede Speicherstelle einen Refresh. Das wird teilweise durch Ansprechen der Speicherstelle erledigt oder durch einen Refreshzähler des Prozessors oder eines anderen Bausteins, der dann die gesamten Zellen durcharbeitet. Der Refresh muß auch nicht alle Adressen durcharbeiten sondern es gibt einen sogenannten Zeilenrefresh. Es werden dabei nur alle Zeilen durchgearbeitet und damit dann alle Spaltenadressen dieser Zeile refresht.

SRAM hat einen durchgehenden Adressierungsbereich. DRAM hat keinen durchgehenden Adressierungsbereich sondern die Adressen sind beim DRAM in Zeilen- und Spaltenadressen getrennt. Beim SRAM legt man also die gesammte Adresse auf einmal an. Beim DRAM trennt man die Adresse auf. Erst wird ein Teil der Adresse ins Zeilenadressregisters des DRAM geschrieben und danach der Rest in das Spaltenadressregister. Danach werden die Daten gelesen oder geschrieben. Dafür haben DRAMs extra die Leitungen RAS und CAS (RowAdressSelect / ColumnAdressSelect). SRAM und DRAM werden also ganz anders angesprochen.

Der Multiplexer 74... wird verwendet um die Leitungen des DRAMs zwischen dem Video-IC und dem Prozessor umschalten zu können. Nicht mehr und nicht weniger. Wenn der Videobaustein auf das DRAM zugreift, dann müßte er den Prozessor eigentlich extern ein WAIT liefern damit der mit seinem Speicherzugriff so lange wartet bis der Videocontroller das DRAM nicht mehr benötigt. Damit werden die Zugriffe vom Video-IC und vom Prozessor also ineinandergeschachtelt. Das kann man vergleichen mit zwei Tasks die auf einem Prozessorkern laufen. Die werden auch in Häppchen "quasi gleichzeitig" ausgeführt.

Der 6883 ist für die Anpassung des Speicherzugriffs gedacht damit auch Prozessoren die nur SRAM ansprechen diesen DRAM verwenden können. Der Baustein ist also eine Erweiterung der Speicherschnittstelle des Prozessors.

Für mehr Infos müßte ich mir die Datenblätter erst mal genauer ansehen. Wird aber ne Zeit dauern bis ich dazu komme.

Gruß
Dino
 
Der VDG verfügt über alle 13 Adressleitungen um die 6K zu adressieren. An den SDRAM-Controller wird nur das LSB davon angelegt (und die nötigen Zeilen-/Spaltensynchronisationsleitungen die dieser benötigt, um die komplette Adresse "rauszusuchen".
SRAM sollte man aber trotzdem mit den 13 Leitungen adressieren können.

Eine der VDG-Ausgänge ist /FieldSync. Der ist low, solange der VDG mit der "Darstellung" ausserhalb der "active display area" beschäftigt ist.
Datenblatt des MC6847 S.13 schrieb:
During this time interval, an MPU may have total access to the display RAM without causing undesired flicker on the screen.
Wenn ich Figure 8 richtig interpretiere, hat man da also ein signalisiertes Zeitfenster von (je) ca. 2,5ms.
Außerdem hat der VDG einen Eingang (/MS), ein Low-Pegel dort zwingt die Adressleitungen auf Tristate.

Meiner Meinung nach (Spekulation) kann man so auch ausserhalb des /FS=low-Fensters mit dem Controller auf den SRAM zugreifen, aber dann hat man eben Artefakte auf dem Schirm.

@Uni:
Ob einer oder mehrere SRAMs macht aus Sicht des AVR adresstechnisch keinen Unterschied. Ob nun 2 8K-ICs verwendet werden, und eine Leitung dazwischen wählt, oder ob die eine Leitung ein Weiteres Bit in der Adresse darstellt, macht keinen Unterschied.
ABER theoretisch kann auf 2 unterschiedliche ICs gleichzeitig zugegriffen werden. (also auf den einen mit dem AVR und auf den anderen mit dem VDG).
Wenn das jetzt aber austauschbar sein soll, mußt Du die Adress- und Datenbusse umschalten können. Also AVR und VDG müssen ihre A- und D-Busse zwischen den SRAMs umschalten können.

Ein mit 20MHz getakteter AVR würde im /FS-Fenster (wenn ich mich nicht total vertan habe) ca 50.000 Takte Zeit haben. Da geht einiges.
Und wenn Das nicht reicht, zerlegst Du eben den SRAM gedanklich in 8 Frames (à 8K, die Frames werden durch die obersten Adressleitungen durch den AVR kontrolliert). Im Fenster macht der AVR irgendwo auf und in beliebigen Frames rum, ausserhalb schaltest Du den Datenbus im AVR tristate, die oberen 3 Adressleitungen auf den gerade darzustellenden Frame, die unteren 13 Adressleitungen tristate, und Übergibst die Kontrolle der unteren 13 Bits an den VDG (mit /MS)
Der AVR bestimmt also, welchen der 8 virtuellen 8K-SRAMs der VDG ausserhalb eines /FS-Fensters darstellen soll, und schreibt innerhalb des Fensters beliebige Daten in beliebige Frames (oder liest sie von da).

Das Fenster öffnet sich ca. alle 16,6ms - eben mit einer (Bildwiederhol-)Frequenz von 60Hz.
 
Hi Uni,

der VDG kann in 14 unterschiedliche Modi versetzt werden:
4 alphanumerische,
2 semigraphische
8 graphische

das wird über 7 Pins eingestellt.

2 der alphanumerischen Modi greifen auf einen internen CharacterGeneratorROM zurück. Die Character sind quasi reduzierte ASCII die mit 6 Bit adressiert sind. Ausgegeben werden dann 16 Charakter-Zeilen mit je 32 Zeichen (Spalten). Entsprechend werden 512 Bytes des RAMs verwendet.
Mein Vorschlag wäre, erstmal mit einem alphanumerischen Modus anzufangen.

Die generelle Verschaltung sollte ja in etwa so sein:

AVR <--A- und D-Bus--> SRAM <--A- und D-Bus, zusätzliche Steuerleitungen--> VDG -- A, B, Y, CHB--> Ausgabegerät
Zusätzlich noch einigen Signale zwischen AVR und VDG, in beide Richtungen.

Was jetzt vom AVR gesehen hinter dem VDG geschieht, hab ich mir überhaupt noch nicht angesehen.

Wenn Du soweit mitgehst, könnte man langsam eine erste Schaltplan-Idee angehen...
 
Tach auch Lotadac!

Die Fähigkeiten vom MC6847 kenne ich inzwischen auch. Ursprünglich kam meine Idee daher, dass mein alter VZ200 nur 128 x 64 Bildpunkte Grafik darstellen kann, ich aber die Frickelei fand, die mehr Grafik ermöglicht. Der Chip ansich ist sehr interessant und wenn man bedenkt, was damals so möglich war, ist das schon recht nett. Man kann ja sogar ein externes Character-ROM anschließen.

Inzwischen schniefe ich das Datenblatt ja auch ständig und eine erste Schaltplanidee geistert bereits in meinem Kopf und teilweise auf einem Stück Papier. Bitte habt Verständnis, dass ich mit meiner Idee nicht so rasend schnell voran komme, wie ich gerne möchte. Ich benötige, wie bereits erwähnt, viel Zeit für das Verstehen der Thematik (und Ihr habt mir bereits sehr geholfen). Leider stecke ich momentan beruflich mitten in einem ISO TS16949-Audit, welches meine Freizeit gerade ein wenig beschneidet. So wie ich jedoch etwas Luft habe, werde ich mit der Umsetzung auf "dem Papier" beginnen und natürlich auch die eine oder andere Testschaltung auf dem Steckbrett probieren.

Und wenn es soweit ist, ist es vermutlich geschickt, dieses Thema im Projekt-Forum weiter zu verfolgen.

Beste Grüße
Uni
 
Sollte jetzt nicht so klingen, als wenn ich drängel... ich denke nur nebenbei mit.

Ich habe mal die Beine des VDG etwas sortiert:
  • Stromversorgung
    • VCC
    • VSS
  • CLK (In) - Takt 3,579545 MHz
  • Videosignal (alle Out)
    • Phi A
    • Phi B
    • Y
    • CH B
  • Ausgänge zu einem externen Character ROM
    • /RP
    • /HS
    • /FS - FieldSync - solange low, kann MCU das externe SRAM nutzen
  • 8bit Datenbus (In)
  • 13bit Adressbus (Out)
  • /MS - Eingang, low zwingt den Adressbus auf tristate
  • Displaymodi (In)
    • /A,G -alphanumerisch, graphisch
    • /A,S - alphanumerisch, semigraphisch
    • GM2..0 - Graphikmodus 0..7
    • /INT,EXT - interner, externer Character ROM
  • Farben (In)
    • INV - invertiert die Farbdarstellung im alphanumerischen Mode
    • CSS - ColorSetSelect, wählt zwischen 2 Farben (alphanum. Modi) bzw 2 Farbsets (graph. Modi)
Normalerweise legt der VDG also über den Adressbus fest, welches Byte der SRAM auf den Datenbus ausgeben soll, dieses landet dann im VDG, und wird als Codenummer für den internen Character-ROM oder als direkte Graphikinfo interpretiert. Aber bei Verwendung eines externen Character-ROM wird der Datenbus zwischen SRAM und VDG umgeleitet, es wird das externe Character-ROM dazwischen geschaltet. Das erfordert also 2 zusätzliche externe 8bit-"Schalter". (Figure 23 rechts unten).
Der interne Character-ROM verwendet nur 6bit-Daten, der semigraphische Modus 7bit. Folglich kann Bit7 des SRAM-Data-Out auch auf den /A,S-Eingang gelegt werden (/A,G wählt zwischen echter Grafik oder (alpha, semigraphik), wenn alpha oder semigraphik, entscheidet Bit7.
Bit6 kann zusätzlich auf INV gelegt werden - dieser Eingang wird nur in den alphanum. Modi ausgewertet, und invertiert ggf die Farben (Figure 17a).
So, nun zu den potentiellen Stolpersteinen:
Der externe SRAM soll natürlich den Inhalt der adressierten (Adressbus) Speicherzelle ausgeben können (Datenbus) - andererseits soll er über den Datenbus beschrieben werden können. Er verfügt also über einen Write-Strobe-Eingang. Da er beim beschreiben selbst nichts auf den Datenbus legen darf außerdem über einen Output-Enable-Eingang. Diese beiden Signale sollten Durch den AVR bedient werden, wenn der VDG (immer lesend) darauf zugreift (also immer ausserhalb des /FS-Fensters), muß der Output (durch den AVR) enabled bleiben (komme später darauf zurück).
Da innerhalb des Fensters der AVR, ausserhalb des Fensters der VDG den Adressbus bedienen, müssen beide ihre Adress-Pins tristate schalten können. Beim VDG erzwingt man das über /MS. Der AVR kann seine Pins natürlich auch tristate schalten, bei Verwendung des Interfaces für den externen SRAM lauert aber auch hier ein Stolperstein.

Wenn man im AVR das Interface für den externen SRAM enabled, werden die entsprechenden Pins mit dem internen Daten- oder Adressbus verbunden, das Interface übernimmt die Kontrolle über die Pins. Also /RD, /WR, ALE und die Datenbus-Pins (die außerdem mit dem unteren Byte des Adressbusses gemultiplext sind), und die verwendeten Pins des oberen Adressbus-Bytes.
Stolperstein 1: Durch das Multiplexing (Adressbus7..0, Datenbus7..0) wird ein externer 8fach-Latch benötigt. dieser puffert das zuerst angelegte Adress-Byte auf den Adress-Bus, danach wird (mit ALE) auf der latch "getrennt", und im AVR auf den internen Datenbus umgeschaltet. Das macht das Interface automatisch, wo ist der Stolperstein? Durch zeitweise deaktivierung des Interfaces (SRE) kannst Du zwar die AVR-Beine tristate schalten, aber der 8fach-Latch hängt weiterhin am unteren Byte des Datenbusses, legt da irgendwas drauf. Du benötigst also einen Octal Latch mit (möglichem) tristate-Output. Sowas wie zB den 74AHC(T)573.
Stolperstein 2: Im AVR sind die Rechenregister, die Standard-I/O-Register und die Extended-I/O-Register vor den internen SRAM "eingeblendet", danach der interne SRAM. Selbst bei Aktivierung des externen Interfaces adressieren Speicherzugriffe (LD, LDS, LDD, ST, STS, STD, PUSH, POP) die Interna. Die ersten 0x0500 können also im externen SRAM so nicht adressiert werden. Der VDG legt aber mit seinem 13bit-Adressbus immer untere 13-Bit fest. Mein Vorschlag war wie gesagt, mit den oberen 3 Bits 8 8K-Bereiche zu "teilen", den ersten quasi wegzulassen und den AVR auch ausserhalb des Fensters auf einen der oberen 7-Frames festzulegen. Die kann der AVR problemlos vollständig adressieren, der VDG "weiß nichts" von den unterschiedlichen Frames, bekommt also einen der oberen 7 vorgesetzt, und darf darin jezt die unteren 13 Adressbits bedienen.
Inwiefern Zugriffe mit IN und OUT (auf den standard I/O), direkte Bitzugriffe (auf die ersten 0x1F standard I/Os) und direkte Bit-Zugriffe auf die Rechenregister (SBRC,SBRS) die externen Busse beeinflussen, ist mir auch nicht klar...
Stolperstein 3: Ist das externe Interface im AVR aktiviert, dienen die entsprechenden Beine dem Interface bzw unterliegen dessen Kontrolle. Zu Zugriffen auf den internen Speicher (inklusive (extended)I/O) findet sich der Hinweis, daß dann die /RD- und /WR-Strobes inactive sind. Das bedeutet mMn(!!) aber, daß dann trotzdem die Pins mit den Daten- und Adressleitungen sowie ALE zappeln - es wird eben nur nicht extern gelatcht. Das darf aber ausserhalb des FSync-Fensters nicht geschehen. Deswegen sollte generell ausserhalb des Fensters generell das externe Speicherinterface abgeschaltet werden. Dadurch werden die PORT- und DDR-Register der verwendeten Beine sofort wieder wirksam (/OE zum externen SRAM könnte da also automatisch gesetzt werden), der /OE des Octal-Latches (Adressbus-Datenbus) muß dann dessen Ausgänge auch auf tristate zwingen. Alle Pins, die direkt an einem der Busse hängen sollen dann automatisch tristate gehen. Achtung! auch Subroutinen-aufrufe und Interrupts verwenden für ihre Rücksprungadressen Speicherzugriffe (Stack)!

Ich bin mir nicht sicher, ob man auf das Schliessen des Fensters (steigende /FS-Flanke) hinreichend schnell reagieren kann, möglicherweise sollte man besser einen Timer im Hintergrund nutzen.
 
OK,

dann machen wir mal weiter. Heute habe ich mir mal die Zeit genommen, einen kleinen Schaltplan zu entwerfen. Ich habe einen ATMega162 mit 2 RAM-Bausteinen vom Typ HY62256 bestückt (32K x 8). Der 74HC573 dient als Latch und sorgt für das Multiplexing de Adressleitungen/Datenleitungen des ATMega. Mit Pin 28 des AVR (PC7 / A15) wird der Chipselect gesteuert. Ist CS high, wird RAM 1 genutzt. Für den Chipselect von RAM 2 verwende ich einen Inverter (74HC04). So ist gesichert, dass immer das richtige RAM aktiv ist.

Bis hierhin ists noch einfach gewesen (hab's sogar auf dem Steckbrett probiert ;)).

Jetzt kommt der MC6847 ins Spiel. Hier wächst meine Unsichertheit umgekehrt zur Außentemperatur bei uns im Ort.

Der Takt des VDC soll gemäß seiner Spezifikation sein. Dieser Takt wird dann auch für den AVR verwendet. Das Signal /FS des VDC hänge ich an OE des 74HC573 um diesen auf Tristate zu bringen, wenn der VDC zugreifen möchte. Die Adressleitungen des VDC habe ich direkt mit denen des RAM verbunden. Allerdings habe ich DA8 bis DA12 des VDC mit A10 bis A14 des AVR verbunden um auf den oberen Adressbereich von RAM 2 zugreifen zu können. Hier bin ich sehr unsicher, ob meine theorie funktionieren kann, was mache ich an dieser Stelle mit dem Chipselect? Meine Gadankengang war, dass der VDC kein CS benötigt, er adressiert von &H0 aufwärts bis &H6800 und weil ich seine Adressleitungen um zwei Leitungen verschoben angeschlossen habe, beginnt er &H6800 Bytes unterhalb vom Ende des Adressbereichs von RAM 2 :)fie: wenn das mal gut geht...)

Damit der VDC nur Daten bekommt, wenn der AVR nicht schreibt, habe ich in die Datenleitungen einen 74HC245 (8 bit Bustreiber) eingeschleift. Dieser nimmt das Byte entgegen und wartet darauf, dass !WE erlischt. Das Signal geht über den Inverter zum Treiber. Erst dann wird das Byte übergeben.

Das ist jetzt mal ein erster Wurf. Der besseren Übersicht halber habe ich die Leitungen im Plan unterschiedlich eingefärbt:

Grün = Adressleitungen des AVR
Blau = Datenleitungen (alle)
Gelb = Adressleitungen des VDC
Lila = Steuerleitungen (alle)
Schwarz = GND
Rot = Vcc

Der Plan ist hinsichtlich Stromversorgung und sonstigem Schnickschnack nicht vollständig. Es geht erst einmal darum, den Weg zu finden, wie AVR und VDC elektrisch in Einklang zu bringen sind.

Hier ist der Plan:

AVR6847_V1.png

Wer möchte, kann sich auch Online an dem Plan zu schaffen machen:
AVR6847


Beste Grüße,
Uni
 
Indem Du die beiden /CS der SRAMs (einmal invertiert, einmal nicht invertiert) zusammen an das MSB des Adressbusses legst, machst Du die für den AVR praktisch zu einem SRAM (mit doppelter Kapazität). Das wäre auch mein Vorschlag gewesen.

Die untersten 0x0500 (0x0000..0x04FF) Adressen in diesem (zusammengesetzten) externen SRAM kann der AVR nicht adressieren, da diese Adressen intern die 32 Rechenregister (0x0000..0x001F), den Standard-I/O-Bereich (0x0020..0x005F), den extended-I/O-Bereich (0x0060..0x00FF) und den internen SRAM (0x0100..0x04FF) adressieren (Siehe DB des AVR S.19). Ab Adresse 0x0500 wird/werden dann der/die externen Speicher adressiert, dort sind also die ersten 0x0500 Adressen vom AVR nicht erreichbar.

Soweit klar?

Wenn Du seitens des VDG jetzt die beiden Adressleitungen auslässt, machst Du es Dir mit dem beschreiben des Speichers unnötig schwer - der VDG adressiert dann keinen zusammenhängenden 8k-Block mehr, sondern mehrere (je 8 Bit "breite") Fragmente, die sich über den ganzen Speicher verteilen.
Und die ersten Adressen landen ja dennoch in einem Bereich (bzw der VDG lädt von da Daten), die der AVR dort nicht hinliefern kann.

Nochmal kurz mein Vorschlag:
Der VDG teilt dem AVR über die /FS mit, wann er keine Speicherzugriffe benötigt.
Der AVR zwingt den Adressbus des VDG über /MS auf tristate.
Der AVR aktiviert den Output des Adress-/Datenlatches.
Der AVR aktiviert sein externes Memoryinterface, und hat jetzt Zugriff auf den (zusammengesetzten) externen Speicher (bis auf die ersten 0x0500 Adressen)
Bevor sich das Fenster wieder schließt (/FS), deaktiviert der AVR sein Interface, macht also seine Busse tristate (sowie den Latch über dessen OE), und gibt den Adressbus des VDG wieder frei (/MS).

Der Adressbus des VDG liegt auf den unteren 13 Adressbits des (zusammengesetzten) Speichers, ABER der AVR legt trotzdem die oberen 3 Bits des Busses fest. (Also wenn das Fenster sich schließt, wird nicht der gesammte Adressbus des AVR tristate, sondern A15..A13 bleiben aktiv. Damit hättest Du 3 Bits bzw 8 wählbare Bereiche, die Du dem VDG präsentierst, in denen der VDG mit den unteren 13 Adressbits adressieren kann. Den ersten dieser Frames kann der AVR nicht vollständig erreichen, aber in den restlichen 7 jede Adresse.

Ist Dir mein Vorschlag klar? Wenn ja, was spricht dagegen?

Wenn der AVR allerdings nur innerhalb des Fensters auf den externen Speicher zugreift, sollte er das schneller tun...
 
Die untersten 0x0500 (0x0000..0x04FF) Adressen in diesem (zusammengesetzten) externen SRAM kann der AVR nicht adressieren, da diese Adressen intern die 32 Rechenregister (0x0000..0x001F), den Standard-I/O-Bereich (0x0020..0x005F), den extended-I/O-Bereich (0x0060..0x00FF) und den internen SRAM (0x0100..0x04FF) adressieren (Siehe DB des AVR S.19). Ab Adresse 0x0500 wird/werden dann der/die externen Speicher adressiert, dort sind also die ersten 0x0500 Adressen vom AVR nicht erreichbar.

Soweit klar?

Ja das ist klar. Ich muss dem VDG einen freien Bereich geben, der eben nicht im untersten Frame liegt.

Wenn Du seitens des VDG jetzt die beiden Adressleitungen auslässt, machst Du es Dir mit dem beschreiben des Speichers unnötig schwer - der VDG adressiert dann keinen zusammenhängenden 8k-Block mehr, sondern mehrere (je 8 Bit "breite") Fragmente, die sich über den ganzen Speicher verteilen.
Und die ersten Adressen landen ja dennoch in einem Bereich (bzw der VDG lädt von da Daten), die der AVR dort nicht hinliefern kann.

Das habe ich auch verstanden. Ich würde den Speicher ungewollt fragmentieren. Das war natürlich nicht mein Ziel.


Nochmal kurz mein Vorschlag:
Der VDG teilt dem AVR über die /FS mit, wann er keine Speicherzugriffe benötigt.

Ich könnte /FS auf INT0 legen und in einer ISR entsprechend reagieren.

Der AVR zwingt den Adressbus des VDG über /MS auf tristate.
Der AVR aktiviert den Output des Adress-/Datenlatches.
Der AVR aktiviert sein externes Memoryinterface, und hat jetzt Zugriff auf den (zusammengesetzten) externen Speicher (bis auf die ersten 0x0500 Adressen)
Bevor sich das Fenster wieder schließt (/FS), deaktiviert der AVR sein Interface, macht also seine Busse tristate (sowie den Latch über dessen OE), und gibt den Adressbus des VDG wieder frei (/MS).[/

In dieser Phase beschreibe ich den Speicher und am Ende des Schreibzyklus (der hinreichend kurz sein muss) deaktiviere ich das Mem-Interface des AVR, damit der VDC wieder seine Arbeit aufnehmen kann.

Der Adressbus des VDG liegt auf den unteren 13 Adressbits des (zusammengesetzten) Speichers, ABER der AVR legt trotzdem die oberen 3 Bits des Busses fest. (Also wenn das Fenster sich schließt, wird nicht der gesammte Adressbus des AVR tristate, sondern A15..A13 bleiben aktiv. Damit hättest Du 3 Bits bzw 8 wählbare Bereiche, die Du dem VDG präsentierst, in denen der VDG mit den unteren 13 Adressbits adressieren kann. Den ersten dieser Frames kann der AVR nicht vollständig erreichen, aber in den restlichen 7 jede Adresse.

Mit A13 des AVR biete ich dem VDC einen Adressbereich ab &H4000 an (richtig so?). Oder auch durch Kombination von A13 + A14 ein anderes Fenster. Mit A15 zusammen wähle ich den RAM-Baustein.


Ist Dir mein Vorschlag klar? Wenn ja, was spricht dagegen?

Ich hoffe es verstanden zu haben und danke Dir dafür, dass Du mir hilfst, den richtigen Weg zu finden. Und es spricht erstmal nichts dagegen, so vorzugehen.


Wenn der AVR allerdings nur innerhalb des Fensters auf den externen Speicher zugreift, sollte er das schneller tun...

DAS dürfte die große Herausforderung sein.

Gruß
Uni
 
Indem Du die beiden Speicher parallel schaltest (A15 bei einem invertiert), machst Du die zu einem doppelt so großem. Adressen 0x0000..0x7FFF landen in dem einen, 0x8000..0xFFFF in dem anderen.
Mit A13 bist Du ab Adresse 0x2000 dabei, sonst stimmts.

Da Du im Fenster fix sein willst, ist die Reaktion mit einem IRQ in der Tat die Methode der Wahl. Allerdings arbeitest Du in der ISR nicht alles ab, sondern setzt Dir dort nur ein "Fenster ist offen"-Flag, welches Du im Hauptprogramm pollst. Ich verwende für solche Flags gern das GPIOR0, da dieses direct bit accessible ist. Dein Controller scheint das noch nicht zu besitzen, ggf reservierst Du ein Rechenregister für derlei Flags?

Mit dem letzten Satz meinte ich nur, daß man im Fenster mehr Controllertakte hat, wenn dieser selbst schneller Taktet. Überschlagen hatte ich das Fenster mit fünfzig tausend 20MHz-Takten. Wären zwanzigtausend bei 8MHz. Aber rechne selber nach.
Sicher muß man dann nochmal das Timing prüfen (ob Adresslatch und SRAM schnell genug sind), und die wait states anpassen.

Um den Speicher vor dem Schließen des Fensters freizugeben, könnte man einen Timer (IRQ) nutzen. Beim externen IRQ (/FS) wird der Timer so gestartet, daß er kurz vor Ende des Fensters zuschlägt.

Das würde ich als erstes testen, also externen IRQ mit /FS, und den Timer. In beiden irgendeinen Controllerpin kippen, und diesen Pin und FS mit 'nem Logikanalysator aufzeichnen lassen.

Dargestellt werden dann nur die uninitialisierten Zufallswerte im externen SRAM.
 
So....

hat ein wenig gedauert, aber nun ist es doch Zeit für einen kurzen Zwischenstand.

Ich musste ein paar Bauteile besorgen. Ich hatte zwar Speicherbausteine da und die wären für den MC6847 auch schnell genug gewesen, aber eben nicht für den AVR.
Also habe ich 32 KB x 8 mit 55ns besorgt. Das sollte reichen. Außerdem habe ich noch einen MC1372 besorgt, um später auch ein buntes Bild erzeugen zu können. Bis dahin
soll aber ein monochromes Bild reichen. Hauptsache, es wird etwas angezeigt.

Nach der hier besprochenen Theorie habe ich einen kleinen Schaltplan entworfen. Dieser findet sich auch hier im Beitrag.

Im Plan erkennt man eine klassische Beschaltung für externes SRAM an einem AVR (Atmega162). Weiters findet sich ein MC6847 und ein 74HCT245 (8-fach Bustreiber).
Dem AVR stehen nur 2,4 ms zur Verfügung um den externen Speicher zu beschreiben. außerhalb dieses Fensters gibt es Bildstörungen. Um das Timing zu erreichen, habe
ich folgendes gemacht:

- /FS des MC6847 liegt an INT0 des AVR an
- /MS des MC6847 liegt an /FS an
- /OE des 74HCT245 liegt an /CS des zweiten SRAMS an um den Adressbus des MC6847 abzukoppeln

Der AVR ist wie folgt programmiert:

- INT0 reagiert auf fallende Flanke (/FS geht für 2,4 ms auf low)
- die ISR für INT0 schaltet die Speicherschnittstelle ein und richtet Timer 1 ein
- Timer 1 zählt 14000 Takte (der Atmega162 läuft aktuell mit 6MHz)
- Am Ende des Zählvorgangs schalter der ISR von Timer 1 die Speicherschnittstelle wieder ab.
- die ISR für Timer 1 legt PC5,6 und 7 auf High (A13,14,15) und bietet dem dem VDG das oberste Segment im SRAM an

Während des kleinen Zeitfensters gebe ich "Hello World" aus (was sonst!?).

Ein Traum wird war.... Oder auch nicht.

Ich habe das Ganze auf dem Steckbrett aufgesteckt und natürlich ausprobiert. Leider nur mit halbem Erfolg.

Ich habe ein Bild. Es zeigt jeweils einen kompletten Schirm voll "@"'s oder irgendein anderes Zeichen. Das Bild ist voller Störungen, was mir sagt, dass das Timing nicht stimmt.

Meine Interrupt-Steuerung funktioniert grundsätzlich, das habe ich mit meinem Oszi gemessen (Einfach im ISR von INT0 PB1 auf High, im ISR von Timer1 wieder auf Low).

Nunja... Ich fürchte, ich muss mit dem Logic-Analyzer ran. Und den muss ich erst noch kaufen (Werde ich gleich noch tun). :D

Ich erwarte jetzt keine Hilfe. Ich wollte nur mal einen Status loswerden.

Mfg,

Uni

MC6847.png
 
Hallo,

hört sich recht interessant an. Ich laß mich mal überraschen :cool:

Frei nach dem Motto: ...

"Nach den Physikern kann die Hummel nicht fliegen - Die Hummel interessiert das nicht."

... oder ...

"Alle haben gesagt das geht nicht. Bis einer kam der das nicht wußte. Der hat es dann einfach gemacht."

Berichte ruhig weiter wie es voran geht.

Gruß
Dino
 

Über uns

  • Makerconnect ist ein Forum, welches wir ausschließlich für einen Gedankenaustausch und als Diskussionsplattform für Interessierte bereitstellen, welche sich privat, durch das Studium oder beruflich mit Mikrocontroller- und Kleinstrechnersystemen beschäftigen wollen oder müssen ;-)
  • Dirk
  • Du bist noch kein Mitglied in unserer freundlichen Community? Werde Teil von uns und registriere dich in unserem Forum.
  •  Registriere dich

User Menu

 Kaffeezeit

  • Wir arbeiten hart daran sicherzustellen, dass unser Forum permanent online und schnell erreichbar ist, unsere Forensoftware auf dem aktuellsten Stand ist und der Server regelmäßig gewartet wird. Auch die Themen Datensicherheit und Datenschutz sind uns wichtig und hier sind wir auch ständig aktiv. Alles in allem, sorgen wir uns darum, dass alles Drumherum stimmt :-)

    Dir gefällt das Forum und unsere Arbeit und du möchtest uns unterstützen? Unterstütze uns durch deine Premium-Mitgliedschaft!
    Wir freuen uns auch über eine Spende für unsere Kaffeekasse :-)
    Vielen Dank! :ciao:


     Spende uns! (Paypal)