123

Dependencies:   TM1638 mbed HCSR04

Committer:
lucem1n
Date:
Sat Mar 02 12:48:15 2019 +0000
Revision:
0:6f4090a07409
Child:
1:63541cb7c9d0
commit

Who changed what in which revision?

UserRevisionLine numberNew contents of line
lucem1n 0:6f4090a07409 1 #include "mbed.h"
lucem1n 0:6f4090a07409 2 #include "IR_Def.h"
lucem1n 0:6f4090a07409 3 #include "hcsr04.h"
lucem1n 0:6f4090a07409 4
lucem1n 0:6f4090a07409 5 #define CAT0_PIN PC_1 // 11 PC_3 переставили с катодом 7
lucem1n 0:6f4090a07409 6 #define CAT1_PIN PC_3 // 7 PC_2 переставили с катодом 6
lucem1n 0:6f4090a07409 7 #define CAT2_PIN PB_0 // 4 PF_5 переставили с катодом 5
lucem1n 0:6f4090a07409 8 #define CAT3_PIN PC_2 // 2 PA_0 переставили с катодом 4
lucem1n 0:6f4090a07409 9 #define CAT4_PIN PA_4 // 1 PF_10
lucem1n 0:6f4090a07409 10 #define CAT5_PIN PA_1 // 10 PF_2
lucem1n 0:6f4090a07409 11 #define CAT6_PIN PC_0 // 5 PD_5
lucem1n 0:6f4090a07409 12 #define CAT7_PIN PF_1 // 3 PH_0
lucem1n 0:6f4090a07409 13
lucem1n 0:6f4090a07409 14 #define ANO0_PIN PB_4 // 12 PC_0
lucem1n 0:6f4090a07409 15 #define ANO1_PIN PB_5 // 9 PF_3
lucem1n 0:6f4090a07409 16 #define ANO2_PIN PB_3 // 8 PB_0
lucem1n 0:6f4090a07409 17 #define ANO3_PIN PB_10 // 6 PA_3
lucem1n 0:6f4090a07409 18
lucem1n 0:6f4090a07409 19 //------------------------------------
lucem1n 0:6f4090a07409 20 // Hyperterminal configuration
lucem1n 0:6f4090a07409 21 // 9600 bauds, 8-bit data, no parity
lucem1n 0:6f4090a07409 22 //------------------------------------
lucem1n 0:6f4090a07409 23 Serial pc(SERIAL_TX, SERIAL_RX);
lucem1n 0:6f4090a07409 24 InterruptIn IR(PC_12);
lucem1n 0:6f4090a07409 25 DigitalOut myled(LED1);
lucem1n 0:6f4090a07409 26 Timer T;
lucem1n 0:6f4090a07409 27 Ticker system_clock;
lucem1n 0:6f4090a07409 28 Ticker pult; //This will be used to increment a counter every msec inside it's ISR
lucem1n 0:6f4090a07409 29 Ticker display;
lucem1n 0:6f4090a07409 30 Ticker distancee;
lucem1n 0:6f4090a07409 31 Ticker muzika;
lucem1n 0:6f4090a07409 32 AnalogOut Da(PA_5);
lucem1n 0:6f4090a07409 33 //DigitalOut myled(LED2);
lucem1n 0:6f4090a07409 34 DigitalOut cathodes[8] = {
lucem1n 0:6f4090a07409 35 DigitalOut(CAT0_PIN),
lucem1n 0:6f4090a07409 36 DigitalOut(CAT1_PIN),
lucem1n 0:6f4090a07409 37 DigitalOut(CAT2_PIN),
lucem1n 0:6f4090a07409 38 DigitalOut(CAT3_PIN),
lucem1n 0:6f4090a07409 39 DigitalOut(CAT4_PIN),
lucem1n 0:6f4090a07409 40 DigitalOut(CAT5_PIN),
lucem1n 0:6f4090a07409 41 DigitalOut(CAT6_PIN),
lucem1n 0:6f4090a07409 42 DigitalOut(CAT7_PIN),
lucem1n 0:6f4090a07409 43 };
lucem1n 0:6f4090a07409 44 DigitalOut anodes[4] = {
lucem1n 0:6f4090a07409 45 DigitalOut(ANO0_PIN),
lucem1n 0:6f4090a07409 46 DigitalOut(ANO1_PIN),
lucem1n 0:6f4090a07409 47 DigitalOut(ANO2_PIN),
lucem1n 0:6f4090a07409 48 DigitalOut(ANO3_PIN),
lucem1n 0:6f4090a07409 49 };
lucem1n 0:6f4090a07409 50
lucem1n 0:6f4090a07409 51 int p = 0;
lucem1n 0:6f4090a07409 52 int o=0;
lucem1n 0:6f4090a07409 53 void IR_ISR(); //ISR for decoding the IR signal
lucem1n 0:6f4090a07409 54 void dummy_ISR(); //Required so that 'IR_ISR' is not called on both rising and falling edges of IR signal at the same time
lucem1n 0:6f4090a07409 55 void sys_tick();
lucem1n 0:6f4090a07409 56 int v=0;
lucem1n 0:6f4090a07409 57 uint8_t state = 0; //State variable for IR state machine
lucem1n 0:6f4090a07409 58 uint8_t Rx_count = 0; //Counter to count no. of bits received
lucem1n 0:6f4090a07409 59 uint32_t Rx_buf = 0; //To store recevied IR data
lucem1n 0:6f4090a07409 60 char Rx_flag = 0; //Flag which indicates that a valid IR command was received
lucem1n 0:6f4090a07409 61 uint32_t Rx_rep_count = 0; //To keep track of how many repeat pulses are received
lucem1n 0:6f4090a07409 62 uint32_t Rx_rep_timeout_count = 0; //Timer which clears the previously received IR command, once it reaches the set limit
lucem1n 0:6f4090a07409 63 uint32_t T_buf = 0; //Buffer to hold value of timer T
lucem1n 0:6f4090a07409 64 char Rx_ignore_rep_flag = 0; //0 => Do not ignore repeat pulses
lucem1n 0:6f4090a07409 65
lucem1n 0:6f4090a07409 66 uint8_t digits[] = {0x03, 0x9F, 0x25, 0x0D, 0x99, 0x49, 0x41, 0x1F, 0x01, 0x09, 0xFD, 0x91,0x89, 0x83};
lucem1n 0:6f4090a07409 67 //DigitalOut trig(PA_3);
lucem1n 0:6f4090a07409 68 //DigitalIn echo(PD_7);
lucem1n 0:6f4090a07409 69 HCSR04 usensor(PB_13,PB_14);
lucem1n 0:6f4090a07409 70 unsigned int dist=0;
lucem1n 0:6f4090a07409 71 int flag1, flag2, flag3 = 0;
lucem1n 0:6f4090a07409 72 int i,j,k,m,size=0;
lucem1n 0:6f4090a07409 73
lucem1n 0:6f4090a07409 74 void fireUpSign(int signNum){
lucem1n 0:6f4090a07409 75 anodes[signNum] = 1;
lucem1n 0:6f4090a07409 76 }
lucem1n 0:6f4090a07409 77
lucem1n 0:6f4090a07409 78 void shutDownSign(int signNum){
lucem1n 0:6f4090a07409 79 anodes[signNum] = 0;
lucem1n 0:6f4090a07409 80 }
lucem1n 0:6f4090a07409 81 void setDigit(int digit){
lucem1n 0:6f4090a07409 82 for(int isd=0; isd < 8; isd++){
lucem1n 0:6f4090a07409 83 ((digits[digit] & (1<<(7-isd))) > 0) ? cathodes[isd] =1 : cathodes[isd] =0;
lucem1n 0:6f4090a07409 84 }
lucem1n 0:6f4090a07409 85 }
lucem1n 0:6f4090a07409 86 void fireUpAllSigns(){
lucem1n 0:6f4090a07409 87 fireUpSign(0);
lucem1n 0:6f4090a07409 88 fireUpSign(1);
lucem1n 0:6f4090a07409 89 fireUpSign(2);
lucem1n 0:6f4090a07409 90 fireUpSign(3);
lucem1n 0:6f4090a07409 91 }
lucem1n 0:6f4090a07409 92
lucem1n 0:6f4090a07409 93 void shutDownAllSigns(){
lucem1n 0:6f4090a07409 94 shutDownSign(0);
lucem1n 0:6f4090a07409 95 shutDownSign(1);
lucem1n 0:6f4090a07409 96 shutDownSign(2);
lucem1n 0:6f4090a07409 97 shutDownSign(3);
lucem1n 0:6f4090a07409 98 }
lucem1n 0:6f4090a07409 99 void ddisplay ()
lucem1n 0:6f4090a07409 100 {
lucem1n 0:6f4090a07409 101 setDigit(p);
lucem1n 0:6f4090a07409 102 fireUpSign(3);
lucem1n 0:6f4090a07409 103 wait_us(3000);
lucem1n 0:6f4090a07409 104 shutDownAllSigns();
lucem1n 0:6f4090a07409 105 setDigit(i);
lucem1n 0:6f4090a07409 106 fireUpSign(2);
lucem1n 0:6f4090a07409 107 wait_us(3000);
lucem1n 0:6f4090a07409 108 shutDownAllSigns();
lucem1n 0:6f4090a07409 109 setDigit(j);
lucem1n 0:6f4090a07409 110 fireUpSign(1);
lucem1n 0:6f4090a07409 111 wait_us(3000);
lucem1n 0:6f4090a07409 112 shutDownAllSigns();
lucem1n 0:6f4090a07409 113 setDigit(k);
lucem1n 0:6f4090a07409 114 fireUpSign(0);
lucem1n 0:6f4090a07409 115 wait_us(3000);
lucem1n 0:6f4090a07409 116 shutDownAllSigns();
lucem1n 0:6f4090a07409 117 //IR.fall(&IR_ISR);
lucem1n 0:6f4090a07409 118 //IR.rise(&dummy_ISR);
lucem1n 0:6f4090a07409 119 if(i>9)
lucem1n 0:6f4090a07409 120 {
lucem1n 0:6f4090a07409 121 j++;
lucem1n 0:6f4090a07409 122 i=0;
lucem1n 0:6f4090a07409 123 }
lucem1n 0:6f4090a07409 124 if(j>9)
lucem1n 0:6f4090a07409 125 {
lucem1n 0:6f4090a07409 126 k++;
lucem1n 0:6f4090a07409 127 j=0;
lucem1n 0:6f4090a07409 128 i=0;
lucem1n 0:6f4090a07409 129 }
lucem1n 0:6f4090a07409 130 /*if(i == 1)
lucem1n 0:6f4090a07409 131 {
lucem1n 0:6f4090a07409 132 myled = !myled;
lucem1n 0:6f4090a07409 133 wait_ms(300);
lucem1n 0:6f4090a07409 134 i = 0;
lucem1n 0:6f4090a07409 135 }*/
lucem1n 0:6f4090a07409 136 }
lucem1n 0:6f4090a07409 137 void ddistance ()
lucem1n 0:6f4090a07409 138 {
lucem1n 0:6f4090a07409 139 usensor.start();
lucem1n 0:6f4090a07409 140 dist=usensor.get_dist_cm();
lucem1n 0:6f4090a07409 141 //IR.fall(&IR_ISR);
lucem1n 0:6f4090a07409 142 //IR.rise(&dummy_ISR);
lucem1n 0:6f4090a07409 143 }
lucem1n 0:6f4090a07409 144
lucem1n 0:6f4090a07409 145 void sys_tick()
lucem1n 0:6f4090a07409 146 {
lucem1n 0:6f4090a07409 147 if(Rx_rep_timeout_count < 0xFFFF) { //Do not increment counter beyond 0xFFFF to prevent roll-over
lucem1n 0:6f4090a07409 148 ++Rx_rep_timeout_count; //Increment this counter every 1msec.
lucem1n 0:6f4090a07409 149 }
lucem1n 0:6f4090a07409 150 }
lucem1n 0:6f4090a07409 151
lucem1n 0:6f4090a07409 152 void ppult ()
lucem1n 0:6f4090a07409 153 {
lucem1n 0:6f4090a07409 154 // if(o==0)
lucem1n 0:6f4090a07409 155 // {
lucem1n 0:6f4090a07409 156 //IR.mode(PullNone);
lucem1n 0:6f4090a07409 157 //wait_ms(20);
lucem1n 0:6f4090a07409 158 // IR.fall(&IR_ISR);
lucem1n 0:6f4090a07409 159 // IR.rise(&dummy_ISR);
lucem1n 0:6f4090a07409 160 // }
lucem1n 0:6f4090a07409 161 }
lucem1n 0:6f4090a07409 162
lucem1n 0:6f4090a07409 163 int main()
lucem1n 0:6f4090a07409 164 {
lucem1n 0:6f4090a07409 165 int verh;
lucem1n 0:6f4090a07409 166 int nij;
lucem1n 0:6f4090a07409 167 while(1) {
lucem1n 0:6f4090a07409 168 //if (o==0)
lucem1n 0:6f4090a07409 169 // {
lucem1n 0:6f4090a07409 170 // display.attach(&ddisplay, 0.02);
lucem1n 0:6f4090a07409 171 // distancee.attach(&ddistance, 0.02);
lucem1n 0:6f4090a07409 172 // pult.attach(&ppult, 2);
lucem1n 0:6f4090a07409 173 ddisplay ();
lucem1n 0:6f4090a07409 174 ddistance();
lucem1n 0:6f4090a07409 175 // }
lucem1n 0:6f4090a07409 176 verh = 80;
lucem1n 0:6f4090a07409 177 nij = 10;
lucem1n 0:6f4090a07409 178 if(dist >verh)
lucem1n 0:6f4090a07409 179 {
lucem1n 0:6f4090a07409 180 flag1=1;
lucem1n 0:6f4090a07409 181 }
lucem1n 0:6f4090a07409 182 if(flag1==1 && dist < nij)
lucem1n 0:6f4090a07409 183 {
lucem1n 0:6f4090a07409 184 flag2=1;
lucem1n 0:6f4090a07409 185 }
lucem1n 0:6f4090a07409 186 if (flag1==1 && flag2==1 && dist>verh)
lucem1n 0:6f4090a07409 187 {
lucem1n 0:6f4090a07409 188 flag3=1;
lucem1n 0:6f4090a07409 189 }
lucem1n 0:6f4090a07409 190 if( flag1==1 && flag2==1 && flag3==1)
lucem1n 0:6f4090a07409 191 {
lucem1n 0:6f4090a07409 192 flag1=0;
lucem1n 0:6f4090a07409 193 flag2=0;
lucem1n 0:6f4090a07409 194 flag3=0;
lucem1n 0:6f4090a07409 195 i++;
lucem1n 0:6f4090a07409 196 }
lucem1n 0:6f4090a07409 197 if (v==1)
lucem1n 0:6f4090a07409 198 {
lucem1n 0:6f4090a07409 199 // pc.printf(" RX= %x " , Rx_buf);
lucem1n 0:6f4090a07409 200
lucem1n 0:6f4090a07409 201
lucem1n 0:6f4090a07409 202 if(Rx_buf == 0xbf40ff00)
lucem1n 0:6f4090a07409 203 {
lucem1n 0:6f4090a07409 204 //pc.printf("5");
lucem1n 0:6f4090a07409 205 p=0;
lucem1n 0:6f4090a07409 206 j=0;
lucem1n 0:6f4090a07409 207 i=0;
lucem1n 0:6f4090a07409 208 k=0;
lucem1n 0:6f4090a07409 209
lucem1n 0:6f4090a07409 210 }
lucem1n 0:6f4090a07409 211
lucem1n 0:6f4090a07409 212 if(Rx_buf == 0xf609ff00)
lucem1n 0:6f4090a07409 213 {
lucem1n 0:6f4090a07409 214 i++;
lucem1n 0:6f4090a07409 215 if(i>9)
lucem1n 0:6f4090a07409 216 {
lucem1n 0:6f4090a07409 217 j++;
lucem1n 0:6f4090a07409 218 i=0;
lucem1n 0:6f4090a07409 219 }
lucem1n 0:6f4090a07409 220 if(j>9)
lucem1n 0:6f4090a07409 221 {
lucem1n 0:6f4090a07409 222 k++;
lucem1n 0:6f4090a07409 223 j=0;
lucem1n 0:6f4090a07409 224 i=0;
lucem1n 0:6f4090a07409 225 }
lucem1n 0:6f4090a07409 226 {
lucem1n 0:6f4090a07409 227 }
lucem1n 0:6f4090a07409 228 // pc.printf("9");
lucem1n 0:6f4090a07409 229 }
lucem1n 0:6f4090a07409 230
lucem1n 0:6f4090a07409 231 if(Rx_buf == 0xf807ff00)
lucem1n 0:6f4090a07409 232 {
lucem1n 0:6f4090a07409 233 //pc.printf("7");
lucem1n 0:6f4090a07409 234 if (p>9)
lucem1n 0:6f4090a07409 235 {
lucem1n 0:6f4090a07409 236 p=0;
lucem1n 0:6f4090a07409 237 }
lucem1n 0:6f4090a07409 238 else
lucem1n 0:6f4090a07409 239 {
lucem1n 0:6f4090a07409 240 p++;
lucem1n 0:6f4090a07409 241 }
lucem1n 0:6f4090a07409 242 }
lucem1n 0:6f4090a07409 243
lucem1n 0:6f4090a07409 244 if(Rx_buf == 0xe619ff00)
lucem1n 0:6f4090a07409 245 {
lucem1n 0:6f4090a07409 246 if(i==0 && j==0 && k==0 && (i+j+k)-p<0 && i-p<0)
lucem1n 0:6f4090a07409 247 {
lucem1n 0:6f4090a07409 248 i=0;
lucem1n 0:6f4090a07409 249 j=0;
lucem1n 0:6f4090a07409 250 k=0;
lucem1n 0:6f4090a07409 251 p=0;
lucem1n 0:6f4090a07409 252 }
lucem1n 0:6f4090a07409 253 if(i>=p)
lucem1n 0:6f4090a07409 254 {
lucem1n 0:6f4090a07409 255 i=i-p;
lucem1n 0:6f4090a07409 256 }
lucem1n 0:6f4090a07409 257 else if(i<p)
lucem1n 0:6f4090a07409 258 {
lucem1n 0:6f4090a07409 259 if(j==0)
lucem1n 0:6f4090a07409 260 {
lucem1n 0:6f4090a07409 261 k=k-1;
lucem1n 0:6f4090a07409 262 j=j+10-(p-i);
lucem1n 0:6f4090a07409 263 i=i+10;
lucem1n 0:6f4090a07409 264 i=i-p;
lucem1n 0:6f4090a07409 265 }
lucem1n 0:6f4090a07409 266 else if(j!=0)
lucem1n 0:6f4090a07409 267 {
lucem1n 0:6f4090a07409 268 i=i+10;
lucem1n 0:6f4090a07409 269 i=i-p;
lucem1n 0:6f4090a07409 270 j=j-1;
lucem1n 0:6f4090a07409 271 }
lucem1n 0:6f4090a07409 272 }
lucem1n 0:6f4090a07409 273
lucem1n 0:6f4090a07409 274
lucem1n 0:6f4090a07409 275 //pc.printf("0");
lucem1n 0:6f4090a07409 276 }
lucem1n 0:6f4090a07409 277 v=0;
lucem1n 0:6f4090a07409 278 }
lucem1n 0:6f4090a07409 279
lucem1n 0:6f4090a07409 280 // if(o==0)
lucem1n 0:6f4090a07409 281 // {
lucem1n 0:6f4090a07409 282 //IR.mode(PullNone);
lucem1n 0:6f4090a07409 283 wait_ms(10);
lucem1n 0:6f4090a07409 284 IR.fall(&IR_ISR);
lucem1n 0:6f4090a07409 285 IR.rise(&dummy_ISR);
lucem1n 0:6f4090a07409 286 //}
lucem1n 0:6f4090a07409 287 }
lucem1n 0:6f4090a07409 288 }
lucem1n 0:6f4090a07409 289
lucem1n 0:6f4090a07409 290 void dummy_ISR()
lucem1n 0:6f4090a07409 291 {
lucem1n 0:6f4090a07409 292 //Do nothing
lucem1n 0:6f4090a07409 293 }
lucem1n 0:6f4090a07409 294
lucem1n 0:6f4090a07409 295 void IR_ISR()
lucem1n 0:6f4090a07409 296 {
lucem1n 0:6f4090a07409 297 o=1;
lucem1n 0:6f4090a07409 298 display.detach();
lucem1n 0:6f4090a07409 299 distancee.detach();
lucem1n 0:6f4090a07409 300 //pult.detach();
lucem1n 0:6f4090a07409 301 if(state == 0) {
lucem1n 0:6f4090a07409 302 T.stop(); //Stop timer
lucem1n 0:6f4090a07409 303 T.reset(); //Reset timer
lucem1n 0:6f4090a07409 304 T.start(); //Start timer
lucem1n 0:6f4090a07409 305 IR.rise(&IR_ISR); //Set IR interrupt to occur on rising edge
lucem1n 0:6f4090a07409 306 IR.fall(&dummy_ISR);
lucem1n 0:6f4090a07409 307 state = 1; //Go to next state
lucem1n 0:6f4090a07409 308 Rx_count = 0; //Clear the received bits counter
lucem1n 0:6f4090a07409 309 } else if(state == 1) {
lucem1n 0:6f4090a07409 310
lucem1n 0:6f4090a07409 311 T.stop(); //Stop timer
lucem1n 0:6f4090a07409 312 T_buf = (uint32_t)T.read_us(); //Read timer
lucem1n 0:6f4090a07409 313 T.reset(); //Reset timer
lucem1n 0:6f4090a07409 314 T.start(); //Start timer
lucem1n 0:6f4090a07409 315 IR.fall(&IR_ISR); //Set IR interrupt to occur on falling edge
lucem1n 0:6f4090a07409 316 IR.rise(&dummy_ISR);
lucem1n 0:6f4090a07409 317
lucem1n 0:6f4090a07409 318 if(T_buf <= IR_9000us_UL && T_buf >= IR_9000us_LL) { //Check for preamble start pulse(9ms)
lucem1n 0:6f4090a07409 319 state = 2; //Go to next state
lucem1n 0:6f4090a07409 320 } else {
lucem1n 0:6f4090a07409 321 state = 0; //Reset the state machine
lucem1n 0:6f4090a07409 322 }
lucem1n 0:6f4090a07409 323 } else if(state == 2) {
lucem1n 0:6f4090a07409 324
lucem1n 0:6f4090a07409 325 T.stop(); //Stop timer
lucem1n 0:6f4090a07409 326 T_buf = (uint32_t)T.read_us(); //Read the value in timer
lucem1n 0:6f4090a07409 327 T.reset(); //Reset timer
lucem1n 0:6f4090a07409 328 T.start(); //Start timer
lucem1n 0:6f4090a07409 329 IR.fall(&IR_ISR); //Set IR interrupt to occur on falling edge
lucem1n 0:6f4090a07409 330 IR.rise(&dummy_ISR);
lucem1n 0:6f4090a07409 331
lucem1n 0:6f4090a07409 332 if(T_buf <= IR_4500us_UL && T_buf >= IR_4500us_LL) { //Check for preamble space(4.5ms)
lucem1n 0:6f4090a07409 333
lucem1n 0:6f4090a07409 334 state = 3; //Go to next state
lucem1n 0:6f4090a07409 335 Rx_rep_timeout_count = 0; //Reset counter
lucem1n 0:6f4090a07409 336 Rx_rep_count = 0; //Reset the repeat pulse counter
lucem1n 0:6f4090a07409 337 } else if(T_buf <= IR_2250us_UL && T_buf >= IR_2250us_LL) { //Check for repeat pulse(2.25ms)
lucem1n 0:6f4090a07409 338 state = 0; //Reset the state machine
lucem1n 0:6f4090a07409 339
lucem1n 0:6f4090a07409 340 if(Rx_rep_count < 0xFFFF) {
lucem1n 0:6f4090a07409 341 if(Rx_rep_timeout_count < IR_rep_timeout_ms) { //Only increment the repeat pulse counter if the delay between two successive repeat pulses is less than 135msec.
lucem1n 0:6f4090a07409 342 Rx_rep_timeout_count = 0; //Reset the counter everytime a valid repeat pulse is received
lucem1n 0:6f4090a07409 343 ++Rx_rep_count;
lucem1n 0:6f4090a07409 344 } else { //Invald repeat pulse received
lucem1n 0:6f4090a07409 345 Rx_rep_count = 0; //Reset counter
lucem1n 0:6f4090a07409 346 Rx_flag = 0; //Clear the flag to indicate that an IR command was not received
lucem1n 0:6f4090a07409 347 Rx_buf = 0; //Clear the previously received command
lucem1n 0:6f4090a07409 348 }
lucem1n 0:6f4090a07409 349 }
lucem1n 0:6f4090a07409 350 goto ahead; //Repeat the previous command
lucem1n 0:6f4090a07409 351 } else { //Wrong pulse
lucem1n 0:6f4090a07409 352 Rx_rep_count = 0; //Reset counter
lucem1n 0:6f4090a07409 353 state = 0; //Reset the state machine
lucem1n 0:6f4090a07409 354 }
lucem1n 0:6f4090a07409 355 } else if(state == 3) {
lucem1n 0:6f4090a07409 356 T.stop(); //Stop timer
lucem1n 0:6f4090a07409 357 T_buf = T.read_us(); //Read the value in timer
lucem1n 0:6f4090a07409 358 T.reset(); //Reset timer
lucem1n 0:6f4090a07409 359 T.start(); //Start timer
lucem1n 0:6f4090a07409 360 IR.fall(&IR_ISR); //Set IR interrupt to occur on falling edge
lucem1n 0:6f4090a07409 361 IR.rise(&dummy_ISR);
lucem1n 0:6f4090a07409 362 v=1 ;
lucem1n 0:6f4090a07409 363
lucem1n 0:6f4090a07409 364 if(T_buf <= IR_1_UL_us && T_buf >= IR_1_LL_us) { //Check if bit is '1'(2.25ms)
lucem1n 0:6f4090a07409 365 ++Rx_count; //Increment the bit counter
lucem1n 0:6f4090a07409 366 Rx_buf >>= 1;
lucem1n 0:6f4090a07409 367 Rx_buf |= 0x80000000; //Shift in a '1' from the left side
lucem1n 0:6f4090a07409 368
lucem1n 0:6f4090a07409 369 state = 3; //Remain in current state
lucem1n 0:6f4090a07409 370 } else if(T_buf <= IR_0_UL_us && T_buf >= IR_0_LL_us) { //Check if bit is '0'(1.12ms)
lucem1n 0:6f4090a07409 371 ++Rx_count; //Increment the bit counter
lucem1n 0:6f4090a07409 372 Rx_buf >>= 1; //Shift in a '0' from the left side
lucem1n 0:6f4090a07409 373 state = 3; //Remain in current state
lucem1n 0:6f4090a07409 374 } else { //Invalid data received
lucem1n 0:6f4090a07409 375 Rx_count = 0;//Reset the bit counter
lucem1n 0:6f4090a07409 376 state = 0; //Reset state m/c
lucem1n 0:6f4090a07409 377
lucem1n 0:6f4090a07409 378 }
lucem1n 0:6f4090a07409 379
lucem1n 0:6f4090a07409 380 if(Rx_count == 32) { //Check if all 32 bits have been received
lucem1n 0:6f4090a07409 381 state = 0;
lucem1n 0:6f4090a07409 382 //Reset state m/c
lucem1n 0:6f4090a07409 383
lucem1n 0:6f4090a07409 384 ahead:
lucem1n 0:6f4090a07409 385
lucem1n 0:6f4090a07409 386 if(!((Rx_rep_count > 0) && (Rx_ignore_rep_flag == 1))) {
lucem1n 0:6f4090a07409 387 Rx_flag = 1; //Set this flag for repeat pulses only if repeat pulses are to be considered
lucem1n 0:6f4090a07409 388 }
lucem1n 0:6f4090a07409 389 Rx_rep_timeout_count = 0; //Reset the counter everytime a valid command is received
lucem1n 0:6f4090a07409 390 }
lucem1n 0:6f4090a07409 391 }
lucem1n 0:6f4090a07409 392 o=0;
lucem1n 0:6f4090a07409 393 }