Forum: Mikrocontroller und Digitale Elektronik Vereinfache/Kompakte Libary für D18B20


von Stefan S. (sschultewolter)


Lesenswert?

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
von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

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.

von Stefan S. (sschultewolter)


Lesenswert?

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.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

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)

von Peter D. (peda)


Lesenswert?

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.

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

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
von Stefan S. (sschultewolter)


Lesenswert?

Gern. Aufbau steht bei mir, könnte denn nach der Einbindung auch mal in 
der Gefriertruhe kurz testen, ob da ansatzweise -18C rauskommt.

von Michael R. (Firma: Brainit GmbH) (fisa)


Angehängte Dateien:

Lesenswert?

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...

von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

Sorry für die "komische" Formatierung... offensichtlich mag die 
"Codeansicht" meine tabs nicht (obwohl ich meinen Code immer durch 
gnu-indent jage)

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

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
von Michael R. (Firma: Brainit GmbH) (fisa)


Lesenswert?

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 :-)

von Stefan S. (sschultewolter)


Lesenswert?

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
Noch kein Account? Hier anmelden.