Hallo,
Ich habe einige Compiler Fehler, kann aber nicht raus finden, was ich
falsch gemacht habe:
> Compiling: main.c> avr-gcc -c -mmcu=atmega328p -I. -gdwarf-2 -Os -funsigned-char
-funsigned-bitfields -fpack-struct -fshort-enums -Wall -Wstrict-prototypes
-Wa,-adhlns=main.lst -I/home/ferdinand/Dokumente/programmieren/AVR/Libs -std=gnu99
-DF_OSC=8000000 -MD -MP -MF .dep/main.o.d main.c -o main.o
> main.c:49: error: expected identifier or '(' before numeric constant> main.c:49: error: expected identifier or '(' before numeric constant> main.c:88:21: error: invalid suffix "+I2C_WRITE" on integer constant> main.c:95:21: error: invalid suffix "+I2C_WRITE" on integer constant> main.c: In function 'main':> main.c:209: error: 'MMC_FILE_NEW' undeclared (first use in this function)> main.c:209: error: (Each undeclared identifier is reported only once> main.c:209: error: for each function it appears in.)> main.c:209: error: too few arguments to function 'ffopen'> main.c:213: warning: pointer targets in passing argument 1 of 'ffwrites' differ
in signedness
> main.c:221: error: 'MMC_FILE_EXISTS' undeclared (first use in this function)> main.c:221: error: too few arguments to function 'ffopen'> main.c:228: warning: pointer targets in passing argument 1 of 'ffwrites' differ
in signedness
> main.c:238: warning: pointer targets in passing argument 1 of 'ffwrites' differ
in signedness
> main.c:245: warning: pointer targets in passing argument 1 of 'ffwrites' differ
in signedness
Vor allem die ersten Fehler, also Zeile 49 und der Fehler in Zeile 88/95
überraschen mich, ich hab da alles so gemacht, wie es in den Tutorials
immer beschrieben wird, aber irgendwie ist es trotzdem falsch.
z.B. Zeile 49ff:
1
ISR(INT0){
2
if(loggen==0x00){
3
loggen=0x01;
4
}else{
5
loggen=0x00;
6
}
7
}
Wobei:
1
volatileint8_tloggen=0x00;
Ich sehe da nicht wo ich noch eine Klammer setzten sollte...
Weiß jemand, was ich falsch gemacht habe?
Ich weiß mein Code ist nicht der übersichtlichste, aber ich bin noch am
lernen ;-) (<-- deswegen auch gerne Hinweise dazu :D)
Danke schon mal :D
MfG
> if (MMC_FILE_NEW == ffopen(file_name))
dito. für die symbolischen Rückgabewert MMC_FILE_NEW muss es irgendwo
ein #define geben, sonst nimmt der Compiler an, es handelt sich um eine
Variable.
> main.c:221: error: too few arguments to function 'ffopen'
Da fehlt ein Argument für die Funktion ffopen. Ich schätze man muss
angeben, ob die Datei zum Lesen oder zum Schreiben geöffnet werden soll.
Ok, da habe ich mich im Datenblatt verlesen, heißt EXT_INT0, wenn ich es
ändere, bekomme ich:
> main.c:49: warning: 'EXT_INT0' appears to be a misspelled signal handler
Ok wenigstens keine error, sondern "nur" eine Warnung, auch wenn ich
nicht weiß warum...
Das Makro I2C_WRITE wird in der i2cmaster.h definiert (von Peter Fleury)
1
/** defines the data direction (reading from I2C device) in i2c_start(),i2c_rep_start() */
2
#define I2C_READ 1
3
4
/** defines the data direction (writing to I2C device) in i2c_start(),i2c_rep_start() */
5
#define I2C_WRITE 0
Komischer weise ist das genau so auch in der Beispieldatei.
MMC_FILE_NEW ist erklärt in der mmc_config.h
Hab den Fehler hier aber auch schon gefunden, hab den Code einfach aus
dem Tutorial hier übernommen
(http://www.mikrocontroller.net/articles/AVR_FAT32) aber anscheinend
haben sich die Namen geändert und wurden hier noch nicht erneuert.
Insgesamt erhalte ich jetzt die Meldung:
> main.c:49: warning: 'EXT_INT0' appears to be a misspelled signal handler> main.c:88:21: error: invalid suffix "+I2C_WRITE" on integer constant> main.c:95:21: error: invalid suffix "+I2C_WRITE" on integer constant> main.c: In function 'main':> main.c:209: error: too few arguments to function 'ffopen'> main.c:213: warning: pointer targets in passing argument 1 of 'ffwrites' >
differ in signedness
> main.c:221: error: too few arguments to function 'ffopen'> main.c:228: warning: pointer targets in passing argument 1 of 'ffwrites' >
differ in signedness
> main.c:238: warning: pointer targets in passing argument 1 of 'ffwrites' >
differ in signedness
> main.c:245: warning: pointer targets in passing argument 1 of 'ffwrites' >
differ in signedness
> main.c: In function 'makeString':> main.c:269: warning: function returns address of local variable> make: *** [main.o] Fehler 1
Fer T. schrieb:> Ok, da habe ich mich im Datenblatt verlesen, heißt EXT_INT0, wenn ich es> ändere, bekomme ich:
er heißt auch nicht EXT_INT0, weil im gcc alle ISR-Handler Vektoren
immer hinten ein "_vect" haben. Wenn schon, dann heißt er also
EXT_INT0_vect
> Komischer weise ist das genau so auch in der Beispieldatei.
Fang mit dem ersten Fehler an.
Es kommt des öfteren vor, dass Fehler nur deswegen entstehen, weil
vorher schon etwas gravierendes falsch war und der COmpiler nicht mehr
dieselbe Sicht der Dinge hat wie du. Nennt man: Folgefehler. Korrigierst
du den ersten Fehler, dann verschwinden Folgefehler ganz von alleine.
> Hab den Fehler hier aber auch schon gefunden, hab den Code> einfach aus dem Tutorial hier übernommen> (http://www.mikrocontroller.net/articles/AVR_FAT32) aber anscheinend> haben sich die Namen geändert und wurden hier noch nicht erneuert.
Im Zweifelsfall gilt immer das Header File, das du hast und nicht
irgendein Tutorial. Du hast das Header File, also sieh rein wieviele
Parameter zb ffopen haben will, welche Datentypen sie haben und was sie
bedeuten.
Danke :D
Hab jetzt mal das ganze so umgebaut (ffopen etc.), dass es nach dem
headerfile valide ist, jetzt bekomme ich nur noch die Fehler:
> main.c:49: warning: 'EXT_INT0_vect' appears to be a misspelled signal handler> main.c:88:21: error: invalid suffix "+I2C_WRITE" on integer constant> main.c:95:21: error: invalid suffix "+I2C_WRITE" on integer constant> main.c: In function 'main':> main.c:216: warning: pointer targets in passing argument 1 of 'ffwrites' >
differ in signedness
> main.c:225: warning: pointer targets in passing argument 1 of 'ffwrites' >
differ in signedness
> main.c:232: warning: pointer targets in passing argument 1 of 'ffwrites' >
differ in signedness
> main.c: In function 'makeString':> main.c:256: warning: function returns address of local variable> make: *** [main.o] Fehler 1
Also trotz _vect noch immer ein Fehler?
Naja nur noch 2 Fehler und der Rest sind Warnungen... Weiß jemand, was
"differ in signedness" zu bedeuten hat?
MfG
Fer T. schrieb:> Danke :D>> Hab jetzt mal das ganze so umgebaut (ffopen etc.), dass es nach dem> headerfile valide ist, jetzt bekomme ich nur noch die Fehler:>>> main.c:49: warning: 'EXT_INT0_vect' appears to be a misspelled signal handler
Für deinen Prozessor ist das Header File
iom328p.h
zuständig. Findet sich in der WinAVR Installation im Subverzeichnis
avr/include/avr. Dort gibt es für jeden Prozessortyp ein Header File.
Dieses Header File ist es, welches letztendlich durch
#include <avr/io.h>
hereingezogen wird. Durch die ANgabe des Prozessortyps im Makefile,
verzweigt dann io.h zum jeweils richtigen Header File.
Wenn alle Stricke reißen, dann macht man dieses Header File auf und
sieht dort nach.
Also iom328p.h aufmachen.
nach INT0 suchen
Und siehe da, der erste Eintrag der passt lautet
Jetzt hast du deinen Namen. INT0_vect
> Also trotz _vect noch immer ein Fehler?
Weil der Name nicht stimme. Du kannst auch SCHNURDIBUR_vect
hinschreiben. Nur kennt den eben keiner und es hagelt einen "appears to
be a misspelled signal handler" Fehler.
Der
> invalid suffix "+I2C_WRITE" on integer constant
ist allerdings interessant
Mach da mal ein paar Leerzeichen rein
i2c_start_wait( 0xA0 + I2C_WRITE ); // EEPROM Adresse
Ist sowieso nicht gut für die Augen, wenn du so knirsch an knirsch
schreibst. :-)
Ok, die Fehler sind raus (nur noch Warnungen), jetzt bekomme ich aber
Linker Fehler, wie z.B.
> mmc.c:464: undefined reference to `TimingDelay'
Ich habe mir das mal angeguckt, aber wirklich die Lösung finden tue ich
nicht (ist die besagt MMC/SD Lib von Daniel R.).
Komisch...
JA! :D
> Errors: none> -------- end --------
geschafft :D
Auch wenn noch Warnungen da sind:
> main.c:235: warning: pointer targets in passing argument 1 of 'ffwrites' differ
in signedness
> main.c:244: warning: pointer targets in passing argument 1 of 'ffwrites' differ
in signedness
> main.c:251: warning: pointer targets in passing argument 1 of 'ffwrites' differ
in signedness
Aber die verstehe ich leider nicht (Und es ist noch mal eine weniger
(bei dem return ... musste nur ein static hin :D)
MfG
PS: 29,2 Kb HEX Datei ist nicht gut oder? Für so eine kleine Aufgabe
(aus meiner Sicht). Komisch...
Fer T. schrieb:>> Aber die verstehe ich leider nicht (Und es ist noch mal eine weniger> (bei dem return ... musste nur ein static hin :D)
Na, was ist denn die signedness?
-> Die Fähigkeit ein Vorzeichen zu haben.
Es gibt signed Variablen und es gibt unsigned Variablen.
Die einen haben ein Vorzeichen, die anderen nicht.
Und was ist ein pointer target?
Das Ziel, also dort wo ein Zeiger hinzeigt.
Du hast also einen Pointer, zb
unsigned int* pPointer;
und diesen Pointer (der ja eigentlich auf einen unsigned int zeigen
sollte), lässt du auf einen signed int zeigen:
int i;
pPointer = &i;
und schon hast du einen 'Pointer target differs in signedness'
Bei dir ist es eine Variation davon:
pointer targets in passing argument 1 of 'ffwrites' differ in signedness
Da ist also von passing argument die Rede.
Das Prinzip ist nach wie vor dasselbe:
Du hast eine Funktion die einen Pointer auf zb einen unsigned int haben
möchte
void foo( unsigned int* pPointer )
{
...
}
und beim Aufruf versuchst du diesem Pointer die Adresse einer signed
Variablen unterzujubeln
int main()
{
int i;
foo( &i );
}
> PS: 29,2 Kb HEX Datei ist nicht gut oder? Für so eine kleine> Aufgabe (aus meiner Sicht). Komisch...
... sagte der BWL-er der nur in seinem Buero sitzt und nicht mitkriegt,
dass die anderen für ihn die Arbeit machen. :-)
Soll keine Beleidigung sein.
Aber du verwendest doch haufenweise fremdes Zeugs, das dir die
Drecks-Arbeit abnimmt.
Aber abgesehen davon zieht dir das hier zb
1
doubleGet2_x(uint8_twert){
2
doubleret=1.0;
3
while(wert!=0){
4
ret=ret*2.0;
5
wert--;
6
}
7
returnret;
8
}
die Floating Point Library rein. Brauchst du diese Funktion tatsächlich?
Welches ist der Wertebereich des Arguments? Muss das alles wirklich in
double ausgeführt sein?
Danke!
Hab jetzt auch keine Warnungen mehr :D
Bin sicherlich kein BWLer ;-)
Hab mal nach gerechnet (max Wert ist 2^16 also um 1 zu groß für int,
aber mit einem kleinen Trick, passt es trotzdem)
Sind jetzt schon 0,4 Kb weniger und dabei einfach nur einen Datentyp
geändert oO
Nochmals danke für die Hilfe.
Karl Heinz Buchegger schrieb:> Der>> invalid suffix "+I2C_WRITE" on integer constant> ist allerdings interessant>> Mach da mal ein paar Leerzeichen rein>> i2c_start_wait( 0xA0 + I2C_WRITE ); // EEPROM Adresse
Yep, über sowas habe ich mich auch schon mal gewundert ... der GCC
ist hier völlig im Recht, musste ich mich dann belehren lassen. Der
C-Standard hat vorsätzlich nur relativ grobe Regeln dafür, welche
Zeichen alles eine Zahl bilden. Der Grund ist, dass man die
lexikalische Analyse nicht übermäßig verkomplizieren (und damit
verlangsamen) möchte. Da nun aber "1.0E+5" eine gültige Zahl ist
und auch "0X2P23F" oder "1234ULL", behandelt der Parser nachgesetzte
Plus- oder Minuszeichen sowie darauf folgende Buchstaben immer als
Bestandteil der zu parsenden Zahl.
Wenn man sich angewöhnt, um + oder - immer Leerzeichen zu schreiben,
kann man in diese Falle nicht tappen.
Jörg Wunsch schrieb:> Wenn man sich angewöhnt, um + oder - immer Leerzeichen zu schreiben,> kann man in diese Falle nicht tappen.
Danke, werde ich mir merken :D