Forum: Mikrocontroller und Digitale Elektronik [S] einfache verständliche Implementierung des TWI-Interfaces eines Atmega


von Matthias (Gast)


Lesenswert?

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...

von holger (Gast)


Lesenswert?

>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.

von Matthias (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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
von Oliver S. (oliverso)


Lesenswert?

R232 hat nichts mit TWI zu tun. Der Fehler liegt also in deinem Code, 
umd zwar in Zeile 42.

Oliver

von Karl H. (kbuchegg)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

> 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
von Matthias (Gast)


Lesenswert?

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
}*/

von Karl H. (kbuchegg)


Lesenswert?

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?

von Karl H. (kbuchegg)


Lesenswert?

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?

von Matthias (Gast)


Lesenswert?

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.

von Karl H. (kbuchegg)


Lesenswert?

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

von Matthias (Gast)


Lesenswert?

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

von Karl H. (kbuchegg)


Angehängte Dateien:

Lesenswert?

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
Noch kein Account? Hier anmelden.