platformübergreifende I2C Module

Begonnen von klausw, 05 Februar 2014, 14:01:47

Vorheriges Thema - Nächstes Thema

ntruchsess

hab mal einen kleinen Parser für das Attribute 'pinMapping' in I2C_LCD eingebaut. Erst mal nur zum anschauen, die LCD-library kann damit noch nichts anfangen.
Was hälst Du davon?
while (!asleep()) {sheep++};

klausw

Super finde ich das! einbauen, einbauen  ;D
Da es schon vorhanden ist und man es nur anpassen muss, ist die Fehlerquelle relativ gering und auch der versierte Enduser sollte damit zurecht kommen.
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

klausw

Ist die LiquidCrystal_I2C hart codiert? Das ist dann auch ein Stück arbeit...
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

klausw

Hallo Norbert,

ich nehme mir gerade die LiquidCrystal_I2C vor.
Mach es Deiner Meinung nach mehr Sinn in expanderWrite die Bits umzusortieren oder
in write4bits und auch die Bitkonstanten anpassen?

Grüße
Klaus
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

klausw

#109
ich habs einfach mal was eingebaut  8)
ist aber noch ungetestet: klick
edit: getestet -> funktioniert
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

Sieht auf den ersten Blick gut aus, bin leider noch nicht dazu gekommen es zu testen. Das Asynchrone OWX und OWCOUNT hat mir am Wochenende genug Arbeit gemacht ;-)
while (!asleep()) {sheep++};

klausw

Zitat von: ntruchsess am 07 April 2014, 18:26:02
Sieht auf den ersten Blick gut aus, bin leider noch nicht dazu gekommen es zu testen. Das Asynchrone OWX und OWCOUNT hat mir am Wochenende genug Arbeit gemacht ;-)
Naja, für Dein Modul sollte sich auch nix ändern. ;)
Bei mir funktioniert leider nicht alles.
Funktioniert:

set <name> text <text to be displayed>
set <name> clear
set <name> display on|off
set <name> backlight on|off (ist aber invertiert)
set <name> reset
set <name> scroll left|right


Folgende aber nicht:
set <name> home
set <name> cursor <...>
set <name> writeXY x-pos,y-pos,len[,l] <text to be displayed>


set <name> writeXY 1,1,4,4,blah  löscht nur 4 Zeichen in der 2. Zeile ab dem 2. Zeichen

beim Rest passiert nix
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

Hallo Klaus,

ich hab das PinMapping gerade noch mal sauber überarbeitet. Die LiquidCrystal.pm (jetzt ohne I2C) ist jetzt unabhängig vom I2C-interface und wäre (mit passender IO-klasse) z.B. auch für LCDs mit UART oder SPI-schnittstelle verwendbar.
Ist allerdings noch ungetestet, komme ich erst heute abend oder so dazu.

Gruß,

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

ntruchsess

so, I2C_LCD mit pinMapping-attribute ist jetzt im SVN.

Gruß,

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

ntruchsess

Zitat von: klausw am 07 April 2014, 21:11:52
Folgende aber nicht:
set <name> home
set <name> cursor <...>
set <name> writeXY x-pos,y-pos,len[,l] <text to be displayed>


set <name> writeXY 1,1,4,4,blah  löscht nur 4 Zeichen in der 2. Zeile ab dem 2. Zeichen

der 4. Parameter nach dem writeXY ist ein 'l' oder ein 'r', keine Zahl:

set lcd writeXY 2,3,28,l blah


set cursor muss ich selber mal schauen.
while (!asleep()) {sheep++};

klausw

Zitat von: ntruchsess am 09 April 2014, 01:19:16
der 4. Parameter nach dem writeXY ist ein 'l' oder ein 'r', keine Zahl:

set lcd writeXY 2,3,28,l blah


ah das Leerzeichen hatte ich übersehen.
Ich werde es morgen mal testen, heute komme ich nicht dazu.

Was Du hier gemacht hast verstehe ich aber nicht. Das ist die Sache, die mich an Perl irritiert... alles kann man auf zig verschiedene Weisen schreiben  :o
Hat $orig und $remapped den gleichen Inhalt?

Grüße
Klaus
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

klausw

Hallo Norbert,

Zitat von: ntruchsess am 08 April 2014, 15:49:37
Ist allerdings noch ungetestet, komme ich erst heute abend oder so dazu.

Im I2C_LCD Modul ist noch ein Fehler drin (oder eher in der LCD Library?).

Wenn ich das Attribut pinMapping auf der Detailseite  auswähle und neu schreiben will (egal ob das default Mapping oder ein Neues) kommt folgender Fehler:


cannot set attribute pinMapping to P0=RS,P1=RW,P2=E,P3=LED,P4=D4,P5=D5,P6=D6,P7=D7 for test07: Can't use string ("3") as an ARRAY ref while "strict refs" in use


Einen Verbesserungsvorschlag hätte ich auch noch: eine Überprüfung, ob jedes token und token value nur einmal vorhanden ist.

Grüße
Klaus
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

in $self->{mapping} ist ein Hash, der zu jedem Pin des GPIO-ports den damit zu verbindenden Pin des LCDs enthält. Die Pins sind als binärzahl (also als eine Bitmask) codiert. So wird z.B. Pin P4 des PCF8584 durch die Zahl 0b00010000 (oder dezimal 32) repräsentiert. Der Hash enthält also die Keys ($orig) 1,2,4,8,16,32,64 und 128, das gleiche gilt für die Values ($remapped). Per default (wenn man kein Mapping angegeben hat) ist $orig gleich $remapped.

$mapped |= $data & $orig ? $remapped : 0;

die Zeile setzt in $mapped für jedes Bit, das in $data gesetzt ist das jeweilige in $remapped angegebene Bit ('|' ist ein 'binäres oder').

Gruß,

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

ntruchsess

#118
Zitat von: klausw am 09 April 2014, 12:39:48

cannot set attribute pinMapping to P0=RS,P1=RW,P2=E,P3=LED,P4=D4,P5=D5,P6=D6,P7=D7 for test07: Can't use string ("3") as an ARRAY ref while "strict refs" in use

ja der Teufel steckt oft im Detail. (Die eigentlichen, das pinMapping selbst betreffenden Änderungen hatte ich vor dem Einbau separat und erfolgreich Modulgetestet...)

Gruß,

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

klausw

#119
Hallo Norbert,

ist es möglich oder besser gesagt mit vertretbarem Aufwand machbar die Unterstützung für DS2482-100 DS2482-800 in das Modul 00_OWX_ASYNC.pm mit einzubauen?
Das würde die Nutzung von I2C am Rpi und anderen Hardwarelösungen sehr vereinfachen.

Grüße
Klaus
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