Hallo Leute,
ich würde gerne in einem PIC16F627A einen LED-Zeichensatz fest
einprogrammieren (für eine Art Display). Ich habe mir gedacht, dabei den
internen 128Byte EEPROM zu nutzen, muss ja nur einmal beschrieben werden
und kann danach beliebig oft ausgelesen werden.
Dabei habe ich folgenden Quellcode (in ASM) gefunden:
http://www.sprut.de/electronic/pic/programm/eeprom/eeprom.html
Ich programmiere jedoch den PIC16F627A in C und lasse das dann
assemblieren, ich selber kann also ASM nicht, nur mein Compiler.
Gibt es ein Äquivalent zu diesem Codeschnipsel in C?
1
;voreingestellte Muster
2
org H'2100' ; Adresse des EEPROM für den Brenner
3
de B'00000001' ; 0
4
de B'00000011' ; 1
5
; etc
6
org 0
Ich denke ja wohl eher nicht, da es sehr "low level" ist. Wie kann ich
dann diesen Code in mein Programm einfügen? Gibt es einen C-Befehl, mit
dem ich dem Compiler sagen kann "Achtung, jetzt kommt Assembler"?
Danke schonmal für die Hilfe,
Jens
Hmm, das hilft mir ja nicht so direkt, ich möchte ja die EEPROM-Daten
dem C-Programm "vorlagern", sodass sie direkt in den EEPROM geschrieben
werden, ruhig jedes Mal neu. Ich werde den PIC ja, wenn er einmal
programmiert und debugt ist, nie wieder neu programmieren, da er dann in
seiner Anwendung bleibt.
Gibt es denn eine Möglichkeit, ASM-Code in C einzubinden, sodass die
Daten für den EEPROM mit ins .hex gepackt werden?
Jens
#ifdef WITH_EEPROM_DATEN
#pragma romdata section_eeprom_data =0xf00000
unsigned char rom EE_DUMMY_BYTE1 = 255;
unsigned char rom EE_DUMMY_BYTE2 = 254;
unsigned char rom EE_DUMMY_BYTE3 = 253;
unsigned char rom EE_DUM[]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
#endif
#pragma code
main()
{
Das macht das gleicher wie der Assembler.
Du muss nur die Adresse 0xf00000 anpassen.
Für SDCC sieht das etwas anders(letze Stelle mit Prog.Version...):
__code __at(0xf000ff) PrVer = PROG_VERSION
Hallo,
erstmal danke euch beiden für die Antworten.
Christian H. schrieb:> Dein Compiler kennt eventuell die Direktive "de" nicht.
Ich verwende den PICC-Lite Compiler. Was soll mensch denn da verwenden
anstelle von "de"?
skorpionx schrieb:> #ifdef WITH_EEPROM_DATEN> #pragma romdata section_eeprom_data =0xf00000> unsigned char rom EE_DUMMY_BYTE1 = 255;> unsigned char rom EE_DUMMY_BYTE2 = 254;> unsigned char rom EE_DUMMY_BYTE3 = 253;> unsigned char rom EE_DUM[]= {0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};> #endif>> #pragma code
Danke, das habe ich aber noch nicht so ganz gerafft. Ich habe das mal
eingehackert:
1
#pragma romdata section_eeprom_data =0x2100
2
unsignedcharromEE_DUMMY_BYTE1=255;
3
unsignedcharromEE_DUMMY_BYTE2=254;
4
unsignedcharromEE_DUMMY_BYTE3=253;
Aber meinem PICC-Lite scheint es nicht zu gefallen. Er scheint "#pragma
code" nicht zu kennen, und auch die erste Zeile mag er nicht - alles
"unbekanntes pragma".
Ich habe mich mal nach den Assembler-Direktiven des PICC-Lite
informiert, und der Assembler ist ja der ASPIC, der hat da sowas wie
"DB". Das scheint genau so etwas zu tun, was ich brauche. Siehe hier
unter Kapitel 6.3.12.8:
http://www.cs.ucr.edu/~eblock/db/downloads/PICmanual2.pdf
Aber bei diesem Code
1
#asm
2
org2100h
3
db1h
4
org0
5
#endasm
meckert der Compiler in der DB-Zeile und sagt "Fehler 803: undefiniertes
temporäres Label". Kann jemand helfen?
Beste Grüße
Jens
Ich sehe gerade, dass die "DB" directive zum Schreiben in den
Programmspeicher gedacht ist - und genau da landen die Daten dann auch.
Aber wenn ich vorher die Adresse mir org auf 2100h setze sollte es doch
langen, oder? Das Programm kompoliert jedenfalls mittlerweile.
Gruß
Jens
Schade dass niemand mehr geantwortet hat. Aber ich habe in einem anderen
Forum einen guten Tip bekommen.
Unter PICC-Lite gibt es die DE-Direktive ja nicht. Stattdessen kann dort
das Makro
1
__EEPROM_DATA_(1,2,3,4,5,6,7,8);
verwendet werden. Damit klappt es genau so wie ich es wollte.
Gruß
Jens