Forum: Mikrocontroller und Digitale Elektronik Pic18 - großes Array


von Bonsi (Gast)


Angehängte Dateien:

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

von Bonsi (Gast)


Lesenswert?

Keine Ideen??

von A. S. (Gast)


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?

von Bonsi (Gast)


Angehängte Dateien:

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

von (prx) A. K. (prx)


Lesenswert?

Achim S. schrieb:
> (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?

Die PIC18 sind etwas moderner. Es gibt TBLxxx Befehle für ROM-Zugriff, 
die SFRs für ROM-Adresse und -Daten verwenden.

von Volker S. (vloki)


Lesenswert?

Bonsi schrieb:
> Zuvor hatte ich einen pic16f18857, da wurde das Array in einer "font.h"
> als:  const char font[256][24] = ... definiert,

In einem Header definiert man eigentlich besser nichts.
Egal - du könntest vielleicht dein mit der "package" Funktion in MPLABX 
gepacktes Projekt hier posten. Das sind dann nur ein paar kB...

von Michael H. (morph1)


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.

von Bonsi (Gast)


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

von Bonsi (Gast)


Lesenswert?

Bzw. Was wäre euer Vorschlag für die Umsetzung dieser look up Tabelle?

von A. S. (Gast)


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]);

von Volker S. (vloki)


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...

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.