Hallo, ich habe hier ein Anfängerproblem. Ich habe hier einen ATMEGA32L mit einer 5x2 Tastenmatrix und habe ein Codebeispiel aus dem Forum umgearbeitet. Leider bekomme ich beim Compilieren den Fehler: "../my_display.c:4: error: expected '=', ',', ';', 'asm' or '__attribute__' before '{' token" In der Datei 'my_display.h' steht lediglich: unsigned char read_tast(void) Zur Hardware ist zu sagen: An PORTA0..4 sind die Reihen 1-5 angeschlossen. An PORTA5..6 sind die Spalten 1-2 angeschlossen. An PORTD7 ist eine LED angeschlossen. Eigentlich hatte ich vor im Hauptprogramm die Tastaturabfragefunktion aufzurufen und deren Rückgabewert in der if Schleife auszuwerten. Also im Moment wird nur ein Tastendruck erkannt, nicht aber welche Taste genau gedrückt wurde. Leider klappt selbst das nicht :-( Hat jemand einen Tipp? Danke Peter
Steht nach dem Prototypen in der .h denn auch das Semikolon?
Nein, kein Semikolon aber wenn ich eins hinzufüge bekomme ich noch mehr Fehler... .
Peter wrote: > Nein, kein Semikolon aber wenn ich eins hinzufüge bekomme ich noch mehr > Fehler... . Es muss dort aber hin. Die restlichen Fehler müssen dann eben aussortiert werden. Einer nach dem anderen, beim ersten beginnen. Denk auch drann, das oftmals durch die Behebung des ersten Fehlers viele nachfolgende Fehler ganz von alleine verschwinden.
Peter wrote: > Nein, kein Semikolon aber wenn ich eins hinzufüge bekomme ich noch mehr > Fehler... . Dann lass es besser weg ;-/ > ... bekomme ich noch mehr Fehler... . Dürfen wir die jetzt erraten? Was ist das für ein Compiler, dass du sowas schreiben kannst: PORTA.6=1;
Und noch was: Ich hab jetzt ehrlich gesagt keine Lust, deinen Code erst mal vernünftig zu formatieren, um zu sehen ob du irgendwo ein { zuviel, oder ein } zuwenig, oder ein { zuwenig oder ein } zuviel hast. Gewöhn dir am besten jetzt gleich an eine Einrückungsstrategie an. Sowas ist keinesfalls Luxus und ist auch nicht etwas was man im Nachhinein macht. Vernünftige Einrückung macht man während man den Code schreibt und man achtet peinlich genau darauf, dass die Einrückungstiefe auch immer stimmt. Denn dann hilft einem die Einrückung * simple { } zuviel/zuwenig Fehler zu vermeiden * die logische Struktur eines Programmes auch optisch zu verdeutlichen
Entschuldigung. Ich habe den Code noch einmal sortiert. Ich hoffe, dass es nun besser lesbar ist. Ich arbeite mit dem avr-gcc. Zum Thema 'PORTA.6=1;': Ich hatte mich schon gefreut, dass ich eine einfachere Art gelernt habe, die einzelnen Bits zu manipulieren. Nun befürchte ich, dass das Codebeispiel für eine andere Umgebung war... . Sorry bin echt neu auf dem Gebiet. Peter
Peter wrote: > Ich arbeite mit dem avr-gcc. Zum Thema 'PORTA.6=1;': Ich hatte mich > schon gefreut, dass ich eine einfachere Art gelernt habe, die einzelnen > Bits zu manipulieren. Eine einfache, aber nicht Standard-konforme Art... > Nun befürchte ich, dass das Codebeispiel für eine > andere Umgebung war... . So sieht es wohl aus. > Sorry bin echt neu auf dem Gebiet. Nun, das war jeder mal.
Taste1, Taste2 und uc_tastabfr1 sind undefiniert!? Zudem fehlt der Funktionsprototyp der Funktion read_taste.
So, ich habe das mal umgeschrieben. Ich hoffe, meinte eigentlich dass das so richtig ist. Compilieren geht ohne Fehler durch. Nur funktionieren tut es nicht. Die LED geht an, nur geht sie nicht auf Tastendruck aus. >Zudem fehlt der Funktionsprototyp der Funktion read_taste. In der my_display.h steht: unsigned char read_taste(void); Das müsste doch reichen, oder muss das in der my_display.c auch noch stehen? Hat noch jemand einen Tipp? Peter PS: Kann man eigentlich irgendwie zwei Dateien anhängen?
...sorry, habe noch ein paar Fehler gefunden. Im Anhang der aktualisierte Code, der leider immer noch keinen Einfluss auf die LED hat :-( Peter
1 | DDRA |= 0b00100000; // Bit PA6 als Ausgang schalten |
2 | //DDRA.6=1;
|
3 | PORTA &= ~(0b00100000); // Bit PA6 l�schen = Spalte 1 auf low |
4 | //PORTA.6=0;
|
Du schaltest PA5, nicht PA6. Bei allen weiteren ähnlichen Zeilen ist es das gleiche Problem.
Hallo Stefan, nein das ist schon richtig:
1 | DDRA |= 0b00100000; // Bit PA6 als Ausgang schalten |
2 | //DDRA.6=1;
|
Ich komme da immer etwas durcheinander, denn im Datenblatt vom ATMEGA ist der Port doch von PA1..8 durchnummeriert, aber an anderern Stellen wird beim Zählen mit 0..87 begonnen. An den ersten 5 Leitungen des PORTA sind die fünf Reihen angeschlossen, an den nächsten zwei Leitungen sind die beiden Spalten angeschlossen. Das höchste Bit 7 (bzw. 8) ist nicht belegt. Peter
Peter wrote: > Hallo Stefan, > > nein das ist schon richtig: > >
1 | > DDRA |= 0b00100000; // Bit PA6 als Ausgang schalten |
2 | > //DDRA.6=1; |
3 | >
|
Nein, das ist falsch ! Die korrekte Zählung beginnt bei Null. Das was Du setzt, ist Bit Nummer fünf. > Ich komme da immer etwas durcheinander, denn im Datenblatt vom ATMEGA > ist der Port doch von PA1..8 durchnummeriert, Wo?
Stimmt. Ist von PA0 an durchnummeriert. Ich hatte noch meinen Schaltplan vor Augen. Dort ist der Controller falsch angelegt, d.h. mit 1 beginnend durchnummeriert. Ich habe das bereinigt. Peter
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.