Forum: Mikrocontroller und Digitale Elektronik EEPROM beim Brennen beschreiben


von Jens (Gast)


Lesenswert?

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

von skorpionx (Gast)


Lesenswert?


von Jens (Gast)


Lesenswert?

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

von Jens (Gast)


Lesenswert?

Ich habe mal rumprobiert und jetzt am Ende meines C-Codes Folgendes 
fabriziert:
1
#asm
2
org 2100h       ; da fängt der EEPROM an
3
de 0h           ; zwei Werte als Test
4
de 1h
5
#endasm

Aber er kompiliert nicht und meint in der dritten Zeile (also in der 
ersten de-Zeile) sei ein Syntax-Fehler. Wo ist da der Fehler?

Gruß
Jens

von skorpionx (Gast)


Lesenswert?

#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

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Jens schrieb:
> Wo ist da der Fehler?
Dein Compiler kennt eventuell die Direktive "de" nicht.

von Jens (Gast)


Lesenswert?

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
unsigned char  rom     EE_DUMMY_BYTE1   = 255;
3
unsigned char  rom     EE_DUMMY_BYTE2   = 254;
4
unsigned char  rom     EE_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
org 2100h
3
db 1h
4
org 0
5
#endasm
meckert der Compiler in der DB-Zeile und sagt "Fehler 803: undefiniertes 
temporäres Label". Kann jemand helfen?

Beste Grüße
Jens

von Jens (Gast)


Lesenswert?

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

von Jens (Gast)


Lesenswert?

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

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.