Forum: Mikrocontroller und Digitale Elektronik Bidirektionaler i/o Port deklarieren am ATMega


von Bomie (Gast)


Lesenswert?

Hallo zusammen,

bin seit einiger Zeit dabei meine ersten Gehversuche in C zu 
unternehmen.
Aktuell versuche ich Temperaturen ( DS18B20 ) über den 1 Wire Bus 
einzulesen.
Hier im Forum gibt es ja auch ein extrem gut dokumentiertes Projekt dazu 
( 1-Wire Projekt 1.3 ), welches ich auch durchgelesen und soweit 
verstanden habe.
Nun wird im diesem Projekt aber ein anderer Controller verwendet, wir 
ist zwar bewusst das ich "nur" den Pin der DQ Leitung unbenennen muss, 
jedoch weiß ich nicht wie ich das machen muss da der ja Bidirektional 
sein muss. Bisher habe ich Port immer nur als Ein- oder Ausgänge 
verwendet.

Habe das Forum hier schon durchforstet, jedoch noch keine Lösung hierzu 
gefunden.

Wäre wirklich super wenn einer mir helfen könnte.

Gruß

Bomie

von Peter II (Gast)


Lesenswert?

Bomie schrieb:
> Bisher habe ich Port immer nur als Ein- oder Ausgänge
> verwendet.

das ist doch die Lösung. Zum lesen musst du ihn als Eingang schalten und 
zum senden als Ausgang.

von Peter D. (peda)


Lesenswert?

1
Init:           Output-Bit auf Low setzen
2
Lesen:          Direction-Bit auf Input setzen, etwas warten, Pin einlesen
3
Schreiben high: Direction-Bit auf Input setzen
4
Schreiben low:  Direction-Bit auf Output setzen.

: Bearbeitet durch User
von Bomie (Gast)


Lesenswert?

Danke Peter,

wobei es mir eher darum geht die ich dieses auf einen ATMega ändere!
( ( unsigned char bit DQ  @  0xb4;      // Port-Pin P3.4 = b4h )  )

Da ja das Ausgang/Eingang wechseln über die Funktionen geregelt wird.

Gruß

von Frank K. (fchk)


Lesenswert?

Du kannst Dir auch das hier durchlesen:
http://www.atmel.com/images/doc2579.pdf

von Christian K. (the_kirsch)


Lesenswert?

1. Bei 1-Wire würde ich trotzdem eine extra Leitung für 
Versorgungsspannung machen und die nicht über die Datenleitung mit 
Energie Versorgen.

2. Die Ports beim AVR sind alle automatisch Bidirektionaler, da muss man 
nichts machen. Wenn du ein Ports als Ausgang schaltest kann man 
weiterhin den Eingang (PIN) abfragen.

Beispiel:
DDR ist auf OUT (1)
PORT ist auf HI (1)

Abfrage von PIN kann jetzt LOW (0) oder HI (1) sein, je nachdem ob die 
Signalleitung von einen anderen Teilnehmer auf GND gezogen wird oder 
nicht.


Bei 1-Wire sollte man aber einen externen PULL-UP Widerstand nehmen, der 
die Leitung in Ruhe auf HI-Pegel hält, unabhängig ob DDR auf IN oder OUT 
steht.

von U. C. (Gast)


Lesenswert?

Also, wenn man einen Pin auf Ausgang und High schaltet, und dann im 
PinRegister 0 lesen will, dann ist der Port voll (über)belastet. Und der 
gegnerische Port ebenfalls.

Nöö, das ist kein erstrebenswerter Zustand!

von U. C. (Gast)


Lesenswert?

Was willst du denn wissen?

Wobei ich glaube:
Im Grunde weißt du es doch schon!

Dein Pin, an dem der DS18B20 hängt, darf nur hochohmig(input), oder 
Low(output) sein.

Das heißt:
Der Zustand high(output) ist verboten
Genau so wie beim I2C Bus.

Und das erreichst du, wenn du das entsprechende PORT Bit auf 0 setzt und 
nur mit dem DDR Bit wackelst. Lesen dann per PIN Register.

von Wolfgang (Gast)


Lesenswert?

Christian K. schrieb:
> 1. Bei 1-Wire würde ich trotzdem eine extra Leitung für
> Versorgungsspannung machen und die nicht über die Datenleitung mit
> Energie Versorgen.

Gibt es dafür einen besonderen Grund? Prima funktionieren tut es auch 
über parasitäre Stromversorgung. Selbst der Hersteller ist der Meinung, 
dass das durchaus eine vernünftige Art der Stromversorgung ist. Einziger 
Nachteil ist, dass man nicht sieht, wann der Sensor mit der Wandlung der 
Temperatur beschäftigt ist. Aber das ist recht deterministisch.

von Peter D. (peda)


Lesenswert?

Bomie schrieb im Beitrag #4485838:
> Zu Faul definitiv nicht, zu dumm finde ich jetzt auch etwas unangebracht
> als Aussage.

Ja hier gibt es leider einige Meckerköppe, einfach ignorieren.

Was in C immer geht, sind Bitmasken:
Beitrag "DS1820, DS18B20 in C"

Man kann aber auch Bitfelder definieren und dann den Bitzugriff darüber 
machen:
http://www.avrfreaks.net/comment/711155#comment-711155

von Steven M. (8023)


Lesenswert?

er meinte vermutlich, dass man die spannung nicht aus dem mega ziehen 
sollte, sondern zumindest extern hochzieht...

von U. C. (Gast)


Lesenswert?

Steven M. schrieb:
> er meinte vermutlich, dass man die spannung nicht aus dem mega ziehen
> sollte, sondern zumindest extern hochzieht...
Der interne Pullup reicht sowieso nicht...
Also gibts da auch nix "aus dem Mega zu ziehen".

von Bomie (Gast)


Angehängte Dateien:

Lesenswert?

Hallo zusammen,
bin immer noch dabei mir die Zähne an meinen 1-Wire auszubeissen.
Jetzt habe ich aber leider immer noch ein Fehler und eine Warnung welche 
ich leider nicht behoben bekomme.

Als Grundgerüst dient mir das 1-Wire Projekt V1.3 hier aus dem Forum.
habe die Deklaration der Datenleitung von

usigned char bit @ 0xb4; auf unsigned char DQ = PB2; geändert und hoffe 
das das so passt.

Da das Projekt ursprünglich für einen anderen Controller bestimmt wahr, 
habe
ich die Lib dafür (AT89C51CC03 (Atmel)) nicht mit verwendet, weil ich 
auch nicht wusste wie ich hätte diese umschreiben müsste.

Ich selber verwende einen ATmega16, und Atmel Studio6.

Also hat jemand eine Idee zur Beseitigung der Fehler?

Vielen Dank für eure Hilfe.

Gruß

von Peter D. (peda)


Lesenswert?

Bomie schrieb:
> usigned char bit @ 0xb4; auf unsigned char DQ = PB2; geändert und hoffe
> das das so passt.

Ein Programmierer hofft nicht.
Er ändert erst was, wenn er die Änderung auch versteht.

Bomie schrieb:
> Also hat jemand eine Idee zur Beseitigung der Fehler?

Was gefällt Dir denn an den Pinzugriffen aus meinem obigen Link nicht?
Wenn Du den Code nicht komplett übernehmen willst, dann übernehme 
einfach nur die Pinzugriffe.

von Joachim B. (jar)


Lesenswert?

PB2 ist undefiniert, io.h oder Prozessortype vergessen?

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.