Pic18 - großes Array

Gast #4942054
Lesenswert?

Hallo,

ich habe ein const char font[256][24] array auf einem pic18f26k40.

auf einem pic 16 hat alles prima funktioniert, jetzt habe ich das auf 
den pic18 portiert und es geht nicht mehr.

Fehlerbild - siehe Anhang. Ich sehe den Arrayinhalt im Debugger, wenn 
ich ein Feld aber in ein char kopieren will, geht das nicht.

Wieso?

VG
Angehängte Dateien:
Gast #4942706
Lesenswert?

Ich sehe garnichts auf Deinem Bild.

a) seit wann hat ein PIC18 direkt adressierbares ROM? Braucht man da 
nicht ROM-Lese-Befehle?
b) was sagt der Compiler?
c) was ist die Adresse von diesem font[85][10]? 0xED8B? dann nimm doch 
mal einen Zeiger auf diese Adresse und schaue Dir an, was er zurück 
liefert und was der Debugger dazu anzeigt.

ich sehe auch nicht, welchen Compiler Du hast und was dessen Handbuch 
zur Verwendung von Datenpointer ins ROM sagt.

Prinzipiell geht es mit PIC18, ich nutze dort den Programmspeicher z.B. 
als general purpose Flash für ein Daten-Device. Mit den alten Hi-Tech 
Compilern, bevor sie von Microchip gekauft wurden.

(BTW.: habe keine Datenblätter oder Sourcen zuhause, aber war 
ROM-Speicher beim PIC16 nicht immer als Return implementiert: Also eine 
zu lesende 17 als "return 17"? Und der Compiler hat das Lesen dann 
entsprechend umgesetzt?

Wie ist denn der Op-Code für die Zuweisungeszeile beim PIC18 bei Dir?
Gast #4943481
Lesenswert?

Das Bild soll zeigen, dass das Array scheinbar(!) richtig in den Flash 
geschrieben wird (ist ja im Debugger sichtbar), wenn ich die Daten dann 
aber abrufen/lesen will, nur "0x00" gelesen wird.

Was meinst du mit direkt lesen?

Was mir noch einfiel: Write protection.. Aber die ist auch aus, siehe 
Bild.

Weitere Infos: Ich verwende einen PIC18F26K40 mit dem XC8 in V1.41!

Beim Rest komme ich leider grad nicht ganz mit. Was ich sagen kann: 
Zuvor hatte ich einen pic16f18857, da wurde das Array in einer "font.h" 
als:

const char font[256][24] = ...

definiert, und anschließend mit

my_var = font[86][4];

ohne Probleme gelesen.

Danke für deine Hilfe!!!

VG Bonsi
Angehängte Dateien:
#4943503
Lesenswert?

Du brauchst beim PIC18 eigene Pointer (const) fürs lesen aus dem ROM, 
damit der Compiler das dann auf die richtigen Leseoperationen umlegt.

Wenn das wirklich beim PIC16 funktioniert hat, dann hat der Compiler das 
wohl erkannt, weil das sollte eigentlich genauso dort gelten.

Meines Wissens nach sind beide nicht in der Lage das im gleichen 
Adressraum abzubilden.
Gast #4943563
Lesenswert?

@A.K.: Du meinst folgendes:
"Look-up table data may be stored two bytes per
program word by using table reads and writes. The
Table Pointer (TBLPTR) register specifies the byte
address and the Table Latch (TABLAT) register
contains the data that is read from or written to program
memory. Data is transferred to or from program
memory one byte at a time."

Allerdings würde das ja heißen, ich müsste die Datenablage meiner 
bisherigen FONT-Table komplett überarbeiten, wenn ich da mit den 
Read/Write befehlen hantiere, oder?

@Volker, das Projekt besteht derzeit nur aus dieser font.h (die ich 
jetzt mal in font.c / font.h gesplittet habe) und aus dem Code schnipsel 
von oben, wo ich versuche, via:
my_var = font[86][4];
lesend auf die Variable zuzugreifen. Mehr will ich derzeit gar nicht 
versuchen :-)

@Michael,a okay! Allerdings leuchtet mir das gerade nicht ganz ein, denn 
in einen "const Pointer" (?) kann ich ja nicht schreiben, da const. Oder 
stehe ich auf dem Schlauch? Wie würde denn für dich ein Codeschnipsel 
aussehen, der aus dem const char font[256][24] = ... lesen würde?

Danke für eure Hilfe!

VG
Gast #4943801
Lesenswert?

Bonsi schrieb:
> Allerdings würde das ja heißen, ich müsste die Datenablage meiner
> bisherigen FONT-Table komplett überarbeiten, wenn ich da mit den
> Read/Write befehlen hantiere, oder?

Es gibt 2 Wege:

a) Du liest in Deinem Compiler nach, wie er den Zugriff auf ROM gerne 
hätte. Vermutlich mit einem const Pointer.

b) Du probierst die Table-Read-Funktionen des PICs aus um ein Byte an 
einer Adresse zu lesen.

Und dann schreibst Du ggf. noch ein Makro, damit Du statt

> t2=font[85][24];

nun z.B. schreibst: t2 = GetROM(font[85][24]);
#4944055
Lesenswert?

Bonsi schrieb:
> @Volker, das Projekt besteht derzeit nur aus dieser font.h (die ich
> jetzt mal in font.c / font.h gesplittet habe) und aus dem Code schnipsel
> von oben, wo ich versuche, via:
> my_var = font[86][4];
> lesend auf die Variable zuzugreifen. Mehr will ich derzeit gar nicht
> versuchen :-)

Na umso einfacher ein Projekt zu posten!
Das Nachschauen ist meistens viel einfach als das Denken...

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