FB Betty in FHEM einbinden

Begonnen von KölnSolar, 16 März 2017, 09:06:18

Vorheriges Thema - Nächstes Thema

pc1246

Zitat von: szoller am 27 April 2017, 11:44:44
Wenn's da was brauchbares gibt, wäre ich über einen Wiki-Eintrag sehr dankbar, bin kein Programmierer  :D
Moin
Einen Wiki-Eintrag kann man auch als Nichtprogrammierer schreiben.
Ich habe mich auch schon mal fuer eine Modulbeschreibung geopfert, hat gar nicht weh getan! Und hilft auch immens beim Verstaendnis!
Gruss Christoph
HP T610
Onkyo_AVR;3 Enigma2; SB_Server ; SB_Player; HM-USB mit 15 HM-CC-RT-DN, 3 HM_WDS10_TH_O, 6 HM-Sec-SCo, 4 HM-Sec-MDIR-2, 1 HM-Sen-MDIR-O-2, 8 Ferion 5000 OW ; PhilipsTV; 4 harmony hub; Jeelink mit 9 PCA301; Somfy; S7-300; 3 LGW; HUE; HM-IP auf Charly

szoller

Ja, ist mir schon klar, allerdings sollte man dazu die Thematik selbst auch verstehen.

Mein konkretes Problem ist die Flut an Informationen in diesem Thema, weiß gar nicht wo ich anfangen soll  ;D

Brauch ich jetzt zB. Boop oder muss ich doch was anderes flashen... da fängts bei mir schon an ;-)

KölnSolar

ZitatBrauch ich jetzt zB. Boop oder muss ich doch was anderes flashen...
Na das ist (fast) einfach  ;D
BBoooopppp

In den ersten Posts sind beschrieben: Flashhardware, Betty-Heaven(flashsoftware unter Win), Lokation des Boop-Sourcecodes, Toolchain f. Compile.

und zu meinen Problemen: versteht jemand, warum der Precompiler die simplen Makros nicht mag error: expected expression before ')' token
#define SET_BIT(PORT, BITNUM) ((PORT) |= (1<<(BITNUM)))

Verwendung:    SET_BIT( CC1100_CS_DDR, CC1100_CS_PIN );
   
sollte eigentlich dann das:   CC1100_CS_DDR |= (1<<CC1100_CS_PIN)
ergeben.

Mit avr-gcc und makefiles der aculfw klappt das problemlos. Irgendeine Option ins makefile ? Nur welche ?

Versuche ich mich im Vergleich dem Problem anzunähern, scheitere ich beim make einer CUL_433 bereits daran, dass die option -mmcu=... abgewiesen wird. Geht arm-none-eabi-gcc also eben nur für arm-Prozessoren und nicht avr, oder ?
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

Telekatz

Zitat von: KölnSolar am 28 April 2017, 10:53:44
Versuche ich mich im Vergleich dem Problem anzunähern, scheitere ich beim make einer CUL_433 bereits daran, dass die option -mmcu=... abgewiesen wird. Geht arm-none-eabi-gcc also eben nur für arm-Prozessoren und nicht avr, oder ?
Das sagt doch der Name arm-none-eabi-gcc schon aus, dass das für ARM ist. AVR ist nicht ARM.

KölnSolar

Die Antwort hatte ich ja fast erwartet  ;) Hätte ja sein können, dass die Toolchain beide kann, schade  :(

Auch noch ne Idee zu den Makros ? Wird das generell im arm-none-eabi-gcc nicht unterstützt ? Bliebe ja noch die Möglichkeit eine Funktion für zu bauen.
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

Telekatz

#65
Poste mal etwas mehr vom Code. Das was davor und danach kommt. Und auch etwas mehr von der Compilerausgabe beim Fehler.

KölnSolar

mehr ist es leider nicht  :( das define des makros und dann die Fehlermeldung des Precompilers. Davor und danach ist unerheblich. Hab die Makros schon an x verschiedenen Stellen eingebaut.
Ok, hab gerade noch gesehen, dass beim cut&paste der Unterstrich nicht transportiert wurde, welche ")" der Precompiler meint. Es ist die hinter dem ersten PORT.
Der Meldung folgend hab ich dann mal getan, was der Precompiler will und einfach PORT+1 in die Klammer geschrieben, Dann lautet die Meldung:
error: lvalue required as left operand of assignment. Markiert ist dann nicht die Klammer sondern das "|" vom "|=". Deshalb gehe ich ja davon aus, dass der Compiler entweder ein generelles Problem mit solchen Makros hat oder er aber (hoffentlich) mit einer option zu überlisten ist. Nur wo könnte man das nachlesen  :-[
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

Telekatz

Der Compiler hat kein Problem mit solchen Makros. Das Problem sitzt so gut wie immer vor der Tastatur und tippt darauf herum.
Ist CC1100_CS_DDR und CC1100_CS_PIN überhaupt definiert?

KölnSolar

#68
wie gerne würde ich Dir zustimmen, aber
#define CC1100_CS_port      1
#define CC1100_CS_PIN 2
#define SET_BIT(PORT, BITNUM) ((PORT) |= (1<<(BITNUM)))
#define CLEAR_BIT(PORT, BITNUM) ((PORT) &= ~(1<<(BITNUM)))

int main(void)
{
  SET_BIT( CC1100_CS_port, CC1100_CS_PIN ); 
  CLEAR_BIT( CC1100_CS_port, CC1100_CS_PIN );
} // main

sollte dann funktionieren und nicht
main.c: In function 'main':
main.c:3:39: error: lvalue required as left operand of assignment
#define SET_BIT(PORT, BITNUM) ((PORT) |= (1<<(BITNUM)))
                                       ^
main.c:8:3: note: in expansion of macro 'SET_BIT'
   SET_BIT( CC1100_CS_port, CC1100_CS_PIN );
   ^~~~~~~
main.c:4:41: error: lvalue required as left operand of assignment
#define CLEAR_BIT(PORT, BITNUM) ((PORT) &= ~(1<<(BITNUM)))
                                         ^
main.c:9:3: note: in expansion of macro 'CLEAR_BIT'
   CLEAR_BIT( CC1100_CS_port, CC1100_CS_PIN );
   ^~~~~~~~~
Makefile:129: recipe for target 'main.o' failed
make: *** [main.o] Error 1

ergeben, oder ?
edit: und so
#include <avr/iom32u4.h>

#define CC1100_CS_DDR DDRB
#define CC1100_CS_PIN PB3

#define SET_BIT(PORT, BITNUM) ((PORT) |= (1<<(BITNUM)))
#define CLEAR_BIT(PORT, BITNUM) ((PORT) &= ~(1<<(BITNUM)))

int main(void)
{
  SET_BIT( CC1100_CS_DDR, CC1100_CS_PIN ); 
  CLEAR_BIT( CC1100_CS_DDR, CC1100_CS_PIN );
} // main

kommt dann wieder
In file included from main.c:1:0:
./avr/iom32u4.h:39:4: error: #error "Include <avr/io.h> instead of this file."
#  error "Include <avr/io.h> instead of this file."
    ^~~~~
main.c: In function 'main':
main.c:6:37: error: expected expression before ')' token
#define SET_BIT(PORT, BITNUM) ((PORT) |= (1<<(BITNUM)))
                                     ^
main.c:11:3: note: in expansion of macro 'SET_BIT'
   SET_BIT( CC1100_CS_DDR, CC1100_CS_PIN );
   ^~~~~~~
main.c:7:39: error: expected expression before ')' token
#define CLEAR_BIT(PORT, BITNUM) ((PORT) &= ~(1<<(BITNUM)))
                                       ^
main.c:12:3: note: in expansion of macro 'CLEAR_BIT'
   CLEAR_BIT( CC1100_CS_DDR, CC1100_CS_PIN );
   ^~~~~~~~~
Makefile:129: recipe for target 'main.o' failed
make: *** [main.o] Error 1

:'(
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

papa

Das liegt daran, das CC1100_CS_port eine Konstante ist und dieser kann der Compiler keinen Wert zuweisen. Du musst im Macro auf eine Adresse casten.


#define CC1100_CS_port      1
#define CC1100_CS_PIN 2

#define SET_BIT(PORT, BITNUM) (*(char*)(PORT) |= (1<<(BITNUM)))
#define CLEAR_BIT(PORT, BITNUM) (*(char*)(PORT) &= ~(1<<(BITNUM)))

int main(void)
{
  SET_BIT( CC1100_CS_port, CC1100_CS_PIN );
  CLEAR_BIT( CC1100_CS_port, CC1100_CS_PIN );
  return 0;
}


So geht es zum Beispiel. Du musst char* entsprechend der Addressbreite noch austauschen.
BananaPi + CUL868 + CUL433 + HM-UART + 1Wire

Telekatz

#70
Besser wäre es bereits mit dem define für CC1100_CS_port einen Pointer zu definieren.

Und mach erst mal das, was der Compiler sagt:
./avr/iom32u4.h:39:4: error: #error "Include <avr/io.h> instead of this file."
#  error "Include <avr/io.h> instead of this file."

KölnSolar

#71
@papa: ok, glaube ich Dir jetzt mal so. Entscheidend ist aber der 2. Test.
edit: neugierig hab ich es ausprobiert. Stimmt. Aber leider ist das 2. Bsp. das Entscheidende  :( :(

@telekatz: ist ja einfach nur ein Extrakt aus der culfw. avr-gcc kanns, arm-none-eabi-gcc nicht. Und ich will ja gerade nichts an der culfw ändern, sonst hätt ich mir schon längst anders beholfen. Nicht vielleicht doch ne einfache option ?
edit:
ZitatUnd mach erst mal das, was der Compiler sagt:
Code: [Auswählen]
./avr/iom32u4.h:39:4: error: #error "Include <avr/io.h> instead of this file."
#  error "Include <avr/io.h> instead of this file."
Prinzipiell schon klar hat aber mit dem Beispiel nix zu tun(und arm-none-eabi-gcc  kann ja kein -mmcu=atmega32u4, was der Grund für die Fehlermeldung istweshalb ein include io.h nicht funktioniert)
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

Telekatz

DDRB ist in iom32u4.h so definiert:

#define DDRB _SFR_IO8(0x04)

Da macht der Präprozessor dann daraus:

int main(void)
{
  ((_SFR_IO8(0x04)) |= (1<<(2)));
  ((_SFR_IO8(0x04)) &= ~(1<<(2)));
  return 0;
}


Da du das File, in dem das AVR Makro _SFR_IO8 definiert ist nicht inkludierst, wird es nicht aufgelöst und der Compiler sagt dir, dass in der linken Klammer Unsinn steht.

Und deshalb sitzt das Problem vor der Tastatur.

KölnSolar

DAS klingt schlüssig. Muss ich suchen, ob das noch in der culfw steckt....
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt

KölnSolar

es war es (fast). Fast deshalb, weil ich es sogar aus meiner iom32u4.h rausgenommen hatte, als ich noch kein Verständnis für Makros hatte  :-[

Danke, da wär ich im Leben nicht drauf gekommen. Die Fehlermeldung ist auch nicht wirklich umfangreich...

Nun muss ich die geglaubt behoben zu habenden Fehler wieder suchen...
RPi3/2 buster/stretch-SamsungAV_E/N-RFXTRX-IT-RSL-NC5462-Oregon-CUL433-GT-TMBBQ-01e-CUL868-FS20-EMGZ-1W(GPIO)-DS18B20-CO2-USBRS232-USBRS422-Betty_Boop-EchoDot-OBIS(Easymeter-Q3/EMH-KW8)-PCA301(S'duino)-Deebot(mqtt2)-zigbee2mqtt