Forum: Compiler & IDEs Kann mir bitte wer beim USI-TWI helfen?


von AVR-Anfänger (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe schon einen Beitrag im uC Bereich geschrieben.
( Beitrag "Ich komme mit dem USI/TWI nicht klar" )
Aber wie es aussieht, hatte ich den falschen Bereich erwischt.
Kann mir bitte jemand unter die Arme greifen?
Ich bekomme den ATtiny24 einfach nicht dazu, über TWI mit dem Master zu 
reden.

Der Master ist ein ATmega32L und der Slave ein ATtiny24.
Beide laufen bei 8MHz internem Takt.
Ich verwende 4,7 Kilo Ohm Widerstände als Pull Up.
Die Leitungen von SDA und SCL sind ca. 15cm lang.
Der ATtiny24 hat 100 Ohm Schutzwiderstände seriell in SDA und SDL.

Für den Anfang habe ich vor, Beispiele aus der Codesammlung zu
verwenden.
Für den Master verwende ich folgendes Beispiel:
 http://www.mikrocontroller.net/topic/goto_post/742070
(TWI_Master-Slave_C_Functions.zip vom 04.01.2008 21:51)

Für den Slave:
 http://www.mikrocontroller.net/topic/goto_post/287917
(usi-slave.zip vom 4.06.2006 21:29)

Leider bekomme ich keine Komunikation zustande.
Wie es aussieht kommt die Sendeanforderung beim Slave an und er sendet
auch die Daten an den Master.
Doch der Master meldet mir "Could not start TWI Bus for READ" und "Could
not start TWI Bus for WRITE"

Ich habe nur ein paar Anpassungen beim Quellcode gemacht.
Und zwar folgende:

Ich habe bei beiden Programmen die gleiche Adresse vergeben.
Bei beiden Programmen werden 3 Bytes gesendet / empfangen
Ich habe das USI-Beispiel auf ATtiny24 erweitert.


Ich weis leider nicht was ich bei der Umsetzung falsch gemacht habe.
Ich brauche eure Hilfe damit ich weiterkomme.
Ich habe die Projekte angehängt.

von (prx) A. K. (prx)


Lesenswert?

Es gibt 2 Konventionen, wie man eine I2C-Adresse verstehen und angeben 
kann:

* Als 7-Bit-Adresse 0x00-0x7F, an die intern das R/W-Bit angefügt wird. 
Nach dieser Konvention arbeitet der Master-Code.

* Als gerade 8-Bit-Adresse 0x00-0xFE, deren unterstes Bit intern durch 
das R/W-Bit ersetzt wird. Nach dieser Konvention arbeitet der 
Slave-Code.

Wenn also der Master gemäss 7+1-Bit Konvention die Adresse 0x10 sendet, 
dann ist das entsprechend der 8-Bit Konvention die Adresse 0x20. 
Folglich reagiert ein auf 0x10 konfigurierter Slave nicht.

von AVR-Anfänger (Gast)


Lesenswert?

Vielen Dank für den Hinweis.
Die Komunikation läuft jetzt Problemlos.

von AVR-Anfänger (Gast)


Lesenswert?

Eine Frage hätte ich noch.

Wenn ich andere Interupts nicht behindern will, kann ich dann Sei() und 
Cli() aus den USI-TWI Slave Funktionen entfernen indem ich stattdessen 
die TWI-Ereignisse über die Register gezielt deaktiviere / aktiviere?
Also anstatt Cli() USISIE und USIOIE im Register USICR auf Null und 
anstatt Sei() auf 1 setzen.
Oder gibt es einen besseren Weg?

von AVR-Anfänger (Gast)


Lesenswert?

Ich habe jetzt versuchsweise sei und cli in den TWI-Funktionen mit
USICR |= ((1<< USISIE)|(1<<USIOIE));/*sei();*/
und
USICR &= ~((1<< USISIE)|(1<<USIOIE));/*cli();*/
ersetzt.

Jetzt werden zwar keine Interrupt's beeinträchtigt, aber es gibt immer 
wieder das Problem, dass der Master keine Daten an den Slave schicken 
kann.
(Ca. bei 10% der Sende-Versuche bekomme ich einen Fehler.)
Das Senden der Daten vom Slave an den Master hingegen funktioniert ohne 
größere Probleme.

Weis jemand woran das liegen könnte?

von AVR-Anfänger (Gast)


Lesenswert?

Ach kommt schon, so ungewöhnlich kann meine Frage doch nicht sein.

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.