Forum: Mikrocontroller und Digitale Elektronik I2C Master Empfangsmodus nur ohne Interrupt?


von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Hallo!

Ich bastel derzeit ein bisschen mit dem TWI Modul im Atmega rum. Master 
ist ein Atmega8 und Slave ein Attiny 261 mit Usi. Das senden vom Master 
zum Slave klappt schon wunderbar. Zuerst lief auf dem Atmega das 
Beispielprogramm aus dem Datenblatt, jetzt habe ich mir das noch 
umprogrammiert auf Interrupt-gesteuert. Funktioniert auch super. Jetzt 
würde ich allerdings gern vom Slave auch Daten empfangen. Effektiv wäre 
das natürlich auch über den TWI-Interrupt zu lösen, aber der 
abgeschlossene Datenempfang wird mit einer logisch "eins" im TWINT 
angezeigt. Der Interrupt wird aber nur ausgelöst, wenn eine logisch 
"null" ins TWINT von der Hardware geschrieben wird. Zumindest steht das 
so im Datenblatt.

"Received Data can be read from the TWDR-Register when the TWINT-Flag 
ist set high by Hardware" Datenblatt Atmega8 Seite 179 unten

Mich wundert der Wortlaut "set high", weil überall wird nur von "set 
TWINT" gesprochen, nur dort steht "set high".
Habe ich jetzt also nur die Möglichkeit in einer while-Schleife zu 
warten, bis TWINT auf logisch "eins" gesetzt wird, oder gibts da noch 
andere Möglichkeiten, die mir einfach nicht einfallen? Oder ist es ganz 
anders, dass Atmel hier einfach mal eine andere Bezeichnung für das 
gleiche genutzt hat?

Danke schonmal für eure Antworten


MfG Dennis

von Thomas K. (thomas_k39)


Lesenswert?

Dennis H. schrieb:
> angezeigt. Der Interrupt wird aber nur ausgelöst, wenn eine logisch
> "null" ins TWINT von der Hardware geschrieben wird. Zumindest steht das
> so im Datenblatt.

Wo steht das im Datenblatt? Bei allen AVRs die ich kenne wird der 
Interrupt ausgelöst wenn das entsprechende Interruptflag gesetzt wird.

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Nun, und was heißt gesetzt? In meinem Falle steht das unter Register 
Description, Seite 168 unten im Datenblatt.

"The TWINT Flag must be cleared by software by writing a logic one to 
it"

Ist doch bei den Externen Interrupts glaube ich auch so, dass man eine 
logisch "1" ins Register schreiben muss, um es zu löschen, also wird es 
gesetzt, wenn ne logisch "0" drin steht.

MfG Dennis

von Thomas K. (thomas_k39)


Lesenswert?

Nein, das TWINT-Bit ist gesetzt wenn eine 1 drin steht und gelöscht wenn 
eine 0 drin steht.

Wenn Du das Register mit TWINT=0 schreibst, passiert mit dem Bit nichts. 
Wenn Du das Register mit TWINT=1 schreibst, wird das Bit gelöscht.

Das ist so ein Mechanismus mit den Interrupt-Flags, damit Du bei 
Registern mit mehreren Interrupt-Flags wie zum Beispiel TIFR genau ein 
Bit löschen kannst, ohne die anderen Bits zu beeinflussen.

Gruss, Thomas

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Thomas K. schrieb:
> und gelöscht wenn
> eine 0 drin steht.

> TWINT=1 schreibst, wird das Bit gelöscht.

Also die Logik musst du mir mal erklären. Wenn du einfach mal in das 
Datenbaltt schaust, nach dem Beispiel-Code für eine TWI- Kommunikation, 
da wird per while-Schleife darauf gewartet, dass das TWINT Flag gesetzt 
wird mit folgender Zeile:

while (!(TWCR & (1<<TWINT)));

Datenblatt Atmega8 Seite 174 oben

Soll also heißen, hier wird gewartet, bis dieses Bit auf logisch "1" von 
der Hardware gesetzt wird. Wenn ich eine 0 in dieses Bit per Software 
schreibe, passiert gar nix, da hast du Recht. Mh, schon komisch, wieso 
ich da warte, bis es auf 1 geht, und dann trotzdem eine 1 reinschreiben 
muss. Erklärt aber immer noch nicht mein Problem mit "set high"

MfG Dennis

von troll (Gast)


Lesenswert?

Dennis H. schrieb:
> Mh, schon komisch, wieso
> ich da warte, bis es auf 1 geht, und dann trotzdem eine 1 reinschreiben
> muss.
Das ist zwar komisch aber tatsächlich so, warten bis 1 und dann 1 
reinschreiben zum Löschen.

von Noname (Gast)


Lesenswert?

Das sind zwei ganz verschiedene Dinge:
1. Bits welche die Hardware setzt oder löscht um dem Programm etwas 
anzuzeigen.
2. Bits welche die Software setzt oder löscht um der Hardware etwas 
anzuzeigen (oder sie zu steuern).
1
while (!(TWCR & (1<<TWINT)));

>Soll also heißen, hier wird gewartet, bis dieses Bit auf logisch "0" von
der Hardware gesetzt wird.

Nein. Im Gegenteil. Es wird gewartet, bis das Bit gleich 1 ist.

Diese Formulierung verdeckt aber den Sachverhalt. Es muss genauer 
heissen:
Die Schleife wird durchlaufen solange das Bit gleich 0 ist.

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Mh, also ich denke langsam, dass es dem Schreiber des Datenblattes 
einfach nur langweilig war, immer "TWINT Flag is set" zu schreiben, und 
eben mal eine andere Formulierung reinbringen wollte. Also löst der 
vollständige Empfang von 8Bit genauso wieder den TWI-Interrupt aus, wie 
es scheint. Danke für deine gute Erklärung mit dem TIFR.


MfG Dennis

von Dennis H. (t1w2i3s4t5e6r)


Lesenswert?

Noname schrieb:
>>Soll also heißen, hier wird gewartet, bis dieses Bit auf logisch "0" von
> der Hardware gesetzt wird.
>
> Nein. Im Gegenteil. Es wird gewartet, bis das Bit gleich 1 ist.
>
> Diese Formulierung verdeckt aber den Sachverhalt. Es muss genauer
> heissen:
> Die Schleife wird durchlaufen solange das Bit gleich 0 ist.

Jetzt hast du genau in den 30sec mich zitiert, wo ich meinen Denkfehler 
beim schreiben gefunden hatte, hab den fix korrigiert aber da hattest du 
schon abgeschickt :)

MfG Dennis

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.