Probleme beim Schreiben ins EEPROM (C)

#3713152
Lesenswert?

Nabend zusammen,
ich melde mich mal wieder zu Wort.

Ich habe ein kleines Versuchsprogramm in C geschrieben in dem ich den 
wert einer Variablen mit einer Taste inkementiere und mit einer anderen 
Taste dekriemtiere. Den Wert der Variablen lasse ich mir auf einem LCD 
anzeigen.
(Ja ich weiss die Tasten sind nicht entprellt usw. aber es ist nur ein 
experientiercode)

Nun möchte ich den Wert der Variable in das EEPROM schreiben um ihn nach 
abschalten der Stromversorgung wieder in meine Variable schreiben zu 
können.

Ich habe mich da an dem AVR-GCC-Tutorial orientiert.
Allerdings meckert der Compiler mit folgender Fehlermeldung:

"main.c:17: error: section attribute cannot be specified for local 
variables"

Und da komm ich nicht weiter. Was habe ich vergessen, was habe ich 
falsch gemacht. Kann mir da wer helfen?

Hier mein Code aus der main.c
1
#include <avr/io.h>
2
#include "lcd.h"
3
#include <util/delay.h> 
4
#include <stdlib.h>
5
#include <avr/eeprom.h>
6
int main(void)
7
{
8
    
9
  DDRD = 0b00000000;
10
  lcd_init();
11
  uint8_t X = 0;
12
  char Buffer[20]; // in diesem {} lokal
13
      itoa( X, Buffer, 10 ); 
14
      lcd_clear();
15
      // ... ausgeben  
16
      lcd_string( Buffer );
17
  uint8_t eeFooByte EEMEM = 0;
18
    while(1)
19
    {
20
    if (!( PIND & (1<<PD6)) )
21
    {
22
      X++;
23
      lcd_setcursor(0,0);
24
      char Buffer[20]; // in diesem {} lokal
25
      itoa( X, Buffer, 10 ); 
26
      lcd_clear();
27
      // ... ausgeben  
28
      lcd_string( Buffer );
29
      eeprom_write_byte(&eeFooByte, X);
30
      while(!(PIND & (1<<PD6)))
31
      {
32
      }
33
      
34
    }
35
    if (!( PIND & (1<<PD7)) )
36
    {
37
      X--;
38
      lcd_setcursor(0,0);
39
      char Buffer[20]; // in diesem {} lokal
40
      itoa( X, Buffer, 10 ); 
41
      lcd_clear();
42
      // ... ausgeben  
43
      lcd_string( Buffer );
44
      eeprom_write_byte(&eeFooByte, X);
45
      while(!(PIND & (1<<PD7)))
46
      {
47
      }
48
      
49
    }
50
    
51
  
52
    }
53
 
54
    return 0;
55
}

Ich danke schonmal für eure Hilfe ;-)

Gruß

HighTec
Gast #3713154
Lesenswert?

Das liegt an dem hier:
1
uint8_t eeFooByte EEMEM = 0;

Eine (funktions-) lokale Variable mit Section-Attribut.
Für den Compiler (-bauer) insofern ein Widerspruch, als funktionslokale 
Variablen nur solange leben, wie die Funktion abgearbeitet wird.

Verschiebe diese Zeile an einen Punkt ausserhalbt jeder Funktion.
Gast #3713157
Lesenswert?

Im Grunde sagt die Fehlermeldung auch schon alles Wissenwerte:

"main.c:17: error: section attribute cannot be specified for local
variables"

1. Eine lokale Variable
2. Mit section-Attribut
3. Darf/Kann nicht
#3713158
Lesenswert?

Christian O. schrieb im Beitrag

> Ich habe mich da an dem AVR-GCC-Tutorial orientiert.
> Allerdings meckert der Compiler mit folgender Fehlermeldung:
>
> "main.c:17: error: section attribute cannot be specified for local
> variables"
>
> Und da komm ich nicht weiter. Was habe ich vergessen, was habe ich
> falsch gemacht. Kann mir da wer helfen?

Das heisst schlicht und ergreifend einfach nur:
EEMEM Variablen muessen global definiert werden. Zieh sie aus den 
Funktionen raus und alles ist gut.
Gast #3713160
Lesenswert?

Karl Heinz schrieb:

> Das heisst schlicht und ergreifend einfach nur:
> EEMEM Variablen muessen global definiert werden. Zieh sie aus den
> Funktionen raus und alles ist gut.

Komisch. Das habe ich auch gedacht. Lach.

So. Ich gehe jetzt in Bett, Raymond Chandler lesen.
Gute Nacht.
Persönliche Seite #3715237
Lesenswert?

ImLichteArbeitender schrieb:
> Im Grunde sagt die Fehlermeldung auch schon alles Wissenwerte:
>
> "main.c:17: error: section attribute cannot be specified for local
> variables"

Die Meldung ist falsch bis verwirrend. Anstatt "local variables" müsste 
da z.B. stehen "variables not in static storage" oder "can only be 
applied to variables in static storage".

> 1. Eine lokale Variable
> 2. Mit section-Attribut
> 3. Darf/Kann nicht

Doch. Beispiel:
1
#include <avr/eeprom.h>
2

3
int main ()
4
{
5
    static int e EEMEM = 1;
6
    return e;
7
}

Es liegt also nicht an lokal/global sondern an static storage oder 
nicht.

Bei EEprom-Variablen mutet das vielleicht seltsam an, bei lokalen 
Lookup-Tabellen im PROGMEM aber nicht mehr.

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