Forum: Compiler & IDEs bekomme lcd nicht zum laufen!


von Oli K. (waldmeister)


Angehängte Dateien:

Lesenswert?

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!

von Stefan (Gast)


Lesenswert?

Kannst du noch die komplette Fehlermeldung per Cut&Paste hier ablegen?
Dein at90s8535 wird mit 8 MHz betrieben?

von Oli K. (waldmeister)


Lesenswert?

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...

von Steffen (Gast)


Lesenswert?

include von lcd.h und lcd.c vergessen

von Oli K. (waldmeister)


Lesenswert?

aber ich habe doch die lcd.h in der headern drinnen?!?

von thkais (Gast)


Lesenswert?

Die lcd.c fehlt im makefile.

von Stefan (Gast)


Lesenswert?

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.

von Sonic (Gast)


Lesenswert?

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.

von Oli K. (waldmeister)


Lesenswert?

könnte ich nicht auch einfach meine test_lcd in die lcd.c einbauen?

von Oli K. (waldmeister)


Lesenswert?

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

von Markus (Gast)


Lesenswert?

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

von Oli K. (waldmeister)


Angehängte Dateien:

Lesenswert?

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!

von Karl heinz B. (kbucheg)


Lesenswert?

> 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!

von Karl heinz B. (kbucheg)


Lesenswert?

> #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'.

von Oli K. (waldmeister)


Lesenswert?

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?

von Karl heinz B. (kbucheg)


Lesenswert?

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.

von Oli K. (waldmeister)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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.

von Oli K. (waldmeister)


Angehängte Dateien:

Lesenswert?

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.

von Stefan (Gast)


Lesenswert?

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

von Stefan (Gast)


Lesenswert?

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...



von Oli K. (waldmeister)


Angehängte Dateien:

Lesenswert?

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.

von Karl heinz B. (kbucheg)


Lesenswert?

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.

von Karl heinz B. (kbucheg)


Angehängte Dateien:

Lesenswert?

So muss das dann aussehen (siehe Bild)

von Stefan (Gast)


Lesenswert?

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 ;-)

von Oli K. (waldmeister)


Lesenswert?

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