Forum: Mikrocontroller und Digitale Elektronik USI_TWI_Master.c von Atmel


von MKr (Gast)


Lesenswert?

Guten Abend,
ich sitze gerade an der USI_TWI_Master aus der AVR310, um die für meine 
Zwecke zu adaptieren. Dabei bin ich über folgende Zeilen gestolpert:
1
PORT_USI |= (1<<PIN_USI_SCL);  // Release SCL.
2
...
3
PORT_USI |= (1<<PIN_USI_SDA);  // Release SDA.
Deren Zweck ist mir klar, nur frage ich mich, warum hier die Pins aktiv 
auf high gezogen werden? Es gibt ja die Pullups, die die Leitung 
eigentlich auf high ziehen, wenn der Pin nicht dran zieht. Deswegen 
würde ich an der Stelle erwarten, dass dort mit
1
DDR_USI &= ~(1<<PIN_USI_xxx);
die beiden Pins als Eingang geschaltet werden und dann der Pullup (der 
auch vorher aktiviert wurde) seine Arbeit tun kann. Das wäre zwar 
langsamer, aber dafür sind die Pullups ja da.
Und wenn bspw. ein Slave mittels Clock-stretching SCL auf low zieht und 
dann kommt mein Controller und schaltet seinen Ausgang nach high...gibt 
einer der beiden Pins eher früher als später auf. Warum hier also diesen 
unsicherer Weg anstelle des sicheren Weges beschreiten?

: Verschoben durch Moderator
von Knut (Gast)


Lesenswert?

Wenn du die USI mit dem USI Control Register in den 2-, oder
3-Wire Mode geschaltet hast, arbeiten die entsprechenden Port-
Pins im oC (open Collector) Mode.
Und wenn die nicht 0 = aktiv Null sein sollen, brauchen sie eine
1 = Hi-Z.

Steht jedenfalls im Datenblatt so...

von MKr (Gast)


Lesenswert?

OK. Den Teil hab ich gelesen, aber wohl nicht ganz für voll genommen, 
dass da die Ausgangsstufe gewechselt wird (bzw der high-side-Fet 
vielleicht nur nicht mehr angesteuert wird)
Danke

von MKr (Gast)


Angehängte Dateien:

Lesenswert?

Ich habe mir jetzt meine Bibliothek geschrieben (USI_I2C_Master.c/.h) 
und mir ein kleines Testprogramm geschrieben, dass einfach jede Sekunde 
einen um 1 inkrementierten Wert senden soll (main.c).
Ich muss leider feststellen, dass SCL fleißig taktet, SDA bewegt sich 
aber nicht.
Lasse ich den SDA-Pin manuell togglen, dann tut er es, sowohl mit
1
PINA |= 1<<6;
als auch mit
1
I2CinitM();
2
while(19{
3
    PORT_USI |= 1<<USI_SDA;
4
    _delay_us(20);
5
    PORT_USI &= ~(1<<USI_SDA);
6
    _delay_us(20);
7
}
Der Pin ist also i.O.,meine #defines passen und auch als USI 
konfiguriert funktioniert der Pin.

Im eigentlichen Programm rührt sich SDA wie gesagt überhaupt nicht. 
Nicht für die Start Condition und auch danach nicht.
Geschrieben und compiliert habe ich das Ganze mit Atmel Studio 7, 
Controller ist ein ATtiny24A.

Ich wäre sehr dankbar, wenn sich jemand die Mühe machen und mir helfen 
würde.

von Oliver S. (oliverso)


Lesenswert?

Externe pull ups sind aber vorhanden, oder? Du setzt zwar die internen, 
aber

"The SDA and SCL pin inputs is not affected by enabling this mode. 
Pull-ups on
the SDA and SCL port pin are disabled in Two-wire mode."

Oliver

von MKr (Gast)


Lesenswert?

Dann ergeben sich für mich aber 2 Fragen:
1. Warum aktiviert Atmel die internen Pullups in seinem AVR310-Code?
2. Wenn die Pullups deaktiviert sind, warum ist SDA dann dauerhaft auf 
high, obwohl es entweder nach low gezogen wird oder "in der Luft hängt"?

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

MKr schrieb:
> Warum aktiviert Atmel die internen Pullups in seinem AVR310-Code?

Selbst wenn: die sind sowieso zu "dünn" für eine vernünftige 
I²C-Funktion. Du brauchst da immer externe, so 4,7 oder 10 kΩ sind 
üblich.

von MKr (Gast)


Lesenswert?

Habe jetzt externe Pullups 5k6 ergänzt und die internen deaktiviert 
gelassen: keine Änderung

von Oliver S. (oliverso)


Lesenswert?

MKr schrieb:
> Dann ergeben sich für mich aber 2 Fragen:

Durchaus berechtigt ;)
Das mit den pull ups steht leider so im Datenblatt.

Dafür, daß
1
PORT_USI &= ~(1<<USI_SDA);

in deinem Testprogramm funktioniert, in der Startfunktion aber nicht, 
gibt es wenig Erklärungen.

Oliver

: Bearbeitet durch User
von MKr (Gast)


Lesenswert?

Jörg W. schrieb:
> Selbst wenn: die sind sowieso zu "dünn" für eine vernünftige
> I²C-Funktion. Du brauchst da immer externe, so 4,7 oder 10 kΩ sind
> üblich.

Mit Arduinos habe ich bis jetzt nie Probleme mit den internen und I2C 
gehabt. Mit blanken Controllern habe ich I2C bis jetzt noch nicht 
benutzt

von MKr (Gast)


Lesenswert?

Oliver S. schrieb:
> Durchaus berechtigt ;)
> Das mit den pull ups steht leider so im Datenblatt.

Ist richtig, habe es gefunden

von Oliver S. (oliverso)


Lesenswert?

MKr schrieb:
> Mit Arduinos habe ich bis jetzt nie Probleme mit den internen und I2C
> gehabt.

Nur haben die halt keine Tinys mit USI.

Oliver

von MKr (Gast)


Lesenswert?

Ich habe das ganze jetzt noch mal mit einem ATtiny26 probiert. Auch hier 
zuckt SCL wie es soll, SDA rührt sich dagegen nicht.
Hat vielleicht noch jemand eine Idee, woran es liegen könnte?

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.