Example #1
0
uint16_t	Readout7705( uint8_t ChannelSelect )
{
	uint8_t  state, ResultH, ResultL;
	BOOL	 isReady;
	uint16_t iRetry;

	for ( iRetry = 20u; iRetry; --iRetry )
	{
		ShiftOut( RS_0 + READ + ChannelSelect );
		state = ShiftIn();
		isReady = ( state & DRDY ) ? FALSE : TRUE;	//	DRDY 低电平有效

		if ( isReady )
		{
			ShiftOut( RS_3 + READ + ChannelSelect );		// do Read
			ResultH = ShiftIn();
			ResultL = ShiftIn();
			return  ( ResultL + ( ResultH * 256u ));
		}

		delay( 10u );
	}

	return 0u;	// failure !!!
}
Example #2
0
void	Convert7705( uint8_t ChannelSelect )
{
	ShiftOut( RS_1 + ChannelSelect );		// 启动指定通道的校准转换

	if( 0u == ChannelSelect )
	{
		ShiftOut( MD_0 + BIPOLAR  + G_5 + BUF );
	}
	else
	{
		ShiftOut( MD_0 + BIPOLAR  + G_4 + BUF );
	}

	ShiftOut( RS_3 + READ + ChannelSelect );	// Reset DRDY#
	ShiftIn();
	ShiftIn();
}
Example #3
0
void event_handler_rcv(int8_t angle_presc)
{
    int8_t initial_angle = 0;
    uint8_t is_init_angle_read = FALSE;
    uint8_t angle_found = FALSE;
	int target_angle=0;
	// pin 12 arduino uno -- when is high -- angle was found
	pin_mode(DDRB,PORTB4, OUTPUT);
	
	/*init compass*/
	HM55B_PinInit();
	HM55B_Reset();
	pin_mode(DDRB, CLK_PIN,OUTPUT);
	
	/*read data from compass until angle will be found*/
	while(!angle_found)
	{
		
		HM55B_StartMeasurementCommand(); // necessary!!
		_delay_ms(40); // the data is 40ms later ready
	
		HM55B_ReadCommand(); // read data and print Status

	
		int X_Data = ShiftIn(11); // Field strength in X
		int Y_Data = ShiftIn(11); // and Y direction
	
	
		set_pin(PORTB,EN_PIN); // ok deselect chip
		int actual_angle = 180 * (atan2(-1 * Y_Data , X_Data) / M_PI); // angle is atan( -y/x) !!!
	
		if(!is_init_angle_read)
		{
			initial_angle = actual_angle;
			target_angle = adjust_angle(initial_angle, angle_presc);
				
			is_init_angle_read = TRUE;
		}
		
		if(is_init_angle_read)
		{
			if( (actual_angle >= target_angle) && (angle_presc <=0) && (target_angle >=0) )
			{
				angle_found = TRUE;
			}
			else if( (actual_angle >= target_angle) && (angle_presc < 0) && (target_angle<0) )
			{
				angle_found = TRUE;
			}
			else if( (actual_angle <= target_angle) && (angle_presc>=0) && (target_angle<0) )
			{
				angle_found = TRUE;
			}
			else if( (actual_angle <= target_angle) && (angle_presc>=0) && (target_angle>=0) )
			{
				angle_found = TRUE;
			}	
			
			if(angle_found) /*if angle was found, set pin to high*/
				set_pin(PORTB,PORTB4);
		} 
		
		
	}
	
	

}