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!
:
Bearbeitet durch User
R232 hat nichts mit TWI zu tun. Der Fehler liegt also in deinem Code, umd zwar in Zeile 42. Oliver
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.
:
Bearbeitet durch User
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...
1 | void I2C_Init() |
2 | {
|
3 | //SCL=16*10^6/(16+2*twbr*prescaler)
|
4 | //Prescaler=1;
|
5 | //twbr=(16*10^6-SCL*16)/(SCL*2)
|
6 | TWBR=72; //--> 100KHZ |
7 | TWSR=(0<<TWPS0)|(0<<TWPS1); //--> Prescaler = 1 |
8 | }
|
9 | |
10 | uint8_t I2C_Send(uint8_t address, uint8_t data) |
11 | {
|
12 | /* I2C */
|
13 | /*Send start condition*/
|
14 | TWCR = _BV(TWINT) | _BV(TWSTA) | _BV(TWEN); |
15 | /* warten bis Start gesendet */
|
16 | while (!(TWCR &(1<<TWINT))); |
17 | /* Goto error if Status different from Start*/
|
18 | if ((TWSR & 0xF8) != 0x08) |
19 | return (TWSR & 0xF8); |
20 | /* Start transmission of address */
|
21 | TWDR = address; |
22 | TWCR = (1<<TWINT) |(1<<TWEN); |
23 | /* wait for Address has been transmitted */
|
24 | while (!(TWCR &(1<<TWINT))) |
25 | ;
|
26 | /* Check value of Status-Register */
|
27 | if (((TWSR & 0xF8) != 0x18) || ((TWSR & 0xF8) != 0x20) || ((TWSR & 0xF8) != 0x38)) |
28 | return 2; |
29 | /* Start transmission of data */
|
30 | TWDR = data; |
31 | TWCR = (1<<TWINT) | (1<<TWEN); |
32 | /* Wait for Data has been transmitted */
|
33 | while (!(TWCR &(1<<TWINT))) |
34 | ;
|
35 | /* goto error if no ACK comes */
|
36 | if ((TWSR & 0xF8) != 0x28) |
37 | return 3; |
38 | /* transmitt Stop-Condition */
|
39 | TWCR =(1<<TWINT)|(1<<TWEN)|(1<<TWSTO); |
40 | return 0x00; |
41 | /*
|
42 | 0x01 = Status different from Start
|
43 | 0x02 = No Slave Ack
|
44 | 0x03 = No Master Ack
|
45 | */
|
46 | }*/ |
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.
:
Bearbeitet durch User
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.