ATMega TWI im Slave Receiver Mode

Gast #237859
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
Gast
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
Persönliche Seite
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
Gast
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
Gast
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
Gast
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

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.