Forum: Mikrocontroller und Digitale Elektronik Bringt ein Serieller SRAM überhaupt was? Oder ist das nur ein größer flüchtiger EEPROM?


von Jan N. (jan_n497)


Lesenswert?

Hallo Leute,
Ich setzte zurzeit ein an größern Projekt. Wo mir langsam an meinem 
ATMega644 der Arbeitsspeicher ausgeht. Daher habe ich geschaut ob es 
irgend eine möglichkeit gibt denn Arbeitsspeicher zu erweitern ohne 
wieder denn Controller tauschen zu müssen.

Da fand ich bei reichelt für glaubig 1,55 Euro ein Seriellen SRAM von 
Microchip mit 512 Kbits(~64 Kbytes), dank des SPI Interfaces das der 
SRAM unterstützt ist die Ansteuerung am ATMega relativ einfach.

Ich habe zwei einfache Funktionen geschrieben mit dem ich ein uint16_t 
in das SRAM schreiben kann und mit der anderen Funktionen, ein uint16_t 
von einer Adresse im SRAM lesen kann.

Doch im Moment kommen wir zweifel auf. Mein interner RAM vom ATMega ist 
mit 3,7 kb von 4 kb so gut wie voll.

Nun ich sage jetzt mal das ich ein char Array mit 1023 Zeichen anlegen 
möchte(char irgendwas[1023]). Da würde mein Interne Speicher überlaufen.

Nur wie lade ich jetzt dieses char Array in dem externen SRAM?

Denn die 1023 in denn SRAM zuschreiben. Und dann die Adresse auslesen 
und char irgendwas[SRAM_ADRESSE] zu machen. Würde ja kein Sinn da dieses 
Array immer noch im internen Speicher angelegt werden würde wenn ich ihr 
grade nix durch einander bringe.

Kann mir jemand da mal bitte auf die Sprünge helfen

Lg Jan.

von Jim M. (turboj)


Lesenswert?

Jan N. schrieb:
> Kann mir jemand da mal bitte auf die Sprünge helfen

Nimm einen größeren µC. Externes SRAM ist - wie Du schon richtig erkannt 
hast - sehr aufwändig zu programmieren. Dein AVR hat IIRC keinen 
externen Bus für RAM.

von batman (Gast)


Lesenswert?

Jan N. schrieb:
> Ich setzte zurzeit ein an größern Projekt.

Dann bist du an den Grenzen der 8-Bit-Controller angelangt, wenn du viel 
Arbeitsspeicher brauchst. Weiter gehts dann mit STM32 o.a.

von Falk B. (falk)


Lesenswert?

@Jan Niehes (jan_n497)

>irgend eine möglichkeit gibt denn Arbeitsspeicher zu erweitern ohne
>wieder denn Controller tauschen zu müssen.

Zuerst sollte man prüfen, ob man wirklich sinnvoll und sparsam mmit dem 
vorhandenen Speicher umgeht.
Dann kann man einen möglichst pinkompatiblen Controller nehmen, z.B. den 
ATmega1280 (8kB SRAM) oder gar ATmega1284, der hat satte 16kB SRAM!

>Da fand ich bei reichelt für glaubig 1,55 Euro ein Seriellen SRAM von
>Microchip mit 512 Kbits(~64 Kbytes), dank des SPI Interfaces das der
>SRAM unterstützt ist die Ansteuerung am ATMega relativ einfach.

Aber in der praktischen Programmierhandhabung nervig.

>Ich habe zwei einfache Funktionen geschrieben mit dem ich ein uint16_t
>in das SRAM schreiben kann und mit der anderen Funktionen, ein uint16_t
>von einer Adresse im SRAM lesen kann.

Die nützen dir wenig.

>Nun ich sage jetzt mal das ich ein char Array mit 1023 Zeichen anlegen
>möchte(char irgendwas[1023]). Da würde mein Interne Speicher überlaufen.

Ja.

>Nur wie lade ich jetzt dieses char Array in dem externen SRAM?

Du musst dich selber um den ganzen Krümelkram der Verwaltung kümmern.

So ein externer Speicher ist nur sinnvoll, wenn man einen größeren 
Datenblock ins interen SRAM kopiert, bearbeitet und wieder in den 
externen Speicher schreibt.
Macht man Einzelzugriffe auf Daten im externen Speicher, hier über SPI, 
wird das nervig und langsam.

von Falk B. (falk)


Lesenswert?

@Jim Meba (turboj)

>hast - sehr aufwändig zu programmieren. Dein AVR hat IIRC keinen
>externen Bus für RAM.

DIESER AVR nicht, einige haben es.

ATMEGA162
ATmega128
ATmega128A
ATmega64
ATmega64A
ATmega1280
ATmega1281
ATmega2560
ATmega2561
ATmega640

von Jan N. (jan_n497)


Lesenswert?

Jim M. schrieb:
> Nimm einen größeren µC

Hallo,
Ja, ich denke das ich denn ATMega1284P nehmen werde, da der Flash 
Speicher auch langsam an seine grenzen kommt, da ich mit SD Karte, 
ENC28J60, Temperatursensoren, Lichtsensoren und einem TFT Arbeite.

Falk B. schrieb:
> Zuerst sollte man prüfen, ob man wirklich sinnvoll und sparsam mmit dem
> vorhandenen Speicher umgeht.

Ich bin noch mal mein Code durch gegangen von denn 64 Kbyte Flash 
Speicher habe ich 47,3 KByte belegt. Alles was mit Strings zutun hat 
also sprintf, tft und SD Funktionen arbeite ich mit pgmspace. Also 
speichere die Strings im Flash.

Ich glaube das mein Problem mehr die globalen Variablen sind. Ich werde 
jetzt erst mal die Variablen so gut wie möglich zu reduzieren. 250 Bytes 
habe ich im RAM schon frei bekommen.

Falk B. schrieb:
> Macht man Einzelzugriffe auf Daten im externen Speicher, hier über SPI,
> wird das nervig und langsam.

Hmmm, blöd.

Lg Jan.

von Curby23523 N. (Gast)


Lesenswert?

batman schrieb:
> Jan N. schrieb:
>> Ich setzte zurzeit ein an größern Projekt.
>
> Dann bist du an den Grenzen der 8-Bit-Controller angelangt, wenn du viel
> Arbeitsspeicher brauchst. Weiter gehts dann mit STM32 o.a.

An einen Xmega (8Bit) kann ich schnellen RAM im MB Bereich anschließen 
(zu den zusätzlichen 8-16kB).

Er muss nicht gleich auf einen 32bitter umsteigen, das ist sehr sehr oft 
einfach nicht notwendig - höchstens um Erfahrungen zu sammeln. Code 
nochmal überdenken und ähnlichen Prozessor nehmen - wurden ja einige 
ähnliche mit mehr Speicher hier genannt.

von Falk B. (falk)


Lesenswert?

@Nils H. (nils_h494)

>An einen Xmega (8Bit) kann ich schnellen RAM im MB Bereich anschließen
>(zu den zusätzlichen 8-16kB).

Jain. Wenn gleich der deutlich schneller und einfacher handhabbar ist 
als ein externer, serieller Speicher, so ist das trotzdem nur bedingt 
besser.

Beitrag "Re: Viel RAM am kleinen Controller"

von Frank K. (fchk)


Lesenswert?

Jan N. schrieb:
> Jim M. schrieb:
>> Nimm einen größeren µC
>
> Hallo,
> Ja, ich denke das ich denn ATMega1284P nehmen werde, da der Flash
> Speicher auch langsam an seine grenzen kommt, da ich mit SD Karte,
> ENC28J60, Temperatursensoren, Lichtsensoren und einem TFT Arbeite.

Wenn Du bei AVR bleiben willst, dann wäre einer mit externem 
Adress/Datenbus wie zB Mega2560/2561 sinnvoller. Dort kannst Du sehr 
einfach ein oder zwei externe 32k SRAMs anschließen, und auch das TFT 
wird durch den Betrieb am Adress/Datenbus sehr viel schneller.

fchk

von c-hater (Gast)


Lesenswert?

Jan N. schrieb:

> Ich setzte zurzeit ein an größern Projekt. Wo mir langsam an meinem
> ATMega644 der Arbeitsspeicher ausgeht. Daher habe ich geschaut ob es
> irgend eine möglichkeit gibt denn Arbeitsspeicher zu erweitern ohne
> wieder denn Controller tauschen zu müssen.

Ich würde den Controller tauschen. Ein Mega1284P ist weitestgehend pin- 
und funktionskompatibel, hat aber viermal soviel SRAM und doppelt soviel 
Flash (wobei man den ja nicht nutzen muss, wenn man ihn nicht braucht).

Änderungen am Programm sind entweder überhaupt nicht erforderlich oder 
minimal, sogar wenn man in Assembler programmiert, bei C ist es 
tendenziell nochmal ein Stück weniger, was zu ändern ist, jedenfalls 
wenn der üblicherweise verwendete C&P-Code von einigermaßen guter 
Qualität ist...

> Da fand ich bei reichelt für glaubig 1,55 Euro ein Seriellen SRAM von
> Microchip mit 512 Kbits(~64 Kbytes), dank des SPI Interfaces das der
> SRAM unterstützt ist die Ansteuerung am ATMega relativ einfach.

Und laaangsaaam. Nö, du fährst mit der Umstellung auf einen 1284P ganz 
sicher sehr viel besser. Wenn du clever warst und die Versuchsplatine 
mit einem DIL40-Stecksockel bestückt hast, ist die Umstellung hard- und 
softwaremäßig insgesamt wahrscheinlich sogar in nur wenigen Minuten 
erledigt...

von Jan N. (jan_n497)


Lesenswert?

c-hater schrieb:
> Ich würde den Controller tauschen. Ein Mega1284P ist weitestgehend pin-
> und funktionskompatibel, hat aber viermal soviel SRAM und doppelt soviel
> Flash (wobei man den ja nicht nutzen muss, wenn man ihn nicht braucht).

Ist auf jeden fall schon mal mehr als der 644er.

c-hater schrieb:
> Wenn du clever warst und die Versuchsplatine
> mit einem DIL40-Stecksockel bestückt hast, ist die Umstellung hard- und
> softwaremäßig insgesamt wahrscheinlich sogar in nur wenigen Minuten
> erledigt...

Mein Projekt befindet sich immer noch auf 2 Steckbretten. Da ich die 
meisten Controller Schaltung erst dort aufbaue, wenn ich dann mit dem 
Programmieren fertig bin und alles klappt. Entwickle ich ein Schaltplan 
und löte das ganze auf eine Lochrasterplatine auf.

Danke für eurere Antworten!

Lg Jan.

von Falk B. (falk)


Lesenswert?

@ c-hater (Gast)

>Datum: 15.06.2017 19:44

WOW! fundamental neue Erkenntnisse, die dieser Thread, ja das ganze 
Forum noch nie gesehen hat! Was würde der OP nur ohne deinen Beitrag 
machen?

von Pandur S. (jetztnicht)


Lesenswert?

> sprintf ....

pfff. Du solltest dich von solchen Monstern loesen.

von batman (Gast)


Lesenswert?

Die 1,4kB printf sollte man beim Mega-Projekt haben. Für Tiny nehme ich 
eine 100 Bytes-Sparvariante.

von Scrimpy (Gast)


Lesenswert?

batman schrieb:

> Die 1,4kB printf sollte man beim Mega-Projekt haben. Für Tiny nehme ich
> eine 100 Bytes-Sparvariante.

Hast du einen Link auf den Quelltext?

von N. G. (newgeneration) Benutzerseite


Lesenswert?

Scrimpy schrieb:
> Hast du einen Link auf den Quelltext?

Ist ja alles Open Source, siehe dazu:
http://svn.savannah.gnu.org/viewvc/avr-libc/trunk/avr-libc/libc/stdio/

Ist der aktuelle Trunk von der Libc. Genauer werden dich die Dateien 
interessieren:
- der Wrapper: 
http://svn.savannah.gnu.org/viewvc/avr-libc/trunk/avr-libc/libc/stdio/sprintf.c?revision=142&view=markup
- sämtliche *printf-Magie: 
http://svn.savannah.gnu.org/viewvc/avr-libc/trunk/avr-libc/libc/stdio/sprintf.c?revision=142&view=markup

Mit freundlichen Grüßen,
N.G.

von batman (Gast)


Lesenswert?

Im Tiny mit 1-2kB brauche ich von printf() selten mehr als die 
Zahlen-Konvertierung/Formatierung. Da tuts die hier:
1
char *itoasc(char *outbuf, int len, i16 val, int base, char pad)
2
/** \brief convert numeric value to ASCII string representation
3
 *
4
 * \param outbuf  - output buffer address
5
 * \param len    - buffer length or target field width for fixed length/padding
6
 * \param val    - numerical input value
7
 * \param base    - target base e.g. 2(=binary), 10(=decimal),..
8
 * \param pad    - padding character or -1 for no padding
9
 * \return    address of output string within outbuf
10
 *
11
 */
12
// Notes:
13
// If no fixed field (padding) with is used, <len> should be set to buffer size.
14
// If fixed field with (padding) is used, <len> = output field width,
15
// i.e. buffer size must be at least <len>+1!
16
// No overflow checks done!
17
{
18
  unsigned idx = len;            // point past end of field/buffer
19
  bool dopadding=true, minus=false;
20
    div_t d;
21
22
  if(pad<0)  { dopadding=false; idx--; }    // step into buffer space
23
  else  memset(outbuf, pad, len);        // else preset field
24
25
  outbuf[idx--] = '\0';
26
27
  if(val<0)  { val= -val; minus=true; }
28
29
    d.quot = val;
30
31
    do
32
    {
33
        d = div(d.quot, base);
34
        outbuf[idx--] = d.rem+( d.rem<10 ? '0' : 'A'-10 );
35
    }
36
    while(d.quot != 0);
37
38
    if(dopadding)  {
39
    if(minus)  outbuf[0]='-';
40
  }
41
  else  {
42
    if(minus)  outbuf[idx--]='-';
43
    outbuf+=idx+1;
44
    }
45
46
    return outbuf;
47
}

von Georg (Gast)


Lesenswert?

Grundsätzlich zur Überschrift:

Nichts muss flüchtig sein. Statisches RAM mit einer kleinen 
Lithium-Batterie wurde und wird millionenfach verwendet. Es hat auch 
keine Begrenzug der Schreibzyklen wie EEProms oder Flash.

Georg

von Sebastian S. (amateur)


Lesenswert?

Geh mal davon aus, dass da, wo SRAM drauf steht, auch SRAM drinnen ist.

Wenn die Möglichkeiten zum Speichersparen ausgeschöpft sind, kommst Du 
wohl nicht um eine "Erweiterung" herum.

Natürlich kannst Du den Chip wechseln mit all den Nachteilen, die das 
mit sich bringt, aber wenn aber nichts gegen den 
Geschwindigkeitsnachteil spricht, so ist ein serielles RAM kostenmäßig 
sehr gut und der Platzbedarf ist echt klasse. Einzig zusätzliche 
Bedingung ist eine aktive oder freie Schnittstelle.
Gegen den Geschwindigkeitsnachteil hilft vielleicht auch eine 
Umorganisation des verwendeten Speichers. Also die Bereiche, die auf'n 
Quiky stehen ins interne RAM verlagern, und die, die es in Ruhen angehen 
lassen, ins serielle RAM.

Was gerne bei den Optimierung übersehen wird ist die Mehrfachnutzung von 
Speicher. Hierzu ein einfaches Beispiel: Ein Eingabepuffer braucht oft 
viel Platz. Dies aber nur wenn Eingaben erfolgen. Also kann dieser, die 
andere Zeit über, alternativ genutzt werden.
Was auch gerne gemacht wird ist, nach dem Motto: "Darf's auch ein Bissel 
mehr sein", Speicher zu reservieren. Vor allem die schon berühmten "+1".

von batman (Gast)


Lesenswert?

Blöcke/Seiten in den Arbeitsspeicher Ein/Auslagern je nach 
Zugriffshäufigkeit. Da gibts doch sicher schon eine MMU-lib für SPI-RAM. 
:)

von c-hater (Gast)


Lesenswert?

Falk B. schrieb:

> @ c-hater (Gast)
>
>>Datum: 15.06.2017 19:44
>
> WOW! fundamental neue Erkenntnisse, die dieser Thread, ja das ganze
> Forum noch nie gesehen hat! Was würde der OP nur ohne deinen Beitrag
> machen?

Tja, es gibt Leute, die haben nicht den ganzen Tag Zeit, sich mit 
Forenthreads zu beschäftigen, die müssen einfach mal richtig arbeiten. 
Mag schon sein, dass sowas jenseits deiner Erfahrungs- oder gar 
Vorstellungswelt ist...

Wie auch immer: Unter diesen Umständen kann es jedenfalls schonmal 
passieren, dass man einfach nur auf das OP antwortet, wenn man dazu 
kommt, es zu lesen, ohne gleich den ganzen Thread zu lesen.

Das ist aber wohl nicht schlimm, solange nur die Antwort sachlich 
korrekt ist. Schlimmstenfalls ist es vollständig redundante Information. 
Praktisch aber angesichts der üblichen fachlichen Durchschnittsqualität 
der Threads mindestens Bestätigung korrekter Information und damit ein 
Beitrag zur Glaubwürdigkeit und Bestätigung des korrekten Lösungswegs, 
also informationstheoretisch betrachtet immer noch ein Gewinn.

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.