Frage zu Atmel Ports und Richtung

A

Andreas Baier

Guest
Hallo,

Ich möchte einen DS1621 Temperatursensor an einem Atmel uC betreiben. Dieser
hat ein TWI Interface, d.h. ich muss an SDA lesen _und_ schreiben. Soweit so
gut.

Jetzt habe ich ein kleines Verständnisproblem: bei einem Atmel uC muss ich
bei der Initialisierung die Richtung (Input/Output) der Ports angeben. D.h.
ab dann ist mein Port Eingabe _oder_ Ausgabe - wie kann ich jetzt aber
abwechselnd lesen und schreiben? Kann ich die Richtung jederzeit ändern?

Gruß Andreas
 
Andreas Baier wrote:
Hallo,

Ich möchte einen DS1621 Temperatursensor an einem Atmel uC betreiben. Dieser
hat ein TWI Interface, d.h. ich muss an SDA lesen _und_ schreiben. Soweit so
gut.
Nicht nur das -- auch die SCL-Leitung ist Bidirektional. Lies mal den
I2C-Standard durch, die Salves können einen Clock-Impuls durch
low-halten der Taktleitung verlängern (Clock-Stretching).

Jetzt habe ich ein kleines Verständnisproblem: bei einem Atmel uC muss ich
bei der Initialisierung die Richtung (Input/Output) der Ports angeben. D.h.
ab dann ist mein Port Eingabe _oder_ Ausgabe - wie kann ich jetzt aber
abwechselnd lesen und schreiben? Kann ich die Richtung jederzeit ändern?
Klar, das geht jederzeit. Beim I2C Bus musst du die Daten sogar
zwangsläufig per Datenrichtungs-Register ausgeben, da der I2C-Bus ein
Open-Collector Bus ist. Der Atmel darf die Leitung nur auf 0V ziehen,
oder auf Eingang umschalten (Der externe Pull-Up Widerstand bringt die
Leitung dann wieder auf 5V).

Ich würde allerdings 'nen Stück fertigen Code dafür nehmen, warum sollte
man das Rad neu erfinden?

--
thomas.kindler@gmx.de
 
Hallo,

Ich möchte einen DS1621 Temperatursensor an einem Atmel uC betreiben. Dieser
hat ein TWI Interface, d.h. ich muss an SDA lesen _und_ schreiben. Soweit so
gut.

Jetzt habe ich ein kleines Verständnisproblem: bei einem Atmel uC muss ich
bei der Initialisierung die Richtung (Input/Output) der Ports angeben. D.h.
ab dann ist mein Port Eingabe _oder_ Ausgabe - wie kann ich jetzt aber
abwechselnd lesen und schreiben? Kann ich die Richtung jederzeit ändern?
Wenn du das TWI des AVR benutzt (aktivierst), werden die PORTx und
DDRx-Einstellungen ignoriert - die jeweilige Hardware übernimmt dann die
Kontrolle über die Portleitungen.

Nur wenn du einen AVI ohne TWI benutzt (und TWI alias I2C emulierst),
musst du die Portleitungen selbst umschalten - und das geht jederzeit.

HTH, bye
Thomas.
 
Hallo,

Nein, erstmal will ichs nur "von Hand" machen - mit dem A90S8515, der hat
noch kein TWI.
Stimmt. Wie Thomas Kindler schon schrieb: Quelltext dafür
solltest du reichlich finden - vermutlich sogar bei Atmel selbst.

Weißt du zufällig, ob der DS1621 direkt I2C kompatibel ist?
Ich behaupte mal: ja, er benutzt I2C.

Bye,
Thomas.
 
Thomas Matern wrote:

Wenn du das TWI des AVR benutzt (aktivierst), werden die PORTx und
DDRx-Einstellungen ignoriert - die jeweilige Hardware übernimmt dann
die Kontrolle über die Portleitungen.
Nein, erstmal will ichs nur "von Hand" machen - mit dem A90S8515, der hat
noch kein TWI.

Nur wenn du einen AVI ohne TWI benutzt (und TWI alias I2C emulierst),
musst du die Portleitungen selbst umschalten - und das geht jederzeit.
Alles klar das wusste ich nicht.

Weißt du zufällig, ob der DS1621 direkt I2C kompatibel ist?

Gruß Andreas
 
Thomas Kindler wrote:
Andreas Baier wrote:
Hallo,

Jetzt habe ich ein kleines Verständnisproblem: bei einem Atmel uC
muss ich bei der Initialisierung die Richtung (Input/Output) der
Ports angeben. D.h. ab dann ist mein Port Eingabe _oder_ Ausgabe -
wie kann ich jetzt aber abwechselnd lesen und schreiben? Kann ich
die Richtung jederzeit ändern?

Klar, das geht jederzeit. Beim I2C Bus musst du die Daten sogar
zwangsläufig per Datenrichtungs-Register ausgeben,
Das ist mir jetzt wieder nicht ganz klar. Das DDR ist doch nur für die
Richtung zuständig, oder? Wie soll ich da Daten auf den Bus geben, und warum
über das DDR?

Ich würde allerdings 'nen Stück fertigen Code dafür nehmen, warum
sollte man das Rad neu erfinden?
Es soll ein bisschen lerneffekt dabei sein, deshalb. Aber fertigen Code
studiere ich auch gern, nur habe ich bisher nichts passendes gefunden.

Gruß Andreas
 
Andreas Baier wrote:

Das ist mir jetzt wieder nicht ganz klar. Das DDR ist doch nur
für die Richtung zuständig, oder? Wie soll ich da Daten auf den
Bus geben, und warum über das DDR?
Das hat mit der internen Beschaltung zu tun: Die AVR Eingänge
können zwischen Tristate und Bistate (interner Pullup verbunden)
umgeschaltet werden. Bistate wäre es wenn DDR=0 und PORT=1. Für
TWI brauchst Du Tristate. D.h. DDR=0 und PORT=0.

PORT:=0
DDR:=0 => der Bus ist offen und wird von den externen Pullups auf
5V gezogen.

DDR:=1 => Der AVR zieht den Bus aktiv auf 0V runter.

So einfach ist das.

Wolfgang Draxinger
--
 
Andreas Baier wrote:
Andreas Baier wrote:

Das ist mir jetzt wieder nicht ganz klar. Das DDR ist doch nur für die
Richtung zuständig, oder? Wie soll ich da Daten auf den Bus geben, und warum
über das DDR?
Wie gesagt: I2C ist Open-Collector. Die Busleitungen sind über einen
Pull-Up Widerstand mit Vcc verbunden. Die Geräte am Bus dürfen die
Leitung entweder auf 0V runter ziehen, _oder_ ihren Ausgang auf
hochohmig schalten. Wenn keines der Geräte am Bus eine 0 ausgibt, liegt
also durch den Pull-Up eine logische 1 an.

Und das Open Collector-Verhalten kannst du simulieren, indem du 'ne 0 in
das PORT Register schreibst, und dann mit dem DDR zwischen Ausgang (low
ausgeben, bus wird aktiv runtergezogen) und Eingang (pin ist hochohmig,
pullup sorgt ggf. für high-pegel) umschaltest.

Im Atmel-Datenblatt sind auch nochmal alle Kombinationen aus DDR und
PORT tabellarisch aufgelistet.

--
thomas.kindler@gmx.de
 
Willst du dir das alte Ding wirklich noch für neuen Code antun? ;-)

Ehrlich, mir wär' die Zeit zu schade dafür. Hardware-TWI geht doch
so einfach...
Es gibt Leute, die benutzen heute noch einen PIC16F84 für Neuentwicklungen
:)

Ich muss aber J"org rechtgeben - bei den neueren ATMEGAs ist TWI schon
fertig drin und außerdem wurden auch ein paar Probleme beseitigt, die die
ATClassics noch hatten, wie z.B. zu empfindlicher Reset-Eingang u.ä.

Mfg
Thomas Pototschnig
www.oxed.de
 
"Andreas Baier" <andreas-baier@web.de> schrieb:

Nein, erstmal will ichs nur "von Hand" machen - mit dem A90S8515,
der hat noch kein TWI.
Willst du dir das alte Ding wirklich noch für neuen Code antun? ;-)

Ehrlich, mir wär' die Zeit zu schade dafür. Hardware-TWI geht doch
so einfach...
--
cheers, J"org .-.-. --... ...-- -.. . DL8DTL

http://www.sax.de/~joerg/ NIC: JW11-RIPE
Never trust an operating system you don't have sources for. ;-)
 
Joerg Wunsch wrote:
"Andreas Baier" <andreas-baier@web.de> schrieb:

Nein, erstmal will ichs nur "von Hand" machen - mit dem A90S8515,
der hat noch kein TWI.

Willst du dir das alte Ding wirklich noch für neuen Code antun? ;-)
Naja, der ist noch übrig. Und den will ich jetzt noch sinnvoll verwenden...
Und IMHO müsste der seinen Dienst als Wetterstation noch ganz gut tun... Ein
Atmega16, den ich daheim noch rumliegen habe ist meiner Meinung nach etwas
oversized dafür...

Ehrlich, mir wär' die Zeit zu schade dafür. Hardware-TWI geht doch
so einfach...
Aber man würde wenigstens I2C im Detail kennenlernen.

Gruß Andreas
 

Welcome to EDABoard.com

Sponsor

Back
Top