Programm for decoding radio-signals sent by a ETH-Window-Shutter-Contact, received with a RFM12B-module

Dependencies:   TextLCD mbed

Revision:
0:96794c9fc5a3
Child:
1:fc72e0bdb693
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/eth_comfort.cpp	Wed Mar 02 20:46:57 2011 +0000
@@ -0,0 +1,204 @@
+/** module for receiving data from eth comfort window sensor by ELV(R) with a RFM12 transceiver module by Hope
+
+  Details see discussion on http://www.mikrocontroller.net/topic/172034
+  Frequenz 868,3
+  Modulation FSK
+  Hub +/- 15kHz
+  Datenrate 10kbit Manchester
+  
+  das Protokoll ist Machester codiert
+  0x7e zz ll aa aa aa cmd crc crc
+
+  zz ist ein fortlaufender Zaehler
+  ll die Blocklaenge 10,20,30 (20 = 9 Byte, 10= 10Byte ,30= ?)
+  aa 3 Byte Adresse
+  cmd der Befehl
+  crc 16 bit checksumme
+
+  die Reihenfolge der Bits im Byte ist verdreht.
+
+*/
+
+
+// WED 6.9.2009
+// extended and adapeted to mbed by Karl Zweimueller 1/2011
+
+
+#include "eth_comfort.h"
+
+
+/* orig AVR-values
+#define BIT_MAX 0x90
+#define BIT_MIN 0x10
+#define LEN_2T 0x44
+*/
+
+//working: 300-80-200
+// nominal values are: 208-104-208 for 9600 bits/sec
+#define BIT_MAX 300                         // maximum allowed time for one or two bits high or low
+#define BIT_MIN 80                          // minimum allowed time for one or two bits high or low
+#define LEN_2T 200                          // time-value to differentiate one or two bit length
+
+
+volatile uint16_t b;
+
+volatile uint8_t transmit,bit_cnt;
+volatile uint16_t buffer_cnt;
+
+
+volatile unsigned char old ;
+volatile uint8_t rbyte;
+
+volatile uint8_t buf[1024];
+volatile uint8_t pack_ok,startbit;
+volatile uint8_t decode,bcnt,lastbit;
+volatile uint8_t state;
+
+// Timer for bit-length-measurement
+Timer BitTime;
+
+//-------------------------------------------------------------------------
+// calcCRC16r()
+//-------------------------------------------------------------------------
+/**
+ * @brief calculate reverse CRC
+ * @param c 16bit value for crc
+ * @param crc old crc value
+ * @param mask crc polynom
+ * @return crc value
+ */
+uint16_t calcCRC16r( uint16_t c,uint16_t crc, uint16_t mask)  // reverser crc!!!!!!
+{
+uint8_t  i;
+  for(i=0;i<8;i++)
+  {
+    if((crc ^ c) & 1) { crc=(crc>>1)^mask; }
+    else crc>>=1;
+    c>>=1;
+  };
+ return(crc);
+}
+
+// initialize eth_receiver
+void eth_init()
+{
+      // start timer for bit-length-measurement
+      BitTime.start();
+
+}
+
+//
+//
+//
+
+/** ISR Interrupt routine for received data
+  * triggers on every pin change high/low and low/high
+  * does all the encoding of the signal including manchester decoding!
+  * as the eth doesn't send a good signal, which the rfm12 could decode for himself
+  * didn't test for myself - just got the code from someone else and ported to mbed!
+*/
+void ISR()    // pin change on rxin ->interrupt
+{
+      //led2=!led2;
+      b=BitTime.read_us();                                      // time since last change
+      BitTime.reset();
+
+      if((b>BIT_MAX)||(b<BIT_MIN)){                             // is bit time in range?
+          state=0;
+      }
+      else{
+
+
+              if(state==0){                                  // wait for first bitchange 2T
+                  if(b>LEN_2T)state=1;
+                  //if((rxin)!=0)state=0;                      // level should be low
+              }
+              else if(state<=10){                            // wait for 5 fullbit without bitchange 10 shortbits
+                  if(b<LEN_2T)state++;
+                  else state=1;                              // bitchange found back to state 1
+              }
+              else if(state==11){                            // now expecting bitchange (last bit in 7e is 0)
+                  if(b<LEN_2T){
+                      state=0;                               // no bitchange -> back to search
+                  };
+                  state=20;                                  // now we found 7e sync finished
+                  rbyte=0x7e;                                // set shift value to 0
+                  bit_cnt=8;                                 // clear bitcounter
+                  buffer_cnt=0;                              // clear buffercounter
+                  bcnt=0;
+                  lastbit=0;
+
+              }
+              else if(state==20){
+                  if(b>LEN_2T){                                // check for bitchange
+                      if(lastbit!=0){
+                          rbyte=(rbyte>>1);                     // last bit was 1 new is 0
+                          bcnt=0;
+                          lastbit=0;
+                      }
+                      else {
+                          rbyte=(rbyte>>1)|0x80;              // last bit was 0 new is 1
+                          bcnt++;
+                          lastbit=1;
+                      }
+                      state=20;                                // fullbit compleate
+                      bit_cnt++;                            // increase bit counter
+                  }
+                  else{
+                      state=21;                                // bit is halfbit, wait for next halfbit
+                  };
+              }
+              else if(state==21){                            // no bitchange
+                  if(b<LEN_2T){                                // next bit must be a halfbit
+                      if(lastbit==0){
+                          rbyte=(rbyte>>1);  // last bit was 0 new is 0
+                          lastbit=0;
+                          bcnt=0;
+                      }
+                      else {
+                          rbyte=(rbyte>>1)|0x80;              // last bit was 1 new is 1
+                          lastbit=1;
+                          bcnt++;
+                      }
+                      state=20;
+                      bit_cnt++;
+                  }
+                  else{
+                      state=0;                            // bit is no halfbit -> Manchester violation
+                     // state=20;
+                  };
+              }else if(state==22){                            // after 5 bit 1 skip one bit 0
+                  if(b>LEN_2T){                                // check for bitchange (next bit 0)
+                      lastbit=0;
+                      state=20;
+                  }
+                  else{
+
+                     lastbit=1;
+                     //state=11;
+                     state=21;
+                  }
+                  bcnt=0;
+
+
+              }
+              if(bcnt==5)state=22;
+
+              if(bit_cnt>7){                                // wait for 8 bits
+                  buf[buffer_cnt]=rbyte;                    // save value into buffer
+                  if(buffer_cnt<1020){
+                      buffer_cnt++;
+                  };
+                  pack_ok=1;                                // set receiveflag
+                  bit_cnt=0;                                // clear bitcounter
+                  led3= !led3;                              //show received byte
+                  
+                  //
+              };
+      };
+      
+}
+
+
+
+