EEPROM Falscher Rückgabewert

#3072697
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
#3073158
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;
}
#3073685
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.

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