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
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?
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
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.
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...
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.
@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
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]);
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.