Forum: Mikrocontroller und Digitale Elektronik Schnelle Speicherung von Daten


von moin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
ich suche eine Möglichkeit Daten, die mir von einem externen
A/D-Wandler über einen 8 oder 16 Bit breiten Datenbus geliefert werden
möglichst schnell abzuspeichern.
Bisher habe ich die Daten mit einem ATMEGA128 eingelesen und an ein
(normales) externes SRAM ausgegeben. Hier bekomme ich aber Probleme mit
dem Timing, da ich selbst unter Assembler nicht genügend Zeit zum
Auslesen und Abspeichern habe (Die Berechnenungen sollen erst beim
späteren Auslesen aus dem SRAM erfolgen).

Meine Idee (s. Anhang) ist es, die Daten beim Auslesen aus dem
A/D-Wandler nicht über den ATMEGA128 laufen zu lassen, sondern gleich
an das SRAM zu schicken.
- Geht das? -
Erst beim späteren Berechnen und Weiterleiten an den PC müssen die
Daten dann über den ATMEGA128 laufen.
- Ist eine solche Schaltung möglich?
- Gibt es hierfür spezielle SRAMs?
Mit einem DSP, den ihr mir hierfür vielleicht vorschlagen wollt, kann
ich noch nichts anfangen - mit dem ATMEGA128 habe ich auch schon so
genug zu tun ;-)

Vielen Dank für die Antworten
Euer moin

von thkais (Gast)


Lesenswert?

Ein paar TTLs (z.B. 74244), Counter (z.B. 4040) und ein Taktgeber.

von Michael (Gast)


Lesenswert?

Ich würde das auch als Logikschaltung realisieren, ich denke ein CPLD
wäre hier auch eine sehr gute Möglichkeit. (anstatt so ein TTL Grab
aufzumachen :-)


Gruß
michael

von frances (Gast)


Lesenswert?

DualPortRAMS sind dafür prädestiniert!
Da kann man von zwei Seiten unabhängig darauf zugreifen.
Auch falls beide Teilnehmer gleichzeitig zugreifen ist über ein busy
Signal berücksichtigt.
Ein bischen Logik/Stuerung für dein ADWandler brauchst du halt
trotzdem!

von A.K. (Gast)


Lesenswert?

"möglichst schnell"

Sinnlose Aussage. Schneller als der ADC zu sein bringt nichts.

von The Daz (Gast)


Lesenswert?

"ich suche eine Möglichkeit Daten, die mir von einem externen
A/D-Wandler über einen 8 oder 16 Bit breiten Datenbus geliefert werden
möglichst schnell abzuspeichern". Wie schnell denn ? Ich koennte mir
vorstellen, dass ein alter DMA controller (Intel 8237/8257 fuer 8Bit,
82258 fuer 16bit Bus) das meiste erledigen koennte, allerdings muss der
Bus dann noch arbitriert werden, aber koennte durch den uC passieren.

von Christoph Kessler (Gast)


Lesenswert?

FIFO-Speicher first in - first out ist genau für solche Anwendungen
gedacht, als Pufferspeicher
http://www.idt.com/?catID=58567

von moin (Gast)


Lesenswert?

@A.K.
Mit "möglichst schnell" meine ich folgendes:
Wenn ich die Kanäle zusammenzähle, dauert ein Auslese- und
Abspeicherzyklus 2 us. In dieser Zeit muss ich zwei mal 16 Bit auslesen
und abspeichern. Das sind dann also bei einem ATMEGA128 mit 16MHz nur 32
Takte pro Zyklus.
Bisher hatte ich vor, ein 512kx8 SRAM an den ATMEGA128 anzuschließen.
Wenn ich das also nicht in Assembler in dieser Zeit hinbekomme, muss
ich die Datenrate heruntersetzen oder mir irgendwelche Tricks
ausdenken.
So ist der erste Beitrag entstanden.

In die Welt der CPLDs möchte ich mich nur ungerne einarbeiten ;-)

moin

von A.K. (Gast)


Lesenswert?

SRAM ganz normal an den Mega128 anschliessen, der ADC hängt mit am
Datenbus. Mit einen kleinen Modifikation:

Wenn ein bestimmter Pin (evtl. gleichzeitig OE vom ADC) auf 1 ist, wird
das RAM ganz normal gelesen/geschrieben. Ist er jedoch auf 0, und der
Mega will das SRAM lesen, dann wird nun nicht etwa das RAM gelesen,
sondern der ADC und so ganz nebenbei ins RAM geschrieben (WE=0).

Benötigt ein klein wenig Logik-Fummelei an den Steuerleitungen zwischen
Mega und SRAM, und benötigt in den 32 Takten grad mal 2 externe
Lesezugriffe minimaler Dauer (weil der Mega in dieser Phase die Daten
ja selbst nicht braucht, der sorgt nur für die Adressen).

von moin (Gast)


Lesenswert?

@A.K.
Das hört sich nach der Lösung meiner Probleme an :))
Wenn ich ehrlich bin, hab ich nur die Hälfte verstanden. Kannst du es
mir bitte ausführlicher erklären?

Die Daten nicht über einen 16 Bit sondern über einen 8Bit Bus laufen zu
lassen, ist nicht schwierig - kostet eben nur die doppelte Zeit

Vielen Dank
Jörn

von Christoph Kessler (Gast)


Lesenswert?


von A.K. (Gast)


Lesenswert?

Der Trick besteht darin, den Mega128 als DMA-Controller zu verwenden. Es
gibt also 2 Modi: der eine arbeitet genau so wie im Atmel Datasheet
beschrieben, der ADC bleibt dabei inaktiv.

Im anderen Modus (DMA) wird der Lesezugriff vom Mega128 vom RAM als
Schreibzugriff verarbeitet. Die Daten dazu liefert der ADC. Der Mega128
interessiert sich hier nicht wirklich für die Daten, der soll hier nur
die Zyklen auslösen und die Adressen hochzählen.

Konkret braucht's dafür ein paar Logikgatter zwischen RD vom Mega128
und OE/WE vom RAM sowie den entsprechenden Signalen vom ADC.

Wenn das RAM nur als Puffer dient, der Mega128 also nichts
reinschreiben muss, wird's noch einfacher. So ungefähr:
  RAM-OE aktiv wenn Mega-RD aktiv und DMA inaktiv
  RAM-WR aktiv wenn Mega-RD aktiv und DMA aktiv
  ADC-OE ist identisch mit RAM-WE
Wobei ich deine ADC-Seite nicht kenne, da muss evtl. noch irgendwelcher
8/16-Bit Kram ran.

von moin (Gast)


Lesenswert?

@A.K.
Nur der ADC soll also in das SRAM schreiben
und nur der ATMEGA soll es später wieder auslesen.

Offen bleibt für mich die Frage, wie der ATMEGA die Adresse an das SRAM
ausgeben kann ohne die Datenleitungen des ADC zu beeinträchtigen. Bei
einer normalen SRAM Beschaltung hängt der PortA gleichzeitig an dem
74573 in Richtung SRAM und zusätzlich an dem I/O-Port des SRAMs.
Wenn ich jetzt an den I/O Port des SRAMs den ADC hänge, kann es doch zu
Konflikten auf diesem Teil des Busse kommen??? Ich meine den Moment,
indem der ATMEGA eine Adresse auf den Buss legt und der ADC immer noch
einen Pegel von der letzten Ausgabe ausgibt.
Mache ich einen Denkfehler??

moin

von A.K. (Gast)


Lesenswert?

Kein Denkfehler, der ADC darf die Daten tatsächlich nicht dauernd
ausgeben, sondern nur zur passenden Zeit. Und so haben die
üblicherweise irgend ein Output-Enable-Signal, das hatte ich oben mal
ad hoc ADC-OE genannt. Aber ohne jede Info deinerseits - was soll ich
mehr schreiben?

von moin (Gast)


Angehängte Dateien:

Lesenswert?

@ A.K.
Hier nun die Schaltungen zum besseren Verständnis.
Ich wollte Dich nicht mit mangelden Informationen ärgern. Da ich das
System noch nicht ganz durchschaue (lange Leitung), wollte ich
niemanden mit (vermeintlich) unnötigen Infos langweilen.

Leider habe ich anscheinend eine besonders lange Leitung ;-(((
Ich habe folgenden Leitungen:
ATMEGA: MEGA-ALE; MEGA-RD; MEGA-OE
SRAM: SRAM-RD; SRAM-OE; evtl noch SRAM-CS
74573: 74573-C (normalerweise an MEGA-ALE)

Es bleibt bei : Nur der ADC soll in das SRAM schreiben
                nur der ATMEGA soll es später wieder auslesen.

Kann ich das Problem mit der Datenkollision auf dem Bus lösen, indem
ich den ADC-CS mit MEGA-ALE zusammenschalten? Wenn ich das Datenblatt
des MEGA richtig verstanden habe, werden nur bei ALE-High-Pegel
Adressdaten ausgegeben.

Daten lesen und schreiben:  (bitte überprüfen ;-)) )
Daten vom ADC ins SRAM
ADC-CS mit MEGA-ALE zusammenschalten (um Datenkollision zu vermeiden)
MEGA-RD und MEGA-OE vertauscht
Wenn jetzt der MEGA einen Lesebefehl bekommt werden die Daten ins vom
ADC ins SRAM geschrieben.

Daten vom SRAM in den ATMEGA
ADC-CS mit MEGA-ALE zusammenschalten (um Datenkollision zu vermeiden)
MEGA-RD und MEGA-OE "nicht mehr" vertauscht (normale Beschaltung)
Wenn jetzt der MEGA einen Lesebefehl bekommt werden die Daten ins vom
SRAM in den ATMEGA geschrieben/eingelesen.

Kann ich die Vertauschung oder Nicht-Vertauschung am besten mit zwei
UND-Gattern lösen, die sich je vor dem Eingang der WE und OE Eingängen
des SRAMs befinden?

Nochmals vielen Dank für die Antwort

Euer moin

von moin (Gast)


Lesenswert?

Im Anhang hat sich ein kleiner Fehler eingeschlichen:
Ich habe vergessen in den beiden Dateinen "Neue-Beschaltung" die
Bildüberschrift zu ändern  ;-(((

moin

von A.K. (Gast)


Lesenswert?

Wie oben beschrieben - ohne ein paar Gatter wirst Du nicht auskommen.
Die Beschaltung von RD/RW/Mega) OE/WE(RAM) RD(ADC) wird so nicht
funktionieren.

Yep, UND-Gatter sind irgendwie ok, in zu den Signalen passend negativer
Logik verstanden ;-). Landläufig sind die jedoch eher als ODER-Gatter
bekannt. Wenn die Pins nicht knapp sind, mach's ganz einfach mit 2
Steuerpins (ansonsten wird ein Inverter fällig). Der verbindet per
ODER-Gatter das RD vom Mega mit dem RD vom RAM (auslesen vom RAM). Der
andere verbindet per ODER-Gatter das RD vom Mega mit dem WR vom RAM und
dem RD vom ADC (DMA, also ADC => RAM). So gibt's auch keinen Konflikt
auf dem Bus, dafür sorgt ja das Timing vom RD des Mega.

Was dann noch fehlt: Pullups (10K) an RD/WR vom Mega, um bei
Systemstart zu verhinden, dass sich die ins Gehege kommen solange der
Mega noch nicht wach ist.

von lui (Gast)


Lesenswert?

Nur so am Rande: je nachdem was du genau vorhast würde ich mal überlegen
ein externer Adresscounter nicht sinnvoller ist. Spart viele IO-Pins,
reduziert die Taktraten (vorallem wenn du zwei 8-bit Speicher nimmst
und die ganze Übertragung 16-bitig auslegst) und dürfte die
Programierung deutlich vereinfachen vorrausgesetzt die Daten werden
weitgehend sequetiell benötigt.

von moin (Gast)


Lesenswert?

@lui
 Adresscounter sind mir unbekannt. Kannst du mir ein mögliches Modell
nennen, damit ich mich mal mit dem Datenblatt vertraut machen kann?
Danke
moin

von lui (Gast)


Lesenswert?

Ein konkretes IC für exakt n-bits hätt ich da auch nicht, aber du kannst
meist mehrere hintereinander schalten.
z.B. 3* 74xx469 (bis 24 bit)
http://pdf.alldatasheet.com/datasheet-pdf/view/88918/FAIRCHILD/DM74LS469.html

Falls du immer bei Adresse 0 anfangen möchtest wären auch nicht ladbare
praktisch

von lui (Gast)


Lesenswert?

Nachtrag: Adresscounter==ganz einfache Binärzähler

von moin (Gast)


Angehängte Dateien:

Lesenswert?

Guten Morgen,
ich werden nun doch die Version von A.K. wählen. Ich habe dann mehr
Kontrolle und kann für eine (wählbare) geringere Datenrate noch einen
Mittelwertbildung einbauen.
Erst morgen oder am Wochenende kann ich die Schaltung anpassen.
Vielleicht werden ich die Schaltung dann so abändern, dass ich dann
zwei SRAMS in die Schaltung einbaue, um so den 16-Bit-Bus des ADCs zu
nutzen. Meine Idee würde ich euch gerne am Wochenende vorstellen.

Wenn ich A.K. richtig verstanden habe ist nun hoffentlich die Schaltung
im Anhang richtig und kann dann weiter ausgebaut werden.

Vielen Dank für die bisherige Hilfe
Euer moin

von Der T. (Gast)


Lesenswert?

..sollten das nicht UND-Gatter sein..?

von A.K. (Gast)


Lesenswert?

@Der wahre: Bitte bedenken, dass RD und WR bei 0 aktiv sind.

von A.K. (Gast)


Lesenswert?

"und kann für eine (wählbare) geringere Datenrate noch einen
Mittelwertbildung einbauen"

In der besagten Schaltung hat der Mega keinen Einfluss darauf, was in
den Speicher geschrieben wird. Er kann den ADC auch nicht direkt
auslesen. Das lässt sich zwar alles hinkriegen, aber dann werden es
etwas mehr Gatter.

von moin (Gast)


Lesenswert?

A.K.
Über die Möglichkeit den ADC auch direkt auslesen und Daten nach einer
Berechnung ins SRAM schreiben zu können, werde ich noch nachdenken.
Meinen Idee mit zwei SRAMs zu arbeiten, um mit der vollen
16-Bit-Busbreite zu arbeiten, werden ich euch auch noch vorstellen. Die
Grundidee ist, den Adressbus parallel zu nutzen und den I/O-Port des
zweiten SRAMs auf einen freien Port des ATMEGA zu legen. Schreib- und
Lesevorgänge des ATMEGA werden dann zwar langsamer - die
Geschwindigkeit für "ADC schreibt ins SRAM" wird dann schneller.
Erst nach dem Mittagessen kann ich den Rechner für die Arbeit mit EAGLE
nutzen und einen neuen Schaltplan erstellen.

Euer moin

von moin (Gast)


Angehängte Dateien:

Lesenswert?

Hallo,
hier meine Antwort auf eure hilfreichen Beiträge:
Ich habe jetzt die Schaltung so abgeändert, dass folgende Zustände
möglich sind:
(wenn ich keinen Fehler gemacht habe)

- ADC schreibt seine Daten direkt in SRAM (ATMEGA gibt Adresse)
- ATMEGA liest SRAM
- ATMEGA liest ADC direkt
- ATMEGA schriebt ins SRAM

Könnt ihr bitte meine Logikschaltung auf Gedankenfehler überprüfen?
Welche Logikklasse (74xx04, 74xx08, 74xx32) sollte ich nehmen, wenn ich
mit 5 Volt arbeite und den ATMEGA mit 16 bis 20 MHz betreibe? Für einen
Auslesezyklus habe ich bei voller Geschwindigkeit 2us, in denen ich den
ADC ansteueren und zweimal 16 Bit auslesen will.
Leicht erhältlich sind glaube ich VHC, VHCT, AC, ACT, F, ...

In der zweiten Schaltungsversion verwende ich ein zweites SRAM. So
möchte ich das Auslesen des ADC erleichtern, da ich den Bus dann mit
der vollen 16-Bit Breite verwenden kann. Der I/O Port des zweiten SRAMs
hängt am PortB des ATMEGA.
(Nachteil: Ich muss einen Bootloader verwenden und für das erste
Programmieren mit einem Jumper der PinB1 aufgetrennt werden ;-((  )

Vielen Dank für die bisherigen Antworten

Euer moin    (POST: klettermaxi__äät__web__de__(ohne__))

++++++++++++++++++++++++++++++++++++++++++++++++
Informationen zur Schaltung
----------------------------------
„ADC an SRAM“
ATMEGA gibt Leseimpuls
Steuerleitung: low
ATMEGA-RD: low
ADC-RD: low
SRAM-WR:low
SRAM-OE/RD: high
Nur beim Leseimpuls sendet der ADC Daten ans SRAM (und ATMEGA). Es gibt
somit keinen Datenkonflikt auf dem Adress-/Datenbus bei dem
Bereitstellen der Speicheradresse)

“ATMEGA liest SRAM”
ATMEGA gibt Leseimpuls
Steuerleitung: high
ATMEGA-RD: low
ADC-RD: low
SRAM-OE/RD: low
SRAM-WR: high
 (nur beim Leseimpuls sendet das SRAM Daten an den ADC. Es gibt somit
keinen Datenkonflikt auf dem Adress-/Datenbus bei dem Bereitstellen der
Speicheradresse)

„ADC an ATMEGA“
siehe „ADC an SRAM“
Ein „ADC an SRAM“ wird ausgelöst durch einen Leseimpuls des ATMEGA

„ATMEGA an SRAM“
Der ADC wird hochohmig geschaltet durch ADC_CS (chip select)
Der Pegel der „Steuerleitung“ ist egal, da MEGA_RD high ist.
Wenn der ATMEGA den Pin „MEGA_WR“ nach low zieht, erhält das SRAM einen
WR-Befehl. Ein Schreibimpuls des MEGA müsste als funktionieren.

von moin (Gast)


Angehängte Dateien:

Lesenswert?

Hier der zweite Schlatplan mit nur einem SRAM

von A.K. (Gast)


Lesenswert?

Die 16bit Version wird so nicht funktionieren. PortB hat ja kein Latch
drin, das mit RD 0=>1 die Daten speichert, und zu dem Zeitpunkt zu dem
Du die Daten abholst, sind die weg weil OE inaktiv. Es sei denn Du
kriegst das Timing so exakt hin, dass die Metastability-Sync-Register
der Ports diesen Zweck erfüllen - aber darauf würde ich lieber nicht
wetten.

Du kannst allerdings das OE vom RAM an PortB mit einem separaten Pin
steuern. Bei ADC=>RAM inaktiv (1), bei RAM=>Mega aktiv (0), dann bleibt
der Ausgang vom diesem RAM aktiv und lässt sich vom PortB fischen.

Bei den Gattern empfiehlt Atmel ja eher die schnellere Sorte, und zwar
beim Adress-Latch. Wobei freilich so manche Boards dennoch mit dem HC
zurecht zu kommen scheinen, sehe ich jedenfalls öfter. AC ist was für
die Mutigen (oder jene, die sowas nicht fragen müssen), fang bei den
Gattern lieber mal HC an.

ADC-CS fehlt bei der "1" Version.

Wer sagt dem ADC eigentlich, ob man 8- oder 16-bittig liest?

von moin (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe jetzt die Änderungsvorschläge eingebaut. Der Fehler mit dem
2.SRAM-RD war ein über Fehler, nach dem ich wohl lange gesucht hätte.
Ich verwende jetzt einen extra Pin.

"Wer sagt dem ADC eigentlich, ob man 8- oder 16-bittig liest?"
Mit dem Pin BYTESWAP kan man auf dem 16er Bus High- und Lowbyte
vertauschen und so nacheinander die Informationen auslesen.

Bei den Gattern habe ich gedacht, dass ich besonders schnelle benötige,
da ja drei hintereinander geschaltet sind.
Was währe für dich die erste und was die zweite Wahl? Was spricht gegen
VHC? Deine Bemerkung gegen "AC" verstehe ich nicht. ;-(

moin

von moin (Gast)


Lesenswert?

Nachtrag:
Spricht etwas für oder gegen 74AHCxx?
moin

von A.K. (Gast)


Lesenswert?

"drei hintereinander geschaltet"

Zwei, die Laufzeit vom Inverter interessiert nicht.

Und die Verzögerung von RAM-WE ist klein genug, dass ich auch bei HC
keine Probleme hinsichtlich der Hold-Time vom RAM erwarte. Ist ja nicht
so, dass hier jemand auf dem Datenbus zum kritischen Zeitpunkt partout
den Pegel wechseln will, der Bus öffnet sich bloss zu High-Z.

"BYTESWAP"

Ich ahnte sowas, mit fiel bloss auf, dass der in beiden Varianten
gleichermassen auf GND lag. Ist ja jetzt korrigiert.

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.