mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik DRAM Problem


Autor: Simon K. (simon) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Heyho.

Bekomme Mein DRAM nicht ans laufen. Quellcode oben.

Habe zwar den Refresh noch nicht implementiert, aber das Byte wird
direkt nach dem Schreiben wieder aus dem RAM gelesen. Denke dieser
kurze Zeitraum sollte ohne Refresh klappen.

Wenn ich ein Zeichen zum AVR schicke, bekomme ich irgndein vermurkstes
Zeichen zurück. Meist ist es hex FF oder hex 247.

Ich kann jedoch nach langer Suche immernoch keinen Fehler finden,
vielleicht hat ja einer von euch noch eine Idee.

Danke schonmal im Vorraus

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Angeschlossen hbe ich ein SIMM RAM von alten Computern, und die RS232
Verbindung klappt ohne Probleme. Sei nur so dazugesagt.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oh, die 247 sind wohl nur durch Wackelkontakt zustande gekommen, jetz
krieg ich immer FF hex zurück :/

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
a) Du bist auf dem besten Weg den DRAM oder den AVR zu grillen.
Du macht einen Read-modify write, und legst gleichzeitig die Daten vom
AVR auf den Port
b) Ein DRAM hat mehr als 256Bytes, du musst also sowohl bei CAS als
auch bei RAS eine Adresse laden
c) das ist ein DRAM und kein SRAM, der braucht nen Refresh.

Autor: Simon K. (simon) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Schematics..

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
a) Wuas? Read-modify-write? Und wo leg ich Daten auf den AVR Port? Der
Port liegt doch High-Z (DDR=0, PORT=0)

b) Ichlade bei CAS und bei RAS eine Adresse.. Und zwar jeweils die
Gleiche, kann man später ja noch ändern..

c) Selbst wenn ich einen zyklischen Refresh von 1mS einbauen würde,
dann würde er mit sehr geringer Wahrscheinlichkeit genau zwischen Write
und Read. Da ist doch kaum Zeit zwischen Schreiben und Lesen. die paar
µS lassen den DRAM schon nicht seine Daten verlieren..

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achja, btw: Wo bekommt man SIMM Sockel her?

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
cbi     Portd, RAM_RAS              ;RAS low
    cbi     Portd, RAM_CAS              ;CAS low -> Daten vom DRAM
weren ausgegeben, da OE\ auf Low

    out     Porta, RAM_Data             ;RAM Daten anlegen -> Du gibst
auch Daten aus
    nop

    cbi     Portd, RAM_WE               ;WE low
    nop
    sbi     Portd, RAM_WE               ;und wieder high


Du musst WE vor CAS auf Low bringen, und erst nach CAS wieder auf
high.

SIMM Sockel: Reichelt oder alte Mainboards.

Bau mal beim auf Low setzen von RAS und CAS dazwischen noch ein nop
ein.
Da wo du ein nop hast, setz noch eins. Eventuell ein Timing Problem.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Oha. In deinem 2MB DRAM am AVR siehts so aus:
http://www.mikrocontroller.net/attachment.php/1214...

da ist auch WE mittendrin.

Was hats eigentlich damit auf sich, dass du Pin 28 und 29 Auf High
gelegt hast. Sind doch Parity Eingänge.

Ich probier mal..

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mein Ausgabeteil sieht jetzt so aus:
RAM_putbyte:
    
    ser     temp                        ;Porta als Ausgang
    out     DDRA, temp

    cbi     Portd, RAM_WE               ;WE low
    nop
            
    out     Portc, RAM_Adress           ;RAM Adrese (8-Bit rausgeben)
    nop

    cbi     Portd, RAM_RAS              ;RAS low
    nop
    cbi     Portd, RAM_CAS              ;CAS low
    nop

    out     Porta, RAM_Data             ;RAM Daten anlegen
    nop


    sbi     Portd, RAM_CAS              ;schließlich CAS
    nop
    sbi     Portd, RAM_RAS             ;und RAS wieder high
    nop
    
    sbi     Portd, RAM_WE               ;und wieder high

ret

leider ohne Besserung. Habe deine Anmerkungen dort eingebaut, ist das
DRAM vielleicht schon kaputt?

PS: Wie heißen denn die Dinger bei Reichelt? Hab mich totgesucht.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>In deinem 2MB DRAM am AVR siehts so aus:
>da ist auch WE mittendrin.

Ja, aber:
Ich verwende OE und halte das DRAM Ausgang so High-Z

Verwende am besten den neueren Code von mir, der alte hatte teilweise
ein paar Fehler.
Der Code ist dann auch in Assembler und speziell an SIMM Module
angepasst.

Reichelt: SSD 30G
Oder gib einfach mal Simm in die Suche ein...

DRAM hält schon einiges aus, so schnell geht der nicht kaputt.

Ob ich Parity auf High lege, oder so wie du auf Low ist an sich egal.
Ich habe es nur deshalb auf High gelegt, damit es deaktiviert wird.

Autor: Simon K. (simon) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ok. Bin grad Zuhause, und hab mir deinen Code mal angeguckt.
Anschließend meine Routine etwas umgestrickt und Siehe Da. Hehe Ich
krieg aufm Terminal das Zeichen zurück was ich sende.

Vielen Dank
funktionierender Code im Anhang

Autor: Birger* (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mal ne Frage, wozu das Ganze? Mit Softwarerefresh, kille ich doch
jegliche Performance und ohne geht gar nix. Außerdem gibt's doch
heutzutage andere viel einfacher zu benutzende Speicher. Mit einem
512KB SRAM und Bankswitching hat man doch Speicher satt.

Autor: Benedikt (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Mal ne Frage, wozu das Ganze?
Um richtig viel Speicher zu bekommen, wie z.B. bei einem mp3 Player der
die komplette Datei in den RAM läd, und dann die Festplatte in den
Standby schickt um Strom zu sparen.
Bei 32MByte wird es bei SRAM teuer, 32MB DRAM Module aus PCs liegen bei
mir dagegen genügend rum...

>Mit Softwarerefresh, kille ich doch jegliche Performance
Nicht unbedingt: Wenn man es per Interrupt macht, und den INterrupt
durch einen anderen Interrupt unterbrechbar macht, gehen nur wenige %
Leistung dafür drauf. Mit ein paar Tricks geht der Refresh sogar auch
per Timer mit Port Toggle, also im Hintergrund.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Mal ne Frage, wozu das Ganze?

Hmm gute frage. Ich geh mal eben mein DRAM im PC austauschen... Habe
dann allerdings nen Problem mit meinem Kredit bei der Bank.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey,

Habe jetzt Probleme mit meinem Code. Leider sind die so
unreproduzierbar, dass ich grad am verzweifeln bin.
Gestern abend die ganze zeit mit dem terminal chars geschickt, und auch
die richtigen zurückbekommen, aufeinmal ging es nich mehr gestern.
Direkt erstmal genervt ins Bett gegangen. Stehe heute morgen auf,
probier rum, klappt ja wieder (Kratz?!). Mache ein bisschen am
quelltext rum (Timer aktiviert,d er einen pin togglen lässt), schon
schickt das RAM mir nur noch 0xFF zurück?! Ich tu die sicherungskopie
vom vorherigen Code wieder rein - immernoch ! (Genau wie gestern).

Total komisch. UART funktioniert wunderbar, Controller läuft
einwandfrei, hab schon den Controller getauscht - nix zu machen.

Jemand einen Tipp? Könnte das eventuell am RAM liegen? ist 30pin SIMM
etwa nur 3,3V RAM? hust ;)

Danke schonmal

Autor: Sssssss (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hast du evtl unbenutze Pins vom Ram offen gelassen ?
Vielleicht kommt da irgendwas ungewollt ins schwingen oder "lädt"
sich auf...

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
lol, oh nein.

Das mit dem "Refresh brauch ich ja nich, weil sofortiges Lesen nach
Schreiben" nehm ich zurück... Testweise auf 2400 Baud umgestellt und
bei der Senderoutine wartet er ja auf UDRE... Tja dummdumm.
Währenddessen leert sich mein DRAM mal eben wieder.

Sorry vielmals, der Code oben klappt natürlich.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Und danke SSSsssss für deine Antwort, hat sich aber schon erledigt, hehe
:-)

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
30pin SIMMs sind immer 5V-DRAMS, die Sorge ist also unbegründet. Kann es
sein, daß Dein Refresh-Puls nicht oft und lange genug kommt?

Autor: Simon K. (simon) Benutzerseite
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Doch doch, ich kann ja gleich mal den Code uppen ;) Klappt jetzt alles
wunderbar.

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mist, jetz weiß ich auch, wofür manche Leute nops vor zB einem
in xxx,yyy
machen. Dauert wohl etwas länger als 1/14745600 Sekunde bis das DRAM
den Port vom uC gezogen hat. besser gehts, wenn man 2 nops vor dem in
xxx,yyy macht.

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>>Dauert wohl etwas länger als 1/14745600 Sekunde bis das DRAM
>>den Port vom uC gezogen hat....

...besonders, wenn´s kalt ist... Wenn Du mit solch knappen Timings
aufwartest, mußt Du Dich nicht wundern, wenn Dein DRAM so lalülala
reagiert ;-)

Autor: Simon K. (simon) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach, sei nicht so unfair ;) :-)

Autor: TravelRec. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich doch nicht, aber Dein DRAM :-)))))

Autor: Thorsten (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

vielen Dank fuer den guten Code. Hat bei mir fast auf anhieb
funktioniert: Es gab ein kleines Problem beim Lesen (nops sind immer
eine gute Idee, wenn man keinen LA hat). Aber es gab ein anderes
kleines Problem:

RAM_getbyte:
[...]
ldi     Temp1, (1<<RAM_CAS)|(1<<RAM_RAS)
out     Portd, Temp1                ; Alles wieder HIGH setzen

Ich glaub, es sollte besser heissen:
ldi     Temp1, (1<<RAM_CAS)|(1<<RAM_WE)|(1<<RAM_RAS)
wie auch in RAM_putbyte, denn das fallende WE koennte als
READ-WRITE-cycle gedeutet werden. Gerade wenn die Signale nicht so
sauber sind (fuer den uC schon HIGH, fuer den RAM aber nicht ..) werden
beim Lesen die (falschen) Daten zurueckgeschrieben und so koennen beim
Lesen die Daten verfaelscht werden.

Schoene Gruesse

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.