Forum: Compiler & IDEs Anfängerfrage: Wie Variablen an Funktion zum EEPROM schreiben übergeben


von technikus (Gast)


Lesenswert?

Hallo,

ich verzweifel langsam bzw. verstehe es nicht.

Zielsystem ist ein ATmega16, IDE AVR Studio 5.

Gerne möchte ich EEPROM Variablen in einer Funktion mit 
Übergabeparametern schreiben.
1
//die Funktion
2
void setIrDataToEeprom (uint8_t da, uint8_t kc)
3
{
4
  
5
    eeprom_write_byte(&da, Rc5DeviceAdress);
6
    eeprom_write_byte(&kc, Rc5KeyCode);
7
    
8
    lcd_clrscr();
9
    lcd_puts("Done");
10
}
11
12
13
//Aufruf der Funktion
14
15
//Menupunkt xx
16
if (rc5_data_receive())
17
setIrDataToEeprom (DeviceAdressKeyStandby,KeyCodeKeyStandby);

- DeviceAdressKeyStandby ist eine EEPROM Variable
- KeyCodeKeyStandby ist ebenso eine EEPROM Variable

Die Funktion rc5_data_receive() schreibt Werte in die Variablen 
Rc5DeviceAdress und Rc5KeyCode.

Wenn ich
1
eeprom_write_byte(&DeviceAdressKeyStandby, Rc5DeviceAdress);
2
eeprom_write_byte(&KeyCodeKeyStandby, Rc5KeyCode);

ausführe, werden die EEPROM Variablen beschrieben.


Hat jeman einen Ahnung was ich falsch mache?


Danke und Gruß

von Karl H. (kbuchegg)


Lesenswert?

technikus schrieb:

> Gerne möchte ich EEPROM Variablen in einer Funktion mit
> Übergabeparametern schreiben.
>
> //die Funktion
> void setIrDataToEeprom (uint8_t da, uint8_t kc)
> {
>
>     eeprom_write_byte(&da, Rc5DeviceAdress);
>     eeprom_write_byte(&kc, Rc5KeyCode);

Wessen Adressen nimmst du hier?
Richtig, die Adressen der lokalen Variablen da und kc


> //Menupunkt xx
> if (rc5_data_receive())
> setIrDataToEeprom (DeviceAdressKeyStandby,KeyCodeKeyStandby);

das sind aber nicht dieselben Adressen, wie die, die du hier genommen 
hast. da hat denselben Inhalt wie DeviceAdressKeyStandby, aber es ist 
eine andere Variable und liegt daher an einer ganz anderen Adresse im 
Speicher.


> eeprom_write_byte(&DeviceAdressKeyStandby, Rc5DeviceAdress);

hier hingegen nimmst du tatsächlich die Adresse von 
DeviceAdressKeyStandby



Dein Code ist etwas ungewöhnlich, denn normalerweise sind ja gerade die 
Adressen fix, an denen etwas im EEPROM gespeichert wird und die dort zu 
speichernden Werte sind variabel. Bist du sicher, dss du das willst?

von technikus (Gast)


Lesenswert?

Danke für deine Antwort!

Der Funktion

void setIrDataToEeprom (uint8_t da, uint8_t kc)

werden je nach Menupunkt die EEPROM Speicherziele übergeben.

Quelle ist immer die gleiche, da von der Funktion
rc5_data_receive()
die beiden Variablen

- Rc5DeviceAdress
- Rc5KeyCode

beschrieben werden.

Ich möchte der Funktion setIrDataToEeprom die Speicherziele als 
Argumente übergeben. Da ich je nach Menupunkt weiß welches EEPROM 
Speicherziel ich beschreiben möchte.

Das Funktioniert aber leider nicht wie in meinem Eingangsposting 
angegeben.

Gruß
Daniel

von Karl H. (kbuchegg)


Lesenswert?

Wenn du der Funktion mitteilen willst, an welche EEPROM Adresse sie die
Werte speichern soll, dann musst du ihr auch diese Adresse geben. Sprich
einen Pointer übergeben
1
void setIrDataToEeprom (uint8_t* da, uint8_t* kc)
2
{
3
  
4
    eeprom_write_byte( da, Rc5DeviceAdress);
5
    eeprom_write_byte( kc, Rc5KeyCode);
6
    
7
    lcd_clrscr();
8
    lcd_puts("Done");
9
}
10
11
12
//Aufruf der Funktion
13
14
//Menupunkt xx
15
if (rc5_data_receive())
16
  setIrDataToEeprom (&DeviceAdressKeyStandby, &KeyCodeKeyStandby);

von technikus (Gast)


Lesenswert?

Passt ;)

DANKE

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.