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 !!! }
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(); }
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); } } }