Forum: Mikrocontroller und Digitale Elektronik 2 AVRs an einem SRam


von Elektrofuzzi (Gast)


Lesenswert?

Hi,

Ich muss von 2 AVRs (sehr schnell) abwechselnd ein SRam IC ansteuern,
und muss die 24 Adress- und Datenleitungen der AVRs jetzt irgendwie
trennen, aber ohne Treiber ICs zu verwenden. Mit Treiber ICs könnte ich
einfach 2 mal 3 8-fach Treiber verwenden, und die dann entsprechend per
"output enable" zu- bzw. wegschalten.

Da ich aber leider keinen Platz für 6 zusätzliche ICs + Leitungen habe,
suche ich irgend eine simplere Möglichkeit, wie ich das z.b. mit ein
paar Widerständen, Transistoren und evtl. entsprechender Programmierung
der AVRs lösen kann.

Das ganze muss recht schnell gehen, und daher geht es leider nicht
jeweils 24 I/O-Ausgänge der AVRs auf hochohmig bzw. Output zu setzen,
ausser das ginge natürlich mit 1 Befehl...

Falls jemand eine Idee hat, dann lasst es mich bitte wissen...

von Hans (Gast)


Lesenswert?

vielleicht dual-port rams???

welche anwendung hast du da, dass du sowas machen musst?

73 deoe6jwf / Hans

von Mark de Jong (Gast)


Lesenswert?

Hallo,

Dafür gibt es Dual Ported RAM.

Grüße Mark,

von Benjamin Schmidt (Gast)


Lesenswert?

hi,

an sowas bin ich auch schon länger interessiert, nur hab ich nie etwas
entsprechendes gefunden...

Nur von Dallas den DS1609, der allerdings "not recommended for new
designs" ist und nur 256 Bytes speichern tut. Ich suche etwas in der
Größenordnung 32 KB


Gruß
Benjamin

von Hans (Gast)


Lesenswert?

tjo die gibts ned mehr so häufig... ursprünglich wurdn die dinger ja auf
grakfik karten verbaut.. und jetzt da ja sowieso alles auf minimalen
raum sein muss wegen der frequenzn macht man den controller gleich auf
den chip...

aber schau doch mal auf die cypress-page..die baun die dinger... z.b
CY7C133....

73 de OE6JWF / Hans

von Peter (Gast)


Lesenswert?

Hallo Elektrofuzzi

Was soll das geben?
Vielleicht ein EPRPOM-Emulator?

Gruss Peter

von Peter D. (peda)


Lesenswert?

Das sollte ganz ohne Probleme gehen.

Man kann doch das externe Speicherinterface disablen und damit sind die
belegten Pins ganz normale IOs, d.h. hochohmig.

Du brauchst nur noch 1 oder 2 Drähte zwischen den AVRs damit sich die
beiden einigen können, wer denn jetzt nun zugreifen darf.

Z.B.darf der Slave immer und der Master sagt über einen Draht, daß er
jetzt mal ran möchte.
Und nachdem der Slave den gerade laufenden Zugriff beendet hat sagt er
über den 2. Draht dem Master, daß er fertig ist und der Master nun ran
darf.


Peter

von Elektrofuzzi (Gast)


Lesenswert?

Hi,

Das Ding soll ein Controller für Grafik-LCD-Displays werden. Ich habe
ziemlich viele verschiedene Displays, und mit einer allgemeinlösung
kann ich alle damit ansteuern und muss nur die SW ein bisschen ändern.

Leider habe ich da keine Zeit für Handshakes, etc.. für die
Kommunikation zwischen den AVRs, daher wäre es am besten, ich könnte
von dem AVR zuständig für die Ausgabe auf dem Display den anderen AVR
zu bzw. wegschalten. Mit Treibern wäre das sehr einfach mäglich, aber
ich will halt nicht 6 Treiber (2 * 16+8 Adress/Datenleitungen)
zusätzlich einbauen müssen.

Wenn es natürlich SRam gibt, das ich gleichzeitig beschreiben und lesen
kann (über verschiedene Adress/Daten-Leitungen) wäre das natürlich
fein....

Jetzt müsste ich nur noch wissen, wo es sowas gibt in grössen ab 32 K.

:-)

von Peter D. (peda)


Lesenswert?

"Leider habe ich da keine Zeit für Handshakes"

Ein IN oder OUT kostet bei 16MHz ja gerademal 62ns.
Du wirst ja wohl noch ein bischen was anderes machen, z.B. die Daten
aufbereiten müssen und nicht nur Speicher hin und her schaufeln.

Man sollte erstmal realistisch ermitteln welche Datenrate da eigentlich
benötigt wird.

Der Overhead für das Handshake dürfte auf etwa 1..10% zu drücken sein,
wenn man Paket orientiert arbeitet und nicht jedes Byte einzeln
handshaked.


Wenn Du aber wirklich jeder einzelnen ns hinterherjagen willst, dürfte
der AVR wohl nicht ganz das richtige sein.


Peter

von Elektrofuzzi (Gast)


Lesenswert?

"Ein IN oder OUT kostet bei 16MHz ja gerademal 62ns."

Genau, und ich habe 7 * 62.6 ns Zeit um die Daten 1 mal auszulesen und
einzulesen. Wenn man da die Zusatztakte für's SRam und das LCD-Display
abzieht, bleibt da nimmer viel übrig.

Mit 6 Treibern gehts (rein theoretisch), aber ich habe für die eben
keinen Platz.

Die AVR-Lösung ist für meine Zwecke trotzdem das beste, da ich damit
sehr flexibel sein kann.

Alles was ich brauche, ist eine Möglichkeit, die 16 Adress- und 8
Datenleitungen vom AVR-2 mit dem AVR-1 mit einem Takt auf das SRam zu-
bzw. wegzuschalten.

Das muss doch irgendwie zu machen sein, oder ?

von Peter D. (peda)


Lesenswert?

"...bleibt da nimmer viel übrig..."


Das reicht doch hinten und vorne nicht, übrig bleibt da erst recht
nichts.


Ein LD + ST dauert ja schon 6 Zyklen:

loop:
      LD              ;3 hole vom RAM
      ST              ;3 lade ins Display
      DEC loopcounter ;1
      BRNE loop       ;2

Du brauchst also mindestens 9 Zyklen und hast keinerlei Zeit noch was
anderes zu machen.
Meistens ist aber das Display mit Controller, d.h. Du must noch einen
Busy-Test mit machen bzw. zwischen Daten und Befehlen umschalten.

Also selbst mit Dual-Port-RAM gehen 7 Zyklen nie und nimmer !


Und ohne Dual-Port-RAM brauchst Du immer ein Handshake, sonst zieht der
eine dem anderen den SRAM unterm Hintern weg und der stellt dann nur
noch Müll im Display dar.

Aber auch mit Dual-Port-RAM brauchst Du eine Art Protokoll, damit der
eine weiß, welche Daten gültig sind und neu dargestellt werden müssen
und welche nicht.


Peter

von Elektrofuzzi (Gast)


Lesenswert?

"Das reicht doch hinten und vorne nicht, übrig bleibt da erst recht
nichts."

Doch das geht schon, der Lesezyklus muss eben immer laufen (fürs LCD
Display) aber schreiben reicht alle 2 oder 3 Lesezyklen.

Und lesen + Daten ans LCD kann ich in 4 takten. Und wenn ich die
Schleife von byteweise auf zeilenweise ausdehne, brauche in die 2
Befehle dafür auch nicht.

Ich muss nur die Ausgänge irgendwie zu bzw. wegschalten können.
Anliegen an den ausgängen tun die richtigen werte bereits...

von Elektrofuzzi (Gast)


Lesenswert?

"Ein LD + ST dauert ja schon 6 Zyklen:"

BTW: Ich dachte eine schreibezyklus auf einem Mega32 dauert genau 1
takt. Hab ich da vielleicht etwas falsch verstanden ?

von Peter D. (peda)


Lesenswert?

Ein LD oder ST dauert 2 Zyklen, aber nach außen mindestens einen mehr,
wenn man superschnelle RAMs hat und ohne Waits auskommt.

Ich war jetzt mal davon ausgegangen, daß das Display auch im externen
RAM-Bereich liegt, deshalb die mindestens 9 Zyklen.

Aber wenn Du da eine Möglichkeit siehst, das kürzer zu schaffen, bin
ich brennend daran interesssiert, wie Du das schaffst.


Soweit ich weiß, sind Dual-Ported RAMs teuer, da zu speziell.

In den heutigen PCs und Grafikkarten wird sowas voll über ASICs oder
den Grafikprocessor mit normalen DDR-RAMs gemacht..



Peter

von DC6RI (Gast)


Lesenswert?

Hi Elektrofuzzi,

vor dem Problem mit der Display-Ansteuerung stand ich auch mal. Damals
kam auch die Idee auf mit 2 AVR's an einem RAM. Hatten dann damals
festgestellt dass das nicht machbar ist. (Selbst wenn es funktioniert
hätte wäre es zu langsam für das Display gewesen).
Ich weis nicht genau welche Art Display du hast, aber eventuell hätte
ich da einen Tipp: Wir haben unsere Displays mit einem EPSON SED1335F
angesteuert. (Datenblatt:
http://www.seiko-usa-ecd.com/lcd/products/graphic_mods/pdf/sed1335f.pdf)

Schau's dir mal an. vielleicht hilft es dir ja weiter ;-)

Viel Erfolg noch beim Basteln!

Andreas

von Elektrofuzzi (Gast)


Lesenswert?

"Hatten dann damals
festgestellt dass das nicht machbar ist. (Selbst wenn es funktioniert
hätte wäre es zu langsam für das Display gewesen)."

Warum ?

Ich bin immer davon ausgegangen, dass ich in einem Takt den Pegel eines
AVR-Ausganges per "out" ändern kann. Damit lässt sich locker ein Sram
+ ein LCD display (320x240) ansteuern. Den 2. avr brauche ich nur um
Daten in das SRam reinzuschreiben, und um zusätzliche Steuerfunktionen
auszuführen (Taster, RS232, AD-Wandler, etc...).

Und nach meiner vorstellung benötige ich etwa 5-6 Takte (inklusive
allen Timings) pro byte, und habe ca 7-8 Zeit. Ich bin also etwas
schneller...

Ausserdem ging es mir immer darum mit einer Schaltung verschiedene
Displays ansteuern zu können, und damit viel flexibler zu sein. mit
einem sed ist's da halt nicht allzuweit. Wenn man mal davon absieht,
dass die Dinger auch recht teuer sind...

von Peter D. (peda)


Lesenswert?

"Ich bin immer davon ausgegangen, dass ich in einem Takt den Pegel
eines
AVR-Ausganges per "out" ändern kann."

Stimmt.

Aber woher soll das LCD wissen, daß da neue Daten am Port anliegen ?
Du mußt also noch ein /WE-Signal takten.

Und ob Du dafür 3  OUT oder 1  ST nimmst, kommt aufs gleiche raus.

Siehe mein Beispiel mit 9 Zyklen, darunter kommst Du nicht !


Peter

von DC6RI (Gast)


Lesenswert?

<<"Hatten dann damals
festgestellt dass das nicht machbar ist. (Selbst wenn es funktioniert
hätte wäre es zu langsam für das Display gewesen)."

Warum ?>>

Der AVR ist zu langsam um eine vernünftige Bildwiederholfrequenz zu
erzeugen => das Display flimmert

von Elektrofuzzi (Gast)


Angehängte Dateien:

Lesenswert?

@cd6ri

"Der AVR ist zu langsam um eine vernünftige Bildwiederholfrequenz zu
erzeugen => das Display flimmert"

wie hoch war denn die erzeugte Frequenz ?


@Peter

"Und ob Du dafür 3  OUT oder 1  ST nimmst, kommt aufs gleiche raus.
Siehe mein Beispiel mit 9 Zyklen, darunter kommst Du nicht !"

ich dachte mir das sieht so aus:

a. Die Ausgänge vom SRAM sind direkt ans LCD-Display und an einen
Treiber des 2. avr angeschlossen.
b. Der 1. AVR ist an 2 kaskadierte 8-bit zähler angeschlossen, die an
die adresspins des srams angeschlossen sind.
c. 2 weitere Treiberbausteine sind mit zwischen die adresspins des
srams und dem 2. avr angeschlossen.
d. Die takte des rams, der zähler, des lcds und der 3 treiber werden
vom 1. avr aus gesteuert, wobei das sram über 2 leitungen angesteuert
wird. einmal normal, und einmal mit einem "and" mit einem ready-pin
des avr 2.

Ich hänge das ganze als Bild mal mit ran.

Auf diese Weise kann ich:

- das lcd direkt vom s-ram mit daten füttern
- das sram mit daten vom avr 2 laden, wenn der ready pin gesetzt ist
- zwischen zähler- und treiber-adressierung toggeln
- komplette lesesteuerung vom avr 1
- schreiben wenn avr 2 daten in treiber abgelegt,und ready pin gesetzt

und das ganze sieht in pseudocode in etwa so aus:

(zeilen die direkt untereinander stehen sind an einem 1 i/o Pin)

1 disablen doppel-takt sram

  sram auf read
  treiber disablen
  zählern enablen

2 enablen sram ausgabe -> daten ans lcd ausgeben

3 enablen 16-bit zähler -> zählt eins weiter
  enablen lcd -> daten übernehmen

  disablen sram ausgabe

4 nop für lcd (benötigt 110 ns)

5 disablen 16-bit zähler
  disablen lcd

  sram auf write
  treiber enablen
  zählern disablen

6 enablen doppel-takt sram -> daten einlesen wenn avr 2 auf ready

Also 6 takte, ohne schleife. Quasi in einem "unrolled-loop".

sollte doch hinhauen, oder ?

Falls du da einen Fehler drin siehst, dann lass es mich bitte
wissen...

:-)

von Peter D. (peda)


Lesenswert?

Irgendwie hatte ich den Eindruck, Du hast nur wenig Platz.
Und nun sind doch diverse Zähler, Treiber und ein AVR mit drauf.
Wärs da nicht besser, alles mit einem CPLD zu machen, z.B. XCR3128 ?


Aber versuch mal, Deinen Ablaufplan in richtigen Code umzusetzen, dann
kann man besser sehen obs geht. Sind ja doch ne Menge Umschaltungen mit
dabei, auch wenn Du die Schleife wegläßt.



Peter

von Elektrofuzzi (Gast)


Lesenswert?

"Irgendwie hatte ich den Eindruck, Du hast nur wenig Platz."

Deswegen... :-)


"Wärs da nicht besser, alles mit einem CPLD zu machen, z.B. XCR3128
?"

Schon, nur wo bekomme ich in D so ein Teil günstig her ? Die Teile für
die LCD-Ansteuerung kosten mich ca 12 Euro.

"Aber versuch mal, Deinen Ablaufplan in richtigen Code umzusetzen,
dann kann man besser sehen obs geht."

Das wären nur diverse outs + 1 nop für takt 4:

out DDRD, r1
out DDRD, r2
out DDRD, r3
nop
out DDRD, r4
out DDRD, r5

Die register muss ich natürlich noch zuvor mit den richtigen Werten
laden. Aber 6 outs pro byte sind locker drin. Ich könnte sogar
langsames sram (> 62,5ns) nehmen und endsprechend nops einfügen.

"Sind ja doch ne Menge Umschaltungen mit dabei, auch wenn Du die
Schleife wegläßt."

Schon, aber alle I/o pins kann ich mit einem out ändern. Daher sollte
es rein theoretisch schon gehen.

Das einzige was mich stört sind die 3 Treiber für die speicherung der
Adressen+Daten beim reinschreiben in das Sram. Aber keiner kennt da
eine Möglichkeit, wie ich das ohne Ics (und auch ohne 24 Transistoren
!) lösen kann, leider !

Falls du da was kennen solltest...

;-)

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.