Subversion Repositories HomeAutomation

Rev

Rev 122 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | SVN | RSS feed

  1. /*********************************************************************
  2.  *
  3.  *                  IR reciver module
  4.  *
  5.  *********************************************************************
  6.  * FileName:        $HeadURL: https://svn.auml.se/svn/HomeAutomation/trunk/EmbeddedSoftware/PIC/canIR/Source/IRec.c $
  7.  * Last changed:    $LastChangedDate: 2006-11-18 22:14:33 +0100 (Sat, 18 Nov 2006) $
  8.  * By:              $LastChangedBy: johboh $
  9.  * Revision:        $Revision: 124 $
  10.  ********************************************************************/
  11.  
  12. #include <IRec.h>
  13.  
  14. #include <CAN.h>
  15. #include <funcdefs.h>
  16.  
  17. #ifdef USE_IREC
  18.  
  19. static BYTE toggle = 0;
  20. static BYTE addr = 0;
  21. static BYTE data = 0;
  22. static BYTE bitIndex = 0;
  23. static IR_TYPE type = IR_NONE;
  24.  
  25. /*
  26. *   Function: irecInit
  27. *
  28. *   Input:  none
  29. *   Output: none
  30. *   Pre-conditions: none
  31. *   Affects: none
  32. *   Depends: TIMER 3 is free
  33. */
  34. void irecInit()
  35. {
  36.  
  37.     // Setup timer 3 to be source for CCP1
  38.     T3CON = 0b11111001;
  39.    
  40.     // configure timer 3 interrupt (for overflow)
  41.     PIR2bits.TMR3IF = 0;
  42.     PIE2bits.TMR3IE = 1;
  43.     IPR2bits.TMR3IP = 1;
  44.  
  45.     // Setup CCP1 to use capture on falling edge
  46.     CCP1CON=0x04;
  47.  
  48.     // Enable CCP1 interrupt and set priority to high.
  49.     PIR1bits.CCP1IF=0;
  50.     PIE1bits.CCP1IE=1;
  51.     IPR1bits.CCP1IP=1;
  52.  
  53. }
  54.  
  55. /*
  56. *   Function: irecISR
  57. *
  58. *   Input:  none
  59. *   Output: none
  60. *   Pre-conditions: a call to irecInit()
  61. *   Affects: ...
  62. *   Depends: ...
  63. */
  64. void irecISR()
  65. {
  66.     static WORD timediff = 0;
  67.     static BOOL started = FALSE;
  68.     static BYTE lastbit = 1;
  69.     static BOOL second = FALSE;
  70.  
  71.     // If IR bit
  72.     if(PIR1bits.CCP1IF && PIE1bits.CCP1IE)
  73.     {
  74.         // Read timediff
  75.         timediff  = TMR3L;
  76.         timediff += (((WORD)TMR3H)<<8);
  77.  
  78.         // Clear timer.
  79.         TMR3H = 0;
  80.         TMR3L = 0;
  81.  
  82.         // Wait on inverse edge
  83.         CCP1CONbits.CCP1M0=~CCP1CONbits.CCP1M0;
  84.  
  85.         // Disable interrupt
  86.         PIR1bits.CCP1IF=0;
  87.  
  88.         // If found RC5 och RC5X startbit...
  89.         if (started==TRUE && (type==IR_RC5 || type==IR_RC5X))
  90.         {
  91.             // Parse message
  92.            
  93.             if ((t2-250)<timediff && timediff<(t2+250) && second==FALSE)
  94.             {
  95.                 if (bitIndex==0) toggle=lastbit;
  96.                 if (bitIndex>=1 && bitIndex<=5) addr+=(lastbit<<(5-bitIndex));
  97.                 if (bitIndex>=6 && bitIndex<=11) data+=(lastbit<<(11-bitIndex));
  98.                 bitIndex++;
  99.    
  100.                 second = TRUE;
  101.                 return;
  102.             }
  103.    
  104.             if ((t4-250)<timediff && timediff<(t4+250) && second==FALSE)
  105.             {
  106.                 lastbit=(lastbit?0:1);
  107.    
  108.                 if (bitIndex==0) toggle=lastbit;
  109.                 if (bitIndex>=1 && bitIndex<=5) addr+=(lastbit<<(5-bitIndex));
  110.                 if (bitIndex>=6 && bitIndex<=11) data+=(lastbit<<(11-bitIndex));
  111.                 bitIndex++;
  112.    
  113.                 second = TRUE;
  114.                 return;
  115.             }
  116.    
  117.             if ((t2-250)<timediff && timediff<(t2+250) && second==TRUE)
  118.             {
  119.                 second = FALSE;
  120.                 return;
  121.             }
  122.    
  123.             if ((t4-250)<timediff && timediff<(t4+250) && second==TRUE)
  124.             {
  125.                 lastbit=(lastbit?0:1);
  126.    
  127.                 if (bitIndex==0) toggle=lastbit;
  128.                 if (bitIndex>=1 && bitIndex<=5) addr+=(lastbit<<(5-bitIndex));
  129.                 if (bitIndex>=6 && bitIndex<=11) data+=(lastbit<<(11-bitIndex));
  130.                 bitIndex++;
  131.    
  132.                 return;
  133.             }
  134.  
  135.         } // if started and type == RC5 or RC5X
  136.  
  137.  
  138.         // If RC6...
  139.         if (started==TRUE && type==IR_RC6)
  140.         {
  141.  
  142.             if ((t1-250)<timediff && timediff<(t1+250) && second==FALSE)
  143.             {
  144.                 if (bitIndex==0) toggle=lastbit;
  145.                 if (bitIndex>=1 && bitIndex<=8) addr+=(lastbit<<(8-bitIndex));
  146.                 if (bitIndex>=9 && bitIndex<=16) data+=(lastbit<<(16-bitIndex));
  147.                 bitIndex++;
  148.    
  149.                 second = TRUE;
  150.                 return;
  151.             }
  152.    
  153.             if ((t2-250)<timediff && timediff<(t2+250) && second==FALSE)
  154.             {
  155.                 lastbit=(lastbit?0:1);
  156.    
  157.                 if (bitIndex==0) toggle=lastbit;
  158.                 if (bitIndex>=1 && bitIndex<=8) addr+=(lastbit<<(8-bitIndex));
  159.                 if (bitIndex>=9 && bitIndex<=16) data+=(lastbit<<(16-bitIndex));
  160.                 bitIndex++;
  161.    
  162.                 second = TRUE;
  163.                 return;
  164.             }
  165.    
  166.             if ((t1-250)<timediff && timediff<(t1+250) && second==TRUE)
  167.             {
  168.                 second = FALSE;
  169.                 return;
  170.             }
  171.    
  172.             if ((t2-250)<timediff && timediff<(t2+250) && second==TRUE)
  173.             {
  174.                 lastbit=(lastbit?0:1);
  175.    
  176.                 if (bitIndex==0) toggle=lastbit;
  177.                 if (bitIndex>=1 && bitIndex<=8) addr+=(lastbit<<(8-bitIndex));
  178.                 if (bitIndex>=9 && bitIndex<=16) data+=(lastbit<<(16-bitIndex));
  179.                 bitIndex++;
  180.    
  181.                 return;
  182.             }
  183.  
  184.         } // if started and type == RC6
  185.  
  186.  
  187.  
  188.         bitIndex++;
  189.  
  190.  
  191.         if (started==FALSE && type==IR_NONE && bitIndex==2 && (t2-250)<timediff && timediff<(t2+250))
  192.         {
  193.             type=IR_RC5;
  194.         }
  195.         else if (started==FALSE && type==IR_NONE && bitIndex==2 && (t4-250)<timediff && timediff<(t4+250))
  196.         {
  197.             started = TRUE;
  198.             bitIndex = 0;
  199.             lastbit = 1;
  200.             type=IR_RC5X;
  201.         }
  202.         else if (started==FALSE && type==IR_NONE && bitIndex==2 && (t6-250)<timediff && timediff<(t6+250))
  203.         {
  204.             type=IR_RC6;
  205.         }
  206.         else if (started==FALSE && type==IR_RC6 && bitIndex==9)
  207.         {  
  208.             started = TRUE;
  209.             bitIndex = 0;
  210.             lastbit = 0;
  211.             type=IR_RC6;
  212.             second = TRUE;
  213.         }
  214.         else if (started==FALSE && type==IR_RC5 && bitIndex==3 && (t2-250)<timediff && timediff<(t2+250))
  215.         {
  216.             started = TRUE;
  217.             bitIndex = 0;
  218.             lastbit = 1;
  219.             type=IR_RC5;
  220.         }
  221.         else if(bitIndex>2 && type!=IR_RC6)
  222.         {
  223.             type=IR_NONE;
  224.         }
  225.         else if(bitIndex>9)
  226.         {
  227.             type=IR_NONE;
  228.         }
  229.        
  230.     }
  231.  
  232.  
  233.  
  234.  
  235.     // If timer 3 overflow
  236.     if(PIR2bits.TMR3IF && PIE2bits.TMR3IE)
  237.     {  
  238.  
  239.         PIR2bits.TMR3IF=0;
  240.  
  241.         if (type!=IR_NONE)
  242.         {
  243.             irecParse(type,toggle,addr,data);
  244.         }
  245.  
  246.         started  = FALSE;
  247.         bitIndex = 0;
  248.         addr = 0;
  249.         toggle = 0;
  250.         data = 0;
  251.         type = IR_NONE;
  252.  
  253.         // wait in falling edge.
  254.         CCP1CONbits.CCP1M0=0;
  255.        
  256.     }
  257.  
  258. }
  259.  
  260.  
  261.  
  262. #endif
  263.