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
Ein paar TTLs (z.B. 74244), Counter (z.B. 4040) und ein Taktgeber.
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
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!
"möglichst schnell" Sinnlose Aussage. Schneller als der ADC zu sein bringt nichts.
"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.
FIFO-Speicher first in - first out ist genau für solche Anwendungen gedacht, als Pufferspeicher http://www.idt.com/?catID=58567
@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
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).
@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
Ja so ähnlich hat Benedikt seine Ausgabe auf LCD genmacht http://www.mikrocontroller.net/forum/read-4-160854.html#new Schaltplan : http://www.mikrocontroller.net/attachment.php/160855/LCD.gif
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.
@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
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?
@ 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
Im Anhang hat sich ein kleiner Fehler eingeschlichen: Ich habe vergessen in den beiden Dateinen "Neue-Beschaltung" die Bildüberschrift zu ändern ;-((( moin
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.
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.
@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
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
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
"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.
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
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.
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?
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
"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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.