Forum: Mikrocontroller und Digitale Elektronik Verständnis-fragen zum TWI. Atmega8


von Attila C. (attila)


Lesenswert?

Hallo!

1)Wie kommen die Status Codes in das TWSR? "Wer" schreibt die da rein?

Sollte der Controller Anhand dessen was in TWBR steht die Status Codes 
aus einer art "Tabelle" auslesen:
Wie unterscheidet der Controller ob grade ein SLA+W oder ein Data byte 
verschickt wird?

2) Was ist denn zu tun wenn ein NOT ACK "zurückkommt"? Was sollte denn 
eine "ERROR()" Funktion machen? Einfach noch mal "von vorne"? Wie macht 
man das "richtig"?


Vielen Dank!

von Karl H. (kbuchegg)


Lesenswert?

Attila Ciftci schrieb:
> Hallo!
>
> 1)Wie kommen die Status Codes in das TWSR? "Wer" schreibt die da rein?
>
Na die Hardware.

> Sollte der Controller Anhand dessen was in TWBR steht die Status Codes
> aus einer art "Tabelle" auslesen:

Ich versteh die Frage nicht wirklich.
Im Datasheet zum AtMega8 hat Atmel doch einen schönen langen Absatz 
eingefügt, in dem im Detail (inklusive Code) die Vorgehensweise 
aufgeschlüsselt ist. Dort steht doch alles relevante.

> 2) Was ist denn zu tun wenn ein NOT ACK "zurückkommt"?

Das musst du entscheiden, wie du den Fall handhaben willst.

> Was sollte denn
> eine "ERROR()" Funktion machen? Einfach noch mal "von vorne"?

Kommt drauf an.
Wenn du denkst, der NOT_ACK ist nur deswegen aufgetreten, weil eine 
Störung auf den Leitungen vorgelegen hat, dann kannst du nochmal 
starten. Aber eigentlich sollte der Fall selten vorkommen.

Je nachdem, wo der NOT_ACK auftritt, hat der eine andere Bedeutung. Wenn 
du einen Sensor anzusprechen versuchst, der einfach physikalisch gar 
nicht am Bus hängt, dann kannst du wiederholen so oft du willst. Wenn er 
nicht da ist, kann er auch nicht antworten und du wirst immer wieder 
einen NOT_ACK kriegen. In dem Fall wird es wohl das vernünftigste sein, 
den Benutzer darüber zu informieren, dass der angesprochene Teilnehmer 
am I2C Bus nicht erreichbar war. Dann kann der Benutzer mal nachsehen 
was überhaupt los ist. Vielleicht ist ja auch irgendwo einfach nur ein 
Kabel abgerissen.

> Wie macht
> man das "richtig"?

Es gibt kein "richtig". Richtig ist, was du als richtig definierst.

: Bearbeitet durch User
von Attila C. (attila)


Lesenswert?

Hallo Karl Heinz,

vielen Dank für Deine Erklärung. Der Teil mit dem ERROR() ist sehr 
hilfreich. Jetzt habe ich zumindest eine Idee worum es bei einem NOT ACK 
überhaupt geht!

Ja den TWI Teil habe ich natürlich gelesen dennoch habe ich einen 
"Knoten" beim Verständnis. Ich versuche es mal anders zu formulieren:

Wenn ich ein START verschicke wo kommt dann die zu prüfende 0x08 her? 
(Tabelle 66)
Sagt der Controller: "Da war ein (1<< STA) also tu ich mal 0x08 ins 
TWSR!" Ist das so?

von Karl H. (kbuchegg)


Lesenswert?

Attila Ciftci schrieb:

> Wenn ich ein START verschicke wo kommt dann die zu prüfende 0x08 her?
> (Tabelle 66)
> Sagt der Controller: "Da war ein (1<< STA) also tu ich mal 0x08 ins
> TWSR!" Ist das so?

Im Prinzip: ja. Genau so ist das.

von Alex (Gast)


Lesenswert?

Hallo,
habe da auch mal eine Frage zum NACK.
Müsste um einen Read zu beenden an den Slave ein NACK senden.
Weiß jemand welche Register dazu gesetzt werden müssen im ATMega32?
Gruß Alex

von spess53 (Gast)


Lesenswert?

Hi

Dafür ist

Bit 6 – TWEA: TWI Enable Acknowledge Bit

in TWCR zuständig.

MfG Spess

von Alex (Gast)


Lesenswert?

Hallo Spess,

ja Bit 6 ist das Acknowledge Bit.
Aber was ist NACK?
Das hab ich bisher nicht verstanden.

Gruß Alex

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.