www.mikrocontroller.net

Forum: Compiler & IDEs Parameter im EEPROM in header file einbinden


Autor: Alexander Liebhold (lippi2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

im Moment hänge ich an folgenden Problem:

Ich habe mir ein Header-File "global_param.h" angelegt, in dem die 
EEPROM-Variablen abgelegt sind. Dieses ist im Hauptprogramm includiert. 
In einem weiteren c-file will ich nun vom EEPROM mittels des 
Veriablennamens lesen. Dafür gibts dann nen neuen Header, in dem die 
Variablen als extern deklariert sind. Irgndwie funktioniert das aber 
nicht.


main.c
#include  <avr/io.h>                    //pin and register definitions
#include  <avr/interrupt.h>                //IRQ handler
#include  <util/delay_basic.h>              //subroutine delay
#include  <avr/eeprom.h>                  //R/W procedures for eeprom
#include  "globals.h"
#include  "global_param.h"
#include  "checksum.h"
#include  "temperature.h"

global_param.h
#ifndef _global_param_h_
#define _global_param_h_


//*************************************Constants EEPROM*****************************
//32Bit serial (init valua = 0xFFFFFFFF!!!)
unsigned char SERIAL3 EEMEM;
unsigned char SERIAL2 EEMEM;
unsigned char SERIAL1 EEMEM;
unsigned char SERIAL0 EEMEM;
//Operating parameters (FB and current limit)
unsigned char FB_GAIN EEMEM;
unsigned char I_LIM_SET EEMEM;
unsigned char I_MAX EEMEM;
//Initialization parameters
unsigned char INIT_MODUS EEMEM;
unsigned char TEMP_UP EEMEM;
unsigned char TEMP_DOWN EEMEM;
uint16_t  V_FB_MAX EEMEM;
//Error memory (ring buffer: if memory contains 0xFFFF --> memory is clear)
unsigned int F_MEM1 EEMEM;
unsigned int F_MEM2 EEMEM;
unsigned int F_MEM3 EEMEM;
unsigned int F_MEM4 EEMEM;
unsigned int F_MEM5 EEMEM;
unsigned int F_MEM6 EEMEM;
//16 bit firmwareversion
unsigned char firmware_version_high EEMEM;
unsigned char firmware_version_low EEMEM;

#endif

temperature.h
#ifndef _temperature_h_
#define _temperature_h_

extern unsigned char TEMP_UP;
extern unsigned char TEMP_DOWN;



#endif

temperature.c
#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>

//***************************************Subroutine Temperatur prüfen******************
int CHECK_TEMP()
{cli();
 unsigned char T_max = eeprom_read_byte(&TEMP_UP);          //max Temp. aus EEPROM lesen
 unsigned char T_min = eeprom_read_byte(&TEMP_DOWN);        //min Temp. aus EEPROM lesen
 static unsigned short AD_result;
//usw.


Der Compiler bemängelt immer, dass TEMP_UP und TEMP_DOWN nicht deklariert sind. 

Autor: Johann L. (gjlayde) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das, was in param.h steht, gehört eigentlich in ein eigenes C-Modul 
param.c. In den Header kommen dann die Deklarationen. Die 
Instanziierungen der Variablen, also die Definitionen, gehören nicht in 
den Header.

in temerature.c gibt es dann ein #include "param.h"

Johann

Autor: Alexander Liebhold (lippi2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also eher so:

global_param.c
//32Bit serial (init valua = 0xFFFFFFFF!!!)
unsigned char SERIAL3 EEMEM = 0x00;
unsigned char SERIAL2 EEMEM = 0x00;
unsigned char SERIAL1 EEMEM = 0x00;
unsigned char SERIAL0 EEMEM = 0x00;
//Operating parameters (FB and current limit)
unsigned char FB_GAIN EEMEM;
unsigned char I_LIM_SET EEMEM;
unsigned char I_MAX EEMEM;
//Initialization parameters
unsigned char INIT_MODUS EEMEM;
unsigned char TEMP_UP EEMEM;
unsigned char TEMP_DOWN EEMEM;
uint16_t  V_FB_MAX EEMEM;
//Error memory (ring buffer: if memory contains 0xFFFF --> memory is clear)
unsigned int F_MEM1 EEMEM;
unsigned int F_MEM2 EEMEM;
unsigned int F_MEM3 EEMEM;
unsigned int F_MEM4 EEMEM;
unsigned int F_MEM5 EEMEM;
unsigned int F_MEM6 EEMEM;
//16 bit firmwareversion
unsigned char firmware_version_high EEMEM = 4;
unsigned char firmware_version_low EEMEM = 6;

Und dann include in temperature.c
#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include "global_param.h"

//***************************************Subroutine Temperatur prüfen******************
int CHECK_TEMP()
{cli();
 unsigned char T_max = eeprom_read_byte(&TEMP_UP);          //max Temp. aus EEPROM lesen
 unsigned char T_min = eeprom_read_byte(&TEMP_DOWN);        //min Temp. aus EEPROM lesen
 static unsigned short AD_result;
//usw.

Wie muss denn dann der global_param.h aussehen? Bei normalen Variablen 
oder Strukturen funktioniert es bestens. Nur mit EEPROM-Variablen gehts 
irgendwie nicht.

Muss ich einfach nur die Variablentypen angeben?
Sprich für global_param.h
#ifndef _global_param_h_
#define _global_param_h_

unsigned char SERIAL3;
unsigned char SERIAL2;
unsigned char SERIAL1;

//usw.

#endif

Autor: Stefan Ernst (sternst)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Alexander Liebhold schrieb:

> Muss ich einfach nur die Variablentypen angeben?
> Sprich für global_param.h
> #ifndef _global_param_h_
> #define _global_param_h_
> 
> unsigned char SERIAL3;
> unsigned char SERIAL2;
> unsigned char SERIAL1;
> 
> //usw.
> 
> #endif

Du hast das "extern" vergessen.

Autor: Alexander Liebhold (lippi2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das geht doch hinten und vorne nicht. Selbst wenn ich die normal im 
main.c anlege, dann kann ich aus nem anderen c-File nicht auf diese 
Speicherbereiche über den deklarierten Namen zugreifen.

Wie legt ihr denn eure Parameter im EEPROM ab? Wenn ich diese aus 
verschiedenen Modulen heraus lesen möchte, dann hab ich doch genau das 
Prob., dass ich die EEPROM-Variablen global brauche.

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Das geht doch hinten und vorne nicht.

Im global_param.c-File sollte stehen:
unsigned char SERIAL3 EEMEM = 0x00;

Im global_param.h-file sollte stehen:
extern unsigned char SERIAL3 EEMEM;

Und wo kannst du jetzt nicht zugreifen?

Oliver

Autor: Alexander Liebhold (lippi2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Problem ist folgendes:

global_param.c
#include "global_param.h"

//*************************************Constants EEPROM*****************************
//32Bit serial (init valua = 0xFFFFFFFF!!!)
unsigned char SERIAL3 EEMEM = 0x00;
unsigned char SERIAL2 EEMEM = 0x00;
unsigned char SERIAL1 EEMEM = 0x00;
unsigned char SERIAL0 EEMEM = 0x03;

global_param.h
#ifndef _global_param_h_
#define _global_param_h_


extern unsigned char SERIAL3 EEMEM;
extern unsigned char SERIAL2 EEMEM;
extern unsigned char SERIAL1 EEMEM;
extern unsigned char SERIAL0 EEMEM;

#endif


Aus 2 Modulen wird aus den EEPROM gelesen. main.c und temperature.c.
Habe deswegen bei beiden das global_param.h includiert.

Der Compiler/Linker gibt folgende Fehlermeldung

.../global_param.h:5: error: expected '=', ',', ';', 'asm' or 
'__attribute__' before 'EEMEM'

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
#include  <avr/eeprom.h> 

muß natürlich auch in jedes File. Am einfachsten packst du das gleich 
mit ins global_param.h.

Oliver

Autor: Alexander Liebhold (lippi2000)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Also ich habe es jetzt.

global_param.h
#ifndef _global_param_h_
#define _global_param_h_

#define EEPROM_SECTION __attribute__ ((section (".eeprom")))


extern unsigned char SERIAL3;
extern unsigned char SERIAL2;
extern unsigned char SERIAL1;
extern unsigned char SERIAL0;
extern unsigned char TEMP_UP;
extern unsigened char TEMP_DOWN;

#endif


global_param.c
#include "global_param.h"

//*************************************Constants EEPROM*****************************
//32Bit serial (init valua = 0xFFFFFFFF!!!)
unsigned char SERIAL3     EEPROM_SECTION = 0;
unsigned char SERIAL2     EEPROM_SECTION = 0;
unsigned char SERIAL1     EEPROM_SECTION = 0;
unsigned char SERIAL0     EEPROM_SECTION = 0;
unsigned char TEMP_UP     EEPROM_SECTION = 0x55;
unsigned char TEMP_DOWN   EEPROM_SECTION = 0xBF;

Und der Aufruf aus dem Modul temperature.c
#include <avr/io.h>
#include <avr/eeprom.h>
#include <avr/interrupt.h>
#include "global_param.h"


//***************************************Subroutine Temperatur prüfen******************
int CHECK_TEMP()
{cli();
 unsigned char T_max = eeprom_read_byte(&TEMP_UP);          //max Temp. aus EEPROM lesen
 unsigned char T_min = eeprom_read_byte(&TEMP_DOWN);        //min Temp. aus EEPROM lesen
...
...

So funktionierts. Danke trotzdem.

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.