Zur Übersicht - INFO - Neueste 50 Beiträge - Neuer Beitrag - Suchen - FAQ - Zum CC1-Forum - Zum CC-Pro-Forum

Re: Probleme beim DS2482-800 <-> DS18B20 Kategorie: I²C-Bus (von Dirk - 11.06.2009 19:01)
Als Antwort auf Re: Probleme beim DS2482-800 <-> DS18B20 von Dirk - 11.06.2009 14:50

> > Hallo Dirk,
> >
> > lt. Datenblatt des DS18B20 steht die Information nach tconv nach folgenden Zeiten
> > (abhängig von der Auflösung) zur Verfügung:
> >
> > Table 2. Thermometer Resolution Configuration
> > R1 R0 RESOLUTION(BITS) MAX CONVERSION TIME
> > 0    0    9                            93.75ms     (tCONV/8)
> > 0    1   10                           187.5ms     (tCONV/4)
> > 1    0   11                           375ms        (tCONV/2)
> > 1    1   12                           750ms        (tCONV)
> >
> > Dabei habe ich keinen Unterschied zwischen parasitärer und externer Stromversorgung gefunden.
> >
> > Der 100 Ohm Widerstand sollte sich zwischen IO-Port (direkt am DS2482)-800 und der 1 Wire Line
> > befinden. (laut Datenblatt von 2004)
> > Habe mir nochmal ein aktuelles Datenblatt ( von 2008) geladen, da taucht der
> >  "Line Terminaton Resistor"  leider nicht mehr auf. Warum auch immer.
> >
> > GruÃ?
> > Jörg
>
> Hallo Jörg,
>
> das Auslesen der 10 Sensoren funktioniert jetzt soweit, allerdings dauert das Auslesen
> ("Read" anschlieÃ?end "Convert") um die 2800ms
> => also fast 3 Sekunden
> Soweit kein Problem, wer braucht schon jede ms alle 10 aktualisierten Temp.-Werte ;-)
> Auch das zunächst komplette Auslesen aller DS18B20 (readTemp) und das anschlie�ende Konvertieren
> aller DS18B20 (convertTemp) mit anschlieÃ?endem Warten von >750ms hilft hier nicht weiter.
> Bereits bei einem einzigen angeschlossenen Sensor werden im Durchschnitt 151ms für das Auslesen und
> anschlie�end zusätzlich 250ms für das Konvertieren benötigt.Lediglich ein Sensor ist dabei der die
> Statistik zeitlich nach unten drückt. Warum der eine aus der Reihe springt, keine Ahnung.
> Sonst sind alle Messungen ca. im gleichen Bereich.
>
> Da ich allerdings dummerweise auch, in einem anderen Thread, die Auswertung von Tastern (zur Licht- bzw.
> Rollladensteuerung) durchführe reagiert hier die C-Control, sprich der I2C-Bus in diesen ca. 3sek.
> merklich schlechter als in der Zeit, wo sich der Thread für das Auslesen der Temp.-Sensoren gerade
> im "standby-Modus" (hier über einen "sleep 10000;"-Befehl) befindet. Auch Runtersetzen der Prio für diesen
> Thread auf "run=2" hilft nicht weiter.
> Somit muss dann der Mensch den Licht-Taster zwei bzw. auch drei mal drücken, bis das
> "Licht angeht". Bewegungsmelder als Eingänge haben dann auch ihre Probleme.
> Das geht so gar nicht.
>
> Wie lange dauert bei Dir das Auslesen der besagten 15x DS18B20-Sensoren?
> Laufen bei Dir auch noch andere Geschichten in dieser Zeit auf dem I2C?
> Gibt es dabei Timing-Probleme?
> Könntest Du das alte Datenblatt (2004) als Link einfügen oder anderweitig zusenden?
> Ich kann die Geschichte mit dem 100Ohm-Widerstand noch nicht ganz nachvollziehen.
>
> Vielen Dank für Deine/Eure Hilfe.

Hallo miteinander,

ich habe mich mal hingesetzt und die verschiedenen Zeiten[ms] ermittelt, für welchen Schritt (Befehlszeile)
welche Zeit verstreicht. Sicherlich kann man nicht jeden Wert auf die "Goldwaage" legen, so kann man
doch eine gewissen Trend erkennen, wo die Zeit liegen bleibt.

function matchROM(byte sensor) returns int
{byte i;

 // NEU hinzu wegen 800'er
 ds2482.setCH(TS[sensor].addr,TS[sensor].ch); // Dauer: 5...8ms
 sleep 1; // Dauer: 2ms

 if (ds2482.resetDevices(TS[sensor].addr)) // Dauer: 8...12ms
  {
   sensor=sensor shl 3; // Offset * 8
   while (ds2482.getStatus(TS[sensor].addr) and 1) // Dauer: 3...7ms
   { sleep 1; }
   ds2482.writeByte(TS[sensor].addr,ds2482.MROM); // Dauer: 5...13ms
   for i = 0...7 ds2482.writeByte(TS[sensor].addr,DS18B20addr[sensor+i]); // Dauer: 42[0] sonst 88ms
  return -1;
  }
 return 0;
}

function convertDS18B20(byte sensor)
{
 matchROM(sensor); // Dauer: 60.64[0] sonst 117...121ms
 ds2482.writeByte(TS[sensor].addr,convertTEMP); // Dauer: 10...12ms
}

function readDS18B20(byte sensor) returns int
{int x;
 
 matchROM(sensor);  // Dauer: 62.65[0] sonst 119...122ms
 ds2482.writeByte(TS[sensor].addr,readSCRATCHPAD);  // Dauer: 9...12ms
 x=ds2482.readByte(TS[sensor].addr) or (ds2482.readByte(TS[sensor].addr) shl 8); // Dauer: 20...25ms
 return x;
}


Was ist zu erkennen?
Der "writeByte"-Befehl benötigt richtig viel (I2C)-Zeit.
Die Zeiten sind übrigens alle unabhängig von der eingestellten Prio über den run-Befehl.
Was noch auffällt ist der Zeitunterschied beim Port-0 den anderen gegenüber, was das Schreiben betrifft.
Allerdings ist beim Schreiben von "convertTEMP" und "readSCRATCHPAD" widerum kein Unterschied
festzustellen. mmmhhhhhh.
Insgesamt, über alle 10 Sensoren, dauert es 1248...1262ms zu konvertieren bzw. 2763...2772ms um die
beiden Temp.-Bytes auszulesen und anschlieÃ?end zu konvertieren.

Wie kann die Abfrage der 10 (später auch 15) Sensoren effektiver gestalten werden, so dass
eine sichere Erkennung eines I2C-Eingang (Licht-Taster bzw. Roll.-Taster) realisiert werden kann ?


Grü�e Dirk.


    Antwort schreiben


Antworten:

Re: Probleme beim DS2482-800 <-> DS18B20 (von Jörg Hansen - 12.06.2009 19:51)
    Re: Probleme beim DS2482-800 <-> DS18B20 (von Dirk - 15.06.2009 16:21)