Hallo,
Ich möchte den I2C-Bus eines Atmega 328 nutzen.
Ich habe es zuerst selbst versucht, doch gibt es dazu bereits diverse
fertige Implementierungen.
So habe ich die Implementierung von Manfred Langemann welche hier im
Forum verfügbar ist genommen und angepasst. Einziger fehler den mein
Compiler mir nun noch gibt ist "undefined reference to ..."
Auch bei der Implementierung von Peter Fleury sieht es nicht anderst
aus.
Habe bereits etwas gesucht, aber keine Ahnung wie ich das Make-File ohne
Linux im Atmel-Studio 6 laufen lassen soll.
Auch selbst habe ich es versucht, bin aber schon am senden der
Start-Condition gescheitert, da danach 0x08 im entsprechenden Register
stehen sollte, dies aber niemals passiert.
Kann mir jemand eine einfache verständliche Implementierung nennen die
ich auch wirklich zum Funktionieren bekomme?
Ich habe keine Probleme damit Register anzupassen, ein paar Bit-Namen zu
ändern oder ähnliches...
>Einziger fehler den mein>Compiler mir nun noch gibt ist "undefined reference to ..."
Das ist ein Fehler vom Linker.
Da fehlt eine Sourcecode Datei in deinem Projekt.
Du hast nur ein include mit der Headerdatei gemacht.
Und wenn du mal die ganze Fehlermeldung postest
könnte man vieleicht raten welche.
Eine Fehlermeldung ist z.b.
Error 2 undefined reference to `RS232_Init()'
Es sind alle Header und C-Dateien im Projekt..
Mir Rechtsklick kann ich auch Goto-Implementation machen und komme
gezielt dort hin.
Matthias schrieb:> Eine Fehlermeldung ist z.b.>> Error 2 undefined reference to `RS232_Init()'
Ist das eine Funktion von dir?
Du hast aber nicht übersehen, dass man bei derartigen vorgefertigten
'Libs' meistens so etwas wie ein Testprogramm mit dazubekommt, das
einfach nur dazu dient, die gebotene Funktionalität zu zeigen, zu zeigen
wie man die Dinge benutzt, etc.
Dieser Demo-Code gehört natürlich nicht zur Lib und den willst du auch
nicht in deinem Projekt haben!
Karl Heinz schrieb:> Matthias schrieb:>> Eine Fehlermeldung ist z.b.>>>> Error 2 undefined reference to `RS232_Init()'>> Ist das eine Funktion von dir?>> Du hast aber nicht übersehen, dass man bei derartigen vorgefertigten> 'Libs' meistens so etwas wie ein Testprogramm mit dazubekommt, das> einfach nur dazu dient, die gebotene Funktionalität zu zeigen, zu zeigen> wie man die Dinge benutzt, etc.> Dieser Demo-Code gehört natürlich nicht zur Lib und den willst du auch> nicht in deinem Projekt haben!
Mit anderen Worten:
Schmeiss die TWI_Master_main.c aus deinem Projekt raus. Die gehört nicht
dazu.
> Auch bei der Implementierung von Peter Fleury sieht es nicht anderst aus.> Habe bereits etwas gesucht, aber keine Ahnung wie ich das Make-File> ohne Linux im Atmel-Studio 6 laufen lassen soll.
Langer Rede kurzer Sinn:
meistens gar nicht.
Es kommt nur ganz selten vor, dass irgendwelcher Code, den du in Source
Form bekommst, spezielle Compiler Flags benötigt.
Du entpackst das Zip-File, siehst nach welche C und H Files du brauchst
und fügst die einfach in dein Projekt ein. Im H File (manchmal auch im C
File) sieht man noch rein, ob irgendwelche #define anzupassen sind (und
ich scroll dann normalerweise auch noch mal über den Code drüber um mir
mal anzusehen, wie er geschrieben ist und einen kurzen Überblock zu
bekommen) und meistens wars das dann auch schon.
Das Makefile ist meist nur deswegen drinn, weil es auch ein Testprogramm
gibt, welches durch Eingabe von 'make' auf der Commandline brennfertig
zusammengebaut wird.
Karl Heinz schrieb:> Ist das eine Funktion von dir?>> Du hast aber nicht übersehen, dass man bei derartigen vorgefertigten> 'Libs' meistens so etwas wie ein Testprogramm mit dazubekommt, das> einfach nur dazu dient, die gebotene Funktionalität zu zeigen, zu zeigen> wie man die Dinge benutzt, etc.> Dieser Demo-Code gehört natürlich nicht zur Lib und den willst du auch> nicht in deinem Projekt haben!
Ja, absolut richtig, ich möcht den Democode nicht haben, aber wenn
selbst der nicht funktioniert, wie soll ichs dann hinbekommen.
Ich habs auch mit meinem eigenen Code versucht aber bei dem konnte ich
auch keine der funktionen nutzen.
undefined reference to
Verstehe nicht warum ich die dateien richtig einbinden kann, automatisch
zur definition gehen kann. Aber die Funktionen für den Compiler/Linker
dennoch nicht auffindbar sind. Im Projekt sind alle drin.
Wenn ich den Code selbst shcreibe funktioniert das genau so.
Wenn ich etwas übernehme dann auf keinen fall, obwohl ich keinen
unterschied zu meinem selbstgeschriebenen erkennen kann.
Mit meinem eigenen Code, funktionierts auch nicht, obwohl er dem Code im
datenblatt und in diversen Foreneinträgen entspricht. Denn bei
if ((TWSR & 0xF8) != 0x08)
wars das schon. Hier wird immer rausgesprungen, obwohl ich nirgends
anderes lesen konnte...
Matthias schrieb:> Karl Heinz schrieb:>> Ist das eine Funktion von dir?>>>> Du hast aber nicht übersehen, dass man bei derartigen vorgefertigten>> 'Libs' meistens so etwas wie ein Testprogramm mit dazubekommt, das>> einfach nur dazu dient, die gebotene Funktionalität zu zeigen, zu zeigen>> wie man die Dinge benutzt, etc.>> Dieser Demo-Code gehört natürlich nicht zur Lib und den willst du auch>> nicht in deinem Projekt haben!>> Ja, absolut richtig, ich möcht den Democode nicht haben, aber wenn> selbst der nicht funktioniert, wie soll ichs dann hinbekommen.
Der funktioniert!
Ich hab mir mal das Zip-File vom Langemann geholt.
Da sind fein säuberlich ein paar C-Files drinnen.
Da gibt es ein File mit Delay Funktion. Ein File mit RS232 Funktionen.
EIn File mit den eigentlichen TWI FUnktionen und ein File mit einem
main(), das zeigt wie man das alles verwendet.
WEnn du das Demo bauen willst, dann brauchst du alle.
Wenn du aber nur die TWI Funktionen zur Verwendung in deinem eigenen
Code haben willst, dann brauchst du auch nur die Dateien TWI_Master.h
und TWI_Master.c. Alle anderen C bzw. H Files brauchst du in diesem Fall
nicht (ausser du findest dir dort drinnen was, was dich interessiert)
Du hast doch geschrieben, du hättest dir die Dinge für dich angepasst.
Hast du denn da nicht mal in die ganzen C-Files reingeschaut, was da
überall drinnen ist?
Also.
Wovon reden wir?
Reden wir von einem Projekt im Atmal Studio, mit dem du das Demobeispiel
vom Martin Langemann zum laufen kriegen willst oder reden wir von deinem
Projekt, in welchem du die TWI Funktionen (und nur die) aus dem Paket
vom Martin benutzen willst?
Karl Heinz schrieb:> Du entpackst das Zip-File, siehst nach welche C und H Files du brauchst> und fügst die einfach in dein Projekt ein. Im H File (manchmal auch im C> File) sieht man noch rein, ob irgendwelche #define anzupassen sind (und> ich scroll dann normalerweise auch noch mal über den Code drüber um mir> mal anzusehen, wie er geschrieben ist und einen kurzen Überblock zu> bekommen) und meistens wars das dann auch schon.
Ja, genauso möcht ich auch vorgehen, aber das führ eben zu den undefined
reference to ...
Ich sehe keinen unterschied zu dem code den ich selbst schreibe, habe
ihn genauso includet, genauso im projekt und rufe ihn gleich auf.
Aber so gehts eben nicht.... warum?
Karl Heinz schrieb:> Du hast doch geschrieben, du hättest dir die Dinge für dich angepasst.> Hast du denn da nicht mal in die ganzen C-Files reingeschaut, was da> überall drinnen ist?
Ja genau das habe ich, sehe aber keinen unterschied zu meinen
selbstgeschreibenen funktionen, jedenfalls keinen der "undefined"
hervorbringt.
Karl Heinz schrieb:> Der funktioniert!
Ich hab schon versucht alle zu einem Projekt zusammenzufassen, habe alle
im Projekt drinn, doch jeder aufruf führt zu einer undefined reference.
Matthias schrieb:> Ich sehe keinen unterschied zu dem code den ich selbst schreibe, habe> ihn genauso includet, genauso im projekt und rufe ihn gleich auf.> Aber so gehts eben nicht.... warum?
Das weiss ich nicht, was du da versemmelt hast.
Pack dein Projekt komplett in ein Zip-File und poste es
Karl Heinz schrieb:> Das weiss ich nicht, was du da versemmelt hast.>> Pack dein Projekt komplett in ein Zip-File und poste es
Werd ich machen wenn es morgen noch zu problemen kommt, hab das Projekt
grade von grundauf neu erstellt, da das Studio noch zusätzliche
Fehlermeldungen der sorte "Die C-Dateien sind bereits in einem anderen
Projekt geöffnet"... und noch andere unnsinnige meldungen ausgab.
Nun hab ich zwar erst eine Bruchteil wieder drinn, doch es scheint zu
funktionieren :)
Ich kann die Init-Funktion aufrufen, ganauso wie jede andere auch :)
Grüße und vielen Dank
Matthias schrieb:> Ich kann die Init-Funktion aufrufen, ganauso wie jede andere auch :)
Genauso, wie ich auch
Die Dateien TWI_Master.c und TWI_Master.h stammen unverändert aus dem
Zip-File vom Martin.