FHEM Forum

CUL => Hard- und Firmware => Thema gestartet von: RaspII am 08 Februar 2015, 21:31:57

Titel: Datenempfag via CUL, brauche Unterstüztung
Beitrag von: RaspII am 08 Februar 2015, 21:31:57
Hallo,
ich habe die culfw dahingehend erweitert, dass ich via Kopp Free Control Protokoll Daten senden kann.
(http://forum.fhem.de/index.php/topic,14790.0.html (http://forum.fhem.de/index.php/topic,14790.0.html))
Jetzt würde ich gerne auch den Empfang von Daten implementieren, bin hier aber völlig unbedarft (soll komplizierter sein wie einfach nur zu senden).

Ich habe den kompletten Empfangsteil schon auf einem Raspberry Pi + RFM12b Modul am Laufen.
Das Handling des CC1101 Bausteins ist für mich kein Problem, ich benötige hauptsächlich folgende Info's:

Wäre Klasse, wenn mir jemand hier helfen könnte bzw. hier einen Link auf bereits vorhandene Doku einstellt (sollte es bereits Tipps im Forum geben).
Falls es noch nichts gibt wäre es jetzt an der Zeit dies in der Wiki zu dokumentieren, ich würde mich da gerne beteiligen (ich muss mich sowieso einarbeiten).

Na dann mal schaun
Gruß
RaspII


Titel: Antw:Datenempfag via CUL, brauche Unterstüztung
Beitrag von: rudolfkoenig am 11 Februar 2015, 08:25:15
Culfw ist nicht so modular aufgebaut wie z.Bsp. FHEM, und fuer viele "Architektur"-Entscheidungen ist der begrenzte Speicher der CUL_V1/V2 verantwortlich, d.h. 12kb Programmspeicher und 512 Byte RAM, letzteres muss auch den Stack beherbergen. CUL_V3/V4 ist ein bisschen besser dran, kommt aber gerade auch an seine Grenzen.

Ein CUL ist vereinfacht gesagt ist ein CC1101 und eine USB-faehige atmega (aka MCU). Das CC1101 beherrscht zwei prinzipiell unterschiedliche Modi: Paket und Interrupt-Modus.

Im Paketmodus kriegt das atmega vom CC1101 ein Interrupt, wenn ein komplettes Paket (1-64 Bytes) fehlerfrei und an diesen Knoten Adressiert empfangen wurden. Die Bytes kann man "fertig" auslesen.  Diesen Modus verwendet man, falls man HM, MAX oder RWE empfaengt. In diesem Modus stellt man zwar einige Parameter wie Frequenz, Modulation und Datenrate ein, aber viele andere Parameter wie Sync-Bits und Checksum kann man nicht ganz frei waehlen. De-Facto kann man in diesem Modus nur Daten von Sender empfangen, die auch ein CC1101 verwenden.

Im Interruptmodus kriegt die MCU ein Interrupt (rf_receive.c/ISR(CC1100_INTVECT)), falls der Signalpegel sich aendert. Damit koennte man im Prinzip alles dekodieren, alledings muss die MCU die Arbeit machen. Das groesste Problem mAn ist aber, dass die Interrupts nicht sehr genau geliefert oder empfangen werden, +/- 50us ist keine Seltenheit, und das beschraenkt die Datenrate(!) auf ca 10kHz.
Diesen Modus habe ich deswegen SlowRF genannt, und culfw implementiert einige Protokolle, wie FS20, FHT, S300, EM, etc.
Diese koennen alle gleichzeitig empfangen werden, muessen aber die Einschraenkung haben, dass die Sync bits aus einer Folge von 0-en gefolgt von einem 1 sind, und dass am Ende eines Paketes ein Pause von ca 4ms kommt.

Die Interrupt-Routine stellt bei der Sync-Folge die laengen fuer die 0/1 Bits fest, und nach der Pause versucht die gesammelten Bits einem Protokoll zuzuordnen (analyze). Falls etwas erkannt wurde, dann wird der Protokoll-Kenner (F,E,K,etc) vorangestellt, und die Daten als HEX mit einem Newline am Schluss ausgegeben.
Titel: Antw:Datenempfag via CUL, brauche Unterstüztung
Beitrag von: RaspII am 20 April 2015, 13:26:36
Hi Rudolf,
Hab den Empfangsmode jetzt prototypisch implementiert, aber eine Frage hab ich noch:

Wie läuft das mit dem Packetempfang und Interrupt?
Ich kenne 3 Aufrufe:
_init
_func
_task

_init wird vermutlich jeweils beim booten aufgerufen,
_func bei Start eines Kommandos
_tasc vermutlich zyklisch (so schnell es halt geht?)

Aber wie/wo  werden Interrupts verarbeitet?
Gibt es eine Standard Interrupt Abarbeitung oder muss ich alles selbst erledigen, was muss ich tun damit meine eigene Interruptroutine gestartet wird?

Gruß
Claus

Titel: Antw:Datenempfag via CUL, brauche Unterstüztung
Beitrag von: rudolfkoenig am 20 April 2015, 20:00:31
_init dient fuer irgendwelche Initialisierungen.
_func wird in die fntab eingetragen, und reagiert auf Benutzer (bzw. FHEM-Modul) Eingaben. Im Normalfall braucht man normalerweise kein _init, _func sollte reichen. _task wird regelmaessig aufgerufen, sollte sich nicht blockieren. Falls durch _func der Protokollempfang nicht aktiviert ist, dann returnt er sofort. Sonst fuehrt regelmaessig anfallende Aufgaben aus, z.Bsp. CC1101 Paketstand pruefen.

Den Aufruf von _init/_func/_task muss man in alle Architekturdateien (CUL.c/CUNO.c/etc) reinschreiben, also mehrfach.

Interrupts gibts mWn nur fuer slowrf in rf_receive.c (ISR(CC1100_INTVECT) und ISR(TIMER1_COMPA_vect)), wenn dein Protokoll slowrf ist, musst dich da reinhaengen, mit einerm #ifdef + Variable pruefen, ob dein Protokoll aktiviert ist.
Titel: Antw:Datenempfag via CUL, brauche Unterstüztung
Beitrag von: RaspII am 20 April 2015, 21:41:06
Ok,
verstanden.
Merci
Titel: Antw:Datenempfag via CUL, brauche Unterstüztung
Beitrag von: RaspII am 04 Mai 2015, 23:32:59
Hi Rudolf,
hätte fast vergessen mich nochmal zu melden.
Hat alles bestens geklappt.
Danke für Deine Unterstützung
Ich kann jetzt problemlos Packete empfangen.
Diese kann ich korrekt mit einem Terminalprogramm empfangen (ich nutze den Code "kr.....".

Der nächste Schritt ist jetzt mein FHEM Modul (kopp_fc.pm) anzupassen.
http://forum.fhem.de/index.php/topic,36914.0.html (http://forum.fhem.de/index.php/topic,36914.0.html)
Ich  hänge ich etwas fest (siehe Link) aber mir wird schon geholfen (wie immer).

Gruß
RaspII