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
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.
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;
}
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.