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