EEPROM Falscher Rückgabewert

OP #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
OP #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

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.