Forum: Mikrocontroller und Digitale Elektronik 1 Wire mit Atmega328


von Michi M. (mutzmutz)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,

Ich stehe unglaublich auf dem Schlauch im moment, also bitte 
entschuldigt schon jetzt die Frage :-) ! Recherchiere schon ziemlich 
lange und werd mir immer unsicherer...

Ich beschäftige mich im moment mit dem 1 Wire Bus. Eigentlich ist mir 
alles klar bzw. ich werde mich noch in die Thematik einarbeiten, der 
Punkt wo ich schon jetzt nicht 100% sicher bin ist, was für 
anforderungen der Pin des Masters (ich würde gerne den ATmega328 
verwenden, da ich den noch rumliegen habe) haben muss. Nach meinem 
wissen muss es ein  I/O Pin mit open collector oder tristate sein (weil 
beim 1 wire extern ein pull up platziert werden muss) ?! Im datenblatt 
des ATmega328 steht bei den I/O's dass diese Konfigurierbar sind... aber 
das sind dann auch schon alle infos, die ich gefunden habe !? Irgendwas 
stimmt doch hier nicht :) ?!

kann mir jemand auf die sprünge helfen ?
vielen dank

von Tim (Gast)


Lesenswert?

Der AVR kann ein Pin
 1. auf 0 ziehen
 2. auf 1 ziehen
 3. in ruhe lassen
 4. Hochohmig auf 1 ziehen

1+2 ist ein normaler logic Ausgang.
Variante 3 für Eingänge (tristate),
die 4. wenn man eine Pullup habe möchte.

Wenn man Zwischen 1 und 3 umschaltet hat man einen
open collector.

Also PORT auf 0 und DDR umschalten.
Wobei dann DDR = 1 0V am Pin ergibt.

von Steffen Cölln (Gast)


Lesenswert?

Im Prizip ist es einfach. Die Busleitung ist eine über 
Pull-Up-Widerstand auf +5 Volt liegende Leitung. Alle Teilnehmer am Bus 
sind Open-Collektor-Ausgänge und ziehen den Bus auf GND. Deren Eingänge 
sollten, damit diese den Bus nicht auch ein bisschen runterziehen, 
CMOS-Eingänge sein. Kondensatoren auf dem Bus sind nicht erlaubt.

Wenn ein Teilnehmer eine Kommunikation einleiten will, legt er für eine 
bestimmte Zeit den Bus auf NULL -> Bus-Reset, dann sendet er als 
"Master" eine serielle Adresse an natürlich alle Teilnehmer und wartet 
danach eine bestimmte Zeit, bis sich der entsprechende Partner mit einer 
NULL für eine bestimmte Zeit meldet. Dann können diese Beiden sich 
"frei" unterhalten mit oder ohne Protokoll. Alle NULLen auf dem Bus sind 
recht kurz (usec), weil über dem Bus u.u. auch die Versorgung der 
Teilnehmer stattfindet. Und damit die Teilnehmer nicht in den 
"IDLE"-Mode (abgeschaltet gewesen) gehen, darf eine NULL eine bestimmte 
Zeit nicht überschreiten.

Wenn der Bus für längere Zeit konstant auf 5 Volt liegt, ist er frei für 
irgendeine andere Verbindung zwischen zwei Partnern.

Übrigens, der two-wire-bus (mit GND natürlich drei Leitungen) ist das 
gleiche, nur mit dem Unterschied, dass auf einer Leitung konstant 5 Volt 
liegen (Versorgung der periferen Teilnehmer). Macht mann wenn recht 
viele Teilnehmer am Bus hängen.

Ich hoffe, das bringt dich etwas weiter.

von Michi M. (mutzmutz)


Lesenswert?

im klartextr heisst das, dass ich den ATmega328 für den 1 wire bus 
verwenden kann ?!
Hab ich denn das falsche Datenblatt (siehe 1. Post), oder wo finde ich 
die befehlssätze, damit ich diese IO's konfigurieren kann ?
eine andere frage, gibt es bzw. kennt jemand eine bibliothek , wo 
"fertige" kommunikations- codes vorhanden sind ?

@steffen, der 2 wire bus ist also der 1 wire mit zusätzlicher 
speiseleitung (gleiches Protokoll ?)

vielen dank an beide !

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Michi M. schrieb:
> @steffen, der 2 wire bus ist also der 1 wire mit zusätzlicher
> speiseleitung (gleiches Protokoll ?)

1-Wire-Bus besteht aus einem gemeinsamen Postenzial (GND) einer 
Versorgungsspannung (+5V) und dem Datenbus. Da man Versorgungen nicht 
zählt, sagt man 1-Wire-Bus.

Man braucht nicht immer alle drei Leitungen, sondern kann teilweise auch 
auf einen sogenannten parasitären Modus ausweichen. Hierbei wird die 
Versorgungsspannung von dem Datenbus geholt (Gleichrichter, 
Kondensator).

Es bleibt aber immer der selbe 1-Wire-Bus (und kein 2-Wire).

Das 2-Wire-Interface (TWI) ist I2C. Da hast Du, neben der Versorgung und 
Masse, ein Taktsignal und ein Datensignal. Das Protokoll ist 
grundverschieden zum 1-Wire-Bus.

von Christian H. (netzwanze) Benutzerseite


Lesenswert?

Noch was:

Michi M. schrieb:
> im klartextr heisst das, dass ich den ATmega328 für den 1 wire bus
> verwenden kann ?!

Ja.
Es geht jeder AVR (und sicherlich auch PICs - kenne mich damit nicht 
aus).

> Hab ich denn das falsche Datenblatt (siehe 1. Post), oder wo finde ich
> die befehlssätze, damit ich diese IO's konfigurieren kann ?

Tim schrieb:
> Der AVR kann ein Pin
>  1. auf 0 ziehen
>  2. auf 1 ziehen
>  3. in ruhe lassen
>  4. Hochohmig auf 1 ziehen

Ich glaube schon, dass Du das richtige DB hast.

1 und 2 bedeutet, dass der Pin als Ausgang geschaltet wird.
3 und 4 auf Eingang. 3 = Pullup aus; 4 = Pullup ein.

Für 1-Wire schaltest Du die erforderlichen Signale mittels 
Datenrichtungsregister um - nicht über das Portregister.

PORT = 0
High bedeutet Pin in Ruhe lassen (also 3 = DDR auf Eingang)
Low  bedeutet Pin auf 0 ziehen (also 1 = DDR auf Ausgang)

Des weiteren ist noch ein Pullup-Widerstand notwendig.

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.