Neue Firmware für HM_LC_Sw1PBU_FM mit getrenntem Aktor, Taster + Wechselschalter

Begonnen von jab, 29 Dezember 2013, 22:04:10

Vorheriges Thema - Nächstes Thema

Klaus0815

Hallo Jan,

die die ich habe sind alle eingebaut, aber ich werde mal noch eins bestellen und auseinander nehmen, bin gerne bereit zu basteln, flashen usw. dürfte auch kein Problem sein.
Ich gebe Bescheid sobald ich eins habe

Viele Grüße

Klaus

frank

hallo jan,

ich wollte gerade deine tolle software flashen. leider bricht die arduino ide bereits beim compilieren mit folgenden fehlermeldungen ab:

unknown MCU 'atmega644a' specified
Known MCU names:
   avr2
   at90s2313
   at90s2323
   at90s2333
   at90s2343
   attiny22
   attiny26
   at90s4414
   at90s4433
   at90s4434
   at90s8515
   at90c8534
   at90s8535
   avr25
   attiny13
   attiny13a
   attiny2313
   attiny24
   attiny44
   attiny84
   attiny25
   attiny45
   attiny85
   attiny261
   attiny461
   attiny861
   attiny43u
   attiny48
   attiny88
   at86rf401
   avr3
   at43usb320
   at43usb355
   at76c711
   avr31
   atmega103
   avr35
   at90usb82
   at90usb162
   attiny167
   avr4
   atmega8
   atmega48
   atmega48p
   atmega88
   atmega88p
   atmega8515
   atmega8535
   atmega8hva
   at90pwm1
   at90pwm2
   at90pwm2b
   at90pwm3
   at90pwm3b
   avr5
   atmega16
   atmega161
   atmega162
   atmega163
   atmega164p
   atmega165
   atmega165p
   atmega168
   atmega168p
   atmega169
   atmega169p
   atmega32
   atmega323
   atmega324p
   atmega325
   atmega325p
   atmega3250
   atmega3250p
   atmega328p
   atmega329
   atmega329p
   atmega3290
   atmega3290p
   atmega406
   atmega64
   atmega640
   atmega644
   atmega644p
   atmega645
   atmega6450
   atmega649
   atmega6490
   atmega16hva
   at90can32
   at90can64
   at90pwm216
   at90pwm316
   atmega32m1
   atmega32c1
   atmega32u4
   atmega32u6
   at90usb646
   at90usb647
   at94k
   avr51
   atmega128
   atmega1280
   atmega1281
   atmega1284p
   at90can128
   at90usb1286
   at90usb1287
   avr6
   atmega2560
   atmega2561
   avrxmega4
   atxmega64a3
   avrxmega5
   atxmega64a1
   avrxmega6
   atxmega128a3
   atxmega256a3
   atxmega256a3b
   avrxmega7
   atxmega128a1
   avr1
   at90s1200
   attiny11
   attiny12
   attiny15
   attiny28
AskSin.cpp:1: error: MCU 'atmega644a' supported for assembler only
In file included from /AskSin.h:17,
                 from AskSin.cpp:7:
e:/programme/arduino/hardware/tools/avr/lib/gcc/../../avr/include/avr/sleep.h:369:6: error: #error "No SLEEP mode defined for this device."
In file included from AskSin.cpp:7:
AskSin.h:463: error: 'Serial' was not declared in this scope
AskSin.cpp: In member function 'void CC::init()':
AskSin.cpp:62: error: 'SPCR' was not declared in this scope
AskSin.cpp:62: error: 'SPE' was not declared in this scope
AskSin.cpp:62: error: 'MSTR' was not declared in this scope
AskSin.cpp:64: error: 'PORTB' was not declared in this scope
AskSin.cpp: In member function 'uint8_t CC::detectBurst()':
AskSin.cpp:205: error: 'PORTB' was not declared in this scope
AskSin.cpp:206: error: 'PINB' was not declared in this scope
AskSin.cpp: In member function 'uint8_t CC::sendSPI(uint8_t)':
AskSin.cpp:226: error: 'SPDR' was not declared in this scope
AskSin.cpp:227: error: 'SPSR' was not declared in this scope
AskSin.cpp:227: error: 'SPIF' was not declared in this scope
AskSin.cpp: In member function 'void CC::cmdStrobe(uint8_t)':
AskSin.cpp:231: error: 'PORTB' was not declared in this scope
AskSin.cpp:232: error: 'PINB' was not declared in this scope
AskSin.cpp: In member function 'void CC::writeBurst(uint8_t, uint8_t*, uint8_t)':
AskSin.cpp:237: error: 'PORTB' was not declared in this scope
AskSin.cpp:238: error: 'PINB' was not declared in this scope
AskSin.cpp: In member function 'void CC::readBurst(uint8_t*, uint8_t, uint8_t)':
AskSin.cpp:244: error: 'PORTB' was not declared in this scope
AskSin.cpp:245: error: 'PINB' was not declared in this scope
AskSin.cpp: In member function 'uint8_t CC::readReg(uint8_t, uint8_t)':
AskSin.cpp:251: error: 'PORTB' was not declared in this scope
AskSin.cpp:252: error: 'PINB' was not declared in this scope
AskSin.cpp: In member function 'void CC::writeReg(uint8_t, uint8_t)':
AskSin.cpp:259: error: 'PORTB' was not declared in this scope
AskSin.cpp:260: error: 'PINB' was not declared in this scope
AskSin.cpp: In member function 'void HM::setPowerMode(uint8_t)':
AskSin.cpp:428: error: 'SLEEP_MODE_IDLE' was not declared in this scope
AskSin.cpp:428: error: 'set_sleep_mode' was not declared in this scope
AskSin.cpp:437: error: 'MCUSR' was not declared in this scope
AskSin.cpp:437: error: 'WDRF' was not declared in this scope
AskSin.cpp:438: error: 'WDTCSR' was not declared in this scope
AskSin.cpp:438: error: 'WDCE' was not declared in this scope
AskSin.cpp:438: error: 'WDE' was not declared in this scope
AskSin.cpp:439: error: 'WDP2' was not declared in this scope
AskSin.cpp:441: error: 'SLEEP_MODE_PWR_DOWN' was not declared in this scope
AskSin.cpp:450: error: 'WDP0' was not declared in this scope
AskSin.cpp:450: error: 'WDP3' was not declared in this scope
AskSin.cpp: In member function 'void HM::power_poll()':
AskSin.cpp:947: error: 'WDTCSR' was not declared in this scope
AskSin.cpp:947: error: 'WDIE' was not declared in this scope
AskSin.cpp:949: error: 'ADCSRA' was not declared in this scope
AskSin.cpp:950: error: 'PRR' was not declared in this scope
AskSin.cpp:953: error: 'MCUCR' was not declared in this scope
AskSin.cpp:953: error: 'SE' was not declared in this scope
AskSin.cpp:961: error: 'MCUCR' was not declared in this scope
AskSin.cpp:961: error: 'SE' was not declared in this scope
AskSin.cpp:962: error: 'WDTCSR' was not declared in this scope
AskSin.cpp:962: error: 'WDIE' was not declared in this scope
AskSin.cpp: In member function 'void HM::initRegisters()':
AskSin.cpp:1404: error: 'eeprom_is_ready' was not declared in this scope
AskSin.cpp:1405: error: 'eeprom_read_word' was not declared in this scope
AskSin.cpp:1420: error: 'eeprom_is_ready' was not declared in this scope
AskSin.cpp:1421: error: 'eeprom_write_word' was not declared in this scope
AskSin.cpp:1433: error: 'eeprom_is_ready' was not declared in this scope
AskSin.cpp: In member function 'uint8_t HM::addPeerFromMsg(uint8_t, uint8_t*)':
AskSin.cpp:1714: error: 'eeprom_is_ready' was not declared in this scope
AskSin.cpp:1732: error: 'eeprom_is_ready' was not declared in this scope
AskSin.cpp: In member function 'uint8_t HM::loadDefaultRegset(uint8_t, uint8_t*, boolean, uint8_t)':
AskSin.cpp:1824: error: 'Serial' was not declared in this scope
AskSin.cpp: In member function 'uint8_t HM::getEEpromByte(uint16_t)':
AskSin.cpp:1881: error: 'eeprom_read_byte' was not declared in this scope
AskSin.cpp: In member function 'void HM::setEEpromByte(uint16_t, uint8_t)':
AskSin.cpp:1886: error: 'eeprom_write_byte' was not declared in this scope
AskSin.cpp:1886: error: return-statement with a value, in function returning 'void'
AskSin.cpp: In member function 'void HM::getEEpromBlock(uint16_t, uint8_t, void*)':
AskSin.cpp:1891: error: 'eeprom_read_block' was not declared in this scope
AskSin.cpp: In member function 'void HM::setEEpromBlock(uint16_t, uint8_t, void*)':
AskSin.cpp:1896: error: 'eeprom_write_block' was not declared in this scope
AskSin.cpp: In member function 'void BK::config(uint8_t, uint8_t, uint16_t, uint16_t, uint16_t, void (*)(uint8_t, uint8_t))':
AskSin.cpp:1922: error: 'PCICR' was not declared in this scope
AskSin.cpp:1924: error: 'PCMSK1' was not declared in this scope
AskSin.cpp:1924: error: 'PCMSK3' was not declared in this scope
AskSin.cpp:1924: error: 'PCMSK2' was not declared in this scope
AskSin.cpp:1924: error: 'PCMSK0' was not declared in this scope
AskSin.cpp: In function 'void pcInt(uint8_t)':
AskSin.cpp:2428: error: 'PCMSK0' was not declared in this scope
AskSin.cpp:2429: error: 'PCMSK1' was not declared in this scope
AskSin.cpp:2430: error: 'PCMSK2' was not declared in this scope
AskSin.cpp:2431: error: 'PCMSK3' was not declared in this scope


ich habe deine jabduino-datei in den hardwareordner entpackt und kann auch den jabduino644a in der hardwareliste der arduino ide auswählen.

zum flashen wollte ich einen arduino mega2560 benutzen den ich mit dem arduino-isp sketch geflasht habe.

kann es sein, dass der mega als programmer die fehler auslöst? ich habe auch unter programmer den punkt "arduino as isp" ausgewählt und das flashen mit "upload mit programmer" gestartet.

ansonsten benutze ich winxp und arduino1.05. ich könnte ein paar hinweise zur lösung des problems gebrauchen.

gruss frank
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

jab

Hi Frank,

Zitat von: frank am 17 März 2014, 23:41:14
unknown MCU 'atmega644a' specified
[/quote]

das sieht mir aus als wenn dein Compiler nur atmega644 und nicht atmega644a als Target kennt. Ich habe das mal schnell in Jabduino eingefügt (https://github.com/jabdoa2/jabduino/blob/master/boards.txt). Update das mal dann und wähle dann "Jabduino ATmega644".

Der Unterschied zwischen atmega644 und atmega644a ist eh nur marginal. Funktioniert auf jeden Fall mit beiden.


Gruß,
Jan

frank

hallo jan,

perfekter service, danke.

das  kompilieren und flashen hat jetzt fehlerfrei funktioniert. nur der schalter macht noch nichts. da muss ich morgen mal genauer forschen.

gruss frank
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

daduke

Hallo Frank,

hast Du vllt auch gcc 4.8? Damit geht der Funk-Teil nicht...

cheers,
-Christian
fhem auf pcengines apu, Philips Hue, MAX!, div. HomeMatic, Spark Core, panstamp, div. eigene Hardware

Robbi24



  Nur heute gibt es ein tolles Angebot bei RWE SH. Die Schalter sind baugleich mit Homematic. Wenn ihr die Software ja doch ändern wollt ist es doch egal ob RWE oder Homematic HW genommen wird.

   https://www.rwe-smarthome.de/is-bin/INTERSHOP.enfinity/WFS/RWEEffizienz-SmartHome-Site/de_DE/-/EUR/ViewProductDetail-Start?ProductUUID=IlIKaASGonkAAAFEVnFJG8Bk&CatalogCategoryID=bOoKlwsgaekAAAErFaU46qRU

trilu

Cooles Angebot, aber derzeit würden ja nur die 3 Schalter gehen. Eine Dimmer Class muss ich erst noch basteln....

Robbi24

#262


... und der flache RWE Wandtaster hat auch den mega328p und den TRX868 Empfänger. Der müsste dann auch mit der Asksin lib funktionieren.
Nur die HW der Fernbedienung kenne ich noch nicht. Sieht aber schick aus.

PS Die RWE Geräte haben alle die OTA Update Funktion im Bootloader! Da scheint es aber zwei Versionen zu geben. Einmal sehr schnell wie bei dem Heizkörperthermostat von Homematic und einmal sehr langsam  ( dauert Wochen !) für den Wandtaster oder dem Fensterkontakt. Da werden nur bei jeder Betätigung einige Bytes übertragen.


trilu

nun, dann müsste der wandtaster schon fast von der stange funktionieren...
ich gehe davon aus das die fernbedienung auch einen atmel drin hat, müsste also auch fluppen.

das einzige wäre halt die dimmer class, ist nicht schwierig, nur viel arbeit.
vom prinzip ist sie wie die relais klasse, aber eben ein paar flags mehr. das braucht ruhe und zeit :-)

jab

Hi

@dadude: Sein Compiler ist scheinbar eher alt wenn er das aktuelle Target nicht kennt. Das Problem ist mir allerdings immer noch schleierhaft. Muss ich mir mal anschauen
@frank: Was funktioniert denn nicht? Kannst du das Gerät pairen?
@Robbi24: atmega328p geht aber hat nur 32k Flash. Vermutlich reicht das für den Betrieb. Mit vollem Debug ist die Firmware aktuell zu groß dafür.
@trilu: Für den Dimmer gibts auch einen Schaltplan + Doku im ELV. Sollte also ziemlich sicher gehen. Ist auch Atmega644A. Wenn jemand das machen will unterstütze ich ihn auch gerne.

Ich habe gestern eine erste wirklich nutzbare Version des OTA Bootloaders gepushed: https://github.com/jabdoa2/Asksin_OTA_Bootloader. Aktuell funktioniert er so:
- Fuses muss man entsprechend setzen (Muss ich noch dokumentieren, ist aber einfach mit avrdude)
- Beim Booten wird der Bootloader aufgerufen
- Bootloader schickt Update Nachricht (Aktuell immer. Könnte man noch auf bei Buttondruck ändern)
- Ab jetzt gibt es ein 10s Timeout. Sobald innerhalb der Zeit nichts passiert wird die normale Anwendung angesprungen
- Nun kann flash-ota oder ein anderes Programm ein Update starten
- Gerät geht in 100k Mode
- Wenn der Flasher das Update bestätigt (gleiche Message) dann sendet das Gerät ein ACK
- Danach werden beliebig viele Blöcke empfangen die alle die Größe SPM_PAGESIZE haben müssen (256 Bytes)
- Das Gerät weiß nicht wie viele Blöcke kommen. Nach dem letzten greift irgendwann das 10s Timeout

Um die Firmware aus dem Binarformat in das Format für einen beliebigen Flasher zu bringen habe ich ein kleines PHP Script beigelegt. An sich funktioniert alles. Es gibt noch potentielle Verbesserungen:
- Nur bei Buttondruck das Update erlauben (wie der TC-DN) oder wenn das Gerät speziell rebootet wurde
- CRC/Checksum. Müsste im Converter + Bootloader eingebaut werden.
- Überschreiben des Bootloaders selber verhindern


Gruß,
Jan

trilu

Der Bootloader hört sich gut an, wie groß ist der? Ich könnte so einen Bootloader gut brauchen, zum einen für Updates der Software,
aber noch wichtiger - zum setzen von HMID und Seriennummer...

Dirk

Zitat von: jab am 18 März 2014, 15:19:35
- Überschreiben des Bootloaders selber verhindern
Hier sollte es ausreichen die Lock Bits für den Bootloader (LPM und SPM) mit dem ISP zu setzen.

ZitatIch könnte so einen Bootloader gut brauchen, zum einen für Updates der Software,
aber noch wichtiger - zum setzen von HMID und Seriennummer...
Die Infos sollte man dann in den letzten Bytes des Bootloaders unterbringen.
Dann können diese Sachen vor dem Flashen im Hexfile entsprechend verändert werden.
Das kann man auch durch ein kleines Script automatisieren.

Gruß
Dirk

jab

Zitat von: Dirk am 18 März 2014, 16:26:03
Hier sollte es ausreichen die Lock Bits für den Bootloader (LPM und SPM) mit dem ISP zu setzen.
Ich will ja verhindern, dass der Bootloader sich selber überflasht. Das verhindern die Fuses doch nicht. Dazu muss ich einfach die Pagenummern im Code überprüfen.

Zitat von: Dirk am 18 März 2014, 16:26:03
Die Infos sollte man dann in den letzten Bytes des Bootloaders unterbringen.
Dann können diese Sachen vor dem Flashen im Hexfile entsprechend verändert werden.
Das kann man auch durch ein kleines Script automatisieren.
Das Script gibt es ja schon. Ich dachte jetzt erstmal an Blockweise CRC dann kann ich es vorm flashen prüfen. Ggf noch ein finaler Block damit man weiß, dass das Image komplett ist. Da bin ich mir noch unschlüssig. Jedes mal den kompletten Flash zu lesen um CRC zu rechnen ist ja auch etwas auswändig.

@trillu: Unter 10kB. Aktuell ist noch Debugausgabe und eine UART Lib drin. Ich denke man bekommt den auf jeden Fall unter 8kB. Ggf auch unter 4kB.


Gruß,
Jan

frank

hallo jan,

alles klappt hervorragend!  :)

das problem war die vorhandene definition des originalschalters und eine mischung aus erwartungshaltung, mangelnder erfahrung und müdigkeit.  ;)

also ein arduino als programmer zum flashen des schalters funktioniert gut. selbst ein versehentliches flashen des schalters mit dem programmer-sketch des arduino konnte dem schalter nichts anhaben.

ich wundere mich nur, dass mein compiler keinen 644a kennt, oder ist der compiler nicht in der arduino ide enthalten?

nochmals danke für diese wunderbare software.

gruss frank
FHEM: 6.0(SVN) => Pi3(buster)
IO: CUL433|CUL868|HMLAN|HMUSB2|HMUART
CUL_HM: CC-TC|CC-VD|SEC-SD|SEC-SC|SEC-RHS|Sw1PBU-FM|Sw1-FM|Dim1TPBU-FM|Dim1T-FM|ES-PMSw1-Pl
IT: ITZ500|ITT1500|ITR1500|GRR3500
WebUI [HMdeviceTools.js (hm.js)]: https://forum.fhem.de/index.php/topic,106959.0.html

trilu

4kb wären schon gut! weil mittlerer weile braucht die lib jede menge platz, dirk und ich sind am optimieren
aber es hat schon seinen grund warum HM dickere cpu's nutzt :-)