Forum: Mikrocontroller und Digitale Elektronik I2C Bus mit ATMEL USI


von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

Hallo Zusammen

Ich eröffne mal einen neuen Beitrag, da es im alten langsam ein 
Durcheinander gegeben hat, man weis gar nicht mehr genau, was überhaupt 
das Problem ist.

Also hier:

Ich bin dabei eine Verbindung mit einem I2C bus zwischen einem Attin45 
(Master) und einem Attiny85 (Slave) aufzubauen. Der Master macht die I2C 
Schnittstelle per Software. Beim Slave verwende ich das USI mit START 
und OVF Interrupt. Der Master_write_mode funktioniert, ich kann mehrere 
bytes zum Slave übertragen. Nun habe ich Probleme beim Master_read_mode. 
Slaveadresse kommt beim Slave an, und jetzt sollte der Slave ein byte 
zurück an den Master senden, geht aber irgendwie nicht. Ich weiss nicht 
genau, ob ich das DDRB Register richtig setzte, habe da schon mehrere 
Varianten versucht.

Ich probiere nun seit Tagen, aber ich sehe vor lauter Bäume den Wald 
nicht mehr
Wahrscheinlich ist es nur eine kleine Sache...

von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

So habe mal die ganze Sache mit dem Oszi angeschaut.

Startkondition, danach kommt &h31 beim Slave an.
Nun schalte ich SDA mit DDRB.0 = 1 auf output.  Wenn ich das jetzt 
richtig sehe, wird SDA  jedoch nur etwa 0.5 Takte auf output geschaltet.

Kennt sich damit jemand genauer aus ? Bin um jede Hilfe dankbar.

von Michael L. (nightflyer88)


Angehängte Dateien:

Lesenswert?

Mit dem bisherigen Code des Slaves, wurde das ACK nach dem empfangen der 
Adresse, nicht an Master gesendet.

Theoretisch sollte der Ablauf des Slaves doch so sein:
-START ISR, Counter auf 0 setzten
-wenn Counteroverflow, dann wurde die Adresse empfangen, nun ACK senden 
-> SDA auf Output, Counter = 14

wenn ich SDA auf Output setzte, geht SDA auf low, verlasse ich nun die 
OVF-ISR, geht SDA sofort wieder auf high. Ich kann also nicht einmal ein 
ACK vom Slave zum Master senden.

Im Datenblatt steht:
When the output driver is enabled for the SDA pin it will force the line 
SDA low if the output of the USI Data Register or the corresponding bit 
in the PORTB register is zero. Otherwise, the SDA line will not be 
driven (i.e., it is released).


Warum geht den SDA beim verlassen der ISR sofort wieder auf high ?

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.