Forum: Mikrocontroller und Digitale Elektronik MatchROM DS18S20, falscher Algorithmus?


von Matcher (Gast)


Lesenswert?

Moin,

ich habe mir eine eigene DS18S20 Bibliothek geschrieben. Diese kann ich 
soweit benutzen, jetzt mache ich kein MatchROM sondern ein SkipROM 
Befehl.

Den MatchRom habe ich auch implementiert, aber ich erhalte für jedes 
gesendete Bit stehts ein True zurück.

Ich kann in mein sendendes Rom zuvor irgendeinen Unsinn schreiben, das 
wird jedoch alles akzeptiert.

Am Ende kriege ich mit MatchROM nach dem Starten einer 
Temperaturwandlung einen Timeout, da auch da bis in die Unendlichkeit 
ein True gesendet wird.

Ich habe natürlich nur einen Sensor an die Schnittstelle angeschlossen. 
ReadROM liefert auch korrekte Daten, die CRC wie auch der FamilyCode 
sind korrekt.

Im Folgenden mein Code. Mache ich hier prinzipiell etwas falsch?
1
bool DS18X20::matchROM(){
2
  if(oOneWire.reset()){
3
    oOneWire.setByte(0x55);
4
5
    ROMCode.u8CRC = calcCRC(&ROMCode.u8Family, 7);
6
7
    uint8_t * u8p = &ROMCode.u8Family;
8
9
    for(uint8_t i = 0; i < 64; i++){
10
      bool bVal = u8p[i / 8] & (1 << (i%8)) ? true : false;
11
      oOneWire.setBool(bVal);
12
13
      if(!oOneWire.getBool()){
14
        return false;
15
      }
16
    }
17
18
    return true;
19
  }
20
  else{
21
    return false;
22
  }
23
}

von Jörn P. (jonnyp)


Lesenswert?

Kann mit deinem Code leider nix anfangen.
Prinzipiell geht es aber so:
match rom command senden ($55)
adresse des zu kontaktierenden ds18.. senden (64 bit)
convert command senden. usw.
Ich sehe nicht, das du eine adresse sendest.

von Matcher (Gast)


Lesenswert?

Hier wähle ich das erste Byte vom ROMCode/64Bit Adresse aus aus:
1
uint8_t * u8p = &ROMCode.u8Family;

Anschließend schicke ich dieses Bit für Bit:
1
for(uint8_t i = 0; i < 64; i++){
2
...
3
}

von Hans-jürgen H. (hjherbert) Benutzerseite


Lesenswert?

Aus dem DS18S20 muss der ROMCode ausgelesen werden.
Das geschieht dadurch, dass
1. Nur ein einziger DS18S20 an den ONE-WIRE-Bus angeschlossen wird.
2. 0x33 zu diesem DS18S20 hingeschickt wird.
Dann antwortet der mit 8 Bytes (7 Bytes plus CRC8)

Diese Antwort muss sich der AVR merken (im EEPROM)

Das muss für jeden DS18S20 wiederholt werden.


Dann können alle DS18S20 an den BUS angeschlossen werden.

Dann muss gesendet werden:
44 - Das startet die Wandlung
Dann 800 ms warten
55 - Das bedeutet Select ROM
10 D3 12 D0 02 08 00 A1 - Das sind genau die 8 Bytes, die vorher auf die 
Reizung 0x33 geantwortet wurden.
Dann antwortet der DS18S20 mit 9 Bytes (8 Bytes plus CRC8) z.B:
3A 00 4B 46 FF FF 09 10 BE - Das bedeutet 29.18 °C
oder
2A 00 4B 46 FF FF 09 10 EA - Das bedeutet 21.18 °C

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.