Forum: Compiler & IDEs EEPROM Falscher Rückgabewert


von Steffen M. (blackangel)


Lesenswert?

Hallo Community

Ich kämpfe seit kurzem mit c und AS6.
Bei meinem "learn the rope" bin ich nun auf ein Problem gestoßen, dessen 
Logik sich mir entzieht.

Wie in dem Tutorial dieser Seite (Kapitel 15.3.7) habe ich ein Byte ins 
EEPROM geschrieben.

Mein .c file enthält ua diesen code:

volatile uint8_t test;

void ausgabe(uint8_t sender)
{
  ...
}

Das Auslesen mit folgendem Code und das übergeben an die Funktion 
"ausgabe" funktioniert:

test = EEPReadByte(0x01);
ausgabe(test);

Folgender Code funktioniert nicht:

ausgabe(EEPReadByte(0x01));

Hier ist der Übergabewert immer 0.

Kann mir jemand erklären warum?

Gruß BA

von Karl H. (kbuchegg)


Lesenswert?

Steffen M. schrieb:

> Kann mir jemand erklären warum?

zeig den ganzen Code und nicht nur "unter anderem".

Dein Problem könnte zb. auf einen fehlenden Protoyp zurückzuführen sein.

von Steffen M. (blackangel)


Lesenswert?

Folgendes geht:

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

// CPU = 14MHz
#define F_CPU 14745600UL;

#define   EEPReadByte(addr)         eeprom_read_byte((uint8_t *)addr)
#define   EEPWriteByte(addr, val)   eeprom_write_byte((uint8_t *)addr, 
val)

volatile uint8_t test = 0;
volatile uint8_t eep_check = 0;

int main(void)
{
  sei();

  eep_check = EEPReadByte(0x00);
  Anzeige(eep_check);

  while(1)
  {
    //
  }
}

void Anzeige(uint8_t sender)
{
  test = sender;
}



Folgendes geht nicht:

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

// CPU = 14MHz
#define F_CPU 14745600UL;

#define   EEPReadByte(addr)         eeprom_read_byte((uint8_t *)addr)
#define   EEPWriteByte(addr, val)   eeprom_write_byte((uint8_t *)addr, 
val)

volatile uint8_t test = 0;
volatile uint8_t eep_check = 0;

int main(void)
{
  sei();

  Anzeige(EEPReadByte(0x00));

  while(1)
  {
    //
  }
}

void Anzeige(uint8_t sender)
{
  test = sender;
}

von Karl H. (kbuchegg)


Lesenswert?

Steffen M. schrieb:

Wie ich schon sagte: fehlender Prototyp


> int main(void)
> {
>   sei();
>
>   eep_check = EEPReadByte(0x00);
>   Anzeige(eep_check);

an dieser Stelle hat der COmpiler, wenn er den Code von oben nach unten 
liest, noch nie irgendwas von einer Funktion namens 'Anzeige' gehört. 
D.h. er muss hier mit Standardannahmen arbeiten. Und die Standardannahme 
ist:
Das Argument eep_check wird als int übergeben und die Funktion liefert 
einen int zurück.


> void Anzeige(uint8_t sender)
> {

Tja. Und jetzt haben wir den Salat.
Die Standardannahme weiter oben im Code war falsch.


Normalerweise warnen Compiler, wenn so etwas passiert! Wenn nicht, dann 
schau dir die Einstellung der Warnungen für deinen Compiler an. Du 
willst so gut wie alle Warnungen haben, die du kriegen kannst!


Abhilfe:
Entweder die Funktion VOR die erste Verwendung im Code setzen, oder aber 
einen Prototypen für die Funktion vor die erste Verwendung setzen
1
void Anzeige( uint8_t sender );
2
3
4
int main()
5
{
6
  ...
7
}
8
9
10
void Anzeige( uint8_t sender )
11
{
12
  ...
13
}

und schon ist das Problem keines mehr. Denn der Prototyp erzählt dem 
Compiler alles was er wissen muss, um den Aufruf korrekt zu machen OHNE 
auf Standardannahmen zurückgreifen zu müssen.

von Steffen M. (blackangel)


Lesenswert?

1000 Dank

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.