mikrocontroller.net

Forum: Compiler & IDEs bekomme lcd nicht zum laufen!


Autor: Oli K. (waldmeister)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Stefan (Gast)
Datum:

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

Autor: Oli K. (waldmeister)
Datum:

Bewertung
0 lesenswert
nicht 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...

Autor: Steffen (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
include von lcd.h und lcd.c vergessen

Autor: Oli K. (waldmeister)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
aber ich habe doch die lcd.h in der headern drinnen?!?

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die lcd.c fehlt im makefile.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Sonic (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oli K. (waldmeister)
Datum:

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

Autor: Oli K. (waldmeister)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Markus (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi Oli,
Du mußt in Deinem makefile folgendes ändern (bei AVR-GCC !!):
Ganz am Anfang
PRG            = displ1
OBJ            = displ1.o test_lcd.o lcd.o
und weiter unten noch
# dependency:
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:
#include "test_lcd.h"
test_lcd.c:
#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

Autor: Oli K. (waldmeister)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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!

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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'.

Autor: Oli K. (waldmeister)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oli K. (waldmeister)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Oli K. (waldmeister)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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...



Autor: Oli K. (waldmeister)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl heinz Buchegger (kbucheg)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
So muss das dann aussehen (siehe Bild)

Autor: Stefan (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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 ;-)

Autor: Oli K. (waldmeister)
Datum:

Bewertung
0 lesenswert
nicht 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!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.