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

Dependencies:   TextLCD mbed

eth_comfort.cpp

Committer:
charly
Date:
2011-03-02
Revision:
0:96794c9fc5a3
Child:
1:fc72e0bdb693

File content as of revision 0:96794c9fc5a3:

/** 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
                  
                  //
              };
      };
      
}