mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATTINY 84 als Slave im Two wire mode


Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen

Ich bin gerade dabei die Kommunikation für einen ATTINY 84 zu 
programmieren. Der ATTINY soll dabei als Slave fungieren. Jetzt habe ich 
schon einige Beispiele gefunden und den Programmablauf habe ich (denke 
ich) verstanden. Das Problem. was ich habe ist folgendes:
Vom Master (Aardvard I2C/SPI als Master) werden neun bits übertragen 
(sieben für die Slave-Adresse, eins für die R/W-Operation und das 
Ack-bit). Nun müßte ich als Slave, wenn die Adresse stimmt, während des 
Ack-bits die SDA-Leitung auf low ziehen. Und genau da liegt mein 
Problem.

Die ISR für die Startbedingung wird durchlaufen. Ich sehe im Buffer die 
richtigen Werte für die Slave-Adresse und den R/W-Befehl. Ich schaffe es 
aber nicht die SDA Leitung auf low zu ziehen, bevor das Ack-bit vom 
Master gesendet wird. Selbst wenn mein erster Befehl (ausgeführt mit 
einem Makro) in der ISR für den USI_OVF ist, bin ich zu spät dran.

Habe ich da was falsch verstanden, oder mache ich grundsätzlich was 
falsch?

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Vorgenhensweise stimmt erst mal, wobei du vor dem setzten des ACK ja 
erst noch die Slave-Adresse mit deiner eigenen vergleichen musst.

Wie schnell läuft denn dein ATTiny und wie hoch ist der I2C-Takt am 
Master eingestellt.

Sascha

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Sascha

Die Taktfrequenz vom ATTINY ist 8MHz und der I2C Takt ist 400kHz.

Die Adresse vergleiche ich direkt als erstes in der ISR für den USI_OVF.
Ich habe gestern abend aber noch festgestellt, dass selbst wenn ich die 
SDA-Leitung noch vor dem Vergleichen der Adresse auf low ziehe, bin ich 
zu spät dran.
Also denke ich, dass ich schon vorher ein Problem habe. Weiterhin habe 
ich die Flags USIWM0 und 1 auf high gesetzt, damit die SCL-line low 
gehalten wird.

Autor: Peter Dannegger (peda)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Du mußt USI-Mode 3 nehmen, dann wird SCL auf low gehalten, solange das 
Overflowbit gsetzt ist.
Und dann kannst Du bequem das SDA auf 0 setzen und danach das 
Overflowbit löschen.

Natürlich muß der Master auch ein voll ausgerüstetes Standard-I2C haben, 
d.h. er darf erst weitermachen, wenn SCL = high ist.


Peter

Autor: Werner (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo Peter

Danke für den Tipp, habe USIWM0 auf 0 und USIWM1 auf 1 gesetzt. Leider 
mit dem gleichen Ergebniss.

Autor: Sascha Weber (sascha-w)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
nimm mal 100kHz, mit dem "soft"-TWI wird die Fequenz nur schwer oder 
garnicht zu erreichen sein.
Ich hab's auf einem ATTiny44 mit 100kHz ohne Probleme am laufen .

Sascha

Autor: A. K. (prx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.