Forum: Mikrocontroller und Digitale Elektronik DS18B20 auslesen wird immer langsamer.


von Tom P. (booner)


Lesenswert?

Hallo Leute,

ich lese bis zu 80 Stück DS18B20 an einem einzigen Bus aus.
Pro Zyklus einen Sensor. Nun dachte, ich dass es pro Sensor immer gleich 
lange dauert. Pustekuchen!
Die ersten zehn Sensoren gehen schnell (Gefühlt innerhalb von 100ms),
dann wird es immer langsamer, bis die letzten Sensoren schon eine 
Sekunde oder länger pro Sensor benötigen.

µC ist ein Atmega328
Programmierumgebung Ardunio 1.01
Onwire.h
DalllasTemperature.h und
SPI.h
sind included.
1
void loop(void)
2
{ 
3
  if (millis() - lastTempRequest >= delayInMillis) // waited long enough??
4
  {
5
   switch (Schreiben) {
6
      case 0:
7
      digitalWrite(13, HIGH);
8
      Temperature = sensors.getTempCByIndex(Sensor_Counter);
9
      if (Temperature>40){
10
       Serial.print(Sensor_Counter);
11
       Serial.print(": T:"); 
12
       Serial.print(Temperature);
13
       Serial.print(" Serie:");
14
       sensors.getAddress(tempDeviceAddress, Sensor_Counter);
15
       Serial.print(sensors.getHighAlarmTemp(tempDeviceAddress),DEC);  
16
       }
17
      Sensor_Counter++;
18
      if (Sensor_Counter >= sensors.getDeviceCount()) // Wenn alle Sensoren durch, dann requeste neue Temperatur
19
      {
20
         Schreiben=1;
21
         Sensor_Counter=0;
22
      }
23
     break;
24
   
25
     case 1: // Temperaturmessung anstoßen
26
      sensors.requestTemperatures(); 
27
      lastTempRequest = millis(); 
28
      Schreiben=0;
29
      digitalWrite(13, LOW);
30
     break;
31
   
32
     default:
33
      Schreiben=0;  
34
    }
35
  }  
36
}

Vielleicht hat jemand von Euch eine Idee woran das liegen könnte?
Das Problem dabei:
Ich möchte zugleich einen Modbus-Slave auf dem µC laufen lassen.
Wenn der nicht innerhalb z.b. 200ms antwortet, gibts nen Timeout.

Vielen Dank schon mal fürs drüber schauen!

Grüße,

TOm

von Cyblord -. (cyblord)


Lesenswert?

Ja wenn man ein solch großes Projekt (80 Sensoren!!!) mit Arduino und 
ner fremden Lib hochzieht, dann muss man sich halt damit abfinden was 
die lib so macht. Man kann ja eine fertige OW lib nehmen, aber die 
Sensorabfrage würde ich in solch einem Fall sicher NIEMALS aus der Hand 
geben. Selber machen, dann weiß man was passiert und kann auf die 
eigenen Anforderungen optimieren.

Aber du nutzt fertiges Zeug und andere sollen jetzt darin rumkramen und 
schauen warum es nicht das tut was du willst? Klar doch.

gruß cyblord

von Tom P. (booner)


Lesenswert?

Hei,

cyblord vielen Dank fürs lesen.
Ich hab von keinem verlangt, darin rumzukramen.
Ich habe nur darum gebeten, falls einer nen Hinweis hat.

Auch habe ich schon Stunden über der "fremden" Bibliothek verbracht und 
nicht einfach schnell ne Frage ins Forum geschmissen.

ABER: Ich bin halt noch ziemlicher Anfänger, was die µC Programmierung 
angeht. Dafür klappt es aber schon erstaunlich gut, was ich mir so 
vornehme.
Modbus läuft, Sensoren auslesen läuft, dRGB-Led ansteuern läuft...
Ist halt nur noch das kleine Problem mit der Anzahl der Sensoren.

Also lehn dich zurück, genieße das Leben und nimms mal ein wenig 
lockerer...

Hier noch ein Link auf die DallasTemperature.cpp, fall es sich doch 
jemand antun will:
http://code.google.com/p/dallas-temperature-control-library/source/browse/trunk/DallasTemperature.cpp?r=5


Grüße,

Tom

von Peter D. (peda)


Lesenswert?

Ich kann mit Deinem Code auch nichts anfangen.
Ich sehe nur einen Haufen unbekannter Funktionen und Variablen 
unbekannten Typs und nichts davon ist kommentiert.

Daß es immer langsamer wird, kann daran liegen, daß die Sensoren immer 
per ROM-Search durchgezählt werden.
Will man einen bestimmten Sensor auslesen, ohne dessen Adresse zu 
kennen, dann adressiert man quasi alle vorherigen Sensoren und das 
dauert eben.

Will man aber alle auslesen, dann gibt man sie einfach der Reihe nach 
aus, d.h. das ROM-Search adressiert immer den nächsten.
Es muß dafür 2 Funktionen geben:
"ROM-Search-first" liest den ersten Sensor und:
"ROM-Search-next" dann immer den folgenden.
Genaueres sollte in der Doku zu der Arduino-Lib stehen.

Und "Loop" ist ein schlechter Name für eine Funktion, die keine Loop 
enthält, das ist irreführend.


Peter

von Tom P. (booner)


Lesenswert?

Hallo Peter,

ich glaube, Du hast mich da auf eine heisse Spur gebracht!
1
// finds an address at a given index on the bus
2
// returns true if the device was found
3
bool DallasTemperature::getAddress(uint8_t* deviceAddress, uint8_t index)
4
{
5
  uint8_t depth = 0;
6
7
  _wire->reset_search();
8
9
  while (depth <= index && _wire->search(deviceAddress))
10
  {
11
    if (depth == index && validAddress(deviceAddress)) return true;
12
    depth++;
13
  }
14
15
  return false;
16
}

Diese Funktion wird bei jedem Mal Sensor-Auslesen aufgerufen.
Ich hab sie zwar noch nicht ganz kapiert, scheint aber so wie Du 
schreibst, dass er da erstmal alle Sensoren durchgeht, bis er die 
passende Adresse findet.

Ich werde jetzt einfach mal zu Beginn meines Programms alle gefundenen 
Adressen in ein Array speichern, (sofern soviel Speicher zur 
Verfügung...) und dann nur noch mit den Adressen statt den Indexes 
arbeiten.

Melde mich, wenn ich es ausprobiert habe.
Schon mal vielen Dank!


Grüße,

Tom

von bernd59 (Gast)


Lesenswert?

Hallo,

Sind für alle Sensoren die gleiche Auflösung eingestellt?

Bernd

p.s.

Für Fragen mit dem Arduino würde ich lieber das deutschsprachige 
Arduino-Forum nutzen.
http://arduino.cc/forum/index.php/board,31.0.html
Da sind sie auch netter:)

von Tom P. (booner)


Lesenswert?

Hallo Bernd,

hast ja eigentlich recht. ;-)
(Mit dem Forum)

Ja alle Sensoren sind auf 12bit eingestellt.
Wenn alle die gleiche Temperatur haben,
(Was wirklich schwierig ist!) dann weichen die Werte gerade mal so 0,2K 
von einander ab. Bin begeistert, wie genau die Sensoren sind.


Grüße,

Tom

von Cyblord -. (cyblord)


Lesenswert?

bernd59 schrieb:

> Da sind sie auch netter:)
Aber können halt nix:
social skills don't pay any bills

gruß cyblord

von Peter D. (peda)


Lesenswert?

Tom P. schrieb:
> Diese Funktion wird bei jedem Mal Sensor-Auslesen aufgerufen.

Es hindert Dich niemand daran, sie nicht zu benutzen.
Du brauchst immer nur einen Paß aufrufen und dann den adressierten 
Sensor auslesen.
Es ist schon ein deutlicher Unterschied, ob man n * die Zeit braucht 
oder n*(n+1)/2.

Hier mal ein Code ohne die A-Lib:

Beitrag "DS1820, DS18B20 in C"


Peter

von Tom P. (booner)


Lesenswert?

Peter Dannegger schrieb:
> Tom P. schrieb:
>> Diese Funktion wird bei jedem Mal Sensor-Auslesen aufgerufen.
>
> Es hindert Dich niemand daran, sie nicht zu benutzen.

Doch! Mein Unwissen hat mich dran gehindert. :-)
Problem erkannt, Problem gebannt. So hoffe ich zumindest.
Vielen Dank Peter, für den Hinweis!
Dafür ist doch ein Forum super, dass man mal andere Sichtweisen 
aufgezeigt bekommt.
Manche Stänkerer sind halt dabei, aber die kann man ja einfach 
"überlesen"... ;-)


Grüße,

Tom

von Tom P. (booner)


Lesenswert?

Hei,

danke Bernd und vor allem Peter.
Jetzt fetzt es.
Bis aufs erste Mal Adressen auslesen und abspeichern.
Aber "langes booten" ist man ja von Windows gewohnt LOL


Dann steht meinem "großen Projekt (80 Sensoren!!!) " ja nichts mehr im 
Wege.
Hehe, naja soo groß ist das nun auch wieder nicht...


Grüße,

Tom

von Henrik W. (skudderon)


Lesenswert?

Hallo,

ich bin ganz neu hier und über die Suche nach DS18B20 und 1-wire auf 
diesen Threat gestoßen. Ich weiß der ist eigentlich Steinzeit aber ich 
steh grad vor der selben Herausforderung.
Vielleicht ist Tom so nett und zeigt mal die Lösung? :)

Vielen Dank im Voraus

Henrik

von Tom P. (booner)


Lesenswert?

Hei,

na die Lösung steht doch schon ein paar Beiträge weiter oben!
Beitrag "Re: DS18B20 auslesen wird immer langsamer."


Grüße,

Tom

von Henrik W. (skudderon)


Lesenswert?

Danke für die schnelle Antwort Tom :)

Ich meinte diesen Abschnitt:
"Ich werde jetzt einfach mal zu Beginn meines Programms alle gefundenen
Adressen in ein Array speichern, (sofern soviel Speicher zur
Verfügung...) und dann nur noch mit den Adressen statt den Indexes
arbeiten."

Viele Grüße
Henrik

von Tom P. (booner)


Lesenswert?

Hei,

genau das ist die Lösung. Mach es doch auch so.
Den Code dazu habe ich leider nicht mehr zur Hand.
Aber da war ich noch blutiger Anfänger und habe das geschafft.
Kann also nicht schwierig gewesen sein. ;-)


Grüße,

Tom

von Henrik W. (skudderon)


Lesenswert?

Danke

von Patrick J. (ho-bit-hun-ter)


Lesenswert?

Hi

Das ist aber doch 'Quatsch' - wenn ich Das Mal so nennen darf.
Im Datenblatt der Sensoren sollte enthalten sein, wie man den ROM_Search 
benutzt.
Diese Funktion richtig angewendet findet IMMER den NÄCHSTEN Sensor - 
wenn's keinen Hinteren mehr gibt, wird der Erste wieder gefunden.
(zumindest in meinem in in ASM auf einem ATtiny45 nachgebautem Programm)

Hat natürlich auch einen Nachteil:
Man weiß nie, Welcher Sensor wann an die Reihe kommt (da die Reihenfolge 
sich aus den IDs ableitet, die Richtung aber 'verkehrt herum' ist.
Theoretisch müssten die IDs, binär notiert und umgedreht, dann sortiert, 
die Reihenfolge der Funde ergeben - habe ich mir gerade zusammen gereimt 
(also ungetestet, klingt aber recht gut).
Nebenbei würfelt es Dir die Reihenfolge durcheinander, wenn Du einen 
neuen Sensor einsetzt oder ein Sensor getauscht werden muß - dann sogar 
2x!!

Selber habe ich angedacht, in den User-Bytes eine Sensor-ID und einen 
Korrekturwert einzutragen -ä da die Sensoren zwar 1/16tel °C Auflösung 
haben, aber (glaub) nur 0,5°C Genauigkeit.
Wenn man jetzt die Abweichung zu einem Master-Sensor in den 
Slave-Sensoren einträgt, kann man Diese immer Korrekturrechnen.
Auch kann man dann gezielt Sensoren austauschen - der Getauschte braucht 
'nur' die gleiche ID wie der Auszutauschende.

Und - man sucht zwar immer noch die I2C-IDs durch, selektiert aber nach 
der enthaltenen ID.

Sollte Das Alles nicht zu Deinem Problem passen - hast Du vll. bei den 
'hinteren Sensoren' die volle Auflösung (12bit) und bei den schnellen 
'Vorderen' vll. nur 9bit?

MfG

: Bearbeitet durch User
von Forist (Gast)


Lesenswert?


von c-hater (Gast)


Lesenswert?

Cyblord -. schrieb:

> social skills don't pay any bills

Cooler Spruch, muss ich mir unbedingt merken.

Wobei es konkret natürlich nicht unbedingt um die Kohle geht, sondern 
einfach darum, dass erzwungenen "nette Umgangsformen" de facto nix 
anderes sind als Vernichtung von Information.

Das nützt niemandem! Das Problem ist halt nur, dass gerade die Doofen 
das nicht begreifen können...

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.