HM-LC-Bl1-FM mit AskSinPP und STM32F103

Begonnen von Funsailor, 05 Juni 2019, 12:00:46

Vorheriges Thema - Nächstes Thema

Funsailor

Hallo Papa,
ich habe auf einem STM32F103 (STM32 Smart) Board den HM-LC-Bl1-FM realisiert. Auf dem Board ist schon ein EEProm drauf, man muss nur noch den II2C Bus mit 2 PullUPs abschließen.
Ich habe aber immer EEProm Fehlermeldungen bekommen. Auf dem II2C Decoder sah aber alles gut aus....
Um Fehler in meinem HM-LC-Bl1-FM Sketch auszuschließen, habe ich dann den HM-LC-SWX-SM Sketch genommen.
Gleiches Ergebnis... ,,ERROR EEPROM CLEAR" und ERROR EEPROM WRITE...

Ich habe dann die Debugg Anzeigen wieder aktiviert und siehe da, damit klappt es!  ???  :)

Um etwas mehr zu sehen, habe ich die Debugg Ausgabe in der Storage.h erweitert (Beispielhaft bei clearData):

  bool clearData (uint16_t addr, uint16_t size) {
//    DPRINT("clearData: ");DHEX(addr);DPRINT(" ");DDECLN(size);
    bool success = true;
    while( success == true && size > 0 ) {
      uint16_t towrite = calcBlockSize(addr, size);
      DPRINT("  clear: ");DHEX(addr);DPRINT(" ");DDECLN(towrite);
      Wire.beginTransmission(ID);
      Wire.write(addr >> 8);
      Wire.write(addr & 0xff);
      uint8_t done = 0;
      while( done < towrite ) {
        done++;
        Wire.write(0);
      }
      success = Wire.endTransmission() == 0;
      // wait for write operation finished
      if( success == true )
      {
       DPRINT("ATx EEPROM CLEAR OK RetVal: ");DHEX ((uint32_t)success);DPRINT(" ");DDECLN(success);
//        DPRINTLN("ATx EEPROM CLEAR OK");
        success = waitComplete();
      }
      else {

        DPRINT("ATx ERROR EEPROM CLEAR RetVal: ");DDECLN(success);
//        DPRINTLN("ATx ERROR EEPROM CLEAR");
      }
      size -= towrite;
      addr += towrite;
    }
//    DPRINTLN("ATx clearData done");
    return success;
  }

Damit erhalte ich folgende Ausgabe:
AskSin++ V4.0.0 (Jun  5 2019 11:20:09)
Address Space: 32 - 700
00000000
ATx Init Storage: CAFE6682
  clear: 0024 28
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 0040 30
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 005E 2
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 0060 30
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 007E 2
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 0080 30
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 009E 2
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 00A0 30
ATx EEPROM CLEAR OK RetVal: 00000001 1
  clear: 00BE 2

Den Rest lasse ich mal weg.

Kommentiere ich die Zeile
ZitatDPRINT("  clear: ");DHEX(addr);DPRINT(" ");DDECLN(towrite);
aus, erhalte ich diese Ausgabe:

AskSin++ V4.0.0 (Jun  5 2019 11:34:30)
Address Space: 32 - 700
00000000
ATx Init Storage: CAFE6682
ATx ERROR EEPROM CLEAR RetVal: 0
ATx EEPROM CLEAR OK RetVal: 00000001 1
ATx ERROR EEPROM CLEAR RetVal: 0
ATx EEPROM CLEAR OK RetVal: 00000001 1
ATx ERROR EEPROM CLEAR RetVal: 0
ATx EEPROM CLEAR OK RetVal: 00000001 1
ATx ERROR EEPROM CLEAR RetVal: 0
ATx EEPROM CLEAR OK RetVal: 00000001 1


Liegt da ein Timing Problem vor?

Noch eine Frage am Rand.
Die Zeile
     
Zitatsuccess = Wire.endTransmission() == 0;

ist mir nicht ganz klar. Vergleich  ohne Auswertung  ???



- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

Das kann schon sein. Was ist da für ein EEProm drauf ? Wie groß sind die Pullups ?
Ich nutze für den Dimmer einen AT24C32 und habe 4,7k Pullups.

Und noch ein bisschen C-Kurs - wenn man die impliziten Klammern darum macht, wird es einfacher:
success = (Wire.endTransmission() == 0);
success wird true, wenn endTransmission() eine 0 zurück gibt.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Funsailor

Hallo Papa,
da ist ein 24C04 drauf. 32 Pages a 16 Byte
Ich habe die Initialisierung so angepasst:

#define STORAGEDRIVER at24cX<0x50 ,32,16>
und da die zweite Page auf der anderen Adresse liegt auch das probiert.
#define STORAGEDRIVER at24cX<0x50 ,16,16>

PullUp 4k7, die Flanken sind auf jeden Fall OK.  Den I2C Bus habe ich mir als erstes im Oszi angeschaut. Der Decoder zeigt ja die richtigen Daten.

Ich hatte ja geschriebn, das kein Fehler kommt, wenn ich die Zeile
    DPRINT("  clear: ");DHEX(addr);DPRINT(" ");DDECLN(towrite); 
in der "storage.h" drin lasse. Das hat mich auf die Frage nach einem Timing Problem gebracht.

Mit der Zeile:
Zitatsuccess = Wire.endTransmission() == 0;
werden einem dann aber die Fehlercodes der Funktion endTransmission() unterschlagen.

Bewusst gesehen habe ich das so zum ersten mal und in den letzten 30 Jahren hat es hier auch niemand benutzt.

- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

Vielleicht funktioniert mit den Chip das waitComplete() nicht. Du kannst den Code auch einfach durch 50ms Delay austauschen.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

papa

BTW: Der EEPROM ist übrigens zu klein. Laut der Ausgabe beim Start werden mindestens 700 Byte benötigt.
Address Space: 32 - 700
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Funsailor

Hmm,  >:(
OK, dann geht das so nicht mit dem "kleinem" EEProm Schade... war halt alles OnBoard.

Habe mal hier ein Delay eingebaut, hat aber nichts gebracht. Morgen geht es weiter...

      if( success == true )
      {
       DPRINT("ATx EEPROM CLEAR OK RetVal: ");DHEX ((uint32_t)success);DPRINT(" ");DDECLN(success);
//        DPRINTLN("ATx EEPROM CLEAR OK");
        _delay_ms(50);
        success = waitComplete();
      }
      else {

        DPRINT("ATx ERROR EEPROM CLEAR RetVal: ");DDECLN(success);
//        DPRINTLN("ATx ERROR EEPROM CLEAR");
      }
- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

Funsailor

So, um das mit dem EEProm zu testen, habe ich mir mein HM-LC-Bl1-FM Sketch genommen und die Peers verkleinert (die benötigen den meisten Platz im EEProm).
Zitat#define PEERS_PER_CHANNEL 1
Mit dieser Änderung benötiget das Testprogramm nur noch 90 Bytes
ZitatAddress Space: 32 - 90
.

Allerdings liegt es nicht an der Funktion waitComplete, da kann ich Delay einbauen wie will, keine Änderung.
Nachdem ich mir dann die Rückgabewerte von endTransmission angeschaut habe (Im Fehlerfall war das immer 3 -> ENACKTRNS ) habe ich vor jedes endTransmission ein Delay von 1ms eingebaut. Jetzt gehts...  8)

...
#define WaitEEPROM 1
...
    Wire.write(d);

    #warning lahmes EEProm   
     _delay_ms(WaitEEPROM);

    success = Wire.endTransmission() == 0;
    // wait for write operation finished


Wundert mich etwas, auf der Homepage vom Roger Clark  wurde berichtet, das die EEProm Funktionen mit diesem Modul/EEProm gehen.
Aber wer weiß wo meine Module herkommen....  ::) China halt

Ich werde jetzt erstmal mit der Flash-EEProm Emulation weitermachen und mir parallel ein paar "größere + bessere" EEProms besorgen.

- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

Hm - ist ja eigenartig. Man könnte folgendes in Storage.h aufnehmen

#ifdef EEPROMDELAY
  void _eeprom_delay() { _delay_ms(EEPROMDELAY); }
#else
  void _eeprom_delay() {}
#endif


Und dann vor alle endTransmission ein _eeprom_delay() einfügen.

Für den beiden lokalen taster brauchst Du aber mindestens 2 Peers/Channel. Sollte aber auch noch passen.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Funsailor

Hallo Papa,
so, die 32er EEProms sind endlich da und auf meiner Testplatine ausgetauscht.

Und siehe da, es geht auch mit der original storage.h :D 8) und 12 Peers per Channel.

Deinen Vorschlag mit dem
#define EEPROMDELAY
ist gut.
Nur irgendwo sollte man das festhalten.

So, jetzt geht es erst mal in den Urlaub, danach wird wieder weitergemacht

LG
Funsailor


- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

Funsailor

Hallo Papa,
als nächsten Schritt würde ich mir gerne einen 3 Fach Rollladen Aktor bauen.

Leider gibt es für die MultiChannelDevice nur den SwitchChannel, kann man die Klasse eins zu eins kopieren und als BlindChannel in die Blind.h einfügen?
Wenn ich mir aber die beiden Klassen anschaue, sieht das nach mehr Arbeit aus. Mt Unterstützung bekomme ich das vieleicht hin, aber um Templates habe ich bisher einen großen Bogen gemacht  :-[

Hintergrund: Ich habe seit ca 25 Jahren in mehreren Rollladenkästen 220V Relais für je 3 Rohrmotoren. Zum Betätigen benutze ich im Moment 3 Umschalter (Hoch/Aus/Runter) die auf einer der 3 Blenden der ehemaligen Gurtwickler montiert sind. Nicht schön, aber garantiert ein Unikat 8).
Das ganze habe ich im Moment 3 mal.
Vorteil: Ich kann die Ansteuerung im Kleinspannungsbereich aufbauen und zum Ansteuern der vorhandenen Relais FETs benutzen, dann passt die Mimik in einen Mauerkasten der Gurtwickler.
- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

Das geht doch ganz einfach. Schau mal in HM-LC-Bl1-FM.ino Zeile 111. Dort wird das Blinddevice definiert. Die 1 im Template gibt die Anzahl der Kanäle an. Für 3 Kanäle muss es also wie folgt definiert werden:
typedef MultiChannelDevice<Hal,BlChannel,3,BlindList0> BlindType;
Jetzt müssen noch die Steuerpins je nach Kanal angepasst werden. Das kann einfach in den motorUp(), motorDown() und motorStop() Methoden im BlindChannel erfolgen. Du kannst da einfach die Kanalnummer mit number() abfragen z.B.
void motorUp () {
  digitalWrite(getDirPin(),HIGH);
  digitalWrite(getOnPin(),HIGH);
}
uint8_t getDirPin () {
  if( number() == 1 ) return DIRPIN1;
  if( number() == 2 ) return DIRPIN2;
  return DIRPIN3;
}
uint8_t getOnPin () {
  if( number() == 1 ) return ONPIN1;
  if( number() == 2 ) return ONPIN2;
  return ONPIN3;
}

Wenn Du für alle Kanäle auch noch die Taster brauchst, müssen diese noch entsprechend in initPeerings() mit den Kanälen verknüpfen.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Funsailor

Hallo Papa,
danke für deine schnelle Antwort.
Ich bin vom Projekt HM-LC-SWX-SM ausgegangen (4 Kanal Switch) und dachte ich muss das so ähnlich machen.

Ich würde auch gerne wieder Schalter benutzen um die Automatik (Zeit und Sonnensteuerung) nur bei OFF der Schalter zulassen.
Das ist mir vor allem bei der Terrassentür wichtig.
Ich habe dazu auch irgendwo etwas gelesen, finde es aber nicht mehr.. Ich habe da irgendwas mit longpoll im Kopf.
Aber prinzipiell müsste das doch gehen, oder?
- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Funsailor

Hallo Papa,
ich steuere die Rollladen im Moment mit Schalter an:

Nach Oben -> Auf
Mittelstellung -> Keine Funktion, Rollladen bleibt stehen
Nach Unten -> Zu

Ich möchte bei den neuen 3 Fach Rollladen Aktor so lösen, das ich die Schalter weiterhin benutzen kann.

Nach Oben -> Auf             +  Automatik aus
Mittelstellung -> Stopp     +  Automatik ein
Nach Unten -> Zu             +  Automatik aus (Terrassenrollladen: Notfallsituationen dürfen den Rollladen automatisch öffnen)

Die Schalter werden in FHEM ausgewertet, dort erfolgt dann die Unterdrückung der Automatik.

Da bei dem HM-LC-Bl1-FM ein eigener Anlerntaster vorhanden ist, wäre das Thema "reset Device" und "enter paring Mode" kein Problem.  :-\

In der Funktion check() gibt es ja den case "pressed" und "longpressed". Erst wenn der pinstate auf OFFSTATE wechselt, geht es weiter.

Der state wird nach einem "longpressed" auf "longreleased" gesetzt,  und damit wird bei einem "InternalButton" mit "longreleased"
der counter hochgezählt.

Also müsste das funktionieren.

Oder gibt es Einschränkungen die ich nicht sehe?


- Asus PN 41- mapleCul V1.24.01 - FHEMDuino - FHEM 6.2 - HUE Bridge - ESPEasy Bridge -  Milight HUB - smartVISU 3.40 -

papa

Ich habe es irgendwie immer noch nicht verstanden, was Dein Problem sein könnte ....
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire