void irSensors(struct sensor s[6]){ /*############################################################################################################################################################################# ** Functia irSensors este folosita la citirea valorilor "raw" ale senzorilor. **Argumentul functiei este un vector de tip structura de date sensor. **Pasii pe care ii urmeaza: ** --declara pini care sunt conectati la senzori ca pini de output ** --seteaza valorile senzorilor pe HIGH -> se incarca condensatorul ** --asteapta 50us pentru incarcarea completa a condensatorului ** --declara pini care sunt conectati la senzori ca pini de input ** --reseteaza timer-ul deoarece poate iesi din limitele tipului de date int dupa un anumit timp ** --citirea valorii timer-ului ** --atribuirea valorii timer-ului variabilelor unde vom retine valorile senzorilor ** --intrarea in bucla de citire a senzorilor(se va termina cand toti pinii de la senzori au valoarea 0): ** ++variabila timer este folosita pentru a iesi din bucla daca este depasita valoarea constantei prag(datele mai mari decat valoarea pragului nu sunt relevante + ** citire mai rapida) ** ++verificarea valorilor pinilor conectati la senzori ** ++valoarea unui senzor devine egala cu valoarea timer-ului daca pinul respectiv are valoarea 1 (in final valoarea unui senzor va fi egala cu ultima valoare a ** timer-ului inainte ca pinul respectiv sa ia valoarea 0) ** ++daca variabila timer este mai mare decat valoarea pragului atunci este intrerupta executia buclei **#############################################################################################################################################################################*/ int v[6]; int timer,i; const int prag=1000; IR_LED_SetOutput(); IR_LED_PutVal(1); /*** Declararea senzorilor ca output. ***/ A1_SetOutput(); A3_SetOutput(); D11_SetOutput(); A0_SetOutput(); A2_SetOutput(); D5_SetOutput(); /*** Setarea senzoriilor pe HIGH. ***/ A1_PutVal(1); A3_PutVal(1); D11_PutVal(1); A0_PutVal(1); A2_PutVal(1); D5_PutVal(1); /*** Asteapta 50us pentru incarcarea completa a condensatorului. ***/ WAIT1_Waitus(50); //Declararea senzorilor ca input. ***/ A1_SetInput(); A3_SetInput(); D11_SetInput(); A0_SetInput(); A2_SetInput(); D5_SetInput(); /*** Resetarea timer-ului. ***/ CountTimer_ResetCounter((LDD_TDeviceData *)NULL); /*** Citirea vaorii timer-ului. ***/ timer=CountTimer_GetCounterValue((LDD_TDeviceData *)NULL); s[0].value=timer; s[1].value=timer; s[2].value=timer; s[3].value=timer; s[4].value=timer; s[5].value=timer; /*** Bucla de citire -- executia buclei se va termina cand s-a terminat citirea tuturor senzorilor. ***/ while(v[0] || v[1] || v[2] || v[3] || v[4] || v[5]){ /*** Variabila timer este acum folosit ca un prag pentru a nu pierde prea mult timp cat senzorii sunt pe negru. ***/ timer=CountTimer_GetCounterValue((LDD_TDeviceData *)NULL); /*** Variabilelor s1-s6 le este atribuita valoarea intrarilor senzoriilor(0 sau 1). ***/ v[0]=A1_GetVal(); v[1]=A3_GetVal(); v[2]=D11_GetVal(); v[3]=A0_GetVal(); v[4]=A2_GetVal(); v[5]=D5_GetVal(); /*** Daca intrarea unui senzor este 1 ii este atribuita variabilei s[i].value ultima valoare a timer-ului. ***/ for(i=0; i<6; i++){ if(v[i]) s[i].value=CountTimer_GetCounterValue((LDD_TDeviceData *)NULL); } if(timer>prag) break; } }
void readSensors(uint16_t sensorsValue[NUMBER_OF_SENSORS]){ /*used for reading how long it take for the line to fall to 0 *and this way detecting the black or white level */ uint16_t counterReadValue; uint16_t i; /* start the infrared LED */ IR_LED_SetVal(); // WAIT1_Waitus(USEC_WAITING_INFRARED_LED_TO_START); /* init the vector to reflecting by default * it will be populated with values in case reflection is discovered * - just a convention 0 means black and 1 means white */ for (i=0;i<NUMBER_OF_SENSORS;i++){ sensorsValue[i]=0; } /* set sensors as output and put them into 1 */ LS1_SetDir(TRUE); LS1_SetVal(); A1_SetDir(TRUE); A1_SetVal(); LS2_SetDir(TRUE); LS2_SetVal(); LS3_SetDir(TRUE); LS3_SetVal(); RS3_SetDir(TRUE); RS3_SetVal(); RS2_SetDir(TRUE); RS2_SetVal(); RS1_SetDir(TRUE); RS1_SetVal(); /* wait until sensors capacitor is fully up */ WAIT1_Waitus(USEC_WAITING_FOR_CAPACITOR_TO_CHARGE); /* set all sensors as inputs to read them */ LS1_SetDir(FALSE); LS2_SetDir(FALSE); LS3_SetDir(FALSE); RS3_SetDir(FALSE); RS2_SetDir(FALSE); RS1_SetDir(FALSE); /* read the time needed for the value of the sensor line to reach 0 * the longer it takes the less light it is reflected */ /* reset of the counter (using periods of 6.1 usec) used to count time * sensor needs till it line is falling to 0 */ CountTimer_ResetCounter((LDD_TDeviceData *)NULL); /* effective reading of the value of the line + decision if it is black or white * the sensor is seeing */ counterReadValue = CountTimer_GetCounterValue((LDD_TDeviceData *)NULL); while (counterReadValue < BLACK_OR_WHITE_BOUNDRY){ /* do nothing wait till enough time has passed * after this time has passed the sensors should be * in correct shape */ counterReadValue = CountTimer_GetCounterValue((LDD_TDeviceData *)NULL); } /* basically if level did not reach 0 which means it is black * and that is recorded in the sensors vector with a value of 1 * a bit tricky and maybe confusing here are they are opposite */ if(LS1_GetVal()==0){ sensorsValue[0] = 1; } if(LS2_GetVal()==0){ sensorsValue[1] = 1; } if(LS3_GetVal()==0){ sensorsValue[2] = 1; } if(RS3_GetVal()==0){ sensorsValue[3] = 1; } if(RS2_GetVal()==0){ sensorsValue[4] = 1; } if(RS1_GetVal()==0){ sensorsValue[5] = 1; } /* shut down the LED emitting infrared - need to see if this step is needed * here decision taken not to shut down the sensor * */ // IR_LED_ClrVal(); }