Hallo, ich suche eine Lösung um eine PROGMEM-Variable in einem INCLUDE-File zu deklarieren und definieren. Die Nachfolgende Zeile wenn ich ohne "Extern" in main.c einbinde lässt sich ohne Fehler compilieren. // Startdaressen der Zeieln im Speicher des LCD extern const uint8_t LCD_line_adr[] PROGMEM = {0x80,0xC0,0x94,0xD4}; Wie kann ich dies realisieren ? Danke Mario
Mario Schmitt schrieb: > // Startdaressen der Zeieln im Speicher des LCD > extern const uint8_t LCD_line_adr[] PROGMEM = {0x80,0xC0,0x94,0xD4}; Ein extern deklarierte Variable kann keine Initialisierung haben (Wenn doch, dann wird das extern ignoriert)
Für mehr Information poste kompletten Code und die Fehlermeldung
Quellcode: LCD.h #ifndef LCD_h #define LCD_h #include <avr/io.h> #include <avr/pgmspace.h> ... // Startdaressen der Zeilen im Speicher des LCD extern const uint8_t LCD_line_adr[] PROGMEM = {0x80,0xC0,0x94,0xD4}; #endif LCD.c #include <avr/io.h> #include <util/delay.h> #include <avr/pgmspace.h> #include "LCD.h" ... LCD_send_cmd (cmd_set_DDRAM_adr | pgm_read_byte (&LCD_line_adr[Zeile])); main.c #include <avr/io.h> #include <util/delay.h> #include <avr/pgmspace.h> #include "LCD.h" In Main wird die Variable LCD_line_adr nicht verwendet. Umgebung: GCC über AVR-Studio Fehlermeldung Build started 30.11.2010 at 20:48:42 avr-gcc -mmcu=atmega644p -Wl,-Map=LCD_test.map main.o LCD.o -o LCD_test.elf LCD.o:(.progmem.data+0x0): multiple definition of `LCD_line_adr' main.o:(.progmem.data+0x0): first defined here make: *** [LCD_test.elf] Error 1 Build failed with 1 errors and 0 warnings... Ich habe überprüft das die Zeichenfolge "LCD_line_adr" nur an diesen beiden Stellen vorkommt. Werden noch weitere Infos benötigt ? Danke im vorraus. Mario
Mario Schmitt schrieb: > LCD.o:(.progmem.data+0x0): multiple definition of `LCD_line_adr' > main.o:(.progmem.data+0x0): first defined here > make: *** [LCD_test.elf] Error 1 > Build failed with 1 errors and 0 warnings... OK. Wie schon gesagt: Schmeiss die Initialisierung raus. Die gehört dort hin, wo du die Variable definiert hast http://www.mikrocontroller.net/articles/FAQ#Globale_Variablen_.C3.BCber_mehrere_Dateien > Ich habe überprüft das die Zeichenfolge "LCD_line_adr" nur > an diesen beiden Stellen vorkommt. Das ist einmal zu wenig. :-) Es muss noch eine dritte Stelle geben: Die Definition der Variablen, zb im lcd.c
Allerdings: Wozu soll diese Variable eigentlich global sein? Ausserhalb von lcd.c geht doch diese Variable niemanden etwas an! Ab damit ins lcd.c (ohne extern) und dort als file-globale static Variable anlegen und gut ists. Mir scheint, da ist wieder mal der Hinweis auf ein C-Buch angebracht. LCD.h *****
1 | #ifndef LCD_h
|
2 | #define LCD_h
|
3 | |
4 | void setCursorToLine( uint8_t Zeile ); |
5 | |
6 | #endif
|
LCD.c *****
1 | #include <avr/io.h> |
2 | #include <util/delay.h> |
3 | #include <avr/pgmspace.h> |
4 | #include "LCD.h" |
5 | |
6 | // Startdaressen der Zeilen im Speicher des LCD
|
7 | static const uint8_t LCD_line_adr[] PROGMEM = {0x80,0xC0,0x94,0xD4}; |
8 | |
9 | // Lokale Funktionen
|
10 | static LCD_send_cmd( uint8_t cmd ); |
11 | |
12 | void LCD_send_cmd( uint8_t cmd ) |
13 | {
|
14 | ....
|
15 | }
|
16 | |
17 | void setCursorToLine( uint8_t Zeile ) |
18 | {
|
19 | LCD_send_cmd(cmd_set_DDRAM_adr | pgm_read_byte (&LCD_line_adr[Zeile])); |
20 | }
|
Mario Schmitt schrieb: > ich suche eine Lösung um eine PROGMEM-Variable in einem INCLUDE-File zu > deklarieren und definieren. Im Header definiert man keine Variablen. Man deklariert sie dort nur und definiert sie im .c-File.
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.