mikrocontroller.net

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


Autor: Egon Müller (kpc)
Datum:

Bewertung
0 lesenswert
nicht 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:
// init SCL and SDA with pull-ups
DDRC &= (~(1<<SCL) | (1<<SDA));
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

Autor: Oliver (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Egon Müller (kpc)
Datum:

Bewertung
0 lesenswert
nicht 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

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.