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


von Alexander L. (lippi2000)


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
1
#include  <avr/io.h>                    //pin and register definitions
2
#include  <avr/interrupt.h>                //IRQ handler
3
#include  <util/delay_basic.h>              //subroutine delay
4
#include  <avr/eeprom.h>                  //R/W procedures for eeprom
5
#include  "globals.h"
6
#include  "global_param.h"
7
#include  "checksum.h"
8
#include  "temperature.h"

global_param.h
1
#ifndef _global_param_h_
2
#define _global_param_h_
3
4
5
//*************************************Constants EEPROM*****************************
6
//32Bit serial (init valua = 0xFFFFFFFF!!!)
7
unsigned char SERIAL3 EEMEM;
8
unsigned char SERIAL2 EEMEM;
9
unsigned char SERIAL1 EEMEM;
10
unsigned char SERIAL0 EEMEM;
11
//Operating parameters (FB and current limit)
12
unsigned char FB_GAIN EEMEM;
13
unsigned char I_LIM_SET EEMEM;
14
unsigned char I_MAX EEMEM;
15
//Initialization parameters
16
unsigned char INIT_MODUS EEMEM;
17
unsigned char TEMP_UP EEMEM;
18
unsigned char TEMP_DOWN EEMEM;
19
uint16_t  V_FB_MAX EEMEM;
20
//Error memory (ring buffer: if memory contains 0xFFFF --> memory is clear)
21
unsigned int F_MEM1 EEMEM;
22
unsigned int F_MEM2 EEMEM;
23
unsigned int F_MEM3 EEMEM;
24
unsigned int F_MEM4 EEMEM;
25
unsigned int F_MEM5 EEMEM;
26
unsigned int F_MEM6 EEMEM;
27
//16 bit firmwareversion
28
unsigned char firmware_version_high EEMEM;
29
unsigned char firmware_version_low EEMEM;
30
31
#endif

temperature.h
1
#ifndef _temperature_h_
2
#define _temperature_h_
3
4
extern unsigned char TEMP_UP;
5
extern unsigned char TEMP_DOWN;
6
7
8
9
#endif

temperature.c
1
#include <avr/io.h>
2
#include <avr/eeprom.h>
3
#include <avr/interrupt.h>
4
5
//***************************************Subroutine Temperatur prüfen******************
6
int CHECK_TEMP()
7
{cli();
8
 unsigned char T_max = eeprom_read_byte(&TEMP_UP);          //max Temp. aus EEPROM lesen
9
 unsigned char T_min = eeprom_read_byte(&TEMP_DOWN);        //min Temp. aus EEPROM lesen
10
 static unsigned short AD_result;
11
//usw.
12
13
14
Der Compiler bemängelt immer, dass TEMP_UP und TEMP_DOWN nicht deklariert sind.

von Johann L. (gjlayde) Benutzerseite


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

von Alexander L. (lippi2000)


Lesenswert?

Also eher so:

global_param.c
1
//32Bit serial (init valua = 0xFFFFFFFF!!!)
2
unsigned char SERIAL3 EEMEM = 0x00;
3
unsigned char SERIAL2 EEMEM = 0x00;
4
unsigned char SERIAL1 EEMEM = 0x00;
5
unsigned char SERIAL0 EEMEM = 0x00;
6
//Operating parameters (FB and current limit)
7
unsigned char FB_GAIN EEMEM;
8
unsigned char I_LIM_SET EEMEM;
9
unsigned char I_MAX EEMEM;
10
//Initialization parameters
11
unsigned char INIT_MODUS EEMEM;
12
unsigned char TEMP_UP EEMEM;
13
unsigned char TEMP_DOWN EEMEM;
14
uint16_t  V_FB_MAX EEMEM;
15
//Error memory (ring buffer: if memory contains 0xFFFF --> memory is clear)
16
unsigned int F_MEM1 EEMEM;
17
unsigned int F_MEM2 EEMEM;
18
unsigned int F_MEM3 EEMEM;
19
unsigned int F_MEM4 EEMEM;
20
unsigned int F_MEM5 EEMEM;
21
unsigned int F_MEM6 EEMEM;
22
//16 bit firmwareversion
23
unsigned char firmware_version_high EEMEM = 4;
24
unsigned char firmware_version_low EEMEM = 6;

Und dann include in temperature.c
1
#include <avr/io.h>
2
#include <avr/eeprom.h>
3
#include <avr/interrupt.h>
4
#include "global_param.h"
5
6
//***************************************Subroutine Temperatur prüfen******************
7
int CHECK_TEMP()
8
{cli();
9
 unsigned char T_max = eeprom_read_byte(&TEMP_UP);          //max Temp. aus EEPROM lesen
10
 unsigned char T_min = eeprom_read_byte(&TEMP_DOWN);        //min Temp. aus EEPROM lesen
11
 static unsigned short AD_result;
12
//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
1
#ifndef _global_param_h_
2
#define _global_param_h_
3
4
unsigned char SERIAL3;
5
unsigned char SERIAL2;
6
unsigned char SERIAL1;
7
8
//usw.
9
10
#endif

von Stefan E. (sternst)


Lesenswert?

Alexander Liebhold schrieb:

> Muss ich einfach nur die Variablentypen angeben?
> Sprich für global_param.h
1
> #ifndef _global_param_h_
2
> #define _global_param_h_
3
> 
4
> unsigned char SERIAL3;
5
> unsigned char SERIAL2;
6
> unsigned char SERIAL1;
7
> 
8
> //usw.
9
> 
10
> #endif

Du hast das "extern" vergessen.

von Alexander L. (lippi2000)


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.

von Oliver (Gast)


Lesenswert?

>Das geht doch hinten und vorne nicht.

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

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

Und wo kannst du jetzt nicht zugreifen?

Oliver

von Alexander L. (lippi2000)


Lesenswert?

Problem ist folgendes:

global_param.c
1
#include "global_param.h"
2
3
//*************************************Constants EEPROM*****************************
4
//32Bit serial (init valua = 0xFFFFFFFF!!!)
5
unsigned char SERIAL3 EEMEM = 0x00;
6
unsigned char SERIAL2 EEMEM = 0x00;
7
unsigned char SERIAL1 EEMEM = 0x00;
8
unsigned char SERIAL0 EEMEM = 0x03;

global_param.h
1
#ifndef _global_param_h_
2
#define _global_param_h_
3
4
5
extern unsigned char SERIAL3 EEMEM;
6
extern unsigned char SERIAL2 EEMEM;
7
extern unsigned char SERIAL1 EEMEM;
8
extern unsigned char SERIAL0 EEMEM;
9
10
#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'

von Oliver (Gast)


Lesenswert?

1
#include  <avr/eeprom.h>

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

Oliver

von Alexander L. (lippi2000)


Lesenswert?

Also ich habe es jetzt.

global_param.h
1
#ifndef _global_param_h_
2
#define _global_param_h_
3
4
#define EEPROM_SECTION __attribute__ ((section (".eeprom")))
5
6
7
extern unsigned char SERIAL3;
8
extern unsigned char SERIAL2;
9
extern unsigned char SERIAL1;
10
extern unsigned char SERIAL0;
11
extern unsigned char TEMP_UP;
12
extern unsigened char TEMP_DOWN;
13
14
#endif


global_param.c
1
#include "global_param.h"
2
3
//*************************************Constants EEPROM*****************************
4
//32Bit serial (init valua = 0xFFFFFFFF!!!)
5
unsigned char SERIAL3     EEPROM_SECTION = 0;
6
unsigned char SERIAL2     EEPROM_SECTION = 0;
7
unsigned char SERIAL1     EEPROM_SECTION = 0;
8
unsigned char SERIAL0     EEPROM_SECTION = 0;
9
unsigned char TEMP_UP     EEPROM_SECTION = 0x55;
10
unsigned char TEMP_DOWN   EEPROM_SECTION = 0xBF;

Und der Aufruf aus dem Modul temperature.c
1
#include <avr/io.h>
2
#include <avr/eeprom.h>
3
#include <avr/interrupt.h>
4
#include "global_param.h"
5
6
7
//***************************************Subroutine Temperatur prüfen******************
8
int CHECK_TEMP()
9
{cli();
10
 unsigned char T_max = eeprom_read_byte(&TEMP_UP);          //max Temp. aus EEPROM lesen
11
 unsigned char T_min = eeprom_read_byte(&TEMP_DOWN);        //min Temp. aus EEPROM lesen
12
...
13
...

So funktionierts. Danke trotzdem.

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.