Forum: Mikrocontroller und Digitale Elektronik C18, #defines und Headerfiles, Deklarationen


von BeastyK (Gast)


Lesenswert?

Moin Leute,

ich hab etwas Ärger mit dem C18 Compiler.

Wenn ich in meiner Main.c soetwas definiere:
1
#include <p184550.h>
2
#include <glcd.h>
3
4
#define    TrisA_init   0b00000000
5
#define    LCD_A0       PORTAbits.RA1
6
7
void main() {
8
          TRISA = TrisA_init;
9
............ }

und es kommt in der Headerdatei glcd.h auch LCD_A0 vor.
Muß ich dann in der Headerdatei LCD_A0 deklarieren mit extern?
PORTAbits.RA1 ist doch schon über die p18f4550 Headerdatei bekannt, also 
muß ich das SFR mit den Addressen nicht bekannt machen.
Ich bekomme in glcd.h immer Error [1105] und [1101], symbol not be 
defined und lvalue required.
Hilfe wäre klasse!

Gruß
Andi

von Vincent H. (vinci)


Lesenswert?

Wenn in glcd.h diese Definition drinnen is, dann brauchst du sie in 
Main.c sowieso nicht mehr, da du glcd.h ja einbindest.

Ev. kennt glcd.h PORTA nicht, sofern du die P18F... Headerdatei dort 
nicht inkludiert hast.

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

"lvalue required" bedeutet, daß das, was links von der Zuweisung steht, 
dem Compiler nicht passt. Das dürfte hier TRISA sein. Ist das irgendwo 
definiert?

von Ralph (Gast)


Lesenswert?

Verschiebe beide Defines in die Datei glcd.h.

Lass die Include Reihenfolge wie sie da ist.
Dann sollte das funktionieren.

Du musst nur aufpassen wenn du glcd.h nochmal an anderer Stelle 
includierst.
Dann muss  #include <p184550.h> wieder davor.

von Andreas G. (beastyk)


Lesenswert?

Erstmal danke für die Antworten!
Ich schreib mal was dazu:

Rufus Τ. Firefly schrieb:
> "lvalue required" bedeutet, daß das, was links von der Zuweisung steht,
> dem Compiler nicht passt. Das dürfte hier TRISA sein. Ist das irgendwo
> definiert?

Ist TRISA nicht, wie PORTA und LATA, in der p18f4550.h enthalten?
Aber das mit der linken Seite von #define stimmt, er meckert bei LCD_A0

Vincent Hamp schrieb:
> Wenn in glcd.h diese Definition drinnen is, dann brauchst du sie in
> Main.c sowieso nicht mehr, da du glcd.h ja einbindest.

LCD_A0 wird in der glcd.h aufgerufen, die Definition hab ich aber nur in 
der main.c. Ich dachte mir das es "unsauber" ist wenn ich diese #define 
's in die Headerdatei schiebe, weil man die glcd.h auch für andere PICs 
verwenden sollte...hab da auch noch den PORT D als #define mit in main.c 
(für die Datenpins D0-D7 u.a.) in kleineren PICs gibs aber eventuell 
kein D Register IO's.

Vincent Hamp schrieb:
> Ev. kennt glcd.h PORTA nicht, sofern du die P18F... Headerdatei dort
> nicht inkludiert hast.

Stimmt! In der glcd.h hab ich p184550.h nicht included, dachte es langt 
im main.c....

Ralph schrieb:
> Verschiebe beide Defines in die Datei glcd.h.

Ok, damit haben schon zwei Leute mir das verschieben in die glcd.h 
geraten, das nehm ich mir mal zu Herzen und schau was sich ergibt!

Was ist mit diesem "extern" Deklarationen gemeint?
Könnte ich z.b. in der glcd.h schreiben:

extern <datentyp> <Name>

wenn ich dann als Name LCD_A0 nehm frag ich mich nur was für ein 
Datentyp das ist, weil LCD_A0 als PORTAbits.RA1 in #define steht. Und 
bit kennt der C18 ja wieder nicht...?

Gruß
Andi

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.