mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik BME280 per OneWire mit DS28E17


Autor: Paul F. (zwanni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Guten Tag,

wie der Titel schon sagt, versuche ich den BME280 als OneWire Sensor zu 
betreiben. Da ich kein Breakout Board finden konnte, habe ich mir das 
mal selbst zusammengebraten. Der DS28E17 antwortet auch schonmal. Mit 
dem weiteren Auslesen hab ich aber noch so ein paar Verständnisprobleme.

Ich stelle das Auslesen mal statisch als Arduino Code dar.
BME.reset();
BME.select(BME280);        // ROM command: Match ROM [55h]
BME.write(0x2D);           // Device command: Write, Read Data with Stop(2Dh)
BME.write(0xEC);           // I2C Slave Address
BME.write(0x01);           // Number of data bytes to be written
BME.write(0xFD);           // I2C Register to read
BME.write(0x02);           // Number of data bytes to be read
BME.write(crc);            // CRC 16

1. Der BME280 hat mit SDO auf GND eine 7bit Adresse von 0x76. Der 
DS28E17 erwartet eine 7bit Adresse und schaltet das R/W bit selbständig. 
Ist es dann korrekt 0xEC zu senden?

2. Der DS28E17 erwartet einen CRC16 auf die gesendeten Bytes. In der 
OneWire Library sind ja CRC16 Routinen enthalten. Dort muss aber ein crc 
Wert übergeben werden. Wie hab ich das zu verstehen?
uint16_t OneWire::crc16(const uint8_t* input, uint16_t len, uint16_t crc) {
...

Autor: Wolfgang A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Paul F. schrieb:
> Der DS28E17 erwartet eine 7bit Adresse und schaltet das R/W bit
> selbständig.
> Ist es dann korrekt 0xEC zu senden?

Was genau an 0xEC = 0b11101100 ist 7bit?
Guck dir das Ack vom BME an. Spätestens dann beantwortet sich deine 
Frage von selbst. Falls der BME bei 0xEC nicht antwortet, könntest du es 
mit 0x76 probieren ;-)
Das geht schneller, als hier die Diskussion im Thread abzuwarten.

Autor: Paul F. (zwanni)
Datum:

Bewertung
-1 lesenswert
nicht lesenswert
ich weiss,... manche Fragen sollte man hier nicht stellen ^^. Für mich 
hat ein Byte halt immer 8bit. Wenn ich also ein Byte sende sind es nie 
7bit, deshalb sagt mir meine Logik immer ich muss ein bit dazuschieben 
um Platz für das R/W bit zu machen. Das ist wohl mein Denkfehler.

Konzentrieren wir uns also auf die CRC Frage. Wenn ich es richtig 
verstehe übergibt man einen Initialwert, ganz klar ist mir das aber noch 
nicht.

: Bearbeitet durch User
Autor: Michael U. (amiga)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

mich hat mehr OneWire im Titel irritiert und nun ist es doch I2C.
Ich gebe außerdem zu: seit ich mal die ganze Rechnerei für einen HopeRF 
HP03 Luftdrucksensor in ASM auf einem Mega8 gemacht habe, nehme da 
lieber fertiges. ;)

Gruß aus Berlin
Michael

Autor: Paul F. (zwanni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Der Sensor ist I2C. Der DS28E17 setzt OneWire auf I2C um.

Autor: Mw En (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Datenblatt lesen bildet.
Was du dem crc zusätzlich übergeben musst steht im Datenblatt unter crc.
Und ja es ist das INitpolynom, das steht trommelwirbel im DB.

Da steht auch ob das LSB der I2C Adresse gesetzt werden muss oder nicht 
für R/W

Autor: Wolfgang A. (Gast)
Datum:

Bewertung
1 lesenswert
nicht lesenswert
Paul F. schrieb:
> Wenn ich es richtig verstehe übergibt man einen Initialwert, ganz klar
> ist mir das aber noch nicht.

Hast du die AN27 von Maxim gelesen
http://www.maximintegrated.com/app-notes/index.mvp/id/27

Das Thema der 1-Wire CRC Berechnung wurde hier auch schon ausführlich 
diskutiert.
Beitrag "Re: CRC16 von Maxim Frage"
Beitrag "Re: 1-Wire DS18B20 CRC"
Beitrag "Re: DS18B20 Code funktioniert nicht"
Beitrag "1-Wire CRC Probleme"

Autor: Wolfgang A. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Mw E. schrieb:
> Da steht auch ob das LSB der I2C Adresse gesetzt werden muss oder nicht
> für R/W

Da verwechselts du die I2C Adresse mit dem ersten Byte der Übertragung.

Die I2C-Adresse ist lt. I2C-Spezifikation (S.15) genau 7 Bit lang. So 
ist es definiert.
http://i2c2p.twibright.com/spec/i2c.pdf

Jeder anders lautende Sprachgebrauch führt immer wieder zu Verwirrung.

Dass die Slave Adresse mit dem R/W-Bit zusammen in das erste übertragen 
Byte gepackt wird, steht auf einem anderen Blatt. Wenn es in der 
Bibliothek eine I2C-Read- und eine I2C-Write-Funktion gibt, ist das 
deren Aufgabe, sich um das Zusammenbasteln zu kümmern - und das tut sie 
dann auch.

Autor: Paul F. (zwanni)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Die Datenblätter habe ich beide vorliegen und gelesen. Manchmal ist 
nicht alles für jeden gleich ersichtlich und verständlich, 
Entschuldigung.
Im Datenblatt des DS28E17 finde ich nur einen kurzen Absatz wie der IC 
den CRC Kram behandelt. Ein Initpolynom kann ich dort mit meinem 
Kenntnisstand nicht finden.

In diesem Forum fehlt ein Tutorial dafür, eine Frage mit Empathie zum 
Wissensstand des Fragestellers zu bewerten und zu beantworten.

Danke Wolfang, die Links scheinen viele Infos zu enthalten. Ich versuche 
mich mal da durchzuquälen.

Autor: Mw En (Firma: fritzler-avr.de) (fritzler)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Polynom steht im DB sogar als riesengroße Grafik, also wer das 
übersieht?
Weiterhin wird auch auf eine Appnote verwiesen wo das 1wire CRC erklärt 
wird.

Paul F. schrieb:
> In diesem Forum fehlt ein Tutorial dafür, eine Frage mit Empathie zum
> Wissensstand des Fragestellers zu bewerten und zu beantworten.
Gilt auch für die TE, zB Datenblatt Links in den Anfangspost packen 
damit man das nich selber suchen muss.

Autor: Paul F. (zwanni)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
danke, ich habs jetzt hinbekommen. Der BME280 läuft nun als 1-Wire 
Sensor. Mal sehen wie er sich als Feuchtigkeitssensor macht.

...

: Bearbeitet durch User
Autor: Joel E B (Firma: na) (joel21987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, können Sie bitte Ihren Arbeitscode posten? Ich versuche, meine 
DS28E17 auch über I2C zu sprechen. Vielen Dank.

Autor: Paul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Joel E B Ich habe mir speziell für den BME280 die Library von Adafruit 
für 1-Wire umgebaut. Ich poste mal eine der Funktionen dann sollte der 
Ablauf klar werden.
uint8_t Adafruit_BME280::read8(byte reg) {
    uint8_t value;
    uint8_t packet[7];                                      // Reserve bytes to transmit data
    packet[0] = DS28E17_WRITE_READ_DATA_WITH_STOP;          // Command ("Write Data With Stop")
    packet[1] = BME280_ADDRESS;                             // I2C slave to address
    packet[2] = 0x01;                                       // Number of data bytes to write
    packet[3] = reg;                                        // The data to write
    packet[4] = 1;                                          // Number of bytes to read
    
    uint16_t CRC16 = _bme280_onewire->crc16(&packet[0], 5);

    CRC16 = ~CRC16;
    packet[6] = CRC16 >> 8;                                 // Most significant byte of 16 bit CRC
    packet[5] = CRC16 & 0xFF;                               // Least significant byte of 16 bit CRC

    _bme280_onewire->reset();
    _bme280_onewire->select(onewire_address);
    _bme280_onewire->write_bytes(packet, sizeof(packet), 1);  // Write the packet and hold the bus
    while(_bme280_onewire->read_bit() == true) {              // Wait for not busy
        delay(1);
    }
  _bme280_onewire->read();                  // Read DS28E17 Status
  _bme280_onewire->read();                  // Read DS28E17 Write Status

    value = _bme280_onewire->read();              // Read value
    _bme280_onewire->depower();                               // Release the bus
    return value;
}

Autor: Joel E B (Firma: na) (joel21987)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Got it working. Thanks!

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.