Forum: Compiler & IDEs Externe Variable in Inclue File


von Mario Schmitt (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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)

von Karl H. (kbuchegg)


Lesenswert?

Für mehr Information poste kompletten Code und die Fehlermeldung

von Mario Schmitt (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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

von Karl H. (kbuchegg)


Lesenswert?

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
}

von Rolf Magnus (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.