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.