Raspberry Pi und HMW timing problem

Begonnen von katze, 13 Februar 2016, 20:37:08

Vorheriges Thema - Nächstes Thema

katze

Hallo zusammen

ich habe mal ein Testsystem aufgesetzt um mit FHEM etwas zu spielen :)
Aufbau:
Raspberry Pi (Jessie Lite) + MAX485 an Serielle Schnittstelle und auf der anderen Seite
ein Arduino Nano mit HBW Sen Sc8 über MAX485

nun funktioniert die Kommunikation leider nicht optimal - oder garnicht. FHEM kann nicht die Configdaten des HMW Gerätes lesen.
Ich weiß dass alle HomeMatic Wired funktionen noch im Beta stadium sind, aber evtl hat jemand eine Idee.

Das Problem liegt daran, dass der Arduino sofort nach dem Frame Ende vom Pi antwortet,
jedoch zu diesem Zeitpunkt der HM485daemon den TxEnable Pin noch nicht zurückgesetzt hat. (siehe angehängtes Bild vom Logicanalyser).
Der daemon braucht 7.5ms um den TxEnable Pin zurück zu setzen.
Somit kommt im FHEM ein fehlerhafter bzw. unvollständiger Frame im FHEM an.

Ich habe mir darauf hin mal die Perl Dateien vom daemon angeschaut.
...aber sieht recht ordentlich aus und ich sehe keine Möglichkeit das Verhalten zu beschleunigen
- wobei meine Perl und Linux kenntnisse eher minimal sind.

Also muss ich wohl dem Arduino beibringen, nach einem Empfangen Frame mit der Antwort mindestens 8 ms zu warten bevor er die Antwort zurück sendet.
(ein kleiner Eingriff - aus meiner sicht jedoch eher ein Workaround als eine Lösung)

Oder hat jemand eine andere Idee ????

2. Problemchen:
Leider beginnt der daemon auch zu senden, ohne dass der Bus frei ist. (2. angehängtes Bild)
Dadurch werden Kollisionen erzeugt...
Lösung kann nur im daemon erfolgen - diesen Teil werde ich mir wohl nochmal genauer anschauen....

Schöne Grüße

Thorsten Pferdekaemper

Hi,
ich glaube, dass bisher alle irgend einen USB- oder LAN-Adapter verwenden. Direkt am Pi kann das durchaus problematisch sein.
Kannst Du das mal in den Homematic Bereich verschieben?
Gruß,
Thorsten
FUIP

Ralf9

Zitat von: katze am 13 Februar 2016, 20:37:08
ich habe mal ein Testsystem aufgesetzt um mit FHEM etwas zu spielen :)
Aufbau:
Raspberry Pi (Jessie Lite) + MAX485 an Serielle Schnittstelle und auf der anderen Seite
ein Arduino Nano mit HBW Sen Sc8 über MAX485

Das Problem liegt daran, dass der Arduino sofort nach dem Frame Ende vom Pi antwortet,
jedoch zu diesem Zeitpunkt der HM485daemon den TxEnable Pin noch nicht zurückgesetzt hat. (siehe angehängtes Bild vom Logicanalyser).
Der daemon braucht 7.5ms um den TxEnable Pin zurück zu setzen.

Ich betreibe auch HMW über die serielle. Mir ist auch aufgefallen, daß das TxEnable sehr zeitkritisch ist. Ich musste in der HM485d.pl anpassungen vornehmen.

In der HM485d.pl habe ich die "sub interfaceSetGpio" wie folgt geändert:
sub interfaceSetGpio ($) {
        my ($value) = @_;

        if ($value == 0) {
                system("gpioTxen.sh 0");
        } else {
                system("gpioTxen.sh 1");
        }
}

Zuerst habe ich versucht das gpioTxen.sh mit sudo auszuführen, dies war aber noch zu langsam.
Seitdem ich den HM485daemon als root laufen habe, funktioniert es.

Hier ist die gpioTxen.sh
root@cubie:~# cat /usr/sbin/gpioTxen.sh
#!/bin/bash
STATE=$1;
echo "$STATE" > /sys/class/gpio/gpio3/value


und hier ist die gpioTxenInit. gpio ist Wiring Pi
$gpioTxenInit = '/usr/local/bin/gpio export 3 out';

Gruß Ralf
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

katze

Danke für die schnelle Antwort.

warum der umweg über die gpioTxen.sh ???
wäre es nicht besser / schneller in der HM485d.pl direkt die IOs zu schalten:


sub interfaceSetGpio ($) {
        my ($value) = @_;

                system("echo "$value" > /sys/class/gpio/gpio3/value");
}


P.S. zurzeit verwende ich noch die wiredPi gpio - also ein langer umweg ;)

Ralf9

Zitat von: katze am 14 Februar 2016, 21:13:24
warum der umweg über die gpioTxen.sh ???
wäre es nicht besser / schneller in der HM485d.pl direkt die IOs zu schalten:

Der Umweg ist noch ein Übrigbleibsel aus dem Versuch mit sudo.

Wenn es so auch funktionioniert müsste es besser / schneller sein.

Gruß Ralf
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7

katze

ich hatte mal wieder zeit um etwas zu basteln.
ich habe erst versucht das Bussy Bit des TX Flag Registers zu verwenden - hab es allerdings nicht geschafft.
Nun habe ich es folgender maßen "gelöst"
ich verwende das Perl Modul Device:BCM2835

den HM485d starte ich per sudo über init script.
(da wenn fhem den HM485d per sudo startet ihn nicht mehr gefunden hat und immer mehr instanzen gestartet hat.)
im HM485d.pl folgende änderungen:
in der init():

# Init for GPIO usage (e.g. on Raspberry Pi)
#CHANGE:
Device::BCM2835::init() || die "init BCM lib err.";
drop_privileges('fhem');
Device::BCM2835::gpio_fsel(&Device::BCM2835::RPI_GPIO_P1_12,&Device::BCM2835::BCM2835_GPIO_FSEL_OUTP);

also das Perl Modul initialisieren und den Benutzer wechslen + Pin initialisieren

dann die InterfaceSetGpio() ersetzen:

#CHANGE:
Device::BCM2835::gpio_write(&Device::BCM2835::RPI_GPIO_P1_12,1);
#interfaceSetGpio(1);               # set gpio pin for RS485 TX enable if necesarry
ServerTools_serialWrite($buffer);  # send out buffer to IO device
#interfaceSetGpio(0);               # reset gpio pin for RS485 TX enable if necesarry
Device::BCM2835::gpio_write(&Device::BCM2835::RPI_GPIO_P1_12,0);


dann war das zurücksetzen des Pins viel zu schnell...
also im DevIO485.pm folgende änderung im DevIoSimpleWrite():

# 1*11/19200 =           0,572916 ms je byte
select(undef, undef, undef, 0.00058*length($msg));


damit habe ich jetzt einen zeitveratz beim einschalten von ca 0.25 ms und abschalten von 0.2 bis 0.5 ms

Ralf9

Zitat von: katze am 27 Februar 2016, 17:41:12
ich hatte mal wieder zeit um etwas zu basteln.
ich habe erst versucht das Bussy Bit des TX Flag Registers zu verwenden - hab es allerdings nicht geschafft.
Nun habe ich es folgender maßen "gelöst"
ich verwende das Perl Modul Device:BCM2835

Dies sieht nach einer sehr Hardware naher Lösung aus die wahrscheinlich nur beim Raspberry Pi funktionieren wird.

Interessant wäre ob dies auch ausreicht. Ich habe leider keine Möglichkeit  die Zeit bis der TxEnable Pin zurückgesetzt wird zu messen.
sub interfaceWrite($) {
my ($buffer) = @_;

system("echo 1 > /sys/class/gpio/gpio3/value");  # set gpio pin for RS485 TX enable
ServerTools_serialWrite($buffer);  # send out buffer to IO device
system("echo 0 > /sys/class/gpio/gpio3/value"); # reset gpio pin for RS485 TX enable
}


Gruß Ralf
FHEM auf Cubietruck mit Igor-Image, SSD und  hmland + HM-CFG-USB-2,  HMUARTLGW Lan,   HM-LC-Bl1PBU-FM, HM-CC-RT-DN, HM-SEC-SC-2, HM-MOD-Re-8, HM-MOD-Em-8
HM-Wired:  HMW_IO_12_FM, HMW_Sen_SC_12_DR, Selbstbau IO-Module HBW_IO_SW
Maple-SIGNALduino, WH3080,  Hideki, Id 7