pic18f8722 array speicher

Gast #551459
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
Gast #551462
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.
Gast #551481
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
Gast #551509
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;

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren