示例#1
0
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;

	}

}
示例#2
0
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();
	
}