Gibt es irgendwo eine kompakte Libary für die D18B20? Habe mir die von Peter bereits angeschaut und finde die doch recht komplex und würde einige Zeit benötigen, diese entsprechend abzuspecken. Ich habe am Attiny84 ein LCD16x2 angeschlossen und möchte nun über die freien Ports noch D18B20 anschließen. Ausreichend wäre ein Sensor, optimal bis zu 5 Stück auf einem Bus. Bislang habe ich ausser der Lib von Peter Dannegger habe ich bereits http://www.sicklinger.com/atmel-avr-atmega-ds18x20-library-in-c.html getestet. Diese scheint aber nicht D18B20 sondern nur DS18B20 kompatibel zu sein. Bei Zimmertemperatur gibt dieser mir für zweit auf dem Breadboard befestigten Sensoren -73 und -69 aus. So kalt hab ichs dann doch nicht. Die Sensoren reagieren auf Erwärmung bereits. Die Suche selber spuckt hier nichts zu D18B20 aus, nur DS18B20.
:
Bearbeitet durch User
Stefan S. schrieb: > Gibt es irgendwo eine kompakte Libary für die D18B20? Habe mir die von > Peter bereits angeschaut und finde die doch recht komplex und würde > einige Zeit benötigen, diese entsprechend abzuspecken. Erstmal: Gibts wirklich einen Unterschied zwischen D18B20 und DS18B20? (gibts überhaupt einen D18B20?) Meines Wissens nach gibts entweder DS18S20 (9 Bit) und DS18B20 (12Bit), der "originalen" DS1820 (ohne S/B zwischen 18 und 20) ist praktisch ausgestorben. An Peters Code gibts (wie üblich) nicht mehr viel abzuspecken; allerdings ist der doch schon in die Jahre gekommen, damals gabs offensichtlich noch keine _delay_us / _delay_ms Funktionen, und die Timings haben sich bei neueren Chips etwas verschoben. ich hab erst kürzlich sowohl DS18S20 als auch B20 an einem ATmega328P erfolgreich in betrieb genommen, ich kann den Code (der auf Peters Code basiert) gerne posten.
Michael Reinelt schrieb: > Meines Wissens nach gibts entweder DS18S20 (9 Bit) und DS18B20 (12Bit), > der "originalen" DS1820 (ohne S/B zwischen 18 und 20) ist praktisch > ausgestorben. DALLAS 18B20, ich hatte vorhin einen zweiten Edit gemacht, irgendwie hat er den nicht gespeichert, da hatte ich das noch als Fußnote gerade gebogen > An Peters Code gibts (wie üblich) nicht mehr viel abzuspecken; > allerdings ist der doch schon in die Jahre gekommen, damals gabs > offensichtlich noch keine _delay_us / _delay_ms Funktionen, und die > Timings haben sich bei neueren Chips etwas verschoben. > > ich hab erst kürzlich sowohl DS18S20 als auch B20 an einem ATmega328P > erfolgreich in betrieb genommen, ich kann den Code (der auf Peters Code > basiert) gerne posten. Bei Peters Variante habe ich lange in dem Beitrag hier im Forum gescrollt, jedoch keine neue Version seinerseits gefunden. Soll angeblich einen Bug bei negativen Zahlen haben. Beinhaltet dein Code bereits diesen Fix? Temperaturbereich ist für den Anfang bei 20 - 60° geplant. Der Dallas ist Teil eines kleinen Gadgets. Attiny84 + 16x2Display, welches die Durchschnittstemperatur sowie Min Max und Aktuell ausgeben soll für 1 - n Sensoren. Bis auf den Dallas ist alles soweit eingebaut.
Stefan S. schrieb: > Soll > angeblich einen Bug bei negativen Zahlen haben. > > Beinhaltet dein Code bereits diesen Fix? Wenn ich das richtig verstehe, tritt das problem mit negativen Werten nur in dem print-aufruf auf:
1 | sprintf( (char*)s, "%3d.%01dC", temp >> 4, (temp << 12) / 6553 ); |
und das verwende ich so nicht. ich kann allerdings momentan nicht garantieren dass ich Temperaturen unter 0° korrekt auswerte, momentan hab ich den Aufbau nciht zur verfügung, um ihn in den Tiefkühler zu geben (und Kältespray ist auch grad keins im haus)
Michael Reinelt schrieb: > Wenn ich das richtig verstehe, tritt das problem mit negativen Werten > nur in dem print-aufruf auf: So ist es, für den Kommateil braucht man eine Fallunterscheidung. Will man sich das sparen, gibt man den Wert einfach als float aus.
Peter Dannegger schrieb: > Michael Reinelt schrieb: >> Wenn ich das richtig verstehe, tritt das problem mit negativen Werten >> nur in dem print-aufruf auf: > > So ist es, für den Kommateil braucht man eine Fallunterscheidung. > Will man sich das sparen, gibt man den Wert einfach als float aus. Genau das mach ich schon in meiner "Lib", da ich den Wert anschließend sowieso als float brauche. Hat noch den angenehmen Nebeneffekt, dass ich Fehler gleich als NAN im Rückgabewert codieren kann. Lässt sich aber einfach ändern (wenn man lieber einen int als Rückgabewert hätte) Stefan, soll ich meinen Code nun hier reinstellen?
:
Bearbeitet durch User
Gern. Aufbau steht bei mir, könnte denn nach der Einbindung auch mal in der Gefriertruhe kurz testen, ob da ansatzweise -18C rauskommt.
Here you are... Beispielhafte Verwendung:
1 | // enumerate 1-Wire Devices
|
2 | while (1) { |
3 | uart_printf("enumerating 1-Wire Devices:\n"); |
4 | uint8_t id[8]; |
5 | uint8_t next = 0xff; |
6 | uint8_t count = 0; |
7 | do { |
8 | next = w1_enumerate(next, id); |
9 | if (next == 0xff) { |
10 | uart_printf("1-Wire Bus Error!\n"); |
11 | break; |
12 | }
|
13 | uart_printf("#%d: ID %02x-%02x-%02x-%02x-%02x-%02x-%02x-%02x\n", count, id[0], id[1], id[2], id[3], id[4], id[5], id[6], id[7]); |
14 | count++; |
15 | } while (next != 0x00); |
16 | uart_printf("\n"); |
17 | _delay_ms(1000); |
18 | }
|
Wenn man dann die Id's seiner Sensoren hat, kann man die auslesen:
1 | uint8_t id[8] = { 0x28, 0x56, 0x69, 0x5e, 0x05, 0x00, 0x00, 0x98 }; |
2 | float ds1820_temp = w1_measure(id); |
3 | uart_printf("DS1820: %.3f\n", ds1820_temp); |
Wenn die Messung fehlschlägt (weils die id nicht gibt, oder ein bus-Feher auftritt, oder...) wird NAN zurückgegeben, das kann man mit "isnan(ds1820_temp)" abfangen. ACHTUNG: w1_measure wartet nicht auf eine fertige messung! Es liest das Scratchpad aus, und startet danach eine messung. Das heisst, jeder aufruf von w1_measure() liefert eigentlich das Ergebnis der vorhergehenden Messung! Daher empfielt es sich in der Praxis, vor der Hauptschleife eine Dummy-messung durchzuführen. Normalerweise wird man ohnehin recht oft messen, und die messergebnisse noch durch einen PT1-Filter jagen...
Sorry für die "komische" Formatierung... offensichtlich mag die "Codeansicht" meine tabs nicht (obwohl ich meinen Code immer durch gnu-indent jage)
Michael Reinelt schrieb: > An Peters Code gibts (wie üblich) nicht mehr viel abzuspecken; > allerdings ist der doch schon in die Jahre gekommen Wer, Peter ?
:
Bearbeitet durch User
Marc Vesely schrieb: > Michael Reinelt schrieb: >> An Peters Code gibts (wie üblich) nicht mehr viel abzuspecken; >> allerdings ist der doch schon in die Jahre gekommen > > Wer, Peter ? LOL :-) Von Peter weiss ich's nicht, aber nachdem sein Code aus 2004 (?) ist, und der Code nicht gerade wie von einem 14jährigen aussieht, wird Peter wohl keine 21 mehr sein :-)
Hallo, danke, das Beispiel geht. Zumindest wird mir jetzt eine Temp von ~22°C angezeigt. Werde den Sketch nun mal säubern und das Ergebnis nachher hier reinstellen.
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.