00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00032
00033
00034
00035
00036
00037
00038 #include <avr/io.h>
00039 #include "rc5.h"
00040
00041
00042
00043
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
00052
00053
00054
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
00078 uint8_t sample = 1;
00079
00080 if ((IR_PINR & (1<<IR_PIN)) != 0)
00081 {
00082 sample = 0;
00083 }
00084
00085
00086 if (RC5bittimer<255)
00087 {
00088 RC5bittimer++;
00089 }
00090
00091
00092 if ( RC5lastsample != sample)
00093 {
00094 if (RC5bittimer<=IR_SAMPLES_PER_BIT_MIN)
00095 {
00096
00097 RC5bitcount=0;
00098 }
00099 else
00100 {
00101
00102 if (RC5bitcount==0)
00103 {
00104 if ( (sample==1) && (RC5bittimer>IR_PAUSE_SAMPLES) )
00105 {
00106
00107 RC5data_tmp = 1;
00108 RC5bitcount++;
00109 }
00110 else
00111 {
00112
00113 RC5data_tmp = 0;
00114 }
00115
00116
00117 RC5bittimer = 0;
00118
00119
00120 }
00121 else
00122 {
00123 if (RC5bittimer >= IR_SAMPLES_PER_BIT_EARLY)
00124 {
00125 if (RC5bittimer<=IR_SAMPLES_PER_BIT_LATE)
00126 {
00127
00128 RC5data_tmp = (RC5data_tmp<<1) | sample;
00129 RC5bitcount++;
00130 }
00131 else
00132 {
00133
00134 RC5bitcount = 0;
00135 }
00136
00137
00138 RC5bittimer = 0;
00139 }
00140 }
00141 }
00142
00143 }
00144 else
00145 {
00146
00147 if (RC5bittimer > IR_SAMPLES_PER_BIT_LATE)
00148 {
00149
00150 if (RC5bitcount==14)
00151 {
00152 RC5data = RC5data_tmp;
00153 }
00154
00155 RC5bitcount = 0;
00156 }
00157 }
00158
00159
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;
00183 IR_PORT |= IR_PIN;
00184 enableRC5 = 1;
00185 }
00186
00187