Externe Variable in Inclue File

Gast #1957471
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
Gast #1957519
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
#1957553
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
#1957571
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
}

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren