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.
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
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
er meinte vermutlich, dass man die spannung nicht aus dem mega ziehen sollte, sondern zumindest extern hochzieht...
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.
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.