Forum: Mikrocontroller und Digitale Elektronik Pointer auf Flash


von L. R. (keyboard)


Lesenswert?

hei,

MPLAP 8.4 & PIC18F46K22

Bei meinem Projekt habe ich mehrere Array's im Flash liegen.

Um im Programm flexiebel zu sein, spreche ich diese über Pointer an.

Leider bekomme ich beim lesen einen fehlerhaften Wert zurück geliefert.

Wenn ich die Array's ins RAM lege, also ohne "const rom far" 
funktioniert es.

unsigned char *p_FunkBit;
unsigned char bit_mask;

const rom far unsigned char PortBit[8] =
  {
    0b00000011,     //
.....
    0b00000000,     //
  };

p_FunkBit  = PortBit;

bit_mask = p_FunkBit[0];


vielen Dank im voraus.
schönen Abend

von Max H. (hartl192)


Lesenswert?

Welchen Kompiler verwendest du?

von Easylife (Gast)


Lesenswert?

L. R. schrieb:
> bit_mask = p_FunkBit[0];

in bit_mask bekommst du die Adresse von PortBit[0] zurück.

Du wolltest wohl eher so etwas machen:

p_FunkBit  = PortBit;   // entspricht "p_FunkBit = &PortBit[0];"
bit_mask = *p_FunkBit;

von L. R. (keyboard)


Lesenswert?

hei,

C18

schönen Abend

von L. R. (keyboard)


Lesenswert?

hei,

@  Easylife (Gast)

immer noch der Fehler

PortBit  liegt auf Adresse  48C4   Wert  1
                            48C5         2
....

p_FunkBit  liegt auf Adress  348   Wert  0x48C


bit_mask = *p_FunkBit;  ergibt  0xBF

schönen Abend

von Easylife (Gast)


Lesenswert?

L. R. schrieb:
> p_FunkBit  liegt auf Adress  348   Wert  0x48C

Hm. p_FunkBit müsste eigentlich 0x48C4 enthalten.
Wirft dein Compiler ein map-file aus, in dem du nachgucken kannst, wo 
PortBit[] tatsächlich liegt?

Versuche doch auch mal die Reihenfolge der keywords zu ändern:

far rom const unsigned char ...
und
near rom const unsigned char ...

und
#pragma romdata PortBit = 0x200 //place at ROM addr 0x200 rom const 
unsigned char PortBit[8] = { (...) };

http://site.iugaza.edu.ps/ehabib/files/ES-chapter7.pdf

von L. R. (keyboard)


Lesenswert?

hei,

@  Easylife (Gast)

ups.. Schreibfehler    richtig  0x48C4

map file schau ich mir an

schönen Abend

  PortBit    romdata   0x000200    program   0x000008

und
far rom const unsigned char
und
#pragma romdata PortBit = 0x200

jetzt ist der Wert beim lesen  0

leider kein Erfolg

von Frank M. (frank_m35)


Lesenswert?

Leider kenne ich mich mit C18 auch nicht aus, aber möglicherweise liegt 
es daran, dass rom far char 24bit groß ist:
http://ww1.microchip.com/downloads/en/devicedoc/51288f.pdf
Kapitel 2.4.3

Dein Pointer ist auch auf ein normales char, also probier mal einen 
passenden Pointer zu benutzen:
const rom far unsigned char * p_FunkBit

von L. R. (keyboard)


Lesenswert?

hei,

@ Frank M. (frank_m35)

Vielen Dank für deine wertvolle Info.

Man sollte nicht nur das Array richtig deklarieren sondern auch den 
Pointer.

jetzt kann ich auch den Rest aus dem RAM ins Flash verbannen.

schönen Tag

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.