rc5.c

gehe zur Dokumentation dieser Datei
00001 /*
00002  * rc5.c Infrarot Fernbedienung Funktionen
00003  *
00004  * This program is free software; you can redistribute it
00005  * and/or modify it under the terms of the GNU General
00006  * Public License as published by the Free Software
00007  * Foundation; either version 2 of the License, or (at your
00008  * option) any later version.
00009  * This program is distributed in the hope that it will be
00010  * useful, but WITHOUT ANY WARRANTY; without even the implied
00011  * warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR
00012  * PURPOSE. See the GNU General Public License for more details.
00013  * You should have received a copy of the GNU General Public
00014  * License along with this program; if not, write to the Free
00015  * Software Foundation, Inc., 59 Temple Place, Suite 330, Boston,
00016  * MA 02111-1307, USA.
00017  *
00018  */
00019 
00032 // Infos ueber RC6: http://www.xs4all.nl/~sbp/knowledge/ir/rc6.htm
00033 // http://www.xs4all.nl/~sbp/knowledge/ir/ir.htm
00034 
00035 // ========================================================================
00036 // RC5 Infrarot-Empfaenger
00037 // ========================================================================
00038 #include <avr/io.h>
00039 #include "rc5.h"
00040 
00041 
00042 // -----------------------------------------------------------------------------
00043 // Timing
00044 // -----------------------------------------------------------------------------
00045 #define IR_SAMPLES_PER_BIT     8   
00046 #define IR_SAMPLES_PER_BIT_EARLY 6  
00047 #define IR_SAMPLES_PER_BIT_LATE 10  
00048 #define IR_SAMPLES_PER_BIT_MIN   3  
00049 #define IR_PAUSE_SAMPLES       250  
00050 // Pegelaenderung gueltig -- eigentlich muesste
00051 // man rund 500 Samples abwarten (50 x
00052 // Bitzeit), doch weil der Samplezaehler ein
00053 // Byte ist, beschraenken wir uns hier auf ein
00054 // Minimum von 250 Samples
00055 
00056 #define IR_PORT   PORTD     
00057 #define IR_DDR    DDRD      
00058 #define IR_PINR   PIND      
00059 #define IR_PIN    PD0       
00062 static uint8_t     RC5lastsample = 0;  
00063 static uint8_t     RC5bittimer   = 0;  
00065 static uint16_t    RC5data_tmp = 0;    
00066 static uint8_t     RC5bitcount = 0;    
00068 volatile uint16_t  RC5data = 0;        
00069 volatile uint8_t   enableRC5 = 0;      
00075 void IsrRC5 (void)
00076 {
00077   // sample lesen
00078   uint8_t sample = 1;
00079 
00080   if ((IR_PINR & (1<<IR_PIN)) != 0)
00081   {
00082     sample = 0;
00083   }
00084 
00085   // bittimer erhoehen (bleibt bei 255 stehen)
00086   if (RC5bittimer<255)
00087   {
00088     RC5bittimer++;
00089   }
00090 
00091   // flankenerkennung
00092   if ( RC5lastsample != sample)
00093   {
00094     if (RC5bittimer<=IR_SAMPLES_PER_BIT_MIN)
00095     {
00096       // flanke kommt zu frueh: paket verwerfen
00097       RC5bitcount=0;
00098     }
00099     else
00100     {
00101       // Startbit
00102       if (RC5bitcount==0)
00103       {
00104         if ( (sample==1) && (RC5bittimer>IR_PAUSE_SAMPLES) )
00105         {
00106           // Startbit speichern
00107           RC5data_tmp = 1;
00108           RC5bitcount++;
00109         }
00110         else
00111         {
00112           // error
00113           RC5data_tmp = 0;
00114         }
00115 
00116         // bittimer-reset
00117         RC5bittimer = 0;
00118 
00119         // Bits 2..14: nur Flanken innerhalb des Bits beruecksichtigen
00120       }
00121       else
00122       {
00123         if (RC5bittimer >= IR_SAMPLES_PER_BIT_EARLY)
00124         {
00125           if (RC5bittimer<=IR_SAMPLES_PER_BIT_LATE)
00126           {
00127             // Bit speichern
00128             RC5data_tmp = (RC5data_tmp<<1) | sample;
00129             RC5bitcount++;
00130           }
00131           else
00132           {
00133             // zu spaet: paket verwerfen
00134             RC5bitcount = 0;
00135           }
00136 
00137           // bittimer-reset
00138           RC5bittimer = 0;
00139         }
00140       }
00141     }
00142 
00143   }
00144   else
00145   {
00146     // keine flanke innerhalb bitzeit?
00147     if (RC5bittimer > IR_SAMPLES_PER_BIT_LATE)
00148     {
00149       // 14 bits gelesen?
00150       if (RC5bitcount==14)
00151       {
00152         RC5data = RC5data_tmp;
00153       }
00154       // paket verwerfen
00155       RC5bitcount = 0;
00156     }
00157   }
00158 
00159   // sample im samplepuffer ablegen
00160   RC5lastsample = sample;
00161 
00162 
00163 }
00164 
00165 
00170 uint16_t ReadRC5 (void)
00171 {
00172   uint16_t retvalue = RC5data;
00173   RC5data = 0;
00174   return retvalue;
00175 }
00176 
00180 void InitRC5 (void)
00181 {
00182   IR_DDR  &= ~IR_PIN;   // Pin auf Input
00183   IR_PORT |= IR_PIN;    // Pullup an
00184   enableRC5 = 1;
00185 }
00186 
00187 

Erzeugt am Sun Nov 18 18:24:52 2007 für ASURO Library von  doxygen 1.5.1-p1