Forum: Compiler & IDEs Externer quaduart als SRAM


von Sascha (Gast)


Lesenswert?

hallo,

ich habe einen quaduartbaustein an meinen ATmega128 angeschlossen und
zwar an die Leitungen für Externes RAM mittels Multiplexschaltung.
Mein ATmaga läuft mit 8MHz, der Baustein nur mit 1,7MHz. Die frage ist
nu ob ich Probleme bei der Übertragung bekomme. Fals einer mit sowas
schon Erfahrung gesammelt, wäre ich froh um eine Antwort.
Ich kann zwar sagen der Prozessor soll noch 2 Waitstates ausführe. Bin
mir aber nicht sicher ob das so hinhaut...

danke ,
Sascha

von Jörg Wunsch (Gast)


Lesenswert?

quaduartbaustein -- ich bin nicht drauf gekommen.

Google hat's für mich auseinandergenommen: Quad UART -- meinst Du
ebendieses?

Anyway, guck ins Datenblatt dieses Bausteins, was sie als Timing
erreichen, vergleiche es mit dem Datenblatt des ATmega128.  Meine
Kristallkugel ist gerade zur Reparatur, daher weiß ich nicht, was
für einen »quaduartbaustein« Du benutzt.

von Sascha (Gast)


Lesenswert?

von Texas Instruments
den TL16C754BFN

naja das ist die hauptnummer es geht noch weiter : 3BA3E7WFB
so der ist das. tut mir leid um deine Kristallkugel ich hoffe sie ist
bald wieder in Ordnung....

Timing, meinst du die Zeitdiagramme : aus denen werd ich leider nicht
besonders schlau !

die Frage ist auch ob sowas prinzipiell funktionieren kann ...

von Rufus T. Firefly (Gast)


Lesenswert?

Sicher kann das prinzipiell funktionieren. Das nennt man "memory mapped
I/O" und ist bei nicht-8080-artigen Prozessoren völlig normal.
8080-Prozessoren (und deren Nachfolger, wie Z80 und die x86-Reihe)
unterscheiden zwischen Speicher- und I/O-Adressierung.

Auch die Zugriffsgeschwindigkeit des AVR stellt hier kein Problem dar;
die 1.7 MHz (das sollten eigentlich 1.8432 sein) haben nichts mit dem
I/O-Timing der UART zu tun.
16C745 ist ein Nachfolger des 16C554, der wiederum eine
Vierfach-Ausführung des aus PCs bekannten 16C550 ist.

Poste doch mal einen Schaltplan, der zeigt, wie Du Dir den Anschluss an
das ext. Speicherinterface des AVR vorstellst.

Es kann im übrigen hilfreich sein, Timingdiagramme lesen zu lernen ...

von Sascha (Gast)


Lesenswert?

ist gerade nicht verfügbar :( werde sehn, daß ich dir heute abend was
nachliefer...

danke schon mal ...

von Sascha (Gast)


Angehängte Dateien:

Lesenswert?

moin , so hab mal ein schaltbild und quellcode für euch.
Ich weiss echt nicht mehr weiter. Habe inzwischen folgen baiteile
drauf:

ATmega128 (im 128-mode);
SN74ALS573CN (Latch);
TL 16C754BFN (QUAD UART);

habe alles wie im schaltbild angeschlossen. und beim ATmeag128 den
Exterenen RAM initialisiert.
Über Constanten berechne ich welchen der 4 UARTS ich ansprechen will
und wie die Adressleitungen gesetzt werden. die soll der Latch dann
halten (ALE). danach Datenlesen und über einen eigens geschrieben
Softuart ausgeben. Die ausgabe klappt einwandfrei. Leider bekomme ich
nur 0x00 zurück. Eigenltich sollte alles klappen.
Wär schön wenn mir einer helfen kann. Ich bin schon ganz verzweifelt..

danke,
Sascha

von Sascha (Gast)


Angehängte Dateien:

Lesenswert?

hier noch der Quellcode mit dem ich alles handle. ich hab auch schon
versucht den Externen Ram auszulassen und alles über ein
Assemblerprogramm selbst zu steuern mit dem gleichen Erfolg :( .

Sascha

von Rufus T. Firefly (Gast)


Lesenswert?

Das sieht im Ansatz nicht schlecht aus.

Naja, um auf Nummer Sicher zu gehen, daß niemals mehr als eine der
/CSn-Leitungen aktiv ist, solltest Du noch einen '138 verwenden, der
zwischen das Latch und die QUART gehängt wird.
Drei Adressleitungen oberhalb A2 gehen dann an den '138, und vier
seiner Ausgänge sind mit den /CSn-Eingängen der QUART verbunden.

Du könntest noch /RD und /WR verXORen und an einen der
Active-Low-Eingänge des '138 anlegen, dann wird /CSn erst dann aktiv,
wenn auch tatsächlich ein Lese- oder Schreibzugriff stattfindet.

Zum Testen kannst Du mit einer einfachen Routine eines der Register der
UARTs verwenden - das sogenannte "scratch pad"-Register hat keine
technische Funktion, außer, daß der hineingeschriebene Wert auch wieder
gelesen werden kann.

Bei meiner oben beschriebenen Beschaltung wiederholt sich das
Scratchpad-Register alle 8 Bytes (jede UART belegt 8 Bytes).

Dein Sourcecode wird vermutlich verständlicher, wenn Du die
Basisadressen der UARTs als Konstanten definierst, und die einzelnen
Register als Offset-Konstanten.

Dann würde Deine "ReadUart" und "WriteUart"-Funktion etwas leichter
lesbar.

Da bei der gegebenen Schaltung die QUART die ersten 32 Byte des XRAM
belegt, kannst Du daher definieren

#define XRAM_BASE 0xEE00  // Startadresse XRAM

#define UART_BASE_0 (XRAM_BASE + 0)
#define UART_BASE_1 (XRAM_BASE + 8)
#define UART_BASE_2 (XRAM_BASE + 16)
#define UART_BASE_3 (XRAM_BASE + 24)

Du solltest zunächst mal nur versuchen, das von mir erwähnte
"scratchpad register" zu beschreiben und lesen - wenn bereits das
nicht klappt, dann solltest Du ein Oszilloskop zur Hilfe nehmen und
einer Testroutine, die bespielsweise in einer Endlosschleife
abwechselnd liest und schreibt, auf die Finger gucken ...

Als nächstes könntest Du, ohne Dich mit Baudratenteilern und ähnlichem
'rumzuschlagen, mal ausprobieren, ob Du die Handshakeleitungen zu
sinnvollen Aktionen bewegen kannst. An die Ausgänge könntest Du
beispielsweise Low-Current-LEDs (mit Vorwiderstand) hängen, und testen,
ob Du die ein- und ausschalten kannst.

Näheres über die Programmierung der 8250 (das ist der "Urvater" der
vier einzelnen UARTs Deiner QUART) solltest Du problemlos im Netz
finden - achte darauf. daß Du C-Quelltext für DOS suchst. Da sehen zwar
die "Speicherzugriffe" auf die UART etwas seltsam aus, da beim PC die
UART nicht im normalen Speicher auftaucht, sondern im
I/O-Adressbereich, aber wenn Du irgendwo Zugriffe auf Adressen um
0x3f8-0x3ff und 0x2f8-0x2ff findest, dann glänzt das sprichwörtliche
Gold schon ganz gut.

Viel Erfolg!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.