mikrocontroller.net

Forum: Compiler & IDEs Einbinden von headern, bzw. vorcompilieren


Autor: Asterix-007 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Moin Männers,

ich sitze hier wieder mal an einem Problem und brauche mal eure Hilfe.
Folgendes:

Ich will mit Hilfe einer Appnote(315) von ATMEL einen I²C-Master zum
Laufen bekommen. Ich habe das letzte AVR-Studio (460) und gerade den
GCC und die Libs "geupdatet" (siehe =>
http://www.mikrocontroller.net/forum/read-2-277531.html)
Dabei habe ich folgendes gemacht:
1. neues Projekt angelegt
2. TWI_Master.c +*.h in das Projektverzeichnis kopiert und die *.h im
main.c includiert. Ich habe jedoch ein neues leeres main.c erstellt!
3. rufe ich die Funktion " TWI_Master_Initialise" (nur die, zum
Test)in meiner Init-Routine im main.c auf

Ich bekomme beim Build-Lauf immer eine undefined Reference auf
TWI_Master_Initialise !

Der Compiler-Lauf wird ausgeführt, aber der Linker scheint
abzustürzen!

Wenn ich mir eine eigene *.h-Datei erstelle und diese einbinde
funktioniert das "scheinbar problemlos", zumindest bekomme ich keine
Fehlermeldungen mehr. => Oder liegt es daran, das hier
Funktionsdefinition und funktion in einer Datei stehen?

Ich habe schon versucht die Pfade in den Settings einzutragen aber
erfolglos! Auch habe ich versucht die TWI_Master.c einzeln zu
compilieren um so eine *.o_Datei zu erzeugen, aber auch erfolglos!
Ich habe auch den Eindruck, dass man die Settings und Pfade im Projekt
jedes mal neu einstellen muss :-((
Es wäre schön, wenn mir einer von euch, mal die Zusammenhänge
ein wenig beleuchten könnte. Besonders die Pfade und wo was beim
compilieren und linken gesucht wird!

Bevor jetzt alle wieder loslegen: ich habe hier im GCC-Tut geschaut,
ich habe im Forum einige Seiten zurückgeblättert und noch einige Seiten
zu Rate gezogen....

Danke!!

mfg

Asterix-007

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du musst alle *.c Dateien in Dein Projekt im AVR-Studio eintragen
Nur dann weiss AVR-Studio, dass sie Bestandteil des Projektes
sind und compiliert werden mussen bzw. auch mitgelinkt werden
muessen.

In der Baumansicht links den obersten Knoten anklicken (das Projekt),
dann rechte Maustaste: Menuepunkt "Add Existing File"
Directory aufsuchen und "TWI_Master.c" auswaehlen.

Autor: Asterix-007 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@KHB:

Danke, aaaber dann bekomme ich das:

rm -rf main.o  I²C-Test.elf dep/ I²C-Test.hex I²C-Test.eep
Build succeeded with 0 Warnings...
avr-gcc -I"D:\Dokumente und
Einstellungen\Ulf\AVR-Projekte\I²C-Test\."  -mmcu=atmega128 -Wall
-gdwarf-2 -O0 -Wp,-M,-MP,-MT,main.o,-MF,dep/main.o.d  -c  ../main.c
avr-gcc -I"D:\Dokumente und
Einstellungen\Ulf\AVR-Projekte\I²C-Test\."  -mmcu=atmega128 -Wall
-gdwarf-2 -O0 -Wp,-M,-MP,-MT,TWI_Master.o,-MF,dep/TWI_Master.o.d  -c
../TWI_Master.c
../TWI_Master.c:26:33: ioavr.h: No such file or directory
../TWI_Master.c:27:19: inavr.h: No such file or directory
../TWI_Master.c: In function `TWI_Master_Initialise':
../TWI_Master.c:42: error: `TWBR' undeclared (first use in this
function)
../TWI_Master.c:42: error: (Each undeclared identifier is reported only
once
../TWI_Master.c:42: error: for each function it appears in.)
../TWI_Master.c:44: error: `TWDR' undeclared (first use in this
function)
../TWI_Master.c:45: error: `TWCR' undeclared (first use in this
function)
../TWI_Master.c:45: error: `TWEN' undeclared (first use in this
function)
../TWI_Master.c:46: error: `TWIE' undeclared (first use in this
function)
../TWI_Master.c:46: error: `TWINT' undeclared (first use in this
function)
../TWI_Master.c:47: error: `TWEA' undeclared (first use in this
function)
../TWI_Master.c:47: error: `TWSTA' undeclared (first use in this
function)
../TWI_Master.c:47: error: `TWSTO' undeclared (first use in this
function)
../TWI_Master.c:48: error: `TWWC' undeclared (first use in this
function)
../TWI_Master.c: In function `TWI_Transceiver_Busy':
../TWI_Master.c:56: error: `TWCR' undeclared (first use in this
function)
../TWI_Master.c:56: error: `TWIE' undeclared (first use in this
function)
../TWI_Master.c: In function `TWI_Start_Transceiver_With_Data':
../TWI_Master.c:92: error: `TWCR' undeclared (first use in this
function)
../TWI_Master.c:92: error: `TWEN' undeclared (first use in this
function)
../TWI_Master.c:93: error: `TWIE' undeclared (first use in this
function)
../TWI_Master.c:93: error: `TWINT' undeclared (first use in this
function)
../TWI_Master.c:94: error: `TWEA' undeclared (first use in this
function)
../TWI_Master.c:94: error: `TWSTA' undeclared (first use in this
function)
../TWI_Master.c:94: error: `TWSTO' undeclared (first use in this
function)
../TWI_Master.c:95: error: `TWWC' undeclared (first use in this
function)
../TWI_Master.c: In function `TWI_Start_Transceiver':
../TWI_Master.c:108: error: `TWCR' undeclared (first use in this
function)
../TWI_Master.c:108: error: `TWEN' undeclared (first use in this
function)
../TWI_Master.c:109: error: `TWIE' undeclared (first use in this
function)
../TWI_Master.c:109: error: `TWINT' undeclared (first use in this
function)
../TWI_Master.c:110: error: `TWEA' undeclared (first use in this
function)
../TWI_Master.c:110: error: `TWSTA' undeclared (first use in this
function)
../TWI_Master.c:110: error: `TWSTO' undeclared (first use in this
function)
../TWI_Master.c:111: error: `TWWC' undeclared (first use in this
function)
../TWI_Master.c: At top level:
../TWI_Master.c:144: warning: ignoring #pragma vector
../TWI_Master.c:145: error: syntax error before "void"
../TWI_Master.c: In function `TWI_ISR':
../TWI_Master.c:149: error: `TWSR' undeclared (first use in this
function)
../TWI_Master.c:158: error: `TWDR' undeclared (first use in this
function)
../TWI_Master.c:159: error: `TWCR' undeclared (first use in this
function)
../TWI_Master.c:159: error: `TWEN' undeclared (first use in this
function)
../TWI_Master.c:160: error: `TWIE' undeclared (first use in this
function)
../TWI_Master.c:160: error: `TWINT' undeclared (first use in this
function)
../TWI_Master.c:161: error: `TWEA' undeclared (first use in this
function)
../TWI_Master.c:161: error: `TWSTA' undeclared (first use in this
function)
../TWI_Master.c:161: error: `TWSTO' undeclared (first use in this
function)
../TWI_Master.c:162: error: `TWWC' undeclared (first use in this
function)
make: *** [TWI_Master.o] Error 1
Build failed with 43 errors and 1 warnings...

Na, da war mir der "eine" Fehler aber bedeutend lieber!!!! ;-))

Übrigens, ich hatte vorher das File in "Other Files " eingebunden!

Nein, ich vermute, das hier eine einfache Pfadvorgabe fehlt!

Danke Karl-Heinz, aber der Schuß ging daneben!

Asterix-007

Autor: Sascha (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Jetzt mußt du nurnoch die header für TWI includen. Das muss aber in der
TWI_Master.c geschehen, da dieser die TWI constanten nicht kennt.

Gruß
   Sascha

Autor: Fritz Ganter (fritzg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ioavr.h gibts nicht (steht ja da!)

nimm stattdessen:

#include "avr/twi.h"

Fehlermeldungen lesen hilft ungemein!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Nun musst du ,,nur noch'' den Code der AppNote von IAR-Syntax
auf GCC-Syntax portieren...

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Na, da war mir der "eine" Fehler aber bedeutend lieber!!!! ;-))

Du solltest Fehlermeldungen auch lesen!
Die erste ist:

../TWI_Master.c:26:33: ioavr.h: No such file or directory

Bei der faengst Du an. Wenn Du ein ioavr.h hast (oder
was gleichwertiges) werden schon mal einen ganzen Haufen
anderer Fehler wie von Zauberhand verschwinden.

> Danke Karl-Heinz, aber der Schuß ging daneben!

Glaub ich nicht. Programmieren ist nun mal auch eine
Kunst. Der eine hat's, der andere hat's nicht.

Autor: Asterix-007 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
@Jörg : bedeutet, neu schreiben ist einfacher als portieren?????
Wie verhält es sich mit "ioavr.h und inavr.h"? Woher kommen, bzw. was
sind das für Dateien?

so, hier noch mal eine Beschreibung:
meine main.c (siehe Anhang) includiert nur die TWI_Master.h. Nach
meinem C-Verständnis, und dem Herrn Krüger von A-W, sind in dieser *.h
die Funktionsdeklarationen und in der dazugehörigen *.c die
Funktionsdefinitionen. Normalerweise sollte die Angabe der *.h-Datei
ausreichen um auf die Funktionen zugreifen zu können! Dazu sollten
diese aber vorcompiliert (als *.o-Datei) vorliegen, damit der Linker
dann diese mit "verbauen" kann.
Also habe ich versucht, die TWI_Master.c zu compilieren aber das war
nichts!

Außerdem ist in der TWI_Master.c der Header mit den Konstanten
includiert!!! => Deshalb die Vermutung, das der Linker auf dem Holzweg
ist, d.h. das irgend welche Pfade nicht stimmen!!

Außerdem sagen die Fehlermeldungen das die main.c erfolgreich
durchgelaufen ist!

Übrigens, da ich nur eine Datei anhängen kann, der Rest steht in der
Appnote 315 (ohne die dortige main).

Ich glaube, ich gehe hier zu Fuß weiter, d.h. ich schreibe den Code
neu!!

mfg

Asterix-007

Autor: Asterix-007 (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Sorry Fehler vom Amt!!

Hier die richtige Main.c!!!

Autor: Jörg Wunsch (dl8dtl) (Moderator) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> bedeutet, neu schreiben ist einfacher als portieren?

Mitnichten.  Ich habe schon einige Stunden seinerzeit damit
verbracht, das twidemo in der avr-libc auf die Beine zu
stellen (und ich habe es im Wesentlichen getan, weil ich ein
Gefühl für I²C bekommen wollte).

> Wie verhält es sich mit "ioavr.h und inavr.h"? Woher kommen,

Vom IAR-Compiler.

> bzw. was sind das für Dateien?

Das musst du in erster Linie den IAR fragen.

<ioavr.h> ist wohl ziemlich genau das, was beim AVR-GCC/avr-libc
<avr/io.h> heißt.  <inavr.h> ist irgendwelcher privater Krempel
vom IAR.  Was da genau drin deklariert ist, kann ich dir aus'm
Hut nicht sagen (ich könnte aber auf Arbeit mal nachgucken).

> Ich glaube, ich gehe hier zu Fuß weiter, d.h. ich schreibe
> den Code neu!

Wenn du meinst.

Ich hätte auch noch ein paar Manntage an Aufgaben abzugeben, nur
falls du noch weitere freie Reserven haben solltest...

Autor: Asterix-007 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Jörg,

zuerst einmal ein Dankeschön für die Antwort! Das Licht im Dunkel wird
langsam mehr! Nun weiß ich wenigstens, wie ich die beiden Dateien
einordnen muß!
Ich werde mal versuchen, dein Beispiel mit dem I²C zu probieren!

Was sagst du zu meinen gedanken bezüglich der Header-Datei? Vom Ansatz
sollte das doch richtig sein, oder? Wenn ich diese oben genannten
Dateien auskommentiere bekomme ich immer noch die Fehlermeldungen,
welche auf unbekannte Konstanten usw. hinweisen!

Woraus ich schlußfolgere, das die *.h nicht gefunden wird!
Gibt es im AVR-Studio noch eine Einstellung (Pfadangabe) an der man
"drehen" kann, damit der Linker dies *.h findet??

Und zu guter Letzt, wie importiere ich die neuesten Libs richtig in den
GCC? Ich hab versucht das einfach hineinzukopieren, aber das war wohl
nix!

Und das mit dem neu schreiben ist dann günstiger, wenn ich mit den
Beispielen nicht klar komme und mir einen Wolf suche....

Trotzdem..
Danke fürs erste!

mfg

Asterix-007

Autor: Fritz Ganter (fritzg)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wozu poste ich eigentlich die Lösung wenn sie niemand liest?

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.