Forum: Compiler & IDEs wie Ports bei I2C / TWI setzen?


von Egon M. (kpc)


Lesenswert?

Hallo,

wenn man für einen Atmega644 nicht das TWI_Master.c bzw. .h verwenden, 
sondern die Register selbst setzen möchte - gibt es da einen Hinweis, 
wie man DDRC setzen muß?
Der AVR soll nur als Master betrieben werden, also kann der SCL-Port als 
Ausgang gesetzt werden.
Anders der SDA-Port, der für acht Bits als Ausgang, für das neunte ACK / 
NOT ACK - Bit als Eingang geschaltet werden müßte.

Wenn man das selbst macht, wäre das machbar, aber irgendwo bei Google 
habe ich gefunden:
1
// init SCL and SDA with pull-ups
2
DDRC &= (~(1<<SCL) | (1<<SDA));
3
PORTC |= (1<<SCL) | (1<<SDA);

Kann man denn die Ports so summarisch setzen? Jedenfalls wird im Rest 
des Programms (=TWI_Master.c) das DDRC nirgends mehr erwähnt, d.h., die 
Einstellung bleibt so.

(das interessiert mich deshalb so sehr, weil mein PCF8574A noch kein ACK 
sendet).

Und noch eine Frage hätte ich zu dem TWI-Statusregister:
Lt. Manual S.213 dachte ich, man könne einfach schreiben
if ((TWSR == 0x08) ... ?
In TWI_Master.c finde ich
if ((TWSR & 0xF8) == 0x08).  Muß das so sein?

Viele Grüße
Egon

von Oliver (Gast)


Lesenswert?

Du musst zwischen hard- und Software-TWI unterscheiden. Nutzt du die im 
AVR eingebaute Hardware-TWI-Einheit, dann steuert die die Pins selber, 
das Datenrichtungsregister DDRx hat für die beiden Pins dann keine 
Funktion.

Der Codeauschnitt stammt vermutlich von einer 
Software-TWI-Implementierung, bei der alles "von Hand" gemacht wird. Da 
sind die Pins normale I/O-Pins, und du musst dich selber um Pegel und 
Richtung kümmern.

Aber bevor du zu lange an der falsche Stelle suchst: Wenn du die TWI.c 
von Peter Fleury nutzt (was ich vermute), dann verlass dich einfach 
darauf. Die funktioniert nachgewiesenermassen, auch mit einem 8574.

Frage: Welche Adresse hast du dem 8574 gegeben, und welcher Wert steht 
in deinem Programm?

Oliver

von Michael U. (amiga)


Lesenswert?

Hallo,

Egon Müller schrieb:
> Der AVR soll nur als Master betrieben werden, also kann der SCL-Port als
> Ausgang gesetzt werden.

Das stimmt so nicht. Der Slave darf jederzeit den Takt verlängern, indem 
er ihn auf L hält, wenn er intern mehr Zeit haben will.

I2C verlangt nach OpenDrain/Opencollector mit PullUp.
Beim AVR wird das am einfachsten bei Software-I2C damit erreicht, daß 
man ins Port eine 0 schreibt und den Zustand mit dem DDR steuert.

Pin ist Eingang: externer PullUp zieht Leitung auf H, Slave kann auf L 
ziehen, ist entweder H vom Master oder Gelegenheit, Daten vom Slavr zu 
lesen.
Für Ausgang L das DDR auf Ausgang setzen und der Port zieht mit aktiv L 
die Leitung auf L.

Gilt für SDA und SCL.

Gruß aus Berlin
Michael

von Egon M. (kpc)


Lesenswert?

Michael U. schrieb:
> Hallo,
>
> Egon Müller schrieb:
>> Der AVR soll nur als Master betrieben werden, also kann der SCL-Port als
>> Ausgang gesetzt werden.
>
> Das stimmt so nicht. Der Slave darf jederzeit den Takt verlängern, indem
> er ihn auf L hält, wenn er intern mehr Zeit haben will.

Ich weiß, aber mein Slave ist ein LCD, das soll sich mal unterstehen, 
mit der zugemessenen Zeit nicht auszukommen.

Ich habe Olivers Empfehlung befolgt:

Oliver schrieb:
>
> Aber bevor du zu lange an der falsche Stelle suchst: Wenn du die TWI.c
> von Peter Fleury nutzt (was ich vermute), dann verlass dich einfach
> darauf. Die funktioniert nachgewiesenermassen, auch mit einem 8574.
>
> Oliver

Es war zwar nicht Fleury's Code (oder vielleicht abgeschrieben), aber 
ich habe mir nun sein twimaster.c und Co besorgt und installiert.
Jetzt gelingt die Verbindung mit dem PCF8574A, er antwortet, wie es sich 
gehört und meine neu produzierte Hardware ist ohne Verkabelungsfehler!

Vielen Dank für Eure Hilfe

Gruß
Egon

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.