Forum: Mikrocontroller und Digitale Elektronik problem mit 1k-grenze bei cc5x


von paul (Gast)


Lesenswert?

Hallo,

ich habe vor einer Weile den cc5x Compiler runtergeladen (freie 
Version). Damit hab ich ein Nokia 3310 Display angesteuert, was auch 
sehr gut klappt. Bin jetzt an die 1k-grenze gestossen und habe versucht 
alle Routinen für Display in eine eigene c-Datei auszulagern.Iich habe 
dabei versucht vorzugehen, wie auf www.cc5x.de bzw. 
www.stefan-buchgeher.info vorzugehen. Aber ich kriegs irgendwie enicht 
hin und je länger ichs versuch, desto verwirrter werde ich.
Ich habe mir eine main.c (hier soll nur das Hauptprogramm ablaufen), 
eine lcd_routinen.c und ein projekt.h angelegt. Jetzt weiß ich aber 
nicht, wo ich meine lcd_routinen "includen" muss. Im main. oder in 
projekt.h? Außerdem hab ichnicht genau verstanden, wie man vorgeht, wenn 
eine Funktion zwei Übergabewerte besitzt. Z.B. hab ich eine Funktion 
Set_Cursor(char x, char y). Geht das überhaupt? Außerdem hab ich eine 
Funktion Put_String(const char *s) um ein String auf dem Display 
auszugeben. Kann man Pointer mit diesem extern-Befehl bekannt machen?
Wäre nett, wenn mir jemand helfen könnte.

von paul (Gast)


Lesenswert?

keiner??

von David M. (md2k7)


Lesenswert?

Hallo,

deine lcd_routinen.c musst du nirgendwo includen. Nachdem die 
C-Quelldateien compiliert worden sind, werden diese durch den Linker 
zusammengefügt.
Du musst nur deiner main.c (vor der Verwendung der jeweiligen Funktion) 
mitteilen, dass die Funktion, z.B. void Set_Cursor(char x, char y), mit 
genau diesen Parametern (char x, char y) und diesem Rückgabewert (void) 
existiert.

Um diese Deklarationen auszulagern, schreibt man sie in Header-Dateien, 
die dann am Anfang des Quelltextes includiert werden. Die eigentliche 
Funktion in lcd_routinen.c findet dann der Linker.

Ich kann ein C-Buch, gratis und online z.B. unter 
http://openbook.galileocomputing.de/c_von_a_bis_z/ empfehlen. Wenn du 
lieber etwas handfestes bevorzugst, musst du dir wohl was kaufen.

Gruß
David

von paul (Gast)


Lesenswert?

ok...das hab ich jetzt soweit verstanden und hab es auch geschafft, 
verschiedene c-dateien anzulegen und somit funktionen auszulagern. mein 
problem ist jetzt noch, dass ich an eine funktion einen pointer 
übergeben will. dieser ist mit "const char *s" im main-file und mit 
"extern page0 'const char *s" deklariert. da bringt mir der compiler 
einen fehler: "'extern const' is not supported". was kann bzw. muss ich 
anders machen damits funktioniert??

von David M. (md2k7)


Lesenswert?

Kannst du bitte komplette Code-Ausschnitte posten (zumindest die 
komplette Deklaration der Funktion), denn so kann man nur raten, was du 
meinst.

Ich rate mal, du hast statt einer Funktion eine globale Variable 
deklariert? Die wird nicht const sein dürfen. Keine Ahnung, was du damit 
machen willst.

Gruß
David

von paul (Gast)


Angehängte Dateien:

Lesenswert?

also ich versuche mit einem ds1820 sensor die temperatur zu messen und 
auf einem nokia 3310 display auszugeben. die funktionen dafür gibs ja 
eigentlich schon zu hauf, nur ich versuch diese selber zu schreiben bzw. 
versuche nach zu vollziehen, wie andere es gemacht haben und nutze den 
code. ist auch noch nicht ganz fertig. das display kann ich ansteuern. 
nur wird der code zu groß. deshalb versuchs ich es auf mehrere c-files 
zu verteilen. da komm ich leider nicht so richtig weiter....

von paul (Gast)


Angehängte Dateien:

Lesenswert?

hier das main-file

von paul (Gast)


Angehängte Dateien:

Lesenswert?

und die display-routinen....mit dem ds hab ich mal weggelassen, weil da 
ist bis jetzt nur der reset fertig

von paul (Gast)


Lesenswert?

ich hab jetzt weiter rum probiert und habs anscheinend fast richtig 
gemacht :-)
nur leider bringt mir mplap einen fehler, wenn ich die einzelnen 
asm-datein zusammen linken will:

MPLINK 4.14, Linker
Copyright (c) 2007 Microchip Technology Inc.
Error - symbol '_LcDA' has multiple definitions.
Errors    : 1

kann mir jemand helfen und sagen was der fehler bedeutet? anscheinend 
wurde _LcDA mehrfach definiert. ich hab so ein symbol aber gar nicht 
deklariert, deshalb versteh ich den fehler nicht.

von paul (Gast)


Lesenswert?

neuer versuch . . .

von TeddyD (Gast)


Lesenswert?

Hi,

ich hatte das gleiche Problem... die 1k-Grenze...

Dies konnte ich allerdings lösen, bloß ich habe mehrere Methoden, an die 
merhere Parameter übergeben werden. Bloß die nimmt der Compiler nicht 
mehr an. Kann mir da vielleicht jmd helfen?

Wichtige Daten:
Compiler: cc5x
Mikroprozessor: 16F877A

Der Fehler sieht so aus:

extern page1 void senden(uns8 adresse, uns8 regbyte, uns8 datenbyte);
                                                                    ^------
Error haupt_2_0.h 29: One unsigned 8 bit parameter (not pointer) is 
supported for extern function 'senden'
 (The single parameter is transfered in 'W' because local storage is not
 shared between modules)

Error options: -ew: no warning details  -ed: no error details  -eL: list 
details

von paul (Gast)


Lesenswert?

wenn man funktionen in mehrere c-dateien auslagert, kann man an sie nur 
noch einen einzigen parameter (1 byte) übergeben. das heißt, du musst 
deine funktionen aufteilen, so das eine variable übergeben und ein teil 
abgearbeitet wird. wenn das nicht geht, weil du z.b. für eine berechnung 
mehrere parameter benötigst, musst du die variablen als extern 
deklarieren (siehe meine files, www.cc5x.de, www.stefan-buchgeher.info). 
du weist vorher alle parameter zu und rufst dann die funktion (ohne 
übergabeparameter) auf. ist das so verständlich?

kann mir vielleicht jemand bei meinem problem helfen?? ich versteh wie 
gesagt nicht, warum der compiler sagt, ich hätte eine variable mehrfach 
deklariert.

von Christian H. (chris07011985)


Lesenswert?

MPLINK 4.31, Linker
Copyright (c) 2009 Microchip Technology Inc.
Error - symbol '_LcTA' has multiple definitions.
Errors    : 1

Ich habe genau das gleich Problem. Das Problem scheint bei mir genau so 
wie bei dir nicht am Code zu liegen sondern an irgendwas anderem.

Weis hier jemand weiter ?

Ich habe das Symbol mit dem Namen nie definiert.

Das ist so nervig, da Programmiert man drei Tage und dann kommt auf 
einmal sowas.

Mitlerweile habe ich den Fehler eingrenzen können. Ich arbeite mit 
mehreren Modulen um die 1k Grenze zu umgehen. Wenn ich jedoch eine 
bestimmte Funktion (die Funktion ist sogar leer) mit einem Parameter 
aufrufe dann wird der fehler gemeldet. Definiere ich diese Funktion und 
den Parameter dann geht alles gut...seltsam.

Vielleicht weiß hier jemand rat?

mfg,christian

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.