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
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.
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ß
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.
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!
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.
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.
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
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".
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ß
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.