Forum: Compiler & IDEs Programmteile in .c und .h auslagern


von Andreas S. (blautech)


Lesenswert?

Hallo zusammen,

ich kämpfe mich nun als Anfänger durch den ganzen Informationsdschungel, 
um mein Projekt zu verwirklichen. Nachdem ich nun das LCD-Display zum 
Laufen bekommen habe beschäftige ich mich nun mit der Tasterentprellung.
Nachdem ich überlegt habe, was ich brauche und was ich will, bin ich auf 
die schöne Lösung von Peter Dannegger gestoßen.

Da diese sehr umfangreich ist, möchte ich den Code nun auslagern. Dies 
habe ich schon für den Code des Displays gemacht, allerdings waren das 
fertige Dateien (von Peter Fleury). Dazu habe ich lcd.c und lcd.h in 
mein Projekt eingebunden.

Doch wie funktioniert das hiermit?
http://www.mikrocontroller.net/articles/Entprellung#Komfortroutine_.28C_f.C3.BCr_AVR.29

Daraus kann man doch auch irgendwie eine taster.c und taster.h machen, 
oder?


Danke im Voraus
Jochen

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Klar. Der Code kommt nach taster.c und in taster.h kommen die 
Funktionsprototypen, also

uint8_t get_key_press(uint8_t key_mask);
uint8_t get_key_short(uint8_t key_mask);

etc.

sowie die für den Gebrauch dieser Funktionen benötigten Defines KEY0 
etc.


Die Hardwaredefinitionen (welche I/O-Ports genutzt werden etc.) hingegen 
können in taster.c verbleiben, denn die interessieren 
höchstwahrscheinlich außerhalb von taster.c nicht.

Die Funktion main ist so umzuschreiben, daß sie nur noch die 
Hardwareinitialisierung enthält (und sollte dann key_init oder so 
ähnlich heißen).

von Andreas S. (blautech)


Lesenswert?

Hallo,

Danke für die schnelle Antwort. Dann werde ich mien Glück mal nach 
Deinen Angaben versuchen. LG Jochen

von thomas (Gast)


Lesenswert?

@ Jochen S.

Bitte berichte dann einmal über deine Ergebnisse. Ich habe das selber 
schon vesucht, anscheinend auch mit Erfolg. (zumindest keine 
Fehlermeldungen mehr im AVR Studio). Allerdings erscheint mir mein 
Vorgehen nicht logisch. (Habe den code leider gerade nicht hier bei der 
Arbeit)

Gruß
Thomas

von Andreas S. (blautech)


Angehängte Dateien:

Lesenswert?

Hallo Thomas,

nach ein wenig Fleissarbeit und so manchem blöden Fehler, habe ich hier 
einen Code, der ganz gut läuft, so wie es momentan aussieht.
Dieser besteht aus:

tasten.c
dort stehen alle Funktionen, die ich einfach aus dem ursprünglichen 
Quelltext herauskopiert habe.

tasten.h
Dort sind alle defines und Variablendeklarationen drin. Wichtig sind 
auch die Prototypen der ganzen Funktionen, die man für die 
Tastenentprellung nun benötigt. Also jede Funktion, die aus dem 
ursprünglichen Code herauskopiert und in "tasten.c" eingefügt wird, muss 
im "tasten.h"-file als Prototyp stehen.

tasten_entprellen_v1:
hier werden letztendlich die Funktionen aufgerufen und deren Ergebnisse 
(wenn sie welche zurückgeben) verarbeitet.

Gruß
Jochen

von Karl H. (kbuchegg)


Lesenswert?

die LED_* Sachen haben in tasten.h nichts verloren.

Genausowenig wie die Variablen key_state, key_press und key_rpt. Die 
bleiben als File-static Variablen in tasten.c

Lies dir das mal durch
FAQ
Punkt 6: Header File, wie geht das?

von Rufus Τ. F. (rufus) Benutzerseite


Lesenswert?

Jochen S. schrieb:
> Also jede Funktion, die aus dem
> ursprünglichen Code herauskopiert und in "tasten.c" eingefügt wird, muss
> im "tasten.h"-file als Prototyp stehen.

Nein, da müssen nur die Funktionen deklariert werden, die außerhalb 
von "tasten.c" aufgerufen werden sollen. Funktionen, die nur innerhalb 
von "tasten.c" verwendet werden, sollten als static deklariert werden, 
und zwar mit den Prototypen am Anfang von "tasten.c" (zwischen 
#include-Orgie und Code).

Auch sollten in der Headerdatei auch nur die Definitionen aufgeführt 
werden, die zum Gebrauch der von außen verwendeten Funktionen 
erforderlich sind, Interna sind entweder in "tasten.c" selbst oder einer 
zusätzlichen, privaten Headerdatei unterzubringen.

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
Noch kein Account? Hier anmelden.