www.mikrocontroller.net

Forum: Compiler & IDEs Externe Variable in Inclue File


Autor: Mario Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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)

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Für mehr Information poste kompletten Code und die Fehlermeldung

Autor: Mario Schmitt (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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#Global...


> 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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
*****
#ifndef LCD_h
#define LCD_h

void setCursorToLine( uint8_t Zeile );

#endif

LCD.c
*****
#include <avr/io.h>
#include <util/delay.h>
#include <avr/pgmspace.h>
#include "LCD.h"

// Startdaressen der Zeilen im Speicher des LCD
static const uint8_t LCD_line_adr[] PROGMEM = {0x80,0xC0,0x94,0xD4};

// Lokale Funktionen
static LCD_send_cmd( uint8_t cmd );

void LCD_send_cmd( uint8_t cmd )
{
   ....
}

void setCursorToLine( uint8_t Zeile )
{
  LCD_send_cmd(cmd_set_DDRAM_adr | pgm_read_byte (&LCD_line_adr[Zeile]));
}

Autor: Rolf Magnus (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.