Hallo, ich programmiere einen ATmega32 mit dem AVR-GCC Compiler, das klappt auch ganz gut. Bisher habe ich allerdings den gesammten Code immer in eine Datei geschrieben, dass wird mit der Zeit aber unübersichtlich (viele Funktionen). Seit einigen Tagen beschäftige ich mich damit Code entsprechend der Funktionen "auszulagern" - also die Ansteuerung des Grafikdisplays etc. Ich habe aber ziemliche Probleme damit, mich auch in das Thema eingelesen aber es klappt nicht. Konkret: Ich möchte meine Funktionen zum Ansteuern des Grafikdiplays als hd610202.h und hs61202.c "includen". Also habe ich in der Datei hd61202.h die Ports, Pins und die Funktionen als Prototypen deklariert. In der Datei hs61202.c stehen dann die jeweiligen Funktionen zum Ansteuern des Displays. In meinem "main.c"-File steht dann #include "hd61202.h" aber der Compiler schluckt das nicht so wie ich mir das gedacht habe. Ich glaube ich mache da einen grundsätlichen Denkfehler. Ich habe mir viele Beispiele angeschaut und inmeinem Code übertragen, aber es klappt nicht. Vielleicht kann mir jemand einen Tip geben.
:
Gesperrt durch Moderator
kann ich da nur sagen. Ersatzweise Kernighan&Ritchie "The C Programming Language". Da steht sowas nämlich drin. Und nein, ich hab keine Lust dir das zu exzerpieren.
>Vielleicht kann mir jemand einen Tip geben.
Weiter probieren, oder deinen Sourcecode hier (mit allen Dateien,
zusammengezippt) einstellen.
Oliver
@ Sven (Gast) >Ansteuern des Displays. In meinem "main.c"-File steht dann #include >"hd61202.h" aber der Compiler schluckt das nicht so wie ich mir das >gedacht habe. Der schluckt das schon, wenn du beachtest, dass jede .C Datei einzeln übersetzt wird. D.h., in jeder C-Datei müssen alle #inludes rein, auf die in der Datei zugrgriffen wird. Z.B. avr/io.h" wird fast überall gebraucht, muss also überall rein etc. Und natürlich dann deine eigenen .h Dateien. MfG Falk
Hallo, habe mich jetzt das ganze Wochenende mit dem Thema beschäftigt, es geht jetzt zwar - aber irgendwie kann das nicht richtig sein (glaube ich). #include <inttypes.h> #include <avr/io.h> #include <util/delay.h> #define LED_PRT PORTD #define LED_DIR DDRD #define LED_PIN PD7 //---------------------------------- // LED einschalten //---------------------------------- void LED_ON(void) { LED_PRT |= (1<<LED_PIN); } //---------------------------------- // LED ausschalten //---------------------------------- void LED_OFF(void) { LED_PRT &= ~(1<<LED_PIN); } //---------------------------------- // Warten (100 x 10 ms = 1 Sekunde) //---------------------------------- void WAIT(void) { uint8_t b0; for(b0=0; b0<100; b0++) { _delay_ms(10); } } //---------------------------------- // main function //---------------------------------- int main(void) { LED_DIR=255; // Alle Pins am Port auf Ausgang LED_PRT=0; // Alle Pins auf Low setzen for(;;) { LED_ON(); WAIT(); LED_OFF(); WAIT(); } } Hier mal ein Beispielcode, das ist das eigentliche Programm (ein Beispiel). Jetzt möchte ich gerne die "defines" in der datei led.h haben um später nur noch die Datei led.h zu ändern um die Ports zu definieren. Die Funktionen LED_ON, LED_OFF und WAIT sollen in der Datei led.c stehen um ggf. die Funktionen unabhängig von "main-code" editieren zu können. Ich hab das auch irgendwie hinbekommen (der Compiler macht es), aber es ist dann komischerweise so, wie es in keinem Beispiel ist. Ich habe die "defines" in die Datei led.h geschrieben und von der Datei led.h die Datei led.c "included" - die Datei led.h wiederum vom Hauptprogramm "included". Ich habe nicht, wie in den Beispielen #ifndef und #endif verwendet. Ich hoffe mir kann jemand einen Tip geben, schon mal vielen Dank.
In led.h kommt rein:
1 | #ifndef LED_H
|
2 | #define LED_H
|
3 | |
4 | #include <inttypes.h> |
5 | #include <avr/io.h> |
6 | |
7 | #define LED_PRT PORTD
|
8 | #define LED_DIR DDRD
|
9 | #define LED_PIN PD7
|
10 | |
11 | //----------------------------------
|
12 | // LED einschalten
|
13 | //----------------------------------
|
14 | void LED_ON(void); |
15 | //----------------------------------
|
16 | // LED ausschalten
|
17 | //----------------------------------
|
18 | void LED_OFF(void); |
19 | #endif
|
led.c:
1 | #include <inttypes.h> |
2 | #include <avr/io.h> |
3 | #include "led.h" |
4 | |
5 | //----------------------------------
|
6 | // LED einschalten
|
7 | //----------------------------------
|
8 | void LED_ON(void) |
9 | {
|
10 | LED_PRT |= (1<<LED_PIN); |
11 | }
|
12 | |
13 | //----------------------------------
|
14 | // LED ausschalten
|
15 | //----------------------------------
|
16 | void LED_OFF(void) |
17 | {
|
18 | LED_PRT &= ~(1<<LED_PIN); |
19 | }
|
main.c:
1 | #include <inttypes.h> |
2 | #include <avr/io.h> |
3 | #include <util/delay.h> |
4 | #include "led.h" |
5 | |
6 | void WAIT(void); |
7 | |
8 | //----------------------------------
|
9 | // Warten (100 x 10 ms = 1 Sekunde)
|
10 | //----------------------------------
|
11 | void WAIT(void) |
12 | {
|
13 | uint8_t b0; |
14 | for(b0=0; b0<100; b0++) |
15 | {
|
16 | _delay_ms(10); |
17 | }
|
18 | }
|
19 | |
20 | //----------------------------------
|
21 | // main function
|
22 | //----------------------------------
|
23 | int main(void) |
24 | {
|
25 | LED_DIR=255; // Alle Pins am Port auf Ausgang |
26 | LED_PRT=0; // Alle Pins auf Low setzen |
27 | |
28 | for(;;) |
29 | {
|
30 | LED_ON(); |
31 | WAIT(); |
32 | LED_OFF(); |
33 | WAIT(); |
34 | }
|
35 | }
|
makefile:
>SRC = $(TARGET).c led.c
Und ferig.
Oliver
Hier wird für Anfänger ganz gut erklärt, wie man ein bestehendes großes Projekt in handliche Stücke zerlegt: http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=48535&postdays=0&postorder=asc&sid=9098c3a3c0cdfcdafbd8187255136d26
Soweit habe ich es kappiert, daß man die C-Files im makefile auflisten muß. Ist irgend wie klar, wenn man die Includes auf die *.h-Dateien macht. Irgendwie muß der Compiler / Linker ja auch die *.c-Datei finden. Aber gibt es denn keine andere Möglichkeit als die Modifikation im Makefile? Mich macht das nämlich etwas stutzig: Ich habe ein Makefile früher mal von einem anderen Projekt vom Internet kopiert und arbeite schon eine Weile damit. Allerdings habe ich die includes auf meine *.c-Dateien gemacht, weil es mit den *.h nicht ging. Ist aber ziemlich unschön. Jedoch bin ich bisher nicht auf eine andere Lösung gekommen, denn in dem von mir verwendeten Makefile gibt es den folgenden Eintrag nicht: SRC = $(TARGET).c led.c Auch wenn ich diesen Eintrag in das Makefile rein mache, geht es nicht wenn ich die includes auf die *.h-Dateien mache (findet die Dateien *.c nicht). Nur wenn ich ein anderes Makefile verwende, das komplett anders aussieht und schon eine Auflistung von C-Dateien drin war, geht es (natürlich habe ich dann meine C-Dateien aufgelistet). Ist schon merkwürdig. Oder hatte das Projekt, von dem ich es kopiert habe vielleicht keine Dateien außer main.c?
Bei kleinen Einmal-Programmen lassen sich *.c Dateien einfach über den Präprozessor auslagern. D.h. einfach betreffendes Codestück in LED.c wegspeichern und über #include"LED.c" in main.c einladen. Der Witz mit dem makefile besteht nur darin, dass in sich fertige Programmteile nicht immer wieder übersetzt werden müssen. Bei kleinen Progrämmchen fällt die Compilerzeit aber kaum ins Gewicht.
|Mich macht das nämlich etwas stutzig: Ich habe ein Makefile früher mal |von einem anderen Projekt vom Internet kopiert und arbeite schon eine |Weile damit. Allerdings habe ich die includes auf meine *.c-Dateien |gemacht, weil es mit den *.h nicht ging. Ist aber ziemlich unschön. |Jedoch bin ich bisher nicht auf eine andere Lösung gekommen, denn in dem |von mir verwendeten Makefile gibt es den folgenden Eintrag nicht: | |SRC = $(TARGET).c led.c Kommt drauf an, wie die Make-Tagets astrukturiert sind. Evtl. gibts da auch die Möglichkeit, zu sagen, welche .o er zusammenlinken soll, und über eine einzige Anweisung erstellt er diese geforderten .o-Dateien aus den vorhandenen .c-Dateien. |Ist schon merkwürdig. Oder hatte das Projekt, von dem ich es kopiert |habe vielleicht keine Dateien außer main.c? Möglich. |Bei kleinen Einmal-Programmen lassen sich *.c Dateien einfach über den |Präprozessor auslagern. D.h. einfach betreffendes Codestück in LED.c |wegspeichern und über #include"LED.c" in main.c einladen. Ist aber häßlich.