Forum: Mikrocontroller und Digitale Elektronik AVR Butterfly ATmega169 - Probleme mit Include Dateien der vorinstallierten Software


von Marcus H. (Firma: Student) (stromberg001)


Lesenswert?

Hallo Leute,

ich bin ein blutiger Anfänger was die Programmierung von µC's angeht, 
von daher bitte ich schon jetzt um Entschuldigung für vielleicht stupide 
Fragen.

Mein Problem: Ich möchte ein Programm schreiben, welches die 
vorgefertigten Include-Datein der AVR Butterfly Software verwenden soll, 
speziell geht es dabei um die ADC.h; Button.h; LCD_functions.h usw. Wenn 
ich mir nun die .h und die .c Datein aus dem ursprünglichen Verzeichnis 
in meinen "neuen Programmordner" Ordner kopiere und anschließend mein 
Programm mit "Make All" oder "Extcoff" kompilieren möchte kommen stets 
viele Fehlermeldungen. siehe hier:

C:\Dokumente und Einstellungen\Heinke\Desktop\Neuer 
Ordner/Termnal.c:328: undefined reference to `LCD_puts'
C:\Dokumente und Einstellungen\Heinke\Desktop\Neuer 
Ordner/Termnal.c:333: undefined reference to `LCD_puts' 
..................usw.

Kann mir da jmd helfen? Habe mich heute den ganzen Nachmittag damit 
befasst. Wie kann ich die Include Dateien für mich nutzen??

Bin für jede Antwort dankbar.
Ich wünsche euch noch einen schönen Samstag Abend.

von Hc Z. (mizch)


Lesenswert?

Du suchst mit den Include-Dateien am falschen Ende.  Was Dir fehlt, ist 
der Code für LCD_puts.

Wohlerzogene Include-Dateien tragen nur Informationen bei, die für den 
momentanen Übersetzungsvorgang wichtig sind (z.B. die Information, dass 
es woanders einen LCD_puts() gibt, welche Parameter das erwartet und was 
es zurückgibt).  Damit hast Du aber noch kein LCD_puts(), das musst Du 
noch liefern.

Das tust Du, indem Du das *.c-File, das den Code für LCD_puts() enthält, 
als weitere Quelldatei angibst.

von Marcus H. (Firma: Student) (stromberg001)


Lesenswert?

Vielen Dank für deine Antwort nur leider weiß ich noch nicht ganz was du 
meinst. Wäre wirklich nett wenn du mir das noch ein bisschen näher 
erläutern könntest. Zur Untestützung hier mal mein Quelltext. Kurz 
vorweg: mein Programm soll zunächst noch nichts ausführen, ich wollte 
damit lediglich die Funktionalität der Include Dateien prüfen:

Programm: "Belüftung.c"
1
 
2
#include <avr/io.h>
3
#include "LCD_functions.h"
4
#include "LCD_driver.h"
5
#include "button.h"
6
7
int main()
8
{
9
}

Die Dateien befinden sich alle im selben Verzeichnis wie mein Programm. 
Ich hatte ja vermutet, dass es etwas damit zu tun hat das diese Include 
Datein aufeinander aufbauen bzw sich aufeinander beziehen.

von Marcus H. (Firma: Student) (stromberg001)


Lesenswert?

Noch ein kleiner Nachtrag, ich denke ich habe soeben verstanden was du 
mir sagen wolltest. Allerdings denke ich ist das nicht der Punkt. Die 
Funktion LCD_puts() verwende ich ja gar nicht in meinem Quelltext. Diese 
Funktion ist in der Datei "LCD_functions.c" enthalten und wird dort 
beschrieben, es reicht doch aber aus nur die "LCD_functions.h" 
einzufügen oder nicht? Wo ist eigentlich der Unterschied zwischen diesen 
beiden Dateien?

von Markus (Gast)


Lesenswert?

Hast du denn LCD_functions.c in dein Makefile als source datei 
eingetragen?

von Marcus H. (Firma: Student) (stromberg001)


Lesenswert?

Nein hatte ich nicht, allerdings liegts daran auch nicht habe es 
ausprobiert. Die *.c Files müssten laut "Makefile_Template" automatisch 
eingefügt werden.
Habe jetzt so ziemlich viel ausprobiert und nix klappt, habe keine 
Ahnung mehr woran das liegen kann. Ich glaub das ist jetzt der richtige 
Zeitpunkt für'n Bier. ;)

von Hc Z. (mizch)


Lesenswert?

Vielleicht können wir die Umgebung erst mal klären:

- Du verwendest WinAVR?

- Mit Makefile oder der Projekt-Arbeitsumgebung von AVR Studio?

- Woher stammt die Datei Termnal.c, in der LCD_puts() aufgerufen wird?

- Wieso ist die Teil des zu übersetzenden Programms, wenn Du sagst, 
LCD_puts() würde von Dir nie aufgerufen?

Vielleicht kommen wir so der Sache näher.

von Marcus H. (Firma: Student) (stromberg001)


Lesenswert?

Also ich verwende WinAVR und schreibe dann meinen Quellcode mit Notepad 
2 und kompiliere dann, nachdem ich mir eine Makefile erzeugt habe mit 
"Make All". Die Datei Termnal.c ist ein selbstgeschriebenes Programm, 
dass ich von meinem Vorgänger übernommen habe. Bitte entschuldigt, ich 
bin vor lauter rumprobieren selbst durcheinander gekommen. Die 
Fehlermeldungen, die oben zu sehen sind treten auf wenn ich versuche 
dieses Termnal.c zu kompilieren. Es sind eigentlich alle wichtigen 
Include Dateien vorhanden und auch im selben Verzeichnis.

@Hazeh: Könnte ich Dir den Quelltext vielleicht einmal schicken (samt 
Include Datein)??

von Karl H. (kbuchegg)


Lesenswert?

nochmal:
Diese Fehlermeldung hat nichts mit dem Include File an sich zu tun.
Beim Zusammenbau des vollständigen Programs beschwert sich der Linker, 
dass er die Implementierung für LCD_puts nicht finden kann (eine 
Funktion die in terminal.c verwendet wird). Die Implementierung der 
LCD_puts ist aber gar nicht in lcd.h enthalten. Dort ist nur die 
Beschreibung drinnen, dass es eine derartige Funltion gibt. Irgendwo 
wird es noch eine Datei lcd.c geben. Die enthält die tatsächliche 
Implementierung und muss mit ins Makefile

von Hc Z. (mizch)


Lesenswert?

> @Hazeh: Könnte ich Dir den Quelltext vielleicht einmal schicken (samt
> Include Datein)??

Das wird nicht nötig sein.  Wenn Du Dir den Quelltext 'Termnal.c' 
anschaust, wirst Du feststellen, dass er in Zeile 328 und 333 LCD_puts() 
aufruft.  Also musst Du irgendwo den Quellcode für LCD_puts() auch 
liefern.  Geh' mal auf die Suche.  Du wirst es nicht finden, jedenfalls 
nicht unter den Quelltexten, die Du im Makefile benannt hast. 
Möglicherweise wird es irgendwo unter den Projektdateien sein, aber halt 
nicht unter denen, die Du dort (im Makefile) angegeben hast.

Zu den Include-Dateien kann ich Dir nur nochmal ans Herz legen, was Karl 
heinz und ich dazu schon gesagt haben:  die enthalten üblicherweise 
nicht den ausführbaren Code, sondern nur Begleitinformationen für den 
Compiler.  Du musst unterscheiden zwischen einer Deklaration wie
1
void LCD_puts(char *text);
die gar nichts tut als dem Compiler mitzuteilen, wie LCD_puts() 
anzusprechen ist, und der Definition von LCD_puts:
1
void LCD_puts(char *text){
2
  // ... Ladung von Anweisungen, die LCD_puts() ausmachen ..
3
}
Die erste Form findet sich typischerweise in einem Include-File wieder, 
die zweite in einer *.c-Datei.

von Marcus H. (Firma: Student) (stromberg001)


Lesenswert?

OK vielen Dank, ich glaube ich habe verstanden. Ich trage also nun 
einfach noch im Makefile die *.c Dateien unter "Source" mit ein und dann 
sollte es funktionieren?!

Vielen Dank für eure Hilfe.

von Hc Z. (mizch)


Lesenswert?

Ja.  Wenn Du weißt, dass die *.c-Dateien vollständig sind und auch, dass 
sich keine nicht mehr benutzte darunter finden, ist das so.

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.