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
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.
@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
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
ioavr.h gibts nicht (steht ja da!) nimm stattdessen: #include "avr/twi.h" Fehlermeldungen lesen hilft ungemein!
Nun musst du ,,nur noch'' den Code der AppNote von IAR-Syntax auf GCC-Syntax portieren...
> 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.
@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
> 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...
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
Wozu poste ich eigentlich die Lösung wenn sie niemand liest?
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.