Changes

KMotionDef

75,979 bytes added, 20:07, 11 February 2016
/* Standard Math Funtions */
====== ======
===KMotionDef.h===
The KMotionDef.h, is a C header file which lists all variables and functions available to [[KFLOP C Programs]]. The KMotionDef.h file can be located in the  \DSP_KFLOP\ directory.
The KMotionDef.h, is a C header file which lists all variables and functions available to [[KFLOP C Programs]]. The KMotionDef.h file can be found at <KMotion Installation Directory>\DSP_KFLOP\
===Variables=The Big List====To be added<span style="color: #ff0000;">Please Note - at the moment this is a direct copy and paste of the KMotionDef.h file. As time allows, it will gradually link to other pages containing further details and examples of related variables and functions. If you wish to contribute to this task, please register.</span>
<span style="color: #0000ff;">To make already linked variables/functions stand out, the original unedited text has been coloured Blue. As the page is edited and linked, it will revert to normal wiki text colours.</span>
Functions
<span style="color: #0000ff;">// standard math funtions</span><br /><span style="color: #0000ff;">//  KMotionDef.h - MAIN HEADER FILE FOR USER C PROGRAMS</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">//  Copyright Dynomotion 2/20/2004</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">//  Include this header file in User C programs that execute</span><br /><span style="color: #0000ff;">//  in the DSP to define all User accessible KMotion functions,</span><br /><span style="color: #0000ff;">//  constants, and data structures</span>
# <span style="color: #0000ff;">ifndef KMotionDef_h</span><br /><span style="color: #0000ff;">#define KMotionDef_h</span> # <span style="color: #0000ff;">define KFLOP</span><br /><span style="color: #0000ff;">#define C6722</span> # <span style="color: #0000ff;">define BOARD "KFLOP"</span> <span style="color: #0000ff;">extern float const char VersionAndBuildTime[];  // string with version and build time</span> # <span style="color: #0000ff;">define CLOCKFREQ   50.0e6   // 200 MHz/4  </span> <span style="color: #0000ff;">typedef int BOOL;</span> # <span style="color: #0000ff;">ifndef _SIZE_T</span><br /><span style="color: #0000ff;">#define _SIZE_T</span><br /><span style="color: #0000ff;">typedef unsigned int size_t;</span><br /><span style="color: #0000ff;">#endif</span> # <span style="color: #0000ff;">ifndef NULL</span><br /><span style="color: #0000ff;">#define NULL    0</span><br /><span style="color: #0000ff;">#endif</span> # <span style="color: #0000ff;">ifndef FALSE</span><br /><span style="color: #0000ff;">#define FALSE 0</span><br /><span style="color: #0000ff;">#endif</span><br /><span style="color: #0000ff;">#ifndef TRUE</span><br /><span style="color: #0000ff;">#define TRUE 1</span><br /><span style="color: #0000ff;">#endif    </span><br /><span style="color: #0000ff;">#ifndef PI</span><br /><span style="color: #0000ff;">#define PI 3.14159265358979323846264</span><br /><span style="color: #0000ff;">#endif    </span><br /><span style="color: #0000ff;">#ifndef PI_F</span><br /><span style="color: #0000ff;">#define PI_F 3.1415926535f</span><br /><span style="color: #0000ff;">#endif    </span><br /><span style="color: #0000ff;">#ifndef TWO_PI_F</span><br /><span style="color: #0000ff;">#define TWO_PI_F (2.0f * 3.1415926535f)</span><br /><span style="color: #0000ff;">#endif    </span><br /><span style="color: #0000ff;">#ifndef PI_2F</span><br /><span style="color: #0000ff;">#define PI_2F (3.1415926535f * 0.5f) </span><br /><span style="color: #0000ff;">#endif    </span><br /><span style="color: #0000ff;">#ifndef TWO_PI</span><br /><span style="color: #0000ff;">#define TWO_PI (2.0 * 3.14159265358979323846264)</span><br /><span style="color: #0000ff;">#endif   </span> <br /><span style="color: #0000ff;">#include "PC-DSP.h"   // contains common structures shared by PC and DSP</span> <span style="color: #0000ff;">// Global Host Status that the PC Application can specify as it Requests Global Status</span><br /><span style="color: #0000ff;">// to inform KFLOP User threads of its current state.  ie Job Actively running</span><br /><span style="color: #0000ff;">// up to 32 bits of status can be specified.  See PC-DSP.h for normal bit defines</span><br /><span style="color: #0000ff;">extern int volatile HostStatus;</span> # <span style="color: #0000ff;">define JOB_ACTIVE (HostStatus & HOST_JOB_ACTIVE_BIT)</span>  ====[[KMotionDef - Standard Math Functions|Standard Math Funtions]]====extern float [[KMotionDef - Standard Math Functions#sqrtf|sqrtf ]] (float x);<br />extern float expf  float [[KMotionDef - Standard Math Functions|expf]]  (float x);<br />extern float logf  (float float [[KMotionDef - Standard Math Functions|logf]]loat x);<br />extern float log10f(float x);<br />extern float powf  (float x, float y);<br />extern float sinf  (float x);<br />extern float cosf  (float x);<br />extern float tanf  (float x);<br />extern float asinf (float x);<br />extern float acosf (float x);<br />extern float atanf (float x);<br />extern float atan2f(float y, float x); <br />extern float fast_fabsf (float y);
extern double sqrt (double x);<br />extern double exp  (double x);<br />extern double log  (double x);<br />extern double log10(double x);<br />extern double pow  (double x, double y);<br />extern double sin  (double x);<br />extern double cos  (double x);<br />extern double tan  (double x);<br />extern double asin (double x);<br />extern double acos (double x);<br />extern double atan (double x);<br />extern double atan2(double y, double x); <br />extern double fast_fabs (double y);
 
<br /><span style="color: #0000ff;">#define FPGA_ADDR ((volatile unsigned char *)0x91000000)   // Base of FPGA addresses</span><br /><span style="color: #0000ff;">#define FPGA(X) (FPGA_ADDR[(X)*4+2])</span><br /><span style="color: #0000ff;">#define FPGA_ADDRW ((volatile unsigned short int *)0x91000000)   // Base of FPGA addresses</span><br /><span style="color: #0000ff;">#define FPGAW(X) (FPGA_ADDRW[(X)*2+1])</span><br /><span style="color: #0000ff;">    </span><br /><span style="color: #0000ff;">// This structure is set to default every time the program runs UNTIL</span><br /><span style="color: #0000ff;">// the program image has been FLASHED using the FLASH command</span><br /><span style="color: #0000ff;">// from then on it will not be cleared, so data that was present at the</span><br /><span style="color: #0000ff;">// time it was flashed will persist    </span>
 
# <span style="color: #0000ff;">define N_USER_DATA_VARS 200</span><br /><span style="color: #0000ff;">                    </span><br /><span style="color: #0000ff;">typedef struct</span><br /><span style="color: #0000ff;">{</span><br /><span style="color: #0000ff;">    int RunOnStartUp; // word Bits 1-7 selects which threads to execute on startup   </span><br /><span style="color: #0000ff;">    unsigned int EntryPoints[N_USER_THREADS];   // each downloaded program's entry point</span><br /><span style="color: #0000ff;">    int UserData[N_USER_DATA_VARS]; // General purpose way to share and or save user program data</span><br /><span style="color: #0000ff;">} PERSIST;</span>
 
<span style="color: #0000ff;">extern PERSIST persist;   </span>
 
<span style="color: #0000ff;">extern int StatusRequestCounter;  // increments each time host requests status</span>
 
<span style="color: #0000ff;">// data gathering variables</span>
 
# <span style="color: #0000ff;">define MAX_GATHER_VALUES 32</span>
 
# <span style="color: #0000ff;">define GATHER_NULL_TYPE 7</span><br /><span style="color: #0000ff;">#define GATHER_ADC_TYPE 6</span><br /><span style="color: #0000ff;">#define GATHER_DOUBLE_TYPE 5</span><br /><span style="color: #0000ff;">#define GATHER_FLOAT_TYPE 4</span><br /><span style="color: #0000ff;">#define GATHER_LASTPWMC_TYPE 3</span><br /><span style="color: #0000ff;">#define GATHER_LASTPWM_TYPE 2</span><br /><span style="color: #0000ff;">#define GATHER_INT_TYPE 1</span><br /><span style="color: #0000ff;">#define GATHER_END_TYPE 0</span>
 
<span style="color: #0000ff;">typedef struct  // define a size and address to store</span><br /><span style="color: #0000ff;">{  </span><br /><span style="color: #0000ff;">    int type;    // GATHER_XXXXX_TYPE, 0=end of list</span><br /><span style="color: #0000ff;">    void *addr;</span><br /><span style="color: #0000ff;">} GATHER_VALUE_DEF;</span><br /><span style="color: #0000ff;"> </span><br /><span style="color: #0000ff;">typedef struct</span><br /><span style="color: #0000ff;">{</span><br /><span style="color: #0000ff;">    double *bufptr;         // data gathering buffer pointer</span><br /><span style="color: #0000ff;">    double *endptr;         // done if bufptr = endptr    </span><br /><span style="color: #0000ff;">    </span><br /><span style="color: #0000ff;">    double Dest;             // Save where the injection will be relative to</span><br /><span style="color: #0000ff;">    </span><br /><span style="color: #0000ff;">    int Inject;             // if set, 1st address is to be copied from buffer to the address </span><br /><span style="color: #0000ff;">    </span><br /><span style="color: #0000ff;">    GATHER_VALUE_DEF list[MAX_GATHER_VALUES];   // list of addresses to gather (null after last value)</span><br /><span style="color: #0000ff;">} GATHER;</span>
 
<span style="color: #0000ff;">extern GATHER gather;    </span><br /><span style="color: #0000ff;">                    </span>
 
# <span style="color: #0000ff;">define MAX_GATHER_DATA 1000000 // Size of gather buffer (number of doubles, 8 bytes each).                   </span><br /><span style="color: #0000ff;">extern double *gather_buffer;   // Large buffer for data gathering, Bode plots, or User use</span>
 
# <span style="color: #0000ff;">define N_CPLX 2048</span>
 
<span style="color: #0000ff;">extern float *input;</span>
 
<span style="color: #0000ff;">void SetupGatherAllOnAxis(int c, int n_Samples);  // Prepares to gather info for an axis</span><br /><span style="color: #0000ff;">void TriggerGather();                             // starts gathering defined items into gather buffer</span>
 
 
<br /><span style="color: #0000ff;">#define TRAJECTORY_OFF 0          // no trajectory generation</span><br /><span style="color: #0000ff;">#define TRAJECTORY_INDEPENDENT 1  // simple independent axis (3rd order funtion of time)</span><br /><span style="color: #0000ff;">#define TRAJECTORY_LINEAR 2       // linear interpolated from coord system 0    (x = c*p+d)</span><br /><span style="color: #0000ff;">#define TRAJECTORY_CIRCULAR 3     // circular interpolated from coord system 0  (x = c*sin(p*a+b)+d)</span><br /><span style="color: #0000ff;">#define TRAJECTORY_SPECIAL 4      // Special Command to clear/set IO bit</span><br /><span style="color: #0000ff;">          // do the operation</span><br /><span style="color: #0000ff;">          // 0 = clearbit</span><br /><span style="color: #0000ff;">          // 1 = setbit</span><br /><span style="color: #0000ff;">          // 2 = wait for bit low</span><br /><span style="color: #0000ff;">          // 3 = wait for bit high</span><br /><span style="color: #0000ff;">          // 4 = beginning of Rapid</span><br /><span style="color: #0000ff;">          // 5 = end of Rapid</span><br /><span style="color: #0000ff;">          </span><br /><span style="color: #0000ff;">          //    param 0 = bit number</span>
 
 
<br /><span style="color: #0000ff;">#define TRAJECTORY_EXPONENTIAL 5  // independent axis (exponentially approach Dest a=Ratio per tick, b=Dest)</span>
 
# <span style="color: #0000ff;">define LAST_MOTION_JOG 0    // type of last independent motion was a jog</span><br /><span style="color: #0000ff;">#define LAST_MOTION_MOVE 1    // type of last independent motion was a move</span><br /><span style="color: #0000ff;">#define LAST_MOTION_MULTI 2    // type of last independent motion was a multi axis move (G0 type)</span><br /><span style="color: #0000ff;">#define LAST_MOTION_EXP 3    // type of last independent motion was an exponential</span>
 
<br /><span style="color: #0000ff;">typedef struct  // linear (only c and d are used),or sine equation</span><br /><span style="color: #0000ff;">{  </span><br /><span style="color: #0000ff;">    double a;    </span><br /><span style="color: #0000ff;">    double b;    </span><br /><span style="color: #0000ff;">    double c;    </span><br /><span style="color: #0000ff;">    double d;   // always t^0 constant coefficient (starting position)</span><br /><span style="color: #0000ff;">} TRIP_CIRCLE_LINEAR;</span>
 
<span style="color: #0000ff;">typedef struct  // linear (only c and d are used)</span><br /><span style="color: #0000ff;">{  </span><br /><span style="color: #0000ff;">    double c;    </span><br /><span style="color: #0000ff;">    double d;   // always t^0 constant coefficient (starting position)</span><br /><span style="color: #0000ff;">} TRIP_LINEAR;</span>
 
<span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// Motion structure for a coordinate system</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// 3rd order polynomial for the parametric parameter </span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// defines a parametric parameter p that varies from 0->1 over the</span><br /><span style="color: #0000ff;">// segment of motion as a function of time.  All the associated axes </span><br /><span style="color: #0000ff;">// derive their position from this (either circular or linear) </span><br /><span style="color: #0000ff;">// using either a circular formula or linear formula</span>
 
<span style="color: #0000ff;">typedef struct  </span><br /><span style="color: #0000ff;">{   </span><br /><span style="color: #0000ff;">    char trajectory_mode;    // Off, circular, or linear</span><br /><span style="color: #0000ff;">    unsigned char x_axis;    // associated x axis / or special command </span><br /><span style="color: #0000ff;">    unsigned char y_axis;    // associated y axis</span><br /><span style="color: #0000ff;">    unsigned char z_axis;    // associated z axis</span><br /><span style="color: #0000ff;">    unsigned char a_axis;    // associated a axis</span><br /><span style="color: #0000ff;">    unsigned char b_axis;    // associated b axis</span><br /><span style="color: #0000ff;">    unsigned char c_axis;    // associated c axis</span><br /><span style="color: #0000ff;">    unsigned char u_axis;    // associated u axis</span><br /><span style="color: #0000ff;">    unsigned char v_axis;    // associated v axis</span><br /><span style="color: #0000ff;"> short int special_param; // special param 0</span><br /><span style="color: #0000ff;"> double t;   // time duration (in sec) of trip state</span><br /><span style="color: #0000ff;">    double a;   // t^3 coefficient  (Jerk)</span><br /><span style="color: #0000ff;">    double b;   // t^2 coefficient  (initial acceleration)</span><br /><span style="color: #0000ff;">    double c;   // t^1 coefficient  (initial velocity)</span><br /><span style="color: #0000ff;">    double d;   // t^0 constant coefficient (starting position) </span><br /><span style="color: #0000ff;">    TRIP_CIRCLE_LINEAR X,Y;</span><br /><span style="color: #0000ff;">    TRIP_LINEAR Z,A,B,C,U,V;</span><br /><span style="color: #0000ff;">} PARAMETRIC_COEFF;</span>
 
 
<br /><span style="color: #0000ff;">typedef struct  // 3rd order polynomial for a single trip state</span><br /><span style="color: #0000ff;">{  </span><br /><span style="color: #0000ff;">    int trajectory_mode;</span><br /><span style="color: #0000ff;">    double t;   // time duration (in sec) of trip state</span><br /><span style="color: #0000ff;">    double a;   // t^3 coefficient  (Jerk)</span><br /><span style="color: #0000ff;">    double b;   // t^2 coefficient  (initial acceleration)</span><br /><span style="color: #0000ff;">    double c;   // t^1 coefficient  (initial velocity)</span><br /><span style="color: #0000ff;">    double d;   // t^0 constant coefficient (starting position)</span><br /><span style="color: #0000ff;">} TRIP_COEFF;</span><br /><span style="color: #0000ff;">            </span><br /><span style="color: #0000ff;">typedef struct  // 2nd order IIR Filter</span><br /><span style="color: #0000ff;">{</span><br /><span style="color: #0000ff;">    float A1;   // output coefficient Z-1</span><br /><span style="color: #0000ff;">    float A2;   // output coefficient Z-2</span><br /><span style="color: #0000ff;">    float B0;   // input  coefficient Z-0   </span><br /><span style="color: #0000ff;">    float B1;   // input  coefficient Z-1</span><br /><span style="color: #0000ff;">    float B2;   // input  coefficient Z-2</span><br /><span style="color: #0000ff;">    float d0,d1; // delay values</span><br /><span style="color: #0000ff;">} IIR;</span>
 
<span style="color: #0000ff;">// MOTION TRAJECTORY STRUCTURES</span><br /><span style="color: #0000ff;">    </span><br /><span style="color: #0000ff;">extern double CS0_t;    // Current Coordinated Motion Segment Times</span><br /><span style="color: #0000ff;">extern double CS0_TimeExecuted;  // Sum of all previous Coordinated Motion Segments Executed</span><br /><span style="color: #0000ff;">extern double CS0_TimeDownloaded; // Sum of all Coord Motion Segments downloaded from Host</span><br /><span style="color: #0000ff;">extern double CS0_TimeLost;   // Sum of all Coord Motion Segments downloaded from Host that have been discarded (buffer wrap)</span><br /><span style="color: #0000ff;">extern double CS0_TimeBase;       // how much coordinated motion is advanced each tick</span><br /><span style="color: #0000ff;">extern double CS0_TimeBaseDelta;   // max amount coordinated motion time base is changed per tick</span><br /><span style="color: #0000ff;">extern float CS0_DecelTime;   // how long to take to stop the coordinated motion (computed by StopMotion)</span><br /><span style="color: #0000ff;">extern double CS0_TimeBaseDesired; // Last Desired rate-of-time (TIMEBASE = real time)</span>
 
<span style="color: #0000ff;">extern BOOL CS0_DoingRapid;    // Flag indicating Rapid in Progress so use normal Time Base ignoring FRO (except for FeedHold)      </span><br /><span style="color: #0000ff;">extern BOOL CS0_Flushed;    // Coordinated motion Terminated so no longer necessary to worry about starvation       </span><br /><span style="color: #0000ff;">extern BOOL CS0_HoldAtEnd;    // Coordinated motion to not Terminate but rather Hold when reaching end of buffer      </span>
 
<span style="color: #0000ff;">extern float CS0_NomDecel2TB2;   // Nominal Decel Time/(2 TIMEBASE^2) = Factor to relate buffer time to TimeBase to be able to stop</span>
 
<span style="color: #0000ff;">extern int CS0_StoppingState;    // emergency stop in progress, 0 = not stopping, 1=stopping coord motion, 2=stopping indep, 3=fully stopped, 4=ind stopped</span><br /><span style="color: #0000ff;">extern PARAMETRIC_COEFF *CoordSystem0;  // current pointer into Coordinated Motion</span><br /><span style="color: #0000ff;">extern PARAMETRIC_COEFF *LastCoordSystem0;</span><br /><span style="color: #0000ff;">extern int ParametricIndex;    // Index of where to put next downloaded Coord Motion Segment or command</span><br /><span style="color: #0000ff;">extern BOOL ParametricIndexWrapped;  // Indicates that Coord Motion Buffer has wrapped and additional segments will cause segments to be lost</span><br /><span style="color: #0000ff;">extern PARAMETRIC_COEFF *ParametricCoeffs;  // Points to beginning of Coord Motion Buffer</span><br /><span style="color: #0000ff;">extern PARAMETRIC_COEFF *ParametricCoeffsEnd;  // Points to End+1 of Allocated Coord Motion Buffer (MAX_SEGMENTS)</span><br /><span style="color: #0000ff;">extern PARAMETRIC_COEFF *LastCoordSystem0;  // Pointer to last Segment executed when finished</span><br /><span style="color: #0000ff;">extern PARAMETRIC_COEFF *LastValidTrajSegment; // Last Segment actually Executed</span>
 
<span style="color: #0000ff;">void StopCoordinatedMotion(void);   // bring any coordinated motion to a emergency stop ASAP</span><br /><span style="color: #0000ff;">void ResumeCoordinatedMotion(void); // resume coordinated/Indep motion after an emergency stop</span><br /><span style="color: #0000ff;">void ClearStopImmediately(void); // Clear Stop Condition without resuming</span><br /><span style="color: #0000ff;">void UpdateStoppingState(void);  // Update Stopping Status (only required for indep stopping)</span><br /><span style="color: #0000ff;">float GetNominalFROChangeTime(void);// computed time to change from FRO 1.0 to 0.0 for all defined CoordSystem Axes and their specified Vel, Accel, jerk</span><br /><span style="color: #0000ff;">void SetFRO(float FRO); // change from current to the specified FRO (FRO=1.0=Realtime)using a nominal rate based on computed time to change from 1.0 to 0.0</span><br /><span style="color: #0000ff;">void SetRapidFRO(float FRO); // change from current to the specified Rapid FRO (FRO=1.0=Realtime)using a nominal rate based on computed time to change from 1.0 to 0.0</span><br /><span style="color: #0000ff;">void SetFROTemp(float FRO); // Temporarily change from current to the specified FRO using a nominal rate, override FeedHold, don't save as LastFRO </span><br /><span style="color: #0000ff;">void SetFROwRate(float FRO, float DecelTime); // change from current to the specified FRO (FRO=1.0=Realtime)using a rate based on caller specified time to change from 1.0 to 0.0</span><br /><span style="color: #0000ff;">void SetRapidFROwRate(float FRO, float DecelTime); // change from current to the specified Rapid FRO (FRO=1.0=Realtime)using a rate based on caller specified time to change from 1.0 to 0.0</span><br /><span style="color: #0000ff;">void SetFROwRateTemp(float FRO, float DecelTime); //  Temporarily change from current to the specified FRO using a rate based on caller specified time, override FeedHold, don't save as LastFRO</span><br /><span style="color: #0000ff;">extern float CS0_LastFRO;         // Last Desired FRO (used for Resume after FeedHold or for changes in FRO while in FeedHold) </span><br /><span style="color: #0000ff;">extern float CS0_LastRapidFRO;      // Last Desired FRO (used for Resume after FeedHold during Rapid)</span>
 
<span style="color: #0000ff;">// Called after adding something to the Cood Motion Buffer.  Increments the Coord Motion Buffer pointer </span><br /><span style="color: #0000ff;">// while keeping track of how much time is currently in the buffer (CS0_TimeDownloaded), also how much </span><br /><span style="color: #0000ff;">// was over written due to buffer wrapping (CS0_TimeLost) to be able to determine the extent that it is </span><br /><span style="color: #0000ff;">// possible to reverse, and keep the buffer terminated with TRAJECTORY_OFF</span><br /><span style="color: #0000ff;">void IncParametricIndex(void);</span>
 
<br /><span style="color: #0000ff;">#define MAX_TRIP 20  // max trip states for individual axis moves</span><br /><span style="color: #0000ff;">extern TRIP_COEFF TripCoeffs[N_CHANNELS][MAX_TRIP];  // Trip Coeff lists for each channel</span>
 
<span style="color: #0000ff;">// Limit Switch Options</span>
 
<span style="color: #0000ff;">// Bit 0 1=Stop Motor on Neg Limit, 0=Ignore Neg limit</span><br /><span style="color: #0000ff;">// Bit 1 1=Stop Motor on Pos Limit, 0=Ignore Pos limit</span><br /><span style="color: #0000ff;">// Bit 2 Neg Limit Polarity 0=stop on high, 1=stop on low</span><br /><span style="color: #0000ff;">// Bit 3 Pos Limit Polarity 0=stop on high, 1=stop on low</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// Bits 4-7 Action - 0 Kill Motor Drive</span><br /><span style="color: #0000ff;">//                   1 Disallow drive in direction of limit</span><br /><span style="color: #0000ff;">//                   2 Stop movement</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// Bit 8=use Extended Limit Bit Numbers (LimitNegSwitchBit,LimitPosSwitchBit)</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// (for legacy support allow packed 8-bit numbers)</span><br /><span style="color: #0000ff;">// Bits 16-23 Neg Limit I/O Bit number</span><br /><span style="color: #0000ff;">// Bits 24-31 Pos Limit I/O Bit number</span>
 
 
<br /><span style="color: #0000ff;">//  M A I N   S T R U C T U R E   T H A T   D E F I N E S   A N   A X I S</span>
 
<span style="color: #0000ff;">typedef struct</span><br /><span style="color: #0000ff;">{   </span><br /><span style="color: #0000ff;">    int ChanNumber;                 // channel number 0-3</span><br /><span style="color: #0000ff;">    int Enable;                     // enables feedback</span><br /><span style="color: #0000ff;">    int InputMode;                  // sets position input mode (See Axis Input Modes)</span><br /><span style="color: #0000ff;">    int OutputMode;     // sets servo/motor mode    (See Axis Output Modes)</span><br /><span style="color: #0000ff;">    int LimitSwitchOptions;         // see above for description</span><br /><span style="color: #0000ff;">    int LimitSwitchNegBit;   // Neg Limit I/O Bit number</span><br /><span style="color: #0000ff;">    int LimitSwitchPosBit;   // Pos Limit I/O Bit number</span><br /><span style="color: #0000ff;"> int MasterAxis;     // -1 if none, else master axis channel to slave to</span><br /><span style="color: #0000ff;"> double SlaveGain;    // Multiplicative Factor for slave motion </span><br /><span style="color: #0000ff;">    double MaxFollowingError;       // Kill motor if error exceeds this value</span><br /><span style="color: #0000ff;">    double LastFollowingError;      // Last Measured Following Error</span><br /><span style="color: #0000ff;">    double t;                       // current time in secs within the trip state</span><br /><span style="color: #0000ff;">    double Dest;                    // current dest position for servo</span><br /><span style="color: #0000ff;"> double UnfilteredDest;   // unfiltered current dest position for servo (before CM smoothing)</span><br /><span style="color: #0000ff;">    double DestOffset;              // Additional offset to position (used by Injection)</span><br /><span style="color: #0000ff;">    float Vel;                      // max velocity for the move trajectory</span><br /><span style="color: #0000ff;">    float Accel;                    // max Acceleration for the move trajectory</span><br /><span style="color: #0000ff;">    float Jerk;                     // max Jerk (rate of change of Accel) for the move</span><br /><span style="color: #0000ff;">    float FFAccel;                  // Acceleration feed forward</span><br /><span style="color: #0000ff;">    float FFVel;                    // Velocity feed forward</span><br /><span style="color: #0000ff;">    double Position;                // encoder, ADC, Resolver, reading</span><br /><span style="color: #0000ff;">    double invDistPerCycle;         // for stepper distance for one complete cycle (4 full steps)</span><br /><span style="color: #0000ff;">                                    // for brushless 3-4 phase encoder counts for one complete cycle</span><br /><span style="color: #0000ff;">                                    // (saved as reciprical for speed)      </span><br /><span style="color: #0000ff;">    float StepperAmplitude;         // Microstepper Amplitude in PWM counts to apply (moving slow, without lead comp)</span><br /><span style="color: #0000ff;">    float Output;                   // Value output to PWM or DAC or CL Stepper offset </span><br /><span style="color: #0000ff;">    float prev_output;              // previous Output so Slave can track Master when in CL Stepper </span><br /><span style="color: #0000ff;">    float Lead;                     // Lead compensation to correct for step motor inductance</span><br /><span style="color: #0000ff;">    TRIP_COEFF *pcoeff;             // pointer to coeff that interrupt routine uses, NULL if done </span><br /><span style="color: #0000ff;">    double last_position;           // last measured error</span><br /><span style="color: #0000ff;">    double last_dest;               // last destination from beginning of prev servo interrupt</span><br /><span style="color: #0000ff;"> double prev_dest;    // prev destination from end of prev servo interrupt (will incl User changes to Dest)</span><br /><span style="color: #0000ff;"> int LastNonZeroDir;    // Last direction we actually moved some amount(+1=Positive, 0=undefined, -1=negative)</span><br /><span style="color: #0000ff;"> int DirectionOfMotion;   // Dest change was in this direction (+1=Positive, 0=none, -1=negative)</span><br /><span style="color: #0000ff;"> float last_vel;                 // last destination velocity</span><br /><span style="color: #0000ff;">    float x1last,x2last;            // used with lead compensation </span><br /><span style="color: #0000ff;">    int   OutputChan0,OutputChan1;  // pwm or DAC channels to use     </span><br /><span style="color: #0000ff;">    int   InputChan0,InputChan1;    // Encoder or ADC channels to use </span><br /><span style="color: #0000ff;">    float InputOffset0,InputGain0;  // offsets and gains for Resolver Input 0,1 (x'=ax+b)</span><br /><span style="color: #0000ff;">    float InputOffset1,InputGain1;  //   or for ADC, or (InputGain0=-1 reverses encoder)</span><br /><span style="color: #0000ff;"> float OutputGain;    // Scale or Reverse Output Magnitude or Direction</span><br /><span style="color: #0000ff;"> float OutputOffset;    // Offset the output</span><br /><span style="color: #0000ff;">    float CommutationOffset;        // 3 or 4 phase commutation offset, PhaseA = sin((Position+CommutationOffset)*invDistPerCycle)</span><br /><span style="color: #0000ff;">    float last_theta;               // last resolver theta reading</span><br /><span style="color: #0000ff;">    float theta_correction;         // resolver correction offset to correct for nonlinearities</span><br /><span style="color: #0000ff;">    signed char last_enc;           // last fpga encoder reading</span><br /><span style="color: #0000ff;">    float P,I,D;                    // pid gain values</span><br /><span style="color: #0000ff;">    float MaxI;                     // max integrator windup</span><br /><span style="color: #0000ff;">    float MaxErr;                   // error saturates at this value</span><br /><span style="color: #0000ff;">    float integrator;               // current integrator vlue</span><br /><span style="color: #0000ff;">    float MaxOutput;                // max allowed servo output</span><br /><span style="color: #0000ff;">    float DeadBandRange;            // Range about zero where gain change occurs</span><br /><span style="color: #0000ff;">    float DeadBandGain;             // Additional gain within DeadBand Range</span><br /><span style="color: #0000ff;"> int LastMotionType;    // Type of last move - used in Immediate Stop/Resume</span><br /><span style="color: #0000ff;"> double LastMotionDest;   // Where last move was to go - used in Immediate Stop/Resume</span><br /><span style="color: #0000ff;"> float ExpMotionVc;    // Velocity point on exp curve where Max Accel is obtained</span><br /><span style="color: #0000ff;"> float ExpMotionXc;    // Distance point on exponential curve where Max Accel is obtained</span><br /><span style="color: #0000ff;"> float SoftLimitNeg;    // Negative Soft Limit (counts)</span><br /><span style="color: #0000ff;"> float SoftLimitPos;    // Positive Soft Limit (counts)</span><br /><span style="color: #0000ff;"> int BacklashMode;    // Type of correction:  Currently only BACKLASH_OFF, BACKLASH_LINEAR</span><br /><span style="color: #0000ff;"> float BacklashAmount;   // Amount of Backlash to be applied</span><br /><span style="color: #0000ff;"> float BacklashRate;    // Rate Backlash shoule be applied, counts/sec</span><br /><span style="color: #0000ff;"> int BacklashDirection;   // Last non zero direction moved</span><br /><span style="color: #0000ff;"> float PrevBacklashDest;   // Prev Destination where backlash was determined to allow small hysteresis</span><br /><span style="color: #0000ff;"> float Backlash;     // current amount of compensation being applied</span>
 
<span style="color: #0000ff;">    TRIP_COEFF *c;                // move profile polynomial coefficients list (up tp MAX_TRIP)</span><br /><span style="color: #0000ff;">    IIR iir[N_IIR_FILTERS];         // several IIR filters</span><br /><span style="color: #0000ff;">}CHAN;</span>
 
<span style="color: #0000ff;">// continuously sent by DMA to DACs</span><br /><span style="color: #0000ff;">extern short int DAC_Buffer[N_DACS];   //  format    12 bits data </span><br /><span style="color: #0000ff;">#define DAC(ch, v) DAC_Buffer[ch]=((v-2048)&0xfff)  // set DAC channel to value (range -2048/+2047)</span>
 
<span style="color: #0000ff;">extern int ADC_BufferIn[N_ADCS];     //  format   12 bits data </span><br /><span style="color: #0000ff;">#define ADC(ch) (ADC_BufferIn[ch]-2048)   // return ADC reading of specified channel (range -2048/2047)extern int ADC_BufferIn[N_ADCS];     //  format   4-dummy bits 12 bits data 16 dummy</span>
 
<span style="color: #0000ff;">extern int ADC_BufferInSnap[2*N_ADCS_SNAP];   //  Snap Amp Current ADC format  16-bits data</span>
 
# <span style="color: #0000ff;">define FULL_RANGE_CURRENT 4.85f</span><br /><span style="color: #0000ff;">#define MeasuredAxisAmps(axis) ((ADC(axis+4)+2048)*(FULL_RANGE_CURRENT/4096.0f))  // returns measured current in an axis (Amperes)</span>
 
<span style="color: #0000ff;">// On board Power Amp PWM control</span>
 
# <span style="color: #0000ff;">define MAX_PWMR_VALUE 400  // Max value for PWMs in Recirculate mode</span><br /><span style="color: #0000ff;">void WritePWMR(int ch, int v);  // Write to PWM - Recirculate mode (+ or - power then shorted)</span><br /><span style="color: #0000ff;">#define MAX_PWM_VALUE 230  // Max value for PWMs in antiphase mode</span><br /><span style="color: #0000ff;">void WritePWM(int ch, int v);   // Write to PWM - locked anti-phase mode (+ power then - power)</span>
 
# <span style="color: #0000ff;">define MAX_PWMC_VALUE 1000  // Max value for PWMs in Current Mode (SnapAmps only)</span><br /><span style="color: #0000ff;">void WritePWMC(int ch, int v);  // Write to PWM - Current Loop mode - Always optimal decay</span>
 
<span style="color: #0000ff;">extern int SnapAmpPresent;         // 1 = SnapAmp Present 0= Not Present</span><br /><span style="color: #0000ff;">extern int DisableSnapAmpDetectOnBoot;  // disables using Bits 12,13, and 15 on JP7 detect AutoDetect SnapAmps</span><br /><span style="color: #0000ff;">void WriteSnapAmp(int add, int data);  // write a 16-bit word directly to SnapAmp FPGA </span><br /><span style="color: #0000ff;">int ReadSnapAmp(int add);     // read a 16-bit word directly from SnapAmp FPGA</span>
 
<br /><span style="color: #0000ff;">// Digital I/O bit PWM control (8 I/O bits on KFlop JP6 may be pulsed)</span>
 
# <span style="color: #0000ff;">define N_IO_PWMS 8    // Number of pwms that may be assigned to GPIO bits  </span><br /><span style="color: #0000ff;">#define IO_PWMS 0xD0     // FPGA offset to IO PWM registers (2 bytes each - value, enable(bit0))</span><br /><span style="color: #0000ff;">#define IO_PWMS_PRESCALE 0x2f   // FPGA offset to IO PWM Pre-Scale clock divider 0-255, 0 = 16.6MHz, 1=8.33MHz, ...</span><br /><span style="color: #0000ff;">#define IO_PWM_MAX_VALUE 255    // 0 = 0%, 255 = 100 % duty cycle</span>
 
<span style="color: #0000ff;">// addr to r/w encoder noise rejection filter value (0..255), </span><br /><span style="color: #0000ff;">// Bit8 switches Encoders Ch4-7 from JP5 to JP6, </span><br /><span style="color: #0000ff;">// Bit9 switches Encoders Ch0-3 from JP7 to JP4</span><br /><span style="color: #0000ff;">#define ENC_NOISE_FILTER_ADD  0x05   </span><br /><span style="color: #0000ff;">#define ENC_0_3_JP4 0x200</span><br /><span style="color: #0000ff;">#define ENC_4_7_JP6 0x100</span><br /><span style="color: #0000ff;">#define ENC_NOISE_FILTER_DEFAULT_VAL 7 // noise rejection filter default value (100MHz/3/7/2 = 2MHz)</span>
 
<br /><span style="color: #0000ff;">#define ENC_NOISE_ERR_ADD 0x08  // encoder sudden change by 2 error address</span><br /><span style="color: #0000ff;">#define ENC_NOISE_ERR_BIT0 4  // encoder sudden change by 2 error bit for encoder 0</span><br /><span style="color: #0000ff;">#define ENC_NOISE_ERR_BIT1 5  // encoder sudden change by 2 error bit for encoder 1</span><br /><span style="color: #0000ff;">#define ENC_NOISE_ERR_BIT2 6  // encoder sudden change by 2 error bit for encoder 2</span><br /><span style="color: #0000ff;">#define ENC_NOISE_ERR_BIT3 7  // encoder sudden change by 2 error bit for encoder 3</span>
 
 
<span style="color: #0000ff;">// FPGA Step and Direction Frequency Generators (8) are available</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// </span><br /><span style="color: #0000ff;">#define NSTEPDIR 8</span>
 
<span style="color: #0000ff;">// address of 6 bit pulse length 0-63= # 16.666MHz clocks, </span><br /><span style="color: #0000ff;">// bit6 muxes generators 0-3 from JP7 to JP4 and JP6, </span><br /><span style="color: #0000ff;">// bit7 reverses polarity (0=pulses low & Pos Dir high, 1=pulses high & Pos Dir Low)</span><br /><span style="color: #0000ff;">#define STEP_PULSE_LENGTH_ADD 0x06</span>
 
# <span style="color: #0000ff;">define STEP_PULSE_LENGTH_DEFAULT 32 // default pulse length of ~ 2us</span>
 
# <span style="color: #0000ff;">define STEP_RATE_ADD 0x3c // write a 32 bit word - Bit31=enable, Bit27=Drive, Bits24-26=chan, 0-23= signed fraction of 16.666MHz</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD0 0x40 // read a 16 bit word - step count0 - 9 bits signed position and 7 bits of fraction</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD1 0x42 // read a 16 bit word - step count1 - 9 bits signed position and 7 bits of fraction</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD2 0x44 // read a 16 bit word - step count2 - 9 bits signed position and 7 bits of fraction</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD3 0x46 // read a 16 bit word - step count3 - 9 bits signed position and 7 bits of fraction</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD4 0x48 // read a 16 bit word - step count4 - 9 bits signed position and 7 bits of fraction</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD5 0x4a // read a 16 bit word - step count5 - 9 bits signed position and 7 bits of fraction</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD6 0x4c // read a 16 bit word - step count6 - 9 bits signed position and 7 bits of fraction</span><br /><span style="color: #0000ff;">#define STEP_POSITION_ADD7 0x4e // read a 16 bit word - step count7 - 9 bits signed position and 7 bits of fraction</span>
 
<br /><span style="color: #0000ff;">extern int KanalogPresent;     // 1=Kanalog Present</span><br /><span style="color: #0000ff;">extern int DisableKanalogDetectOnBoot;  // disables using Bits 16-20 and 23 on JP4 to detect AutoDetect Kanalog</span>
 
<span style="color: #0000ff;">extern int KStepPresent;       // 1=KStep Present - set this to mux inputs into virtual bits 48-63</span>
 
<span style="color: #0000ff;">// Kanalog FPGA Registers for internal use only</span><br /><span style="color: #0000ff;">#define KAN_TRIG_REG 0xA0  // triggers a transfer to/from Kanalog, 1-enables Kanalog, 2-enables RS232, 3-both</span><br /><span style="color: #0000ff;">#define KAN_DAC_REGS 0x80    // 8 - 12 bit r/w regs</span><br /><span style="color: #0000ff;">#define KAN_FET_OPTO 0x88    // 1 - 16 bit 15-8 FET drivers, 7-0 Opto Outputs</span><br /><span style="color: #0000ff;">#define KAN_GPOUT    0x89    // 1 - 8 bit   7-0 GP 3.3V OUTPUTS</span><br /><span style="color: #0000ff;">#define KAN_ADC_REGS 0x90    // 8 - 12 bit r/w regs</span><br /><span style="color: #0000ff;">#define KAN_OPTOIN_GPIN 0x98   // 1 - 16 bit 15-8 OptoInputs, 7-0 GP 3.3V inputs</span>
 
<span style="color: #0000ff;">// Kanalog IO Bit numbers</span><br /><span style="color: #0000ff;">#define KAN_INPUTS 128   // 16 Bits 128-143 (128-135 GPIN, 136-143 Opto in)</span><br /><span style="color: #0000ff;">#define KAN_NINPUTS 16   // 16 Input Bits</span><br /><span style="color: #0000ff;">#define KAN_OUTPUTS 144   // 24 Bits 144-167 (144-151 Opto out, 152-159 FET/Relay Drivers, 160-167 GPOUT)</span><br /><span style="color: #0000ff;">#define KAN_NOUTPUTS 24   // 24 output Bits</span>
 
 
<span style="color: #0000ff;">// 3 Phase manual control. Angle is specified in cycles.</span><br /><span style="color: #0000ff;">// cycles is a double precision value an may be a very</span><br /><span style="color: #0000ff;">// large number.  Only the fractional part will be used.  </span><br /><span style="color: #0000ff;">#define MAXV 230.0f // Max allowed 3 phase vector (512/2/sin(60) - EOFF*4)</span><br /><span style="color: #0000ff;">void Write3PH(CHAN *ch0, float v, double angle_in_cycles); // put a voltage v on a 3 Phase motor at specified commutation angle</span><br /><span style="color: #0000ff;">void Write4PH(CHAN *ch0, float v, double angle_in_cycles); // put a voltage v on a 4 Phase motor at specified commutation angle</span>
 
<br /><span style="color: #0000ff;">extern int LastPWM[N_PWMS+2*N_PWMS_SNAP];    // +/- 255 counts</span>
 
<span style="color: #0000ff;">int ReadADC(int ch);           // User Programs should use ADC() command instead</span><br /><span style="color: #0000ff;">void WriteDAC(int ch, int v);  // User Programs should use DAC() command instead</span>
 
 
<span style="color: #0000ff;">//  S P I N D L E   A N D   T H R E A D I N G   S U P P O R T</span>
 
<span style="color: #0000ff;">// main Spindle data structure which maintains Spindle </span><br /><span style="color: #0000ff;">// Position Info and threading control</span>
 
<span style="color: #0000ff;">typedef struct </span><br /><span style="color: #0000ff;">{</span><br /><span style="color: #0000ff;"> double Position;   // position in revs</span><br /><span style="color: #0000ff;"> double StartPosition;  // position in revs to begin threading</span><br /><span style="color: #0000ff;"> double LastUpdatePosition; // last position in revs where speed was computed</span><br /><span style="color: #0000ff;"> double RevsPerCount;  // inverse of counts/rev</span><br /><span style="color: #0000ff;"> double UpdateTick;   // which servo tic we should calc RPM</span><br /><span style="color: #0000ff;"> double DeltaTicks;   // # Servo tics between speed measurement</span><br /><span style="color: #0000ff;"> double AdjTimeFilt;   // Lead Adjusted, filtered, time</span><br /><span style="color: #0000ff;"> double LastCSTime;   // Previous Coordinate System Time</span><br /><span style="color: #0000ff;"> double *pEncoderPos;  // pointer to Spindle Position </span><br /><span style="color: #0000ff;"> double K;     // Tau low pass filter coefficient</span><br /><span style="color: #0000ff;"> float TrueSpeedRPS;   // last measured speed</span><br /><span style="color: #0000ff;"> float InvBaseSpeedRPS;  // Reciprocal of Base speed of which trajectory was planned</span><br /><span style="color: #0000ff;"> double InvBaseSpeedRPSK1; // InvBaseSpeedRPS * (1-K)</span><br /><span style="color: #0000ff;"> float InvUpdateTime;  // Reciprocal of update time to avoid division</span><br /><span style="color: #0000ff;"> float Tau;     // Time constant for spindle filtering</span><br /><span style="color: #0000ff;"> int Type;     // Type=0 None, Type=1 uses encoder to measure spindle position</span><br /><span style="color: #0000ff;"> int ThreadingActive;  // True when threading is in progress</span>
 
<span style="color: #0000ff;">} SPINDLE;</span>
 
<span style="color: #0000ff;">extern SPINDLE Spindle;</span>
 
<span style="color: #0000ff;">void ConfigureSpindle(int Type, int Axis, float UpdateTimeSecs, float Tau, float CountsPerRev);  // configures for type of Spindle feedback</span><br /><span style="color: #0000ff;">void TrigThreading(float BaseSpeedRPS); // triggers threading coordinated motion, BaseSpeed is the ideal Spindle speed thatthe motion was planned for</span>
 
 
<span style="color: #0000ff;">//  T I M E   F U N C T I O N S</span>
 
<span style="color: #0000ff;">double Time_sec();// returns total time since power up in seconds</span>
 
<span style="color: #0000ff;">void WaitUntil(double time_sec);// wait until a specified time</span>
 
<span style="color: #0000ff;">void Delay_sec(double sec);// Delay time in seconds</span>
 
<span style="color: #0000ff;">// (returns current time)</span><br /><span style="color: #0000ff;">double WaitNextTimeSlice(void);// wait until a thread's new time slice begins</span>
 
 
 
# <span style="color: #0000ff;">define TIMER0  (*(volatile int *)0x42000010) // 32 bit raw hardware timer counts at CLOCKFREQ (see PC_DSP.h) </span>
 
<span style="color: #0000ff;">extern volatile double ServoTick;         // increments each servo interrupt</span><br /><span style="color: #0000ff;">extern volatile unsigned int LastTimer0;  // Last timer value when the ServoTick was incremented</span>
 
 
<span style="color: #0000ff;"> </span><br /><span style="color: #0000ff;">extern CHAN chan[N_CHANNELS];   // the axes channel related structures</span><br /><span style="color: #0000ff;">extern CHAN *ch0;               // global pointer to axis 0 </span><br /><span style="color: #0000ff;">extern CHAN *ch1;               // global pointer to axis 1 </span><br /><span style="color: #0000ff;">extern CHAN *ch2;               // global pointer to axis 2 </span><br /><span style="color: #0000ff;">extern CHAN *ch3;               // global pointer to axis 3 </span><br /><span style="color: #0000ff;">extern CHAN *ch4;               // global pointer to axis 4 </span><br /><span style="color: #0000ff;">extern CHAN *ch5;               // global pointer to axis 5 </span><br /><span style="color: #0000ff;">extern CHAN *ch6;               // global pointer to axis 6 </span><br /><span style="color: #0000ff;">extern CHAN *ch7;               // global pointer to axis 7</span>
 
<br /><span style="color: #0000ff;">// This status contains the majority of all status</span><br /><span style="color: #0000ff;">// so that it can be uploaded as a bulk transfer</span><br /><span style="color: #0000ff;">extern MAIN_STATUS MainStatus;</span>
 
 
<span style="color: #0000ff;">void DisableAxis(int ch); // Disable the Axis, Servo output is set to zero</span>
 
<br /><span style="color: #0000ff;">void EnableAxisDest(int ch, double Dest); // enable the Axis and set the destination</span>
 
<br /><span style="color: #0000ff;">void EnableAxis(int ch); // enable the Axis at the current encoder position</span>
 
<br /><span style="color: #0000ff;">// do this before enabling servo or when</span><br /><span style="color: #0000ff;">// filter coefficients change</span><br /><span style="color: #0000ff;">void ResetFilters(int ch); // Resets Filter history to known state</span>
 
<br /><span style="color: #0000ff;">void Zero(int ch);  // Zero the Encoder Position and Current Commanded Position</span>
 
<span style="color: #0000ff;">// Basic motion commands to move one axis</span><br /><span style="color: #0000ff;">void Move(int ch, double x);   // move using absolute coordinates</span><br /><span style="color: #0000ff;">void MoveAtVel(int chno, double x, float MaxVel);        // move using absolute coordinates and specify the velocity</span><br /><span style="color: #0000ff;">void MoveRel(int ch, double dx);    // move relative to current destination</span><br /><span style="color: #0000ff;">void MoveRelAtVel(int chno, double x, float MaxVel);        //  move relative to current destinatio and specify the velocity</span><br /><span style="color: #0000ff;">void Jog(int ch, double vel);       // move continiously at specified velocity</span><br /><span style="color: #0000ff;">void MoveExp(int chno, double x, double Tau);  // exponentially approach a target at time constant Tau</span>
 
<span style="color: #0000ff;">int CheckDone(int ch);  // returns 1 if axis is Done, 0 if not, -1 if axis is disabled</span>
 
<br /><span style="color: #0000ff;">// Basic motion commands to move 3 axes </span><br /><span style="color: #0000ff;">// </span><br /><span style="color: #0000ff;">void MoveXYZABC(double x, double y, double z, double a, double b, double c); // Moves 6 axes (each axis moves independently)</span><br /><span style="color: #0000ff;">int CheckDoneXYZABC(); // Check if all CS axis have completed , returns 1 if all complete, -1 if any is disabled, otherwise 0</span>
 
<br /><span style="color: #0000ff;">int CheckDoneBuf();   // returns 1 if Done, 0 if not, -1 if any axis in CS disabled</span><br /><span style="color: #0000ff;">int CheckDoneGather();</span><br /><span style="color: #0000ff;">void StartMove(int ch);</span>
 
<span style="color: #0000ff;">void SetupForMove(double From, double To, float MaxVel, CHAN *ch, int CoeffOffset,</span><br /><span style="color: #0000ff;">                                                  int NoJerkControlAtStart, </span><br /><span style="color: #0000ff;">                                                  int NoJerkControlAtEnd,</span><br /><span style="color: #0000ff;">                                                  int Start,</span><br /><span style="color: #0000ff;">              int *Nstates);</span><br /><span style="color: #0000ff;">                                                  </span><br /><span style="color: #0000ff;">void SetupForMotionPause(double x,CHAN *ch,int CoeffOffset, double time);  // stay still                                                  </span>
 
<span style="color: #0000ff;">// coordinate systems #0 - axis definitions</span><br /><span style="color: #0000ff;">extern int CS0_axis_x; // Axis channel number to use as x</span><br /><span style="color: #0000ff;">extern int CS0_axis_y; // Axis channel number to use as y  </span><br /><span style="color: #0000ff;">extern int CS0_axis_z; // Axis channel number to use as z  </span><br /><span style="color: #0000ff;">extern int CS0_axis_a; // Axis channel number to use as a  </span><br /><span style="color: #0000ff;">extern int CS0_axis_b; // Axis channel number to use as b  </span><br /><span style="color: #0000ff;">extern int CS0_axis_c; // Axis channel number to use as c  </span><br /><span style="color: #0000ff;">extern int CS0_axis_u; // Axis channel number to use as u  </span><br /><span style="color: #0000ff;">extern int CS0_axis_v; // Axis channel number to use as v </span>
 
<span style="color: #0000ff;">void DefineCoordSystem(int axisx, int axisy, int axisz, int axisa); // define axis chan numbers to use as x,y,z,a (set -1 to disable)</span><br /><span style="color: #0000ff;">void DefineCoordSystem6(int axisx, int axisy, int axisz, int axisa, int axisb, int axisc); // define axis chan numbers to use as x,y,z,a,b,c (set -1 to disable)</span><br /><span style="color: #0000ff;">void DefineCoordSystem8(int axisx, int axisy, int axisz, int axisa, int axisb, int axisc, int axisu, int axisv); // define axis chan numbers to use as x,y,z,a,b,c,u,v (set -1 to disable)</span>
 
<br /><span style="color: #0000ff;">// A Low Pass filter can be applied to all 8 axes of coordinated motion</span><br /><span style="color: #0000ff;">// by setting the KLP coefficient.  To compute an appropriate coefficient</span><br /><span style="color: #0000ff;">// from a time constant Tau in seconds use KLP = exp(-TIMEBASE/Tau);</span><br /><span style="color: #0000ff;"> </span><br /><span style="color: #0000ff;">extern double KLP;  // coordinated motion low pass filter coefficient</span>
 
<span style="color: #0000ff;">// TauKLP = -TIMEBASE/log(KLP);  automatically computed by ExecBuf command</span><br /><span style="color: #0000ff;">extern float TauKLP;      // "smoothing" related time constant used for End Motion</span>
 
<span style="color: #0000ff;">extern float SplineTauFactor;  // Final Spline motion to target will have a time duration of this number of TauKLP (defaults to 2)</span>
 
<br /><span style="color: #0000ff;">// Stop profile generation</span><br /><span style="color: #0000ff;">// which will stop updating (freeze) the destination </span><br /><span style="color: #0000ff;">// new commands can then be placed into the queue</span>
 
<span style="color: #0000ff;">void StopMotion(CHAN *ch);</span>
 
<span style="color: #0000ff;">// put a trajectory off into the queue </span><br /><span style="color: #0000ff;"> </span><br /><span style="color: #0000ff;">void SetupForMotionEnd(CHAN *ch, int CoeffOffset) ;</span>
 
<br /><span style="color: #0000ff;">// Digital I/O Functions </span><br /><span style="color: #0000ff;"> </span><br /><span style="color: #0000ff;">#define BIT_SET  0x100      // rel address in FPGA where bit set ports reside</span><br /><span style="color: #0000ff;">#define BIT_CLR  0x110      // rel address in FPGA where bit clear ports reside</span><br /><span style="color: #0000ff;">#define BIT_DIR  0x120      // rel address in FPGA where bit Direction ports reside</span><br /><span style="color: #0000ff;">#define BIT_READ 0x130      // rel address in FPGA where bit read ports reside</span>
 
<span style="color: #0000ff;">// Fixed I/O bit definitions</span>
 
# <span style="color: #0000ff;">define LED0 46  // KFLOP LED #0 bit number</span><br /><span style="color: #0000ff;">#define LED1 47  // KFLOP LED #1 bit number</span>
 
<br /><span style="color: #0000ff;">// Virtual I/O bits</span><br /><span style="color: #0000ff;">extern int VirtualBits;     // Virtual I/O bits simulated in memory, use SetBit/ClearBit/SetStateBit(32-63 to reference)</span>
 
<span style="color: #0000ff;">// Virtual I/O bits Extended 1024-2047</span><br /><span style="color: #0000ff;">extern int VirtualBitsEx[N_VIRTUAL_BITS_EX/32]; // 1024 Expanded Virtual Bits (1024-2047)</span>
 
<span style="color: #0000ff;">extern int BitDirShadow[2];   // direction of all 64 I/O bits</span><br /><span style="color: #0000ff;">extern int BitDirShadowSnap0;   // direction of 14 Snap Amp, 1st board, I/O bits</span><br /><span style="color: #0000ff;">extern int BitDirShadowSnap1;   // direction of 14 Snap Amp, 2nd board, I/O bits</span>
 
<span style="color: #0000ff;">void SetBitDirection(int bit, int dir); // define bit as input (0) or output (1) </span><br /><span style="color: #0000ff;">int GetBitDirection(int bit);           // returns whether bit is defined as input (0) or output (1)</span><br /><span style="color: #0000ff;">void SetBit(int bit);                   // set a bit high (bit must be defined as an output, see SetBitDirection)</span><br /><span style="color: #0000ff;">void ClearBit(int bit);                 // set a bit low (bit must be defined as an output, see SetBitDirection)</span><br /><span style="color: #0000ff;">void SetStateBit(int bit, int state);   // set a bit high or low (bit must be defined as an output, see SetBitDirection)</span><br /><span style="color: #0000ff;">int ReadBit(int bit);                   // read the state of an I/O bit</span>
 
<br /><span style="color: #0000ff;">// Non volatile Flash functions</span>
 
# <span style="color: #0000ff;">define FLASH ((volatile char *)0x90000000)  // beginning of FLASH - first 1MByte is for System Use</span><br /><span style="color: #0000ff;">#define FLASH_USER ((volatile char *)0x90100000)  // 2nd MegByte is for User use</span><br /><span style="color: #0000ff;">#define FLASH_BLOCK_SIZE (0x10000)  // FLASH erases in 64KByte Blocks </span><br /><span style="color: #0000ff;">#define IRAM  ((volatile char *)0x10000000)</span><br /><span style="color: #0000ff;">#define SDRAM ((volatile char *)0x80000000)</span><br /><span style="color: #0000ff;">int ProgramFlash(volatile char *src, int Length, volatile char *dest, char *message);  //Programs Flash source address of data, length in 16-bit words, dest add must be on 64KByte block, optional \n terminated message</span><br /><span style="color: #0000ff;">void SetFlashBank(volatile unsigned short *add);  // sets the currently addressable flash bank (address bits 14-19)</span>
 
 
<span style="color: #0000ff;">// KONNECT AUX PORT FUNCTIONS</span><br /><span style="color: #0000ff;">// </span><br /><span style="color: #0000ff;">// Example:</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// Configure KFLOP to service Konnect 32 Input 16 output IO board</span><br /><span style="color: #0000ff;">// Board address is 0, </span><br /><span style="color: #0000ff;">// 16 Outputs are mapped to Virtual IO 48-63 (VirtualBits)</span><br /><span style="color: #0000ff;">// 32 Inputs are mapped to Virtual IO 1024-1055 (VirtualBits[0])</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">//  InitAux();</span><br /><span style="color: #0000ff;">//  AddKonnect(0,&VirtualBits,VirtualBitsEx);</span><br /><span style="color: #0000ff;">//</span>
 
<span style="color: #0000ff;">void InitAux(void);  // Initialize the AUX Port KFLOP JP4 or JP6 and clear list of board to be serviced (only one Aux Port may be used at a time)</span>
 
<span style="color: #0000ff;">// Board address, address of 32-bit into to get the Output Bits (in low 16 bits), address of where to put 32 Inputs</span><br /><span style="color: #0000ff;">void AddKonnect(int BoardAddress, int *OutputAddress, int *InputAddress);  // add a Konnect Board to list of AUX1 Port Boards to be serviced</span>
 
<span style="color: #0000ff;">// Board address, address of 32-bit into to get the Output Bits (in low 16 bits), address of where to put 32 Inputs</span><br /><span style="color: #0000ff;">void AddKonnect_Aux0(int BoardAddress, int *OutputAddress, int *InputAddress); // add a Konnect Board to list of AUX0 Port Boards to be serviced</span>
 
<br /><span style="color: #0000ff;">                                </span><br /><span style="color: #0000ff;">// User Print Routines</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// sends a string to the user console of the KMotion</span><br /><span style="color: #0000ff;">// application.  Because other threads may be sending</span><br /><span style="color: #0000ff;">// characters, the strings are buffered in a queue</span><br /><span style="color: #0000ff;">// and sent by the primary thread as soon as there</span><br /><span style="color: #0000ff;">// is no PC input to process.  The string prepends </span><br /><span style="color: #0000ff;">// an escape so the PC application knows for sure</span><br /><span style="color: #0000ff;">// to send this to the Console window and not to </span><br /><span style="color: #0000ff;">// process it as a response to a command that may</span><br /><span style="color: #0000ff;">// be in the pipeline.</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">//</span><br /><span style="color: #0000ff;">// normally the routine exits to the caller quickly</span><br /><span style="color: #0000ff;">// unless the queue is full, then it must wait</span>
 
# <span style="color: #0000ff;">define MAX_STRING 128                    </span><br /><span style="color: #0000ff;">#define MAX_NSTRINGS 256  // must be binary   </span>
 
<span style="color: #0000ff;">// Note: standard C language printf</span>
 
<span style="color: #0000ff;">int printf(const char *format, ...);       // Print formatted string to console</span><br /><span style="color: #0000ff;">int sprintf(char *s, const char *format, ...);  // Print formatted string to string</span>
 
<span style="color: #0000ff;">typedef int FILE;</span><br /><span style="color: #0000ff;">FILE *fopen(const char*, const char*);     // Open a text file for writing on the PC (2nd param = "rt" or "wt") </span><br /><span style="color: #0000ff;">int fprintf(FILE *f, const char * format, ...);     // Print formatted string to the PC's Disk File</span><br /><span style="color: #0000ff;">int fclose(FILE *f);                           // Close the disk file on the PC</span>
 
<span style="color: #0000ff;">int Print(char *s);                        // Print a string to the console window</span><br /><span style="color: #0000ff;">int PrintFloat(char *Format, double v);    // Print a double using printf format, ex "%8.3f\n"</span><br /><span style="color: #0000ff;">int PrintInt(char *Format, int v);         // Print an integer using printf format, ex "result=%4d\n"</span><br /><span style="color: #0000ff;">                                </span><br /><span style="color: #0000ff;">int sscanf(const char *_str, const char *_fmt, ...); //scan string and convert to values</span>
 
# <span style="color: #0000ff;">define MAX_READ_DISK_LENGTH 1024 // max allowed length of disk file line length</span><br /><span style="color: #0000ff;">extern volatile int read_disk_buffer_status; //status of read disk buffer 1=line available, 2=error, 3=eof </span><br /><span style="color: #0000ff;">extern char read_disk_buffer[MAX_READ_DISK_LENGTH+1];</span><br /><span style="color: #0000ff;">char *fgets(char *str, int n, FILE *file); //read string from PC disk file, str=buffer, n=buffer length, f=FILE pointer, returns NULL on error</span><br /><span style="color: #0000ff;">int fscanf(FILE *f, const char *format, ...); //read sting from PC Disk file, convert values, returns number of items converted</span><br /><span style="color: #0000ff;">int feof(FILE *f);   // End of file status for disk reading</span>
 
<span style="color: #0000ff;">/*</span><br /><span style="color: #0000ff;"> * MessageBox() Flags thes can be passed to the PC to invoke MessageBoxes</span><br /><span style="color: #0000ff;"> *              for some applications such as KMotionCNC which monitor upload</span><br /><span style="color: #0000ff;"> *              status and present message boxes when requested.  See the pc-dsp.h</span><br /><span style="color: #0000ff;"> *              header for more information</span><br /><span style="color: #0000ff;"> */</span><br /><span style="color: #0000ff;">#define MB_OK                       0x00000000L</span><br /><span style="color: #0000ff;">#define MB_OKCANCEL                 0x00000001L</span><br /><span style="color: #0000ff;">#define MB_ABORTRETRYIGNORE         0x00000002L</span><br /><span style="color: #0000ff;">#define MB_YESNOCANCEL              0x00000003L</span><br /><span style="color: #0000ff;">#define MB_YESNO                    0x00000004L</span><br /><span style="color: #0000ff;">#define MB_RETRYCANCEL              0x00000005L</span><br /><span style="color: #0000ff;">#define MB_CANCELTRYCONTINUE        0x00000006L</span><br /><span style="color: #0000ff;">#define MB_ICONHAND                 0x00000010L</span><br /><span style="color: #0000ff;">#define MB_ICONQUESTION             0x00000020L</span><br /><span style="color: #0000ff;">#define MB_ICONEXCLAMATION          0x00000030L</span><br /><span style="color: #0000ff;">#define MB_ICONASTERISK             0x00000040L</span><br /><span style="color: #0000ff;">#define MB_APPLMODAL                0x00000000L</span><br /><span style="color: #0000ff;">#define MB_SYSTEMMODAL              0x00001000L</span><br /><span style="color: #0000ff;">#define MB_TASKMODAL                0x00002000L</span><br /><span style="color: #0000ff;">#define MB_NOFOCUS                  0x00008000L</span><br /><span style="color: #0000ff;">#define MB_SETFOREGROUND            0x00010000L</span><br /><span style="color: #0000ff;">#define MB_DEFAULT_DESKTOP_ONLY     0x00020000L</span><br /><span style="color: #0000ff;">#define MB_TOPMOST                  0x00040000L</span><br /><span style="color: #0000ff;">#define MB_RIGHT                    0x00080000L</span>
 
<span style="color: #0000ff;">/*</span><br /><span style="color: #0000ff;"> * Dialog Box Command IDs</span><br /><span style="color: #0000ff;"> */</span><br /><span style="color: #0000ff;">#define IDOK                1</span><br /><span style="color: #0000ff;">#define IDCANCEL            2</span><br /><span style="color: #0000ff;">#define IDABORT             3</span><br /><span style="color: #0000ff;">#define IDRETRY             4</span><br /><span style="color: #0000ff;">#define IDIGNORE            5</span><br /><span style="color: #0000ff;">#define IDYES               6</span><br /><span style="color: #0000ff;">#define IDNO                7</span>
 
 
<span style="color: #0000ff;">// Misc routines</span>
 
<span style="color: #0000ff;">void DoResolverInput2(CHAN *chx, float x, float y);  // optimized routine to handle sin/cosine resolver input</span>
 
<span style="color: #0000ff;">extern double ResolverFactor; // defaults to 1000.0/TWO_PI converts sine/cosine angle to reported Position</span>
 
<br /><span style="color: #0000ff;">// M U L T I - T H R E A D   S U P P O R T</span>
 
<span style="color: #0000ff;">// user threads are numbered 1 .. n</span>
 
<span style="color: #0000ff;">void StartThread(int thread);  // starts a downloaded program at it's entry point</span><br /><span style="color: #0000ff;">void PauseThread(int thread);  // stops a thread from executing</span><br /><span style="color: #0000ff;">int ResumeThread(int thread);  // resumes a tread after a pause </span><br /><span style="color: #0000ff;">void ThreadDone(void);         // call to terminate current thread</span><br /><span style="color: #0000ff;">extern int CurrentThread;      // current thread that is/was executing  0 = Pri 1-7 = User Threads</span>
 
 
<span style="color: #0000ff;">// A User Program Call Back can be defined to be called every Servo Sample</span><br /><span style="color: #0000ff;">// Set to Non-NULL for the the Callback to be made.  The Callback Routine</span><br /><span style="color: #0000ff;">// must return with a few micro seconds or the system may become unstable</span><br /><span style="color: #0000ff;">typedef void USERCALLBACK(void);</span><br /><span style="color: #0000ff;">extern USERCALLBACK *UserCallBack;</span>
 
<br /><span style="color: #0000ff;">// used to allow mutual exclusive access to a resource</span><br /><span style="color: #0000ff;">// (waits until resource is available, then locks it)</span><br /><span style="color: #0000ff;">// if the thread that locked it is no longer active,</span><br /><span style="color: #0000ff;">// release the lock</span>
 
<span style="color: #0000ff;">void MutexLock(int *mutex);</span><br /><span style="color: #0000ff;">void MutexUnlock(int *mutex);</span>
 
<span style="color: #0000ff;">// These routines are written in assembly such that</span><br /><span style="color: #0000ff;">// they are atomic and are un-interruptible by using</span><br /><span style="color: #0000ff;">// instructions in delayed branching</span>
 
<span style="color: #0000ff;">void AtomicSet(int *p, int mask);</span><br /><span style="color: #0000ff;">//{</span><br /><span style="color: #0000ff;">// *p = *p | mask;</span><br /><span style="color: #0000ff;">//}</span>
 
<span style="color: #0000ff;">void AtomicClear(int *p, int mask);</span><br /><span style="color: #0000ff;">//{</span><br /><span style="color: #0000ff;">// *p = *p & mask;</span><br /><span style="color: #0000ff;">//}</span>
 
<span style="color: #0000ff;">// test a location and if zero, set</span><br /><span style="color: #0000ff;">// to value.  returns the original</span><br /><span style="color: #0000ff;">// value.  routine is atomic</span>
 
<span style="color: #0000ff;">int TestAndSet(int *mutex, int value);</span><br /><span style="color: #0000ff;">//{</span><br /><span style="color: #0000ff;">// register result = *mutex;</span><br /><span style="color: #0000ff;">// if (result==0) *mutex=value;</span><br /><span style="color: #0000ff;">// return result;</span><br /><span style="color: #0000ff;">//}</span>
 
<br /><span style="color: #0000ff;">// S N A P   A M P   D E F I N I T I O N S</span>
 
# <span style="color: #0000ff;">define KM_SNAP_READ_LOW 0xc</span><br /><span style="color: #0000ff;">#define KM_SNAP_READ_HI  0xd</span><br /><span style="color: #0000ff;">#define KM_SNAP_READ_EXCEPTION 0x10</span><br /><span style="color: #0000ff;">#define KM_SNAP_CLK_ENA 0x09</span><br /><span style="color: #0000ff;">#define KM_SNAP_SHIFT_BYTE 0x0a</span><br /><span style="color: #0000ff;">#define KM_SNAP_WRITE_HIGH_TRIG 0x0b</span><br /><span style="color: #0000ff;">#define KM_SNAP_READ_ADD_TRIG 0x0c</span><br /><span style="color: #0000ff;">#define KM_SNAP_READ_ADD_BITMAP 0x28</span><br /><span style="color: #0000ff;">// FPGA Registers</span>
 
# <span style="color: #0000ff;">define SNAP0 0x40  // Base Addresse SNAP AMP #0 </span><br /><span style="color: #0000ff;">#define SNAP1 0x60  // Base Addresse SNAP AMP #1 </span>
 
<span style="color: #0000ff;">// write addresses</span>
 
# <span style="color: #0000ff;">define SNAP_PWMS 0      // (4) 16 bit PWMs </span><br /><span style="color: #0000ff;">#define SNAP_CLR_ENC_ERRS 8   // any write clears all encoder errors</span><br /><span style="color: #0000ff;">#define SNAP_CUR_LOOP_GAINS 9  // (4) 8 bit Current Loop Gains Default=16</span><br /><span style="color: #0000ff;">#define SNAP_SET_BIT 17    // (14) GPIO bits</span><br /><span style="color: #0000ff;">#define SNAP_CLR_BIT 18    // (14) GPIO bits</span><br /><span style="color: #0000ff;">#define SNAP_DIR_BIT 19    // (14) GPIO bits</span><br /><span style="color: #0000ff;">#define SNAP_SUPPLY_CLAMP0 20  // 16 bit power supply clamp setting side A</span><br /><span style="color: #0000ff;">#define SNAP_SUPPLY_CLAMP_ENA0 21 // 1 bit power supply clamp enable side A</span><br /><span style="color: #0000ff;">#define SNAP_SUPPLY_CLAMP1 22  // 16 bit power supply clamp setting side B</span><br /><span style="color: #0000ff;">#define SNAP_SUPPLY_CLAMP_ENA1 23 // 1 bit power supply clamp enable side B</span><br /><span style="color: #0000ff;">#define SNAP_PEAK_CUR_LIMIT0 24  // 4 bits peak current limit side A</span><br /><span style="color: #0000ff;">#define SNAP_PEAK_CUR_LIMIT1 25  // 4 bits peak current limit side B</span>
 
<span style="color: #0000ff;">// read addresses</span>
 
# <span style="color: #0000ff;">define SNAP_PWMS 0      // (4) 16 bit PWMs </span><br /><span style="color: #0000ff;">#define SNAP_ENC 8       // (4) 16 bit Encoders (bit15=error 7-0=data) </span><br /><span style="color: #0000ff;">#define SNAP_CURRENT_A0 12   // Measured Current Side A Lead A (14bits)</span><br /><span style="color: #0000ff;">#define SNAP_CURRENT_C0 13   // Measured Current Side A Lead C</span><br /><span style="color: #0000ff;">#define SNAP_CURRENT_A1 14   // Measured Current Side B Lead A</span><br /><span style="color: #0000ff;">#define SNAP_CURRENT_C1 15   // Measured Current Side B Lead C</span><br /><span style="color: #0000ff;">#define SNAP_DIFF_IN 16     // 16 bits (15-8= Diff inputs 7-0=encoder inputs) </span><br /><span style="color: #0000ff;">#define SNAP_IN_BIT 17    // (14) GPIO bits</span><br /><span style="color: #0000ff;">#define SNAP_SUPPLY_VOLT0 22  // Measured Supply Voltage Side A</span><br /><span style="color: #0000ff;">#define SNAP_SUPPLY_VOLT1 23  // Measured Supply Voltage Side B</span><br /><span style="color: #0000ff;">#define SNAP_TEMP0 24    // Measured Temperature Side A</span><br /><span style="color: #0000ff;">#define SNAP_TEMP1 25    // Measured Temperature Side B</span><br /><span style="color: #0000ff;">#define SNAP_STATUS 30    // Status (FAN,OverTemp1,OverTemp0,OVER_CUR1,OVER_CUR0,Fault)</span><br /><span style="color: #0000ff;">#define SNAP_RESET 31    // Reset</span>
 
<span style="color: #0000ff;">//RS232 FPGA Register Definitions</span>
 
# <span style="color: #0000ff;">define RS232_STATUS 0xc1  // Status Reg Address</span><br /><span style="color: #0000ff;">#define RS232_DATA 0xc0   // 8 bit data read/write reg address</span><br /><span style="color: #0000ff;">#define RS232_DATA_READY 0x01 // Data ready to read status mask</span><br /><span style="color: #0000ff;">#define RS232_TRANSMIT_FULL 0x02// Transmit buffer full status mask</span>
 
# <span style="color: #0000ff;">define RS232_BAUD_REG 0xc1 // Set Baud rate 8-bit divisor Reg Address </span><br /><span style="color: #0000ff;">#define RS232_BAUD_115200  ((16666666/115200/16)-1)// 8-bit divisor value to set 115200 baud</span><br /><span style="color: #0000ff;">#define RS232_BAUD_57600  ((16666666/57600/16)-1) // 8-bit divisor value to set  57600 baud</span><br /><span style="color: #0000ff;">#define RS232_BAUD_38400  ((16666666/38400/16)-1) // 8-bit divisor value to set  38400 baud</span><br /><span style="color: #0000ff;">#define RS232_BAUD_19200  ((16666666/19200/16)-1) // 8-bit divisor value to set  19200 baud</span><br /><span style="color: #0000ff;">#define RS232_BAUD_9600  ((16666666/9600/16)-1) // 8-bit divisor value to set   9600 baud</span><br /><span style="color: #0000ff;">#define RS232_BAUD_4800  ((16666666/4800/16)-1) // 8-bit divisor value to set   4800 baud</span>
 
<span style="color: #0000ff;">void InitRS232(int baud);</span><br /><span style="color: #0000ff;">void EnableRS232Cmds(int baud);</span>
 
<span style="color: #0000ff;">extern char * volatile pRS232RecIn;  // Buffered Receive Pointer Head</span><br /><span style="color: #0000ff;">extern char *pRS232RecOut;           // Buffered Receive Pointer Tail</span><br /><span style="color: #0000ff;">extern char *pRS232TxIn;             // Buffered Transmit Pointer Head</span><br /><span style="color: #0000ff;">extern char * volatile pRS232TxOut;  // Buffered Transmit Pointer Tail</span><br /><span style="color: #0000ff;">extern int DoRS232Cmds;              // Enables/disables KFLOP Command processor to/from RS232</span>
 
<span style="color: #0000ff;">char RS232_GetChar(void);   // Get Internally Buffered (1000 chars) RS232 received Data </span><br /><span style="color: #0000ff;">void RS232_PutChar(char c); // Put Internally Buffered (1000 chars) RS232 transmit Data</span>
 
 
 
# <span style="color: #0000ff;">endif</span>
11
edits