rc_receive.c

Go to the documentation of this file.
00001 
00043 #include <includes.h>
00044 
00045 static int rcx_read[RCX_LAST]; 
00046 static volatile RCX_DATA rcx_chans[RCX_LAST]; 
00047 static int rcx_is_init = 0; 
00058 void rcx_init(int chan_0, int chan_1, int chan_2, int chan_3)
00059 {
00060   int i = 0;
00061   volatile RCX_DATA* data;
00062   for (i = 0; i < RCX_LAST; i++){
00063     data = &rcx_chans[i];
00064     data->prev = -1;
00065     data->start = 0;
00066     data->value = 0;
00067     data->overflows = 0;
00068   }
00069   rcx_read[0] = chan_0;
00070   rcx_read[1] = chan_1;
00071   rcx_read[2] = chan_2;
00072   rcx_read[3] = chan_3;
00073   rcx_is_init = 1;
00074 }
00075 
00082 float rcx_get_chan(RCX_CHAN chan)
00083 {
00084   if (rcx_is_init){
00085     if (rcx_read[chan]){
00086       return (float)(rcx_chans[chan].value>>14);
00087     } else {
00088       error_occurred(ERROR_RCX_BAD_CHAN);
00089       return 0.0;
00090     }
00091   } else {
00092     error_occurred(ERROR_RCX_NINIT);
00093     return 0.0;
00094   }
00095 }
00096 
00102 float rcx_get_chan_0(void){return rcx_get_chan(RCX_CHAN_0);} 
00108 float rcx_get_chan_1(void){return rcx_get_chan(RCX_CHAN_1);}
00114 float rcx_get_chan_2(void){return rcx_get_chan(RCX_CHAN_2);}
00120 float rcx_get_chan_3(void){return rcx_get_chan(RCX_CHAN_3);}
00121 
00128 void rcx_isr(void) //__irq
00129 {
00130   int i;
00131   int interrupts = T0IR;
00132   int cap_0 = T0CR0;
00133   int cap_1 = T0CR1;
00134   int cap_2 = T0CR2;
00135   int cap_3 = T0CR3;
00136   int pins = FIO0PIN;
00137   int lvl_0 = pins & (1<<22);
00138   int lvl_1 = pins & (1<<27);
00139   int lvl_2 = pins & (1<<16);
00140   int lvl_3 = pins & (1<<29);
00141   int flag_cap_0 = interrupts & (1<<4);
00142   int flag_cap_1 = interrupts & (1<<5);
00143   int flag_cap_2 = interrupts & (1<<6);
00144   int flag_cap_3 = interrupts & (1<<7);
00145   int flag_overflow = interrupts & (1<<0);
00146   T0IR = flag_overflow | flag_cap_0 | flag_cap_1 | flag_cap_2 | flag_cap_3; //clear interrupts
00147   
00148   if (flag_overflow){
00149     for (i = 0; i < RCX_LAST; i++){
00150       rcx_chans[i].overflows++;
00151     }
00152   }
00153   if (flag_cap_0 && rcx_read[0]){
00154     rcx_update(RCX_CHAN_0, lvl_0, cap_0, flag_overflow);
00155   }
00156   if (flag_cap_1 && rcx_read[1]){
00157     rcx_update(RCX_CHAN_1, lvl_1, cap_1, flag_overflow);
00158   }
00159   if (flag_cap_2 && rcx_read[2]){
00160     rcx_update(RCX_CHAN_2, lvl_2, cap_2, flag_overflow);
00161   }
00162   if (flag_cap_3 && rcx_read[3]){
00163     rcx_update(RCX_CHAN_3, lvl_3, cap_3, flag_overflow);
00164   } 
00165   
00166 //  VICVectAddr = 0; //for __irq
00167   
00168 }
00169 
00177 void rcx_update(RCX_CHAN chan, int curr, int cap_value, int flag_overflow)
00178 {
00179   static int coeff = 4;
00180   int new_value;
00181   volatile RCX_DATA* data = &rcx_chans[chan];
00182 
00183   if (flag_overflow){
00184     if (cap_value > T0MR0 / 2){ //overflow happened after capture
00185       data->overflows--;
00186     }
00187   }
00188 
00189   if (!data->prev && curr){ //Capture channel has gone from low to high
00190     data->start = cap_value; //rcx_initial_time_0 = T0CR0;
00191   } else if (data->prev && !curr){ //Capture channel has gone from high to low
00192     //find pulse width
00193     new_value = (data->overflows * T0MR0) + cap_value - data->start;    
00194     //add pulse width to average
00195     if (data->value == 0){ //init average
00196       data->value = new_value<<14; 
00197     } else if (new_value > 0) { //average new data
00198       data->value = data->value - (data->value >> coeff) + (new_value << (14-coeff));
00199     }
00200 
00201   } else { //undefined operation - either both low or both high <- BAD
00202     error_occurred(ERROR_RCX_BAD_LVLS);
00203   }
00204   data->overflows = 0;
00205   data->prev = curr;//actual current pin level.
00206 }
00207 
Generated on Tue Jun 29 16:36:14 2010 by  doxygen 1.6.3