Forum: Mikrocontroller und Digitale Elektronik pic18f8722 array speicher


von marc (Gast)


Lesenswert?

hallo leute,

ich beschäftige mich seit kurzem mit einem pic18f8722. in meinem 
projektchen würde ich gerne werte in mehreren arrys speichern. der daten 
speicher sollte ja grösser als 3000 byte sein. von daher wäre es schön, 
wenn man eine arry wie folgt erzeugen könnte

typedef unsigned char  u8;
#define GROESSE 3000
u8 daten[GROESSE];

was scheinbar nicht funktioniert. denn der compiler meckert mit:


Error - section '.udata_pic18f18722.o' can not fit the section. Section 
'.udata_pic18f18722.o' length=0x00000200
Errors    : 1

hat jemand eine idee, wie ich denn ganzen datenspeicher oder vielleicht 
auch noch den programmspeicher als datenspeicher nutzen kann.

das kap. 6.4 im MPLAB_C18_Getting_Started habe ich mir durchgelesen und 
nicht so verstanden, das ich es umsetzten könnte.

einen schönen tanz in den mai!

marc

von Christoph (Gast)


Lesenswert?

Hi,

ich hab hier eine etwas ältere Version vom "Getting Started", aber in 
diesem wird auf exakt dein Problem eingegangen. Weiß ich weil ich es 
auch mal hatte ;)

Kurz gesagt: standardmäßig kann der C18 nur mit maximal 255 Byte großen 
Arrays umgehen. Um das hinzubiegen muss man das Linkerskript anpassen, 
eine größere Datensektion anlegen und diese dann dem Array zuweisen. Ist 
aber dort recht gut beschrieben.

von Christoph (Gast)


Lesenswert?

Noch ein kleiner Tipp: der 18F8722 hat nur knappe 4k RAM. Wenn du da 
schon 3k für einen Datenspeicher abziehst solltest du aufpassen das es 
nicht irgendwann (zu) eng wird.

von marc (Gast)


Lesenswert?

ich habe noch etwas rumprobiert...

wenn man das arry in 13 * 256 bytes teilt kommt man auf 3328 bytes

typedef unsigned char  u8;

#pragma udata data1
u8 data1[256];
...
#pragma udata data13
u8 data13[256];

ob das der schönste weg ist mag ich mal bezweifeln. damit reize ich aber 
den speicher fast ganz aus.
vielleicht kennt ja einer einen schöneren weg!

danke

marc

von holger (Gast)


Lesenswert?

Machs im Linkerskript

ALT:
//DATABANK   NAME=gpr1       START=0x100          END=0x1FF
//DATABANK   NAME=gpr2       START=0x200          END=0x2FF
//DATABANK   NAME=gpr3       START=0x300          END=0x3FF
//DATABANK   NAME=gpr4       START=0x400          END=0x4FF

//DATABANK   NAME=gpr5       START=0x500          END=0x5FF
//DATABANK   NAME=gpr6       START=0x600          END=0x6FF
//DATABANK   NAME=gpr7       START=0x700          END=0x7FF
//DATABANK   NAME=gpr8       START=0x800          END=0x8FF

//DATABANK   NAME=gpr9       START=0x900          END=0x9FF
//DATABANK   NAME=gpr10      START=0xA00          END=0xAFF
//DATABANK   NAME=gpr11      START=0xB00          END=0xBFF

NEU:
DATABANK   NAME=gpr1       START=0x100          END=0xBFF

Entschuldige wenn ich das hier sage, aber C18 ist einfach
nur buggy und scheiße. Und ich weiß wovon ich rede.

Solche Klimmzüge muss man da oft machen:

// BytesPerCluster= BYTE_PER_SEC * secPerCluster; //this did not work 
with MCC18 !
 BytesPerCluster= BYTE_PER_SEC;
 BytesPerCluster *= secPerCluster;

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.