Forum: Compiler & IDEs ATMega TWI im Slave Receiver Mode


von Sebastian (Gast)


Lesenswert?

Hi,

bin gerade dabei, zwei Mega8 testweise über den TWI zu verbinden und
schaff es mittlerweile auch, Daten von dem einen Controller auf den
anderen zu schieben.
Allerdings finde ich keine Möglichkeit abzufragen, wie ich beim Slave
nach neuer Aktivität auf dem Bus pollen kann. Das TWSR liefert immer
0xF8 (keine Aktivität).
Das TWCR ist mit 0x45 beschrieben, das TWINT Bit im TWCR ändert sich
nicht. (Obwohl ich auch befürchte, dass es dies in diesem Mode auch
nicht tut.)
Ich kann zwar Daten aus dem TWDR lesen und es sind auch immer die
aktuellen Daten (Master sendet einen unsigned char, der alle Sekunde um
1 inkrementiert wird) und wenn ich alle Sekunde einmal im Slave das TWDR
auslese, bekomme ich auch 1 mal das aktuelle Zeichen. Nun will ich aber,
dass ich nicht von der Zeit abhängig bin, sondern einfach nen Status
abfrage, ob sich was ändert. Könnte ja mal sein, dass der Master nen
anderen Zeitabstand hat.

So, ich hoffe mir kann dabei jemand helfen,

Gruss und vielen Dank schonmal, Sebastian

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

sowas macht man doch nicht im Poll-Betrieb. Dafür nutzt man Interrupts.
Dann ist das eigentlich ganz einfach. Du bekommst bei bestimmten
Ereignissen auf dem Bus einen Interrupt, behandelst den Zustand des
TWSR und setzt TWCR entsprechen dem Vorgängerzustand neu.

Matthias

von Sebastian (Gast)


Lesenswert?

War mir irgendwie klar, dass genau die Antwort kommt, aber gut. Mir
gehts auch momentan nicht um eine konkrete Anwendung, sondern einfach,
dass es einmal funktioniert hat, damit ich weiss, wie es geht.

Danach kommt die Sache mit den Interrupts.

Aber trotzdem danke für die schnelle Antwort .)

Sebastian

von Μαtthias W. (matthias) Benutzerseite


Lesenswert?

Hi

wenn du pollst könntest du ja Statuswechsel verpassen. Das ist ansich
keine gute Idee. Aber im PRinzip läuft es ja genau gleich ab:

1. Statuswechsel detektieren
2. Auswertung des Status
3. TWCR passend neu schreiben

Ich verstehe eh nicht wie das bei dir überhaupt funktionieren kann wenn
du bei einem Statuswechsel das TWCR nicht neu schreibst. Solange das
nicht beschreiben wird macht das TWI AFAIK garnichts.

Matthias

von Sebastian (Gast)


Lesenswert?

Ich muss ehrlich sagen, da wunder ich mich auch drüber, aber das TWDR
wird definitiv erneuert, auch wenn ich das TWINT nicht neu setze. Laut
Datenblatt sollte das Bit ja in jedem fall freigesetzt werden. Na ja,
ich forsche eh weiter, aber Danke.

Sebastian

von peter dannegger (Gast)


Lesenswert?

Du must im Slave das TWEA Bit setzen, dann kriegst Du auch einen neuen
Status, nachdem ein Start+SLA gesendet wurde und bei jedem Datenbyte
bis zum Stop.

Daß das TWDR ständig mitliest, obwohl nicht als Slave adressiert, ist
zwar lustig, aber nicht dokumentiert.

Wenn Du das HW-I2C nutzen willst, mußt Du Dich schon an den
I2C-Standard halten.


Peter

von Sebastian Strunck (Gast)


Lesenswert?

Da das TWCR auf 0x45 gesetzt ist, ist das TWEA Bit mit gesetzt.

Das TWDR liefert nur richtige Daten, wenn die Adresse stimmt. Viel mehr
hab ich da bis jetzt auch nicht rausgefunden. Hab da aber abgebrochen
und hab noch ne interuptgesteuerte Software gebastelt. Funktioniert in
der Tat zufriedenstellender.

Danke nochmal an die eifrigen Poster.

Sebastian

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.