Hallo zusammen, könnt ihr mir bitte einen Tipp geben warum diese Anweisung siehe Bild so nicht funktioniert?? Ich definiere in der Headerdatei den keypad_port und möchte davon in Abhängigkeit des Taster definieren entweder Taster= PINA oder PINC Meine Anweisung funktioniert noch nicht ganz. Ich habe es nach den Unterlagen durchgeführt, die ich im Netz gefunden habe. http://de.wikibooks.org/wiki/C-Programmierung:_Pr%C3%A4prozessor#.23if Es wäre sehr nett, wenn ihr mir bei dieser Kleinigkeit helfen könntet. Herzlichsten Dank und viele Grüße, Matthias. hier ist die Headerdatei: #ifndef keypad_h #define keypad_h #define keypad_port PORTC #if (PORTC=keypad_port) #define Taster PINC #if (PORTA=keypad_port) #define Taster PINA #endif extern unsigned char flankenwechsel2; extern unsigned char keypad_uebergeben; //damit der Wert niht doppelt eingelesen werden kann char keypad_wert_einlesen(unsigned char warten); void keypad_ini(void); #endif
Das steht in deinem C-Buch aber nicht so drin, oder? Zu jedem #if, #ifdef etc. gehört genau ein #endif. Wenn man bei dir nachzählt, stimmt das nicht. Was du vorhast, weiß ich nicht. Aber ein Vergleich wird mit = auch nicht funktionieren, sollte auch in eine guten C-Buch stehen. Quelltext als Bilder einzufügen, ist Unsinn. Und lesbaren Quelltext bekommt man, indem man entsprechende Tags beim Schreiben benutzt. Und "geht nicht" ist so ziemlich der schlechteste Versuch, vernünftige Hilfe zu bekommen.
Warum so kompliziert?
1 | #ifndef keypad_h
|
2 | #define keypad_h
|
3 | |
4 | /*
|
5 | Hardwaredefinitionen
|
6 | (avr/io.h muss bereits includiert sein)
|
7 | */
|
8 | #define keypad_port PORTC
|
9 | #define Taster PINC
|
10 | |
11 | /*
|
12 | Globale Variablen
|
13 | */
|
14 | extern unsigned char flankenwechsel2; |
15 | extern unsigned char keypad_uebergeben; |
16 | |
17 | /*
|
18 | Funktionsprototypen
|
19 | */
|
20 | char keypad_wert_einlesen(unsigned char warten); |
21 | void keypad_ini(void); |
22 | |
23 | #endif /* keypad_h */ |
### Oder ###
1 | #ifndef keypad_h
|
2 | #define keypad_h
|
3 | |
4 | /*
|
5 | Hardwaredefinitionen
|
6 | (avr/io.h muss bereits includiert sein)
|
7 | */
|
8 | #define keypad_port PORTC
|
9 | |
10 | #if (keypad_port == PORTC)
|
11 | #define Taster PINC
|
12 | #endif
|
13 | |
14 | #if (keypad_port == PORTA)
|
15 | #define Taster PINA
|
16 | #endif
|
17 | |
18 | #ifndef Taster
|
19 | #error "Taster ist nicht definiert"
|
20 | #endif
|
21 | |
22 | /*
|
23 | Globale Variablen
|
24 | */
|
25 | extern unsigned char flankenwechsel2; |
26 | extern unsigned char keypad_uebergeben; |
27 | |
28 | /*
|
29 | Funktionsprototypen
|
30 | */
|
31 | char keypad_wert_einlesen(unsigned char warten); |
32 | void keypad_ini(void); |
33 | |
34 | #endif /* keypad_h */ |
Wahrscheinlich hat du nur = und == verwechselt.
Hallo zusammen, danke für Eure Hilfe. Doch leider hat das nicht viel gebracht, denn ich bin kein Stück weiter. baue ich diese Aussage ein, gibt es immer 2 Fehlermeldungen operator has no left operand. Irgendwas stimmt wohl an der Syntax dennoch nicht und ich weiß nicht wieso. #if (PORTA==keypad_port) #define Taster PINA #endif #if (PORTB==keypad_port) #define Taster PINB #endif Mit dieser Aussage möchte ich eine bedingte Zuweisung von Taster zu PINA oder PINB. Viele Grüße, Matthias.
PORTA ist ein Makro, das durch einen Ausdruck ersetzt wird, mit dem der Präprozessor selbst nichts anfangen kann, weil er z.B. Casts und Zeiger-Dereferenzierungen enthält.
Hallo, danke für Deine Antwort. Ich verstehe zwar noch nicht was Casts und Zeiger-Dereferenzierungen sind, aber es scheint wohl nicht ohne weiteres möglich zu sein meine Idee umzusetzen. Darum lasse ich es erst mal so. Viele Grüße, Matthias.
Matthias H. schrieb: > Ich verstehe zwar noch nicht was Casts und Zeiger-Dereferenzierungen sind, Ok, dann soll für jetzt mal die Information ausreichen, daß es dem Präprozessor da genau wie dir geht. ;-)
ok, schön, dass Du das mit Humor nimmst. ich bin immer noch dabei meine alten ilcudierten C.Dateien!!! umzuschreiben 1. jeweils eine dazugehörige Headerdatei erstellen 2. die C-Datein richtig ins projekt einbinden über Add existing item AVR Studio5 Da ist viel Arbeit, wenn man 7 Dateien mit vielen Variablen hat und man Datei für Datei nach und nach wieder einbindet Viele Grüße, Matthias.
Dafür gibt es ein stichwort: Modularisierung! spart dir viel arbeit :-) wie verarbeitest du das makro denn weiter? diesen Fheler: operator has no left operand. hast du ja bereits im bild oben, ich vermute du hast irgendwo anders im code noch einen kleinen fehler drin, aber lass dich davon nicht entmutigen, das passiert :)
Matthias H. schrieb: > Ich verstehe zwar noch nicht was Casts und > Zeiger-Dereferenzierungen sind Dann schreib' dir mal eine Minimal-Datei:
1 | #include <avr/io.h> |
2 | |
3 | PORTC
|
schick diese Datei durch den Präprozessor und sieh dir das Ergebnis an:
1 | avr-gcc -mmcu=atmega8 -E minimaldatei.c |
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.