Neues Modul i2cBMP180

Begonnen von Dirk, 21 Juli 2013, 23:52:20

Vorheriges Thema - Nächstes Thema

klausw

Zitat von: MEitelwein am 11 November 2014, 00:15:50
im Modul ist noch ein Fehler, der den I2C Betrieb über FRM verhindert:
In der Funktion sub I2C_BMP180_i2cwrite($$$) wird beim Aufruf von I2CWrtFn für i2cwrite eine falsche Parameterliste übergeben: Das Register darf nicht als eigener Hash "reg" geführt werden

falsch ist relativ
Für RPII2C und NetzerI2C ist "reg" notwendig da sonst nicht zwischen Register und Daten unterschieden werden kann.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

ntruchsess

#121
ich habe vergessen, ob es einen Grund gibt, dass in FRM bei der I2CWriteFn beim i2cwrite das reg nicht ausgewertet wird - sinnvoll ist das nicht. Das sollte man dann aber nicht in den I2C-client-modulen abfangen (das geht ja völlig am Sinn einer hardwareunabhängigen API vorbei), sondern im FRM ändern.

EDIT: Auf der niedrigsten Ebene spezifieziert das I2C-protokoll eigentlich keine Register-addressen, das sind (aus Sicht des Protokolls) einfach Daten. Hängt vom addressierten Chip ab, ob er das erste Byte (oder die ersten Bytes) als Registeraddresse interpretiert oder nicht. Damit gehört es der reinen Lehre nach eigentlich ins Client-modul. Beim Lesen ist das etwas anderes, da muss die (optionale) Register-addresse ja erst auf den I2C-Bus geschrieben werden, bevor auf Lesen umgeschaltet wird. Aber unabhängig davon istl natürlich einfacher dem FRM das Berücksichtigen eines (optionalen) reg-wertes beim i2cwrite hinzuzufügen. Schränkt die Nutzung für Chips die das nicht brauchen ja nicht ein.
while (!asleep()) {sheep++};

MEitelwein

Zitat von: klausw am 11 November 2014, 00:48:42
falsch ist relativ
Für RPII2C und NetzerI2C ist "reg" notwendig da sonst nicht zwischen Register und Daten unterschieden werden kann.

In 10_FRM.pm ist die i2c_write Funktion so definiert:


COMMANDHANDLER: {
                        $package->{direction} eq "i2cwrite" and do {
                                $firmata->i2c_write($package->{i2caddress},split(" ",$package->{data}));
                                last;
                        };


Das Hash reg wird also gar nicht ausgewertet und der Write funktioniert erst, wenn das reg als erstes Byte in Data steht. Liegt der Fehler dann also hier, wenn andere i2c_write Implementierungen über 3 Parameter (i2caddress, reg, data) angesteuert werden? Ich bin nicht der Perl Experte und konnte den Code hinter $firmata->i2c_write nicht finden - in welchem Modul ist das eigentlich implementiert?

MEitelwein

Noch eine Anregung (und grundsätzlich mal DANKE für dieses Modul!), um netteren Log-Output für das Debugging zu erzeugen:


sub I2C_BMP180_GetCal ($$) {
        my ($hash, $rawdata) = @_;
        my @raw = split(" ",$rawdata);
        my $n = 0;
        my $name = $hash->{NAME};
        $hash->{calibrationData}{ac1} = I2C_BMP180_GetCalVar($raw[$n++], $raw[$n++]);
        $hash->{calibrationData}{ac2} = I2C_BMP180_GetCalVar($raw[$n++], $raw[$n++]);
        $hash->{calibrationData}{ac3} = I2C_BMP180_GetCalVar($raw[$n++], $raw[$n++]);
        $hash->{calibrationData}{ac4} = I2C_BMP180_GetCalVar($raw[$n++], $raw[$n++], 0);
        $hash->{calibrationData}{ac5} = I2C_BMP180_GetCalVar($raw[$n++], $raw[$n++], 0);
        $hash->{calibrationData}{ac6} = I2C_BMP180_GetCalVar($raw[$n++], $raw[$n++], 0);
        $hash->{calibrationData}{b1}  = I2C_BMP180_GetCalVar($raw[$n++], $raw[$n++]);
        $hash->{calibrationData}{b2}  = I2C_BMP180_GetCalVar($raw[$n++], $raw[$n++]);
        $hash->{calibrationData}{mb}  = I2C_BMP180_GetCalVar($raw[$n++], $raw[$n++]);
        $hash->{calibrationData}{mc}  = I2C_BMP180_GetCalVar($raw[$n++], $raw[$n++]);
        $hash->{calibrationData}{md}  = I2C_BMP180_GetCalVar($raw[$n++], $raw[$n++]);
        $hash->{STATE} = 'Initialized';
        Log3 $hash, 5, "$name Gelesene Kalibrierungswerte:";
        Log3 $hash, 5, "$name AC1: $hash->{calibrationData}{ac1}";
        Log3 $hash, 5, "$name AC2: $hash->{calibrationData}{ac2}";
        Log3 $hash, 5, "$name AC3: $hash->{calibrationData}{ac3}";
        Log3 $hash, 5, "$name AC4: $hash->{calibrationData}{ac4}";
        Log3 $hash, 5, "$name AC5: $hash->{calibrationData}{ac5}";
        Log3 $hash, 5, "$name AC6: $hash->{calibrationData}{ac6}";
        Log3 $hash, 5, "$name B1 : $hash->{calibrationData}{b1}";
        Log3 $hash, 5, "$name B2 : $hash->{calibrationData}{b2}";
        Log3 $hash, 5, "$name MB : $hash->{calibrationData}{mb}";
        Log3 $hash, 5, "$name MC : $hash->{calibrationData}{mc}";
        Log3 $hash, 5, "$name MD : $hash->{calibrationData}{md}";
        return
}

ntruchsess

Zitat von: MEitelwein am 11 November 2014, 07:51:49
$firmata->i2c_write nicht finden - in welchem Modul ist das eigentlich implementiert?
Device/Firmata/Platform.pm
while (!asleep()) {sheep++};

ntruchsess

while (!asleep()) {sheep++};

klausw

Zitat von: ntruchsess am 11 November 2014, 08:34:15
-> fixed
das ging schnell  ;D

Beim i2cwrite wird aber unter Umständen auch ein Register übertragen. Habe ich das im 10_FRM.pm übersehen?

Nochmal zur Erklärung, wieso das reg im hash überhaupt existiert.
Bei I2C devices welche mehrere Register besitzen, wird im Fall des Lesens erstmal eine Schreiboperation mit der Registeradresse ausgeführt. Um Lese- und Schreibvorgang einigermaßen homogen zu halten wird das reg in beiden Fällen abgespalten (ausserdem erwarten viele i2c hardwaretreiber ein separates register). Im Nachhinein (also im physical Modul) ist es nicht mehr möglich herauszufinden, ob ein logisches Modul auf Registern basiert (z.B. PCA9532) oder eben nicht (z.B. PCF8574). Daher sollte dies im logischen Modul erfolgen und an das physikalische weitergegeben werden.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

ntruchsess

Zitat von: klausw am 11 November 2014, 09:46:57
Habe ich das im 10_FRM.pm übersehen?

Ist doch egal, wer das übersehen hat, wir hatten das halt nicht auf dem Radar, dass das im 10_FRM i2cwrite halt ursprünglich ohne register war als wir das Interface abgestimmt haben. Ist ja jetzt nachgezogen.

Gruß,

Norbert
while (!asleep()) {sheep++};

klausw

Ich meinte in Deiner aktuellen Änderung.
Du hast nur das read angepasst und nicht das write, richtig?
Das write müsste auch ein reg verarbeiten können.
RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

ntruchsess

while (!asleep()) {sheep++};

klausw

RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

MEitelwein

Danke für die schnelle Reaktion :) 

danieljo

Ich hoffe ich bin hier richtig es geht um das Modul "i2c_BMP180" Ich setze den poll-interval auf 1 und speichere die Config ab. Nach jedem "shutdown restart" wird poll-interval aber wieder auf 5 gesetzt. Das sehe ich daran das neben dem "Save Config" button ein rotes Frage Zeichen zusehen ist klicke ich drauf erscheint die Meldung:

Last 10 structural changes:
  attr BMP180 poll_interval 5


Ich denke das könnte ein BUG sein !?

MFG, Daniel Joachims



klausw

jop ist nen Bug
werde es evtl. heute noch beheben

RasPi B v2 mit FHEM 18B20 über 1Wire, LED PWM Treiber über I2C, Luchtdruck-, Feuchtesensor und ein paar Schalter/LED\'s zum testen
Module: RPI_GPIO, RPII2C, I2C_EEPROM, I2C_MCP23008, I2C_MCP23017, I2C_MCP342x, I2C_PCA9532, I2C_PCF8574, I2C_SHT21, I2C_BME280

Edi77

Master FHEM 6 als VM auf ESX Ubuntu 20.04 LTS mit MAXCube/MAX!/FS20|TabletUI|Flightradar|Tasmota|TTN Lora|CCU3 HomematicIP|RPi mit GammaScout|MQTT EasyESP 8266|LuftdatenInfo|deCONZ HUEDev|probemon|Siemens Logo|P4D|3D PRINTER RAISE3D