hallo, nun muss ich doch noch mal nen neuen beitrag zum thema lcd schreiben. ich habe einene at90s8535 und habe diesen mit einem Display verbunden(hd44870). die pinbelegung ist auch routinemäßig angebracht: 11-14 gehen an pa0-3 4 (rs) an pa4 5 (rw) an pa5 6 (e) an pa6 also hardwretechnisch sollte da alles in ordnung sein! die software habe ich über das forum heruntergeladen. nun möchte ich ganz einfach eine textausgabe haben. also auf gut deutsch ein wenig herumspielen, damit ich mich in dieses gebiet einarbeiten kann! insgesammt bin ich auch in der programmierung ein anfänger, somit kann es auch gut sein, dass ich da "vorschulfehler" bei der prog gemacht habe! beim compilieren bring mir der avr keine fehler mehr, doch wenn ich dann build`n run mache, spielt er mir das nicht auf den µc. er bringt mir dann den fehler undefined reference....? wäre klasse, wenn ihr mich da auf die richtige spur bringen könntet, da ich auch schon bei googles codesearch geschaut habe und wohl ganz gewaltig auf dem schlauch stehe!
Kannst du noch die komplette Fehlermeldung per Cut&Paste hier ablegen? Dein at90s8535 wird mit 8 MHz betrieben?
jep 8mhz. hier noch die meldung: Build started 19.10.2006 at 11:17:54 avr-gcc.exe -mmcu=at90s8535 displ1.o test_lcd.o -o displ1.elf test_lcd.o: In function `main': ../../../lcd_oli/test_lcd.c:19: undefined reference to `lcd_init' ../../../lcd_oli/test_lcd.c:20: undefined reference to `lcd_clrscr' ../../../lcd_oli/test_lcd.c:21: undefined reference to `lcd_puts' make: *** [displ1.elf] Error 1 Build failed with 3 errors and 0 warnings...
Das reicht nicht. #include "lcd.h" macht dem test_lcd.c nur bekannt, dass es LCD Funktionen mit diesen Namen gibt. Wo die LCD Funktionen tatsächlich programmiert sind ist in lcd.c. Man kann das Zusammenfügen von lcd.c und test_lcd.c auf mehrere Arten machen. 1/ Include von lcd.c und lcd.h in test_lcd.c. Das ist aber unschön. 2/ Das Makefile so abändern, dass bei den Quelldateien auch lcd.c steht. Die Quelldatei lcd.c wird dann auch getrennt von test_lcd übersetzt und zusammen mit dem übersetzten test_lcd.c zu einem kompletten Programm gelinkt. Meist hat das Makefile eine Zeile SRC= $(TARGET).c Die wäre dann zu ändern in SRC= $(TARGET).c lcd.c 3/ (für Fortgeschrittene) Die Quelldatei lcd.c wird getrennt von anderen Sourcen übersetzt und mittels eines Librarymanagers zu einer Library umgeformt. Beim übersetzten eigener Programmen kann der Linker Routinen aus dieser Library zum eigenen Programm hinzubinden. Hier ist dann auch eine Anpassung des Makefiles erforderlich.
Du musst die lcd.c im Code an der richtigen Stelle mit #INCLUDE einbinden. Wenn du Funktionen im lcd.c aufrufst muss das #INCLUDE nach diesen Funktionen eingebunden werden.
könnte ich nicht auch einfach meine test_lcd in die lcd.c einbauen?
und wenn ich die lcd.c auch einbinde bekomme ich: Loaded plugin STK500 Loaded plugin AVR GCC Loaded partfile: C:\Programme\Atmel\AVR Tools\PartDescriptionFiles\AT90S8535.xml gcc plug-in: Exported makefile to c:\Dokumente und Einstellungen\Desktop\lcd_oli\Makefile gcc plug-in: Error: Object file not found on expected location c:\Dokumente und Einstellungen\Desktop\displ1\default\displ1.elf
Hi Oli, Du mußt in Deinem makefile folgendes ändern (bei AVR-GCC !!): Ganz am Anfang
1 | PRG = displ1 |
2 | OBJ = displ1.o test_lcd.o lcd.o |
und weiter unten noch
1 | # dependency:
|
2 | displ1.o: displ1.c test_lcd.h lcd.h |
Bei dem Beispiel hier ist displ1.c Dein Hauptprogramm mit dem main, test_lcd.c Deine LCD-Routinen und lcd.c die einzubindende LCD-Bibliothek z.B. die von Peter Fleury. In den C Dateien mußt Du dann folgendes haben: displ1.c:
1 | #include "test_lcd.h" |
test_lcd.c:
1 | #include "lcd.h" |
Dabei gehe ich davon aus das ALLE Dateien in ein und demselben Verzeichnis liegen ;) Probier's einfach mal aus und Sicherheitskopie des orignalen makefiles nicht vergessen ;) Bye, Markus
ich glaube, jetzt wird es so langsam tag. müsste es dann nicht heißen: #include "test_lcd.c"? habe das mal umbenannt. und bei meinem makefile stehen die daten auch drinnen (siehe Anhang) außer dass objects nicht ganz am anfang is!
> Du musst die lcd.c im Code an der richtigen Stelle mit #INCLUDE > einbinden. Bitte, bitte, bitte. Lernt ihm nicht so einen Schwachsinn! Source Code Dateien werden unabhängig voneinander übersetzt und zum Schluss werden alle Einzelteile zu einem Programm gelinkt. Alles Andere ist Schwachsinn!
> #include "test_lcd.c"?
Nein.
Du inkludierst niemals C-Source-Code Dateien (mit einer Ausnahme).
Immer nur Header-Dateien.
C-Source-Code Dateien (also die mit der Endung .c)
werden unabhängig voneinander vom Compiler übersetzt.
Als Ergebnis entsteht für jede *.c Datei eine *.o
(oder *.obj) Datei, den den übersetzten Maschinencode
für dieses *.c Modul enthält.
Danach kommt der sog. Linker zum Zug. Aufgabe des Linkers
ist es, die Einzelteile, also die *.o Dateien und eventuelle
Bibliotheken in denen andere bereits fertig überstzte Module
liegen, zu einem kompletten Program zusammenzufügen.
Du musst nur in deinem Makefile eintragen, dass
1) Der Compiler jedes einzelne der *.c Dateien überstzen muss
2) Der Linker auch weiss, welche *.o Dateien dann schlussendlich
zum fertigen Programm 'gelinkt' werden muessen.
Genau der 2. Punkt korrespondiert mit der Fehlermeldung.
Dem Linker wurde nicht mitgeteilt, dass lcd.o auch zum
Programm dazugehört. In diesem lcd.o sind die Funktionen
lcd_init(), etc. drinnen. Jetzt schaut die Sache für den Linker
so aus: Im Programm wird ein Aufruf der Funktion lcd_init() gemacht.
Der Linker (der a nichts davon weis, dass lcd.o auch dazugehört)
findet aber die entsprechende Implementierung nicht. Und daher
beschwert er sich mit einer 'undefined reference'.
danke viel mal für deine ausführliche erklärung! ok, dann scheint das problem also bei meinem linker zu sein! wenn ich das nun ändern möchte, (was ich definitiv will), was muss ich dann als nächstes machen! ich würde ganz gerne mein prog heute noch zum laufen bringen, um mal wieder ein erfolgserlebnis zu haben! muss ich etwa eclipse wie im thread: Beitrag "Eclipse und WinAVR" installieren?
Moment. Du benutzt doch das AVR-Studio mit dem avr-gcc Plugin. Zumindest sieht das weiter oben so aus. Da geht das dann besonders einfach. In der linken Hälfte, in der 'AVR GCC' Ansicht. Da klickst du mit der rechten Maustaste auf 'Source Files'. Im Kontextmenü wählst du dann aus: 'Add Existing Source Files' und wählst alle Dateien aus, die zu deinem Projekt gehören. Also die lcd.c Und das wars dann schon. ACR-Studio baut dir dann ein korrektes Makefile. Da brauchst du also nicht selber Hand anlegen. Ach übrigens: Speichere dein Projekt woanders. Ein Dateiname ...\Dokumente und Einstellungen\.... ist nicht so schlau. Viele Programme kommen mit Leerzeichen in Datei oder Pfadnamen nicht gut zurecht.
ja, benutze avr-gcc plugin. meine dateien habe ich, wie du auch beschrieben hast, so mit eingebunden. habe die ganzen sachen jetzt auch direkt unter laufwerk c im ordner drinnen, aber er will mir das noch immer nicht laufen lassen: gcc plug-in: Error: Object file not found on expected location C:\da_oli\displ1\default\displ1.elf
eclipse installieren... Willst du jetzt alles noch komplizierter machen ;-) Mein Vorschlag zur Abänderung des Makefiles war für den WinAVR allein gedacht, aber du benutzt wohl das AVRStudio plus das gcc-plugin. Das Makefile von dir ist prinzipiell OK. Die Sourcen aus deinem Archiv oben sind prinzipiell auch OK für dieses Makefile, wenn du die dort angegebenen Includes benutzt und eventuelle nachträgliche Ergänzungen wieder entfernst. Allerdings hast du dem Projekt eine neue Sourcedatei hinzugefügt (displ1.c), von der ich nicht weiss was drin steht. Eins ist sicher: Nur in einer Sourcedatei von dir darf main() definiert sein. In der Source, die ich kenne, ist das in test_lcd.c. Das ist ungewöhnlich, denn üblicherweise stecken Programmierer main() in die Source mit dem gleichen Namen, den das Projekt (displ1) hat. Es muss aber nichts bedeuten. gcc plug-in: Error: Object file not found on expected location c:\Dokumente und Einstellungen\Desktop\displ1\default\displ1.elf Das weist darauf hin, dass diese Ausgabedatei wegen einem Fehler beim Build nicht erzeugt worden ist. Normalerweise solltest du den auslösenden Fehler auch angezeigt bekommen. Ich schlage vor, dass du zunächst ein "make clean" machst, um alle Zwischendateien zu löschen und dann ein "make/build all" machst und die Meldungen wieder per Cut&Paste berichtest. Und wenn du sichergehen willst, dass wir am gleichen Problem arbeiten, packe nochmal dein Projekt in ein Archiv und hänge es an.
hm, das hatte ich auch schon gedacht, dass mein displ1 das problem is. war leider nicht so. habe jetzt alles noch mal gezipt. wie gesagt, habe halt mal gesucht, was ich noch anstellen könnte und bin dabei eben über eclipse gestolpert. und dadurch, dass das hier quasi meine ersten gehversuche sind, habe ich diese möglichkeit mal hier angefragt gehabt.
Wohin ist jetzt test_lcd.c verschwunden, welches du laut Makefile benötigst? Der Linker ist stur: Das Programm will das displ1.elf unbedingt nach den Regeln aus dem Makefile erzeugen und das heisst aus dipl1.o, test_lcd.o und lcd.o
Moment, ich sehe gerade, dass du das Projekt inkl. Makefile geändert hast und test_lcd.c aus dem Projekt entfernt hast bzw. in displ1.c umbenannt hast. Du hast doch ein displ1.elf und ein displ1.hex in dem Ausgabeordner. Lade das HEX-File doch mal in deinen µC und lasse es dort laufen...
sorry, ich habe probiert das ganze ohne meine test_lcd zum laufen zu bringen. dann geht es. aber mit eben nicht. hier noch mal das ganze mit allem.
Ich sehe in deinem Projekt bei den Source Files immer noch kein lcd.c Füge lcd.c wie bereits beschrieben hinzu und es compiliert und linkt ohne Probleme.
Ich schreibe noch: "Eins ist sicher: Nur in einer Sourcedatei von dir darf main() definiert sein. In der Source, die ich kenne, ist das in test_lcd.c. Das ist ungewöhnlich, denn üblicherweise stecken Programmierer main() in die Source mit dem gleichen Namen, den das Projekt (displ1) hat. Es muss aber nichts bedeuten." Und du bringst jetzt ein Projekt an, bei dem main() gleichzeitig in displ1.c und test_lcd.c steckt. Da waren wir ein Posting früher schon weiter ;-)
ja, wer lesen kann ist klar im vorteil. habe wie stefan oben geschrieben nur in einer sourcedadei die main() reingehauen. noch mal alles kontrolliert und auch die source files noch mal kontrolliert. und was sehen meine augen, es funktioniert! compiliert und rennt. vielen dank euch!
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.