Forum: Mikrocontroller und Digitale Elektronik externer speicher per spi mit dspic30f - verwendung mit C


von speicherschorsch (Gast)


Lesenswert?

n'abend zusammen,

das meiste steht schon im betreff ... ich brauche mehr (arbeits)speicher 
als mein pic zur verfügung stellt (2kb)
jetzt muss ich wohl externen speicher anhängen (kann auch eeprom sein).

von microchip direkt gibts serielle eeproms und rams
es gibt welche mit I²C, und welche mit SPI

meine frage is jetzt:
wie kann ich datenstrukturen wie arrays structs etc. EINFACH mit C im 
externen speicher ablegen, und daraus lesen?

also wie realisiere ich sowas wie:
int meinarray[20];
meinarray [2]=42;
x= meinarray[2];
für externen speicher.... mich interessierts ja einen feuchten kericht 
wo der mir da was speichert... ich will mein array irgendwo auf dem 
externen speicher und auch mit ner variable wieder drauf zugreifen.

ich hab gesehen dass es folgendes auf der microchip seite gibt:
IBIS Model - 25xx1024 Devices
Verilog Model - 25xx1024 Devices
was soll ich denn damit anfangen ... letzteres enthält z.b. ne .v datei 
... das scheint sowas ähnliches zu sein wie eine bibliothek, aber was 
mach ich damit?


dann is noch die frage: bei spi und i²c gibts irgend eine taktrate ... 
z.b. können einige i²c eeproms 400kHz bis 1MHz. was bedeutet das?
wenn ich irgendwo nen schwingquarz mit 7Mhz hab, was muss ich dann 
softwaremäßig einstellen um den speicher zu betreiben?

herrjeh, beim pc ist das doch so einfach: ramriegel mit wenig raus, 
ramriegel mit viel rein, geht.

von (prx) A. K. (prx)


Lesenswert?

speicherschorsch schrieb:

> das meiste steht schon im betreff ... ich brauche mehr (arbeits)speicher
> als mein pic zur verfügung stellt (2kb)

Wäre es nicht einfacher, einen dsPIC30 mit mehr RAM zu verwenden?

> wie kann ich datenstrukturen wie arrays structs etc. EINFACH mit C im
> externen speicher ablegen, und daraus lesen?

Programmgesteuert rauskopieren und wieder einlesen. Ein direkter Zugriff 
auf seriell angeschlossenen Speicher ist nicht möglich. Also:

   copy_ram_to_extern(&variable, 0x12345, 32);
   copy_extern_to_ram(0x12345, &variable, 32);

Wobei du diese Funktionen selbstredend selber (ab)schreiben darfst.

Externes EPROM/RAM ist bei diesen Controllern ein bisschen wie eine 
Festplatte beim PC. Nicht direkt als Variable adressierbar, sondern man 
muss über Zugriffsfunktionen lesen/schreiben.

> und auch mit ner variable wieder drauf zugreifen.

Direkt? Dann ist dein Controller zu klein. Punkt.

> IBIS Model - 25xx1024 Devices
> Verilog Model - 25xx1024 Devices
> was soll ich denn damit anfangen ...

Nichts. Ist nicht für dich gedacht.

von (prx) A. K. (prx)


Lesenswert?

Camel Coder schrieb im Beitrag #1706411:

> externen speicher kann ich nie nicht so einfach verwenden wie meinen
> internen ram.

Korrekt. Nicht bei den dsPIC30. Auch nicht parallel. Es gibt in anderen 
Controller-Familien Typen, die extern parallel angeschlossenes RAM 
unterstützen und dies direkt adressierbar machen. Aber es gibt m.W. 
nirgends Controller bzw. C-Compiler, die externen seriellen Speicher 
im Programm direkt ohne explizite Zugriffsfunktionen ansprechbar machen.

> also sowas wie ein array auf externem e³prom speichern und darus lesen
> ist schlicht nicht möglich?

Nicht direkt per a[i], sondern nur über Zugriffsfunktionen wie 
read_byte(i).

von speicherschorsch (Gast)


Lesenswert?

also mal angenommen ich hätte ein array von structs:

struct irgendwas{
unsigned int teilvonirgendwas;
int anderesteilvonirgendwas;
}

irgendwas vieleirgendwasse [12];

wie speichere ich das extern, und wie rufe ich das extern auf?

von (prx) A. K. (prx)


Lesenswert?

Wie schon erwähnt: Eine einzelne "struct irgendwas" ist im RAM und zwei 
zu schreibende Funktionen kopieren deren Inhalt von/in den 12 Plätzen 
des externen Speichers.

von Peter D. (peda)


Lesenswert?

Versuch doch erstmal festzustellen, warum Du soviel RAM benötigst.

Bei der MC-Programmierung geht man normaler Weise völlig anders vor, als 
bei der PC-Programmierung.
Man überlegt sich genau, welche Variablen ständig gebraucht werden. Alle 
anderen Variablen werden nur solange angelegt, wie man sie benötigt.
Man nimmt daher vorzugsweise lokale Variablen, d.h. am Ende der 
benutzenden Funktion werden sie automatisch ungültig und die nächste 
Funktion kann den freigewordenen RAM benutzen usw..
Insbesondere Textausgaben werden erst erstellt, wenn sie benötigt werden 
und nach der Ausgabe sofort wieder gelöscht.
Ältere MCs hatten daher oft nur 128 Byte RAM.


Bei den AVRs gibt es z.B. den ATmega1284 mit 16kB RAM.
Einige MCs haben auch ein Memory-Interface, z.B. der ATmega162 kann bis 
zu 64kB externen SRAM anschließen. Der Compiler kann ihn ganz normal wie 
interen RAM benutzen, nur der Zugriff dauert einen Zyklus länger.


Peter

von speicherschorsch (Gast)


Lesenswert?

ich bin auch schon dran zu überlegen wie ich die variablengröße 
minimiere ... oder eben doch externen speicher benutze ... wegen 
ziemlichem zeitdruck ist das aber alles irgendwie ... naja
aber danke mal soweit für die hilfe.

kann mir vllt noch jemand tipps geben wie ich geeignete bibliotheken 
finde für die serielle übertragung?

ist i²c einfacher zu implementieren oder spi?

was ich finde ist irgendwie immer nicht das was ich brauche...

von (prx) A. K. (prx)


Lesenswert?

speicherschorsch schrieb:

> ist i²c einfacher zu implementieren oder spi?

SPI. Und wenn du dafür eine Bibliothek brauchst, dann sehe ich schwarz 
für das Projekt. Dass EEPROM nur begrenzte Schreibzyklen kann, und dafür 
ausserdem recht lang braucht, ist dir hoffentlich bekannt. RAM oder FRAM 
könnte sinnvoller sein.

Noch sinnvoller ist es freilich, mit weniger Daten auszukommen. Oder, 
weil softwareseitig am einfachsten, innerhalb der gleichen Familie einen 
Controller mit ausreichend RAM zu verwenden (dsPCI30F6013: 6KB).

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


Lesenswert?

Was für ein Compiler benutzt du, C30?

wenn ja, guck mal hier rein:
\Microchip\MPLAB C30\src\peripheral_30F_24H_33F\include

vielleicht gibt es was passendes für dich.

von speicherschorsch (Gast)


Lesenswert?

Hermann U. schrieb:
> Was für ein Compiler benutzt du, C30?
> [...]
> vielleicht gibt es was passendes für dich.

da gibts sowohl eine i2c bib als auch eine spi ... muss mir die erst 
noch genauer anschauen, aber ich denk bissl was werd ich schon damit 
anfangen können ... is halt nicht direkt auf speicherverwaltung 
zugeschnitten


A. K. schrieb:
> SPI. Und wenn du dafür eine Bibliothek brauchst, dann sehe ich schwarz
> für das Projekt.
deswegen weil ich so doof bin und überhaupt bibliotheken benutzen will? 
oder weils keine passenden gibt?
>
> Dass EEPROM nur begrenzte Schreibzyklen kann, und dafür
> ausserdem recht lang braucht, ist dir hoffentlich bekannt. RAM oder FRAM
> könnte sinnvoller sein.
ich bin am schwanken zwischen eeprom und ram, ... die begrenzten 
schreibzyklen sind mir bewusst, dass eeprom 'langsam' ist weiß ich 
mittlerweile auch, allerdings nicht genau was das bedeutet ... hängt 
doch sowieso alles an der langsamen seriellen schnittstelle?
dann ist halt der punkt dass eeprom nicht flüchtig ist... wie groß der 
vorteil ist kann ich aber noch nicht abschätzen.
>
> Noch sinnvoller ist es freilich, mit weniger Daten auszukommen.
deswegen mach ich am besten nen neuen fred auf ... das passt thematisch 
wohl nich ganz...
> weil softwareseitig am einfachsten, innerhalb der gleichen Familie
> einen Controller mit ausreichend RAM zu verwenden (dsPCI30F6013: 6KB).
nen anderen controller kann nicht nehmen: 6kb sind auch zu wenig, 
außerdem würds zu lange dauern nen neuen zu bekommen samt board ... und 
da macht mein studienarbeitsbetreuer nich mit nehm ich an.

von (prx) A. K. (prx)


Lesenswert?

speicherschorsch schrieb:

> deswegen weil ich so doof bin und überhaupt bibliotheken benutzen will?
> oder weils keine passenden gibt?

Weil es so einfach ist.

> dann ist halt der punkt dass eeprom nicht flüchtig ist... wie groß der
> vorteil ist kann ich aber noch nicht abschätzen.

FRAM ist auch nicht flüchtig, dafür entfällt die Schreib/Löschzeit und 
die Schreibzyklen sind faktisch nicht begrenzt.

> nen anderen controller kann nicht nehmen: 6kb sind auch zu wenig,

An wieviel Gigabyte dachtest du denn? Irgendwann wird's halt absurd.

von Hermann U. (Firma: www.pcb-devboards.de) (gera82)


Lesenswert?

> nen anderen controller kann nicht nehmen: 6kb sind auch zu wenig,

Wieviel RAM brauchst du? hast du schon mal nachgerechnet. Ich meine es 
gibt bei C30 optimierungs- Einstellungen. Und Sie bringen einiges an 
Optimierung, hast du schon mal versucht, vielleicht brauchst du dann 
kein RAM mehr. :-)

von speicherschorsch (Gast)


Lesenswert?

ich hab z.b. daten von einem RFID Tag ... das sind ca. 600bit (im worst 
case 1024bit)
von diesen Tags habe ich 20 stück, deren daten ich speichern will, also 
12000bit sprich 1500byte, und damit ist ja mein 2kb RAM schon fast voll, 
im worst case übervoll.

dazu kommen noch 4 puffer für senden und empfangen von 2 uarts ... bei 
denen kann ich noch nicht ganz einschätzen wie groß die sein müssen. im 
zweifelsfall doppelt so groß wie ein datensatz. also zusammen ca. 
512byte

damit bin ich voll am anschlag mit dem ram ... und dann kämen eigentlich 
noch 'normale' kleinere variablen dazu ...

gut, 6kb würden reichen, aber ich kann einfach keinen anderen µC nehmen.

auf jeden fall mal danke für eure hilfe, ich werd mich zum thema spi 
speicher und optimierte speicherverwaltung schlaumachen ....

hilfreiche links sind natürlich gern gesehen.

gruß

von Peter D. (peda)


Lesenswert?

speicherschorsch schrieb:
> von diesen Tags habe ich 20 stück, deren daten ich speichern will

Fürs nur Speichern gibts unbegrenzt FINO-Speicher (first in, never out).

Wichtig ist daher zu überlegen, ob, wann und wie lange Du welche Daten 
benötigst.

Werden die Daten nur selten eingelesen, kann man sie auch im Code-Flash 
ablegen.


Peter

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.