Periodic Breakpoint C/C++ Code
The following section includes C/C++ code for executing a high-speed capture, as well as using RTSI to execute a high-speed capture. The following example code is not necessarily complete, and may not compile if copied exactly. Refer to the examples folder on the NI-Motion CD for files that are complete and compile as is.
// Main function void main(void) { u8 boardID; // Board identification number u8 axis; // Axis u16 csr = 0; // Communication status Register u8 profileStatus; // Profile Complete Status u8 bpStatus; // Breakpoint found Status i32 bpPos; // Breakpoint Position i32 bpPer; // Breakpoint Period i32 targetPos; // Target Position i32 currentPos; // Current Position u16 axisStatus; // Status of the axis // Variables for modal error handling u16 commandID; // The commandID of the function u16 resourceID; // The resource ID i32 errorCode; // Error code // Get the board ID printf("Enter the Board ID: "); scanf("%u", &boardID); // Get the axis number printf("Enter a axis number: "); scanf("%u",&axis); // Get the Target Position printf("Enter a target position: "); scanf("%ld",&targetPos); // Get the Breakpoint Position printf("Enter a breakpoint position: "); scanf("%ld",&bpPos); // Get the Breakpoint Period printf("Enter a breakpoint period: "); scanf("%ld",&bpPer); // Configure the breakpoint to be absolute err = flex_configure_breakpoint(boardID,axis,NIMC_PERIODIC_BREAKPOINT,NIMC_NO_CHANGE,0); CheckError; // Load the position to start breakpoints err = flex_load_pos_bp(boardID,axis,bpPos,0xFF); CheckError; // Set the Period err = flex_load_bp_modulus(boardID,axis,bpPer,0xFF); CheckError; // Enable the breakpoint err = flex_enable_breakpoint(boardID,axis,NIMC_TRUE); CheckError; // Load a target position err = flex_load_target_pos(boardID,axis,targetPos,0xFF); CheckError; // Start the motion err = flex_start(boardID,axis,0); CheckError; printf("\n"); do { // Read the axis status err = flex_read_axis_status_rtn(boardID,axis,&axisStatus); CheckError; err = flex_read_pos_rtn(boardID,axis,¤tPos); CheckError; // Check the breakpoint bit bpStatus = !((axisStatus & NIMC_POS_BREAKPOINT_BIT)==0); // Check the profile complete bit profileStatus = !((axisStatus & NIMC_PROFILE_COMPLETE_BIT)==0); printf("Current Position=%10d Breakpoint Status=%d Profile Complete=%d\r",currentPos,bpStatus,profileStatus); // Check for modal errors err = flex_read_csr_rtn(boardID,&csr); CheckError; // Check the modal errors if (csr & NIMC_MODAL_ERROR_MSG) { flex_stop_motion(boardID,NIMC_VECTOR_SPACE1, NIMC_DECEL_STOP, 0);// Stop the Motion err = csr & NIMC_MODAL_ERROR_MSG; CheckError; } }while(!profileStatus); printf("\nFinished.\n"); return; // Exit the Application ///////////////////////////////////////////////////////////////////////// // Error Handling // nimcHandleError; //NIMCCATCHTHIS: // Check to see if there were any Modal Errors if (csr & NIMC_MODAL_ERROR_MSG){ do{ // Get the command ID, resource and the error code of the modal // error from the error stack on the board flex_read_error_msg_rtn(boardID,&commandID,&resourceID,&errorCode); nimcDisplayError(errorCode,commandID,resourceID); // Read the Communication Status Register flex_read_csr_rtn(boardID,&csr); }while(csr & NIMC_MODAL_ERROR_MSG); } else // Display regular error nimcDisplayError(err,0,0); return; // Exit the Application }