MFX-ETH Firmware Revision History
Copyright 2002-2008 Precision MicroControl Corp.
All Rights Reserved

CONFIDENTIAL AND PROPRIETARY:
This file contains confidential and proprietary information that is the sole
property of Precision MicroControl Corp. This confidential information is
not to be copied, disclosed or reproduced in whole or in part by any means
(including photocopying or storage in an information storage/retrieval
system) or transmitted in any form or by any means except as authorized by
written contract with Precision MicroControl Corp. 


Baseline PM1 Rev. 4.5a
===============================================================================
 4/1/07    Imported MFXPCI code base 
           
           
Changes for Rev. 4.6a
===============================================================================
05/27/07   Added new parameter to Input Mode (IM) command to allow changing default
	   polarity of home sensor input edge detection during execution of 
	   Latch Edge (LE) controller command.  Default was rising edge for 
	   normally-open switches.  Asserting bit 4 (i.e. IM(16)) in the mode 
	   register has the effect of changing the polarity to falling edge for
	   normally-closed switches.

11/15/07   Added support for MFX-ETH1442 version of the controller. This is a
           4 axis PWM servo, 4 axis stepper controller. Axes 1 thru 4 are configured
           as servos, 5 thru 8 are configured as steppers.  The distinction to 
           this board is the distribution of axes on each connector:
           
           	J1:	Axis 7
           	J2:	Axis 8
           	J3:	Axes 1 2 5
           	J4:	Axes 3 4 6
           	
	   This architecture was proposed by David who noticed that a 1440-type
	   board could be created from lower-cost 1040-1 hardware by using the
	   stepper encoder inputs for the servo axes.  In addition, the
	   customer can have 6 axes on only two connectors in this configuration.


Changes for Rev. 4.6b
===============================================================================
01/08/08   Added support for hardware high-speed strobe function for MFX-ETH1440
           version of the controller. This feature extends the capability of the 
           compare circuit by providing a new OC mode 5 that produces a set of strobe
           pulses starting at the axis compare position.  Rather than a firmware-
           mediated set of pulses, the fpga now produces a train of strobe pulses
           at regular encoder count intervals.  
           
           The MCConfigureCompare() and MCEnableCompare() functions, as well
           as the corresponding MCCL calls were expanded to support the
           additional fpga registers required for this function.  The following
           sequence of commands illustrates the revision:
           
           1OC5       // set output compare mode to 5 for hardware strobe function
	   1LC1000    // set compare start position to 1000 counts
	   1NC400     // set PW = 10 uS (25E-9 * 400)
	   1OP10      // set strobe period to 10 encoder counts
	   1BC100     // start compare and issue 100 strobe pulses
           
01/15/08   Embedded Web server configuration support was expanded from network 
	   configuration only to add the following functions:
		
		- firmware upgrade (alternative to flash wizard)
		- board reconfiguration (alternative to pcdiag)
		
	   Now, all non-volatile user configuration data and applications can
	   be modified via the web server.
		
02/02/08   Added support for non-volatile macros.  Now, all macros (0 - 1999)
	   can be either ram-based or flash-based.  Macro 0 still has no special
	   significance and the stand-alone MC0 function will be added after the
	   next revision of PCB when external switch inputs will be provided to
	   override the feature.
	   
02/10/08   Implemented jog mode (per DCX-PCI model).  A resistive joystick can
	   now be connected to any one of the ADC inputs and used as a jog mode 
	   controller.  The MCJOG data structure and MCCL calls were maintained
	   for compatability.  One new function had to be added to specify which
	   ADC port is connected to the joystick controlling the axis.
	   
	   	aJCn 	JoystickChannel	(a = axis; n = ADC channel)
	   
02/15/08  Support was added to MFX-ETH1040 board type for high-speed strobe
          compare outputs.  This feature requires a 1040-1 type controller
          since encoders are required for this circuit.          
          
04/01/08   Modifications to strobe circuit
		- function will only exist on 1040 and 1440 stepper axes
		- logic modified to drive strobe circuit from encoder inputs
		  only, for both open and closed loop  modes
		  		          
Changes for Rev. 4.7a
===============================================================================
09/08/08   Initial release of code for 70.461.A production hardware	

09/12/08   Added support for Macro 0 call.  This feature can be disabled by
	   means of dip switch(5) on the PCB to insure against fatal errors coded
	   into flash-based macros.
	   

09/16/08   Added support for adjustment of digital potentiometers for servo
	   DACs.  These are X9252 256-tap U/D control pots that are driven by 
	   state machine in fpga using the SO (cmd 300) MCCL call
	   
	   	aSOn 	(a = axis n = signed up/down count)
	   	
09/20/08   Added support for 4MB flash and separated fpga images from RTMES load 
	   image by creating static pointers in PMON to fixed offsets.  This was 
	   necessary to support the larger Spartan 3E 500 images and to allow a 
	   reasoanble RTEMS FTP file size for firmware upgrades.
	   
9/25/08	   Revised DAC logic to allow for continuous data writes to all eight
	   devices with a free-running state machine in the fpga.  There is
	   a 2-stage latch that allows asynchronous command values from the 
	   o/s while the current value is written.  Effective update rate is
	   around 50 kHz (all channels)
	   
                   
Changes for Rev. 4.7b
===============================================================================
10/08/08   Initial release of code for 70.600.A production hardware		                      

10/08/08   Re-mapped auxilliary fpga I/O to support 3-bit personality field 
	   from interconnect boards and added dedicated 4-wire SPI interface 
	   to support port expander on ICN-125 board and other devices.
	   
10/12/08   Created fpga and embedded support for 8-axis 1840 board type

11/02/08   Added variable loop-rate in motor service ISR.  New MCCL commands
	   added to support following highspeedlooprate values
	   
	   	YL	4 kHz	(default)
	   	YM	8 kHz
	   	YH     16 kHz
	   	
	   This feature was the first necessary step in developing the KLOE 
	   application.

11/15/08   Added strobe support for all axis types on all board architectures.	   
	   
11/20/08   Completed prototype testing of direct sine commutation for 1440 and
	   1840 board types. Expanded OM command to support this feature, as follows:
	   
	   	OM0x8000	commutation mode (offset angle = 0)
	   	OM0xC000	commutation mode (offset angle from encoder)
	   	OM0xA000	reset commutation logic
	   	
	   The existing MCCL for older implementations of sine commutation were
	   carried through with some simplfication since the FPGA now calculates 
	   prescale and repeat counts based on a single encoder resolution 
	   description using the LR command (see tech notes)
	   
12/08/08   Modified IORST mechanism in CPLD, boot rom and application to insure
	   that reset is held active until after the fpga is loaded.  The only
	   impact on the application is that IORST has to be released through a
	   memory-mapped register write to the CPLD.
	   
12/18/08   Added support for autonomous motor data broadcasts (for Gerber Innovations).
	   This consists of network layer (IP) broadcasts to the default host that
	   contains a sparse payload of motor data for every axis that has enabled
	   broadcasts using a new BroadcastInterval MCCL command
	   
	   	aBIn	(n = 0 disable   n = 1 enable)
	   	
	   The data payload now consists of DAC command value, position, error 
	   and other motor table entities and will probably evolve over time.
	   
01/08/09   Added support for the 1848 board architecture.  The FPGA now contains logic
	   that constantly writes to the 4 open-collector driver ports and reads the 
	   state of the 16 opto-input ports and stores the value in a memory-mapped register.
	   The embedded code was modified to map the AmpEn open-collector ouput and AmpFault,
	   CoarseHome and +/- Limits opto inputs for axes 9-12 to the offboard port expander
	   on the ICN-125 board.  New configuration files have been generated for the 1848
	   that specify the offboard input channels as 65-80 and output channels as 81-96.
	   A pair of new motor table variables were created to specify the location and register
	   offsets of the input and output ports.
	   
	   
Changes for Rev. 4.7c
===============================================================================	   
01/23/09   Provided modifications to ascii command processor to eliminate latencies
	   associated with excessive packets and acknowledges.  The reply file flush
	   operations are sprinkled throughout the embedded code, making it difficult
	   to implement a common return point enhancement to reply data processing.  This
	   version of firmware has been changed to suppress the file flush that occurred
	   inside the command execution processor and replacing it with a file rewind and
	   flush when control passes back to the telnet server process.  This seems to 
	   have the effect of always having the prompt character bundled with the previous
	   response, reducing TCP packets and the resulting ACK latencies that have been observed.


02/09/09   Implemented digital control panel on web server.  This will provide an API-independent
	   configuration utility for support of 12 axes as well as the additional axis I/O
	   located on the ICN-125 board
	   
	   
Changes for Rev. 4.8a
===============================================================================	   
02/13/09   Resolved inconsistencies in all FPGA designs and produced new board type.
	   The MFX_ETH 1800 is an 8 servo axis variety with axes numbered 1-8, unlike 
	   the 1840.  It has no stepper axes, allowing for any combination of up to
	   8 analog servo/PWM axes and 4 sine-commutated axes.  It assumes the use
	   of an ICN-125 board to allow consistency of the amp enable pins on all
	   8 dsub connectors.
	   
	   All of the FPGA work called for a roll of the revision number to 4.8.
	   For this and all subsequent releases of the embedded system, the FPGA
	   revision number (e.g. 4.8) will match the major revision number of 
	   the RTEMS release (e.g. 4.8a). 
	   
	   
02/17/09   The FPGA designs that support ICN-125 interconnect boards have been
	   merged for each controller type such that a single FPGA image supports
	   both ICN-120 and ICN-125 boards.  The init() routine will now sense and
	   report the attached ICN board but will not do sanity checking on the
	   configuration data file (i.e. a config file that specifies off-board
	   axis I/O can be installed and run with an ICN-120 board attached). 
	   
	   An entirely new set of configuration data files (as well as exhaustive
	   instructions on the web server to guide the proper selection) has been
	   developed to support this unified approach to the logic.  The format of
	   the config files is as follows:
	   
	   mfxeth1440_3_120		ICN-120 board
	   mfxeth1440_3_125		ICN-125 board
	   
	   etc...
	    
02/18/09   A final board type (1400) was added to fill out the full range of axis
	   counts and types.  The full range of available MFX-ETH board types and
	   the associated interconnect board options are:
	   
	   1040-0	(ICN-120)		4 steppers
	   1040-1	(ICN-120)
	   1040-2	(ICN-120)
	   1040-3	(ICN-120)
   	   
   	   1400-0	(ICN-120)		4 servos
   	   1400-2	(ICN-120)		4 servos
   	   
   	   1440-0	(ICN-120/ICN-125)	4 steppers/4 servos
   	   1440-1	(ICN-120/ICN-125)	4 steppers/4 servos
   	   1440-2	(ICN-120/ICN-125)	4 steppers/4 servos
   	   1440-3	(ICN-120/ICN-125)	4 steppers/4 servos

   	   1800-0	(ICN-120/ICN-125)	8 servos
   	   1800-2	(ICN-120/ICN-125)	8 servos

   	   1840-0	(ICN-120/ICN-125)	4 steppers/8 servos
   	   1840-2	(ICN-120/ICN-125)	4 steppers/8 servos

	   There is now distinct FPGAs and configuration files available for 
	   each of these architectures.  The 1448 and 1848 are deprecated.
	   
02/20/09   Added configuration filename string to MFX_FIRMWARE_CONFIG structure	   
	   (mfxconfig.h) to allow reporting of this data through the web browser
	   configuration utility panel
	   
03/06/09   Added additional parameter to IM command to allow selecting alternate
	   home input source for stepper axes that are shared with servo axes on 
	   1440 and 1840 board types.
	   
	   aIM(0x40) causes the selected axis to select the alternate home sensor input
	   port based on the following mapping:
	   
	   	axis		alternate home input
	   	
	   	  5		  Digital In 3	(DI[2])
	   	  6		  Digital In 4	(DI[3])
	   	  7		  Digital In 11	(DI[10])
	   	  8		  Digital In 12	(DI[11])
	   	  
	   This allows the JEOL ICN-190 board to perform homing of stepper axes 5 and 6
	   using the LE command since their stepper axis home opto inputs are mapped as
	   shown on the interconnect board.
	   	  
Changes for Version PM1 Rev. 4.9a
===============================================================================	   
12/31/09   Added support for MFX-ETH 1080 architecture.  This is an 8 pulse
           axis controller that requires the use of the ICN-126 interconnect board
           to provide the additional open-collector outputs and additional
           dedicated opto-isolated inputs as on the ICN-125.
   
   	   The final list of available configurations for the MFX-ETH are:
   	   
	   1040-0	(ICN-120)		4 steppers
	   1040-1	(ICN-120)
	   1040-2	(ICN-120)
	   1040-3	(ICN-120)
   	   
   	   1400-0	(ICN-120)		4 servos
   	   1400-2	(ICN-120)		
   	   
   	   1440-0	(ICN-120/ICN-125)	4 steppers/4 servos
   	   1440-1	(ICN-120/ICN-125)	
   	   1440-2	(ICN-120/ICN-125)	
   	   1440-3	(ICN-120/ICN-125)	
   	   
   	   1080-0	(ICN-126)		8 steppers
   	   1080-1	(ICN-126)		8 steppers
   	   1080-2	(ICN-126)		8 steppers
   	   1080-3	(ICN-126)		8 steppers
   	   
   	   1800-0	(ICN-120/ICN-125)	8 servos
   	   1800-2	(ICN-120/ICN-125)	

   	   1840-0	(ICN-120/ICN-125)	4 steppers/8 servos
   	   1840-2	(ICN-120/ICN-125)	  	   
   	   
   
   
01/19/10   Added workaround support for CNC functions.  LOF command does not
           work correctly since earlier bus controllers expected file stream on
           STDIN (RS-232 port on MFX-ETH).  Since the Telnet socket task is the
           main ASCII command interface for API functions, the file stream does not
           open.  The workaround was to create a /home/user in the rootfs to allow
           the user to directly transfer configuration and part files via FTP.  This
           appears to work properly but will create code compatibility for users
           migrating from older platforms.
           
02/02/10   Corrected problem in background task execution that was revealed by
           G-code part file containing an M-code instruction which was not being
           executed in foreground, as expected.  The macro call did not occur until
           completion of the part file.  The revisions consisted of changing the task
           creation calls for the binary and ascii command interfaces from pre-empting
           to time slice and to setting both priorities to COMMAND_INTERFACE_TASK.  The
           fact that the command executor was called by a pre-empting thread prevented 
           the inline execution of the macro pointed to by the GT instruction since that
           task was a lower-priority time-slice background task.
           
           Also resolved a bug from 4.7c where the change to avoid the response file
           flush in cmdexe() also had the unwanted effect of suppressing calls to
           the escape() function.
           
02/11/10   Added functionality to allow transfer and execution of large MCCL configuration
           files via FTP rather than Telnet.  The change consists of resurrecting the EC
           (execute command) function that had been deprecated.  With a few modifications
           to allow string literal filenames, the function opens the command file that has
           been FTP'd to /home/user, parses each line and passes them to the ASCII command
           interpreter.  The command syntax is
           
           			EC"<fname.mccl>"
           			
           Based upon the changes to the mechanism for transfering data files, the following 
           functions will be deprecated
           
           	LO	load file
           	LOF	load config file
           	RUE	run part file enable
           	RCE	run config file enable
           	RWE	run work file enable
           	RTE	run tool file enable
       
03/09/10   Testing of the ICN-125 board on 09/03/09 revealed a failure of the SPI interface.  The new 
	   logic has been built on ISE 10.1 and the variation of place and route revealed a flaw on the
	   SPI clock output.  It was a combinatorial term and a small glitch was seen following the 
	   16th clock pulse - enough for the port expander to detect.  The fix was to register the
	   SPI CLK and SPI DIN outputs.  Also, the DCM divisor was changed to 8, resulting in a change
	   in the SPI clock frequency to 2 MHz from the previous 4 MHz, to reduce power and noise.
           
03/23/10   Added function to allow direct query of all G-code system variables.  New extended command
           mnemonic is GetCncVariable (function # 408)
           
           	GCVn	n = variable number	(returns double in accumulator)
           	
04/01/10   Added developer command to allow direct writes to DAC by channel - not by axis number.
           This was done to simplify the production test macros that are used to measure the 
           outputs of 8 analog channel controllers.
           
           Command mnemonic is WritedaC (WC = function 166). It takes an axis number 1-8 but
           ignores the error checking of the system and maps the axis to the DAC channel, 
           regardless of board type.  The function wc() is in misccmd.c
           
06/22/10   Added capability to set default power-on PID loop rate from dip switch.  Code
           was added to init.c to test the state of dip_sw(5) and set the loop rate divisor
           as follows
           
           	sw(5)		divisor 	PID rate
           	
           	off		   4		  4 kHz
           	on		   1  		 16 kHz
           	
           The rates can still be set by command line with YL, YM, YH.
           	           
           	
Changes for Version NM1 Rev. 4.9a
===============================================================================	   
06/20/10   Added support NanoMotion piezo motor modfications.  This includes the following elements
           in the PID loop:
           
           1. An integrator preload value for positive and negative position moves can be programmed
              that result in a one cycle command voltage output which is intended to overcome the
              piezo motor stiction.
              
           2. A position dead band zone max and min can be programmed that has the effect of setting the
              command voltage to zero when the current position is within the minimum deadband of target
              at the end of a position move.  When at target, the position is monitored for exit from the
              maximum deadband and if this occurs, 1/2 the integrator preload is applied and the PID 
              is re-enabled to pull the motor back in.
              
           3. A velocity feedforward dead band zone can be programmed that has the effect of removing
              the VFF term defined by
              
              		VFF = d/dt (POSopt * Kd)
              		
              whenever the position is within the dead band count of the target.
           
           
           To support these changes, the following commands, motor variables and status bits were
           created:

	   1. Added command parameter to OM command to place axis in Piezo mode and set 
	      state of outctrl status bit: 
	   
	   	OM(4)	Set Piezo mode	(mtr->outctrl |= PIEZOMODE)
	   				(#define PIEZOMODE 0x800)
	   				
	   2. Added ID(12) parameter to show status of all piezo mode settings
	   
	   3. Added commands to set integrator preload value (in units of volts)
	   
	   	aIZn	set axis a positive integrator preload to n	mtr->intseedp
	   	(function 301)
	   		
	   	aIYn	set axis negative integrator preload to n	mtr->intseedn
	   	(function 302)
	   		
     	   4. Added commands to set dead band zone minimum and maximum (units of counts)
     	   
     	   	aYYn	set axis a dead band zone maximum to n		mtr->dzmax
     	   	(function 303)
     	   		
     	   	aYZn	set axis a dead band zone minimum to n		mtr->dzmin
     	   	(function 304)
     	   		
     	   5. Added command to set VFF position dead band (units of counts)
     	   
     	   	aYXn	set axis a VFF dead band zone to n		mtr->vfflim
     	   	(function 305)
     	   		
06/22/10   Added capability to set default power-on PID loop rate from dip switch.  Code
           was added to init.c to test the state of dip_sw(5) and set the loop rate divisor
           as follows
           
           	sw(5)		divisor 	PID rate
           	
           	off		   4		  4 kHz
           	on		   1  		 16 kHz
           	
           The rates can still be set by command line with YL, YM, YH.     	   		
     	   		
07/26/10   Problem was reported on pulse axes in s-curve profile mode where axis
           was stalling one count short of target without assertion of At Target
           and Trajectory Complete.  The PID code was modified to remove the one
           count pulse axis deadband for open-loop steppers in s-curve mode only
           to resolve the problem.
           
07/28/10   Modified logic in micwcc.v to address problem in gantry mode on pulse axes.
           The slave axis pulse count was found to be incorrect in almost all position moves.
           This was traced to the lack of implementation of the breakpoint latch, relying
           instead on position error and velocity to terminate the move.  The fix involved
           adding muxes to all stepper interfaces that allowed the slave axis step and
           direction outputs to be identical to those of the master axis.  The SM command
           was modified to write a 2-bit mux select to a new fpga register in the slave axis
           which switches in the signals from the master axis.
           
08/31/10   Modified hardware configuration file open function to relax restrictions on 
	   filenames of config files that are FTP'd to controller.  Now, the following
	   filenames are all acceptable:
           
           	mfxeth_1040.hex, mfx_eth_1040_0_120.hex, mfx_eth_1040_1_120.hex, ... etc.
           	
           Also, removed instructions on web server that indicated the necessity to strip
           the trailing numeric fields (_0_120,... etc) during FTP transfer.

09/08/10   Corrected a bug discovered in the WA command when executed in a background task.
           With the interrupt rate changed to 16 kHz, the system call to RTEMS sleep function
           was not scaling correctly and produced waits of 1/4 the expected time.  This was
           fixed in misccmd.c
                      
Changes for Version NM1 Rev. 4.9b
===============================================================================	   
11/29/10   Dropped support for 16 kHz PID rate.  The 1840 architecture was shown to exhibit
           anomolous behavior of the NanoMotion motor when a sufficiently high load was
           put on the CPU.  The 4 kHz rate seems to perform well and the next revision will
           contain a logic implemenation of a breakpoint latch for dead-zone detection.

03/11/11   Modified motor data broadcast mechanism to support variable broadcast frequency.
           The following relevant commands are now in place
           
           	BIn	Broadcast Interval
           		(function 254)
           		frequency = 1 kHz / n (at default motor update rate)
           		
           	aBEn	Broadcast Enable
           		(function 255)
           		a = axis
           		n = 0 (disable) 1 (enable)
           		
03/20/11   Modified network initialization to allow user to change default ethernet 
           network prefix of 192.168.1.  The web browser interface was modified to
           support this change.  No boot rom config field was added - the default
           is still copied into flash and if the user modifies the prefix, that is
           copied back into flash.  The prefix is extracted from the IP address in 
           flash and the default route (gateway address, log host address) is
           created by appending a .1 to the network prefix and storing that in
           a string array read at initialization time.
           		           
04/08/11   Corrected flaw involving VFF correction always active, regardless of state
           of PIEZOMODE flag.  OM0 was not turning off the VFF function in the motor
           update routine.
                      		           

Changes for Rev. 4.9c
===============================================================================	   
04/15/11   Added support for network discovery tool.  This is an application
           that will allow users to query a network for the presence of MFX-ETH
           controllers whose IP addresses may not be known.  The tool allows 
           querying, resetting and reconfiguring controllers remotely using the
           discovery application which communicates by broadcast UDP datagrams
           containing custom data fields to allow recognition by the MFX-ETH.
           
           The operation of motor data broadcasts was modified to change from an
           Ethernet unicast to a broadcast UDP datagram containing the motor data
           structures.  
           
04/27/11   Added VR command for compatibility with PM1 firmmware. 

			aVRn		Velocity Ratio = n (double)
			(function 309)
			
			mtr->velratio	motor table variable (added to lookup)
			
	   The ratio defaults to 0 in which case the MV and SV commands work as always.  If
	   mtr->velratio is set to a non-zero value, MV returns without changing the minimum
	   velocity.  The minimum will instead be set based on the ratio to the maximum and 
	   will track changes to the SV and VR commands.  When the ratio is set back to zero,
	   the previously programmed value for minimum will be restored.           
           
04/28/11   Changed function number of VR command to eliminate conflict with 
           piezo mode functions that will likely be merged into the PM1 code
                      
           Updated RTEMS_WEBSERVER code which was considerably down-level and
           didn't include recent changes to config filename conventions, etc.
 
 
Changes for Rev. 5.0a
===============================================================================	   
04/29/11   Merged PM1 production build with NM1 4.9a nanomotion custom as well as
           TT1 4.9a G-code modifications.  This version will be in beta until full
           regression testing is complete.
           
05/11/11   Added fix to address problem associated with zero-value integrator preload
           value.  The preload logic required a non-zero value to initiate the 
           algorithm to set the integral accumulator, otherwise with piezo mode active
           a zero value would cause the term to blow up.  The fix was to add 1 uV of
           constant bias to the preload value, satisfying the logic but having no 
           effect on the DAC output.           
           
06/20/11   Added inversion mask support for SPI-based opto inputs (ICN-125) to
           allow user to change limit polarity.  This required a third diginv
           integer to support the upper 16 bits of input and 4 of output

07/19/11   Corrected bug on SPI interface initialization that caused Amp Enable
           outputs to be intermittently non-functional.  The port intitialization
           write code was sensing the Busy status going inactive when in fact
           the command had not had time to assert Busy on the port expander and
           therefore looked as if the command had already completed.

07/22/11   Bug fix for spline contouring when using synchronized motion.  It was
           found that a zero-length move resulted in divide-by-zero fpu exception
           and a crash.  This was fixed in pre_process_spline() in ctrcmd.c      
           
08/11/11   Perturbation of the PID loop was seen to occur when the network binary
           interface was heavily loaded with status and position queries.  This was
           traced back to excessive overhead to service the 62.5 uS interrupt for
           16 kHz loop rates.  This feature is being dropped and the default 4 kHz
           interrupt will be restored.  The YH, YM and YL commands will have no
           effect.  The high speed loop rate feature may be resurrected at a later date.
           
09/12/11   Fixed minor bug in high-speed strobe compare function.  The BC-1 command
           was not doing a complete reset of the strobe logic state machine and
           that problem is now corrected.  
           
10/04/11   Enhancement to high-speed strobe logic that supports bi-directional position
	   moves (previously only + motion).    Also modified the state machine to 
	   eliminate a spurious 25 nS pulse at the end of the programmed strobe output.
	   
10/18/11   Corrected bug that was causing the ICN board id field from being read before
           the processor PIO registers were initialized, causing the spi init routine
           to be invoked (and hang) when no board was present.
           
10/20/11   Corrected bugs in 1008 FPGA which did not include the previous fix for
           pulse axis master/slave mode.  Partial testing done but complete test not
           possible until ICN-126 board is prototyped.        
           
11/11/11   Implemented Position Following Error Limit feature to allow user to 
           specify an allowable interval during which the axis exceeds the programmed
           following error.  This is useful for excursions outside the limit during
           accel and decel that may not be as of much interest as constant-velocity
           error.  The new function is
           
           	aFXn 	 		-   sets axis a to a following error time
           	(function 169)		    limit to n mSec before asserting the error
           				
           The motor variables that can be looked up are:    
           
           	poserrcnt (int)		PID loop error counter
           	poserrlim (int)		position error limit (loop counts)
           	poserrtime (long)	position error limit (mSec)
           	

11/30/11   Implemented a 4-channel PWM controller for the 1040 platform.  The
           outputs are placed on general-purpose digital outputs as follows:
           
           	PWM channel		   Digital Out (channel)
           	     1				10 (42)
           	     2				11 (43)
           	     3				14 (46)
           	     4				15 (47)
           	     
           The digital outputs are still available for use if the PWM circuit is 
           disabled.  The duty cycle of each channel is independent but there is a
           common clock and prescaler used by all 4 channels.  
           
           The two command mnemonics that are used to control these circuits are:
           
           	PKn		   -	set PWM frequency 
           				(f = n * 50 Hz)
           	
               aPGn 		   - 	set duty cycle of channel a
	       (function 183)		(duty cycle = n / 65535)
				
	   Notes:
	      	1. To disable the PWM circuit, command a duty cycle of zero
	   	to the desired channel (aPG0).
	   
	   	2. The base frequency of 50 Hz is approximate (50.86 Hz)
	   	
12/05/11   The Spartan2 DLL allows fewer frequency synthesis options so in order
           to maintain compatability between PCI and ETH versions, the base
           frequency of the PWM circuits had to be changed.  The new value is 
         
         
           	PKn		-  set PWM frequency 
           			   (f = n * 38 Hz)      
           			
	   It was also noted that a frequency scaler value that is an exact
	   power of 2 (8, 32, 1024,...) results in a more jitter-free pulse
	   train.  At other values and high frequencies, the jitter can be as 
	   great as 500 nS.  This will be addressed and fixed in a future release.
           
12/12/11   Added back command mnemonic (aYXn - function 305) for VFF limit set to 
           command table.  This was mistakenly deleted from a previous pilot build.           
           
01/22/12   Added data logging capability developed earlier for prototype builds.
	   This mechanism is different than data recording in that data files are
	   created in the root file system and written to on every pass through the
	   motor service routine.  The user can then FTP this file to the host for 
	   analysis.  The data record structure was made to look identical to the one
	   used in data recording:
	   
			log_rec.rec1 = (int)mtr->status;
			log_rec.rec2 = mtr->cmdcount;
			log_rec.rec3 = mtr->poscount;
			log_rec.rec4 = mtr->dacval;
			
	   The recording is enabled by the following command
	   
	   		aLGn 		- log n records for axis a on next position move
	   		(function 316)
	   		
	   The recording begins on the next call to movtopos() and terminates on count.
	   The filename convention for the log file is
	   
	   		\home\user\data_log_a	(a = axis number)
           
08/18/12   Added support for slave-to-contour motion with two axes performing contour
           moves and a third axis slaved to the contour controller.  This required 
           enhancement to the slave ratio command to support upadating a new motor
           variable mtr->slvoffset.  This variable accounts for changes in slave ratio
           and avoids the slave axis jumping to a new position when the ratio changes
           and the contour axis has not moved.  The new function is 
           
	   		aRSn 		- change slave ratio for axis a to n and
	   		(function 168)	  update mtr->slvoffset
	   		
	   The offset is changed according to the following expression
	   
	   	mtr->slvoffset = mtr->optimal - (ratio * (motor[mtr->master1 - 1].prfpos - mtr->mstrinit));

08/18/12   Added function to explicitly open data log file from command line.  This allows
           beginning data logging from an MCCL script at an arbitrary point in time.  Previously,
           the data log file was only opened at the first entry into movetopos() in
           order to capture position moves.  The new function is
	              
	   		aOL 		- open data log file for axis a, if logging enabled
	   		(function 167)	  

09/14/12   Implemented s-curve trajectory planner based upon trapezoidal accel/decel in addition
           to the current sinusoidal profile.  This mode is selected by calling the exisitng S-curve 
           select function with a non-zero parameter
           
           
           	aPSn		select S-curve profile for axis a
           			n = 0		sinusoidal accel/decel function
           			0 < n < 0.5	trapezoidal accel/decel function ramp = n
           			
           The ramp value is defined as the percentage of the accel time ramping to
           full acceleration.  A value of 0.1 will provide a .1/.8/.1 trapezoid.
           
           The value of this parameter can be determined by the lookup variable
           
           	mtr->scrvramp	(double ramp value)
           
09/18/12   Added DAC scaling/offset capability.  This allows the user to change the dynamic
	   range of the analog servo DAC with console commands.  The default +10/-10 volt 
	   range can be changed by accessing two motor variables:
	   
	   	dacrange (double)	specifies DAC range in +/- volts
	   	dacoffset (double)	specifies DAC offset in volts

	   There is no parameter error checking as the DAC is always clipped at +10/-10
	
Changes for Rev. 5.0b
===============================================================================	   

03/29/13   Added DAC output null motor variable that represents an offset in counts to 
           allow fine adjustment of the command voltage.  The variable is
           
           	mtr->nulldac  unsigned int (lookup "nulldac")
           	
           An MCCL command was added to set the variable as follows:
           
           	aNDn	a - axis
           		n - increment/decrement DAC offset in counts[
           		    (n = 0 resets offset to 0)
           		    (a = 0 stores all axis offsets in flash configuration space)
           		    
           The value of each axis offset is stored in the configuration space of flash 
           memory by assigning a new int to the fwconfig structure (see mfxconfig.h).
           This allows the offset values to be non-volatile and available at power up.
           
           		
	   The recording buffers were increased from 1024 to 2048.          		
          
04/11/13   Added new trapezoidal trajectory generator without on-the-fly position
	   change capability.  This was to allow latitude in debug, anomolous
	   stepper behavior, etc.    Only stepper axes can utilize this function by
	   selecting the type of trapezoidal trajectory.  Servo axes will always use
	   the on-the-fly trajectory generator.  The choice of which trajectory generator
	   is dynamically selected, based on the state of the following new motor 
	   variables:
           
           	mtr->otf	otf state flag (selects trajectory generator)
           	mtr->otfmode	otf mode (enable/disable/count-based)
           	mtr->otfcnt     otf count threshold
           	
           An MCCL command, added to support the new variables, and its command
           arguments are as follows:
           
           	aFYn		Trapezoid On the Fly control	(a - pulse axis)
           	(function 307)	
           	

		
		n	mtr->otfmode	mtr->otfcnt	on-the-fly trajectory
		--------------------------------------------------------------
		0	    1		    0            always on
		<0	   -1		    0            always off
		>0          0               n		 on  (move > n)
							 off (move < n)	
							 
	   Usage examples:
	   
	   	5fy0	;axis 5 otf trapezoidal trajectory always selected
	   	3fy-1	;axis 3 non-otf trapezoidal trajectory always selected
	   	5fy100	;axis 5 move distance >100  otf trapezoidal trajectory selected
	   		;	move distance <100  non-otf trapezoidal trajectory selected     
	   		
04/25/13   Revised control methodology of trapezoidal on-the-fly to improve clarity and
           flexibility for future h/w and f/w enchancements.  The motor variables, MCCL 
           command syntax and their effect are as follows:
           
           
           	aFYn		Trapezoid On the Fly control	(a - axis)
           	(function 307)	
           	

		
		n	mtr->otfmode	trajectory generator	on-the-fly mode
		--------------------------------------------------------------
		0	   0		     type 0 		    on
		1	   1		     type 1                 on
		2          2                 type 1                 off
							 
	   
		   
	   The trajectory generators are defined as
	   
	   	type 0:	trprof.c [trapezoidal_trajectory()]
	   		
	   		original implementation of trapezoidal trajectory planner
	   		that was created to support on-the-fly position changes
	   		  
	   	type 1: trprof.c [trap_traj()]
	   		
	   		new parameterized implementation of trapezoidal trajectory
	   	        planner that is more robust and immune to math errors on
	   	        short, high-velocity moves.  This trajectory planner now
	   	        supports on-the-fly moves with the temporary limitation that
	   	        axis stops occur on all commanded position changes.  This 
	   	        slight limitation will be corrected in a future release.
	   
05/06/13   Added new motor variables to insure additional  pass through path 
           generator to eliminate spurious enables on STEPENA signal in fpga.
           The variables are
           
           	mtr->stpdly	- specifies number of passes through path
           		          generator after AT latch fires (default = 1).
           		          This value can be inspected/set by a lookup
           		          of "stpdly"
           	
           	mtr->stptimer	- timer variable
           	
           This mechanism is applicable only in mode 1 and 2 trapezoidal trajectory
           planners on open-loop pulse axes.
           
06/18/13  Corrected problem that prevented execution of Stop command in velocity mode
           whe trapezoidal trajectory planner mode 2 was selected.  When velocity mode
           is selected now, type 0 trajectory will be switched in to provide stop
           function.  When position mode is re-selected, the previously selected
           trapezoidal trajectory planner mode will be reinstated.

06/18/13   Corrected problem related to stop command issued during position move on
           pulse axes.  The optimal position was not set to the final target position
           after the stop and Trajectory Complete was frequently not set.  This was
           corrected by updating the breakpoint latch target position following deceleration
           calculation performed in the ST command function.
                      
	               
Changes for Rev. 5.0c
===============================================================================	   
07/16/13  Corrected problem involoving stop mode during +/- hardware limit detect
          when in trapezoidal mode 2.  The problem was identical in nature to 
          the one found to effect the ST command where a trapezoidal rampdown
          was not being calculated.
          
08/20/13   Corrected problem in velocity ratio command.  The profile velocity was not getting
           updated correctly after the VR command unless a subsequent SV command was issued.
           
09/03/13  Restored LO and LOF commands and performed modifications to allow proper
          behavior over Telnet ASCII interface.  Also modified TY (file type) command
          to send response to correct terminal (either serial port or telnet socket).

	  The file load functions require a Ctl-Z delimiter which currently cannot
	  be passed by WinControl.  In the interim, an alternative inline EOF delimiter
	  will be used consisting of the following line:
	  
	  		;*;
	  		
	  When this string is parsed, the file will be closed and loading from the ASCII
	  command port terminated.
	  
09/18/13  Corrected flaw in movtopos() that was miscalculating times and distances associated
          with moves wherein full velocity was never reached and the accel was not equal to decel.

 Changes for Rev. 5.1a
===============================================================================	   	   
09/25/13   Revised logic in movetopos() that was being used to determine completion
           of previous move.  Changed qualifier from profiler trajectory complete
           to motor trajectory complete and added additional check for pulse disable.
           
10/15/13   Release version 5.1 to indicate viable FY1 on-the-fly functionality.
           This is still a preliminary release which performs on-the-fly moves
           during constant velocity but will hopefully represent significant
           uplift in speed.  A version to manage otf moves during acceleration
           will follow.
           
 Changes for Rev. 5.1b
===============================================================================	   	   
10/15/13   Implemented feature from bl_4.7 source tree that inhibits execution
           of successive MA commands to the same position (other than 0).  This 
           had been shown to provide significant speed improvement in some 
           applications.

	   
10/20/13   Implemented on-the-fly processing for accleration phase of trapezoid


10/22/13   Implemented on-the-fly processing for triangular velocity profiles

10/24/13   Corrected error in triangle otf processing whereby max velocity was
           ignored during calculation of new accel/decel times.
           
           Added logic in SA, DS, SV, and MV commands to inhibit changes to any
           of these parameters while an axis is in motion if in FY1 mode.
     	
 Changes for Rev. 5.2a
===============================================================================	   
12/01/13   Revised algorithm for processing on-the-fly position changes to correct
           fundamental flaw in triangular profile processing/generation.  Also
           revised mechanism to capture otf velocity/accel/decel commands but have
           not completed the full implementation in this release to allow proceeding
           with testing of position changes only.

012/02/13  An MCCL command was added to allow programmatic control of unused
           bits in the motor status word (for PCI compatability)
           
           	aSUn		set mtr->status(31:30) to n on axis a
           	(function 138)	

01/13/14   Development build that includes logic to record and display statistics
           related to on-the-fly moves.  This includes percentage of otf moves
           that can be processed by controller and the estimated move time
           savings of FY1 mode compared to FY2.  The statistics are displayed
           by entering
           
             	aID13	a - axis number
	   
 Changes for Rev. 5.3a
===============================================================================	   
08/04/14   Corrected flaw that was causing pulses to be disabled when a pulse
           axis was placed in contour mode.  Modified MN command to enable 
           pulses when axis is in slave or contour mode.
           
           Removed on-the-fly statistics recording from previous build due to 
           processing overhead.  
           
 Changes for Rev. 5.4a
===============================================================================	   
12/02/14   This revision results from the first extensive testing of sine
           commutation and the first application to a rotary motor.  The changes
           are primarily modifications to the logic of all servo axis types
           (1440, 1840, 1800, 1400), with corresponding changes to the embedded
           code.  
           
           It was found that rotary PM AC motors require logic that is not needed
           in linear stages.  This logic resets the encoder commutation angle to 
           zero at each mechanical period, whereas linear stages reset this angle
           at each magnetic period.  The small angle calculation is nulled out
           at each revolution of the rotary motor, rather than at each magnetic
           pole position of the linear stage.
           
           The other critical modification involved the calculation of the encoder
           divisor which is based on the value of encoder counts / magnetic cycle.
           Previously, this value was evaluated as an integer but it was found that
           using a floating point number had the effect of not resettting the 
           commutation angle to zero at each magnetic cycle.  
           
           For example, a motor with 8192 encoder counts / revolution and 11 pole
           pairs results in the following calculation. 
           
           		N = encoder counts / magnetic cycle  
           	  	  = 8192 / 11 = 744.7272 
           	
           		DIV = encoder angle divisor
           	    	    = (4096 / N) * 4096
           	    
           If N is truncated to an integer, 
          
          		DIV = (4096 / 744) * 4096
          		DIV = 22550  
          	
           If N is used as a floating point value,

          		DIV = (4096 / 744.7272) * 4096
          		DIV = 22528 
          	
           The latter value results in no appreciable loss of synchronization between
           encoder and the u and v phase angles and smoother commutation.
          
           To allow specification of encoder counts / rotation, an MCCL command was
           created
          
	   		aLDn 		- set cnts/rev for axis a to n 
	   		(function 333)
			   		
           So a portion of the initialization for the example motor would consist of
           
           		
           		1LR744.7272	- encoder counts / magnetic cycle
           		1LD8192		- encoder counts / revolution
           		
           LD should remain the default vaule of zero for linear stages.
           
           
12/15/14   Added two values to the broadcast data user defined 1 and 2 fields
           for sine commutated axes.  Refer to TechNote 1071 for details of
           usage.
           
           user defined 1 = sine(u) 
			    this is represented as a 16 bit value +/- 32767
	 
	   user defined 2 = commutation angle
	                    this is the sine LUT value 0 - 4095           
	                    
02/02/15   Revised broadcast data fields to fix all user-defined fields.  The
           data for sine-commutated axes are shown above.  For standard servo
           and pulse axes, the contents consist of:
           
           user defined 1 = current velocity 
			    this is represented as a 32 bit signed integer
	 
	   user defined 2 = digital inputs - DI[31:0]
	                    this is represented as a 32 bit unsigned integer 
	                    
	   TechNote 1071 has been updated to reflect these additions          
	   
 Changes for Rev. 5.5a
===============================================================================	   
05/05/15   Added MCCL command to query active background tasks without console I/O
           of ID7 command.  The new command is
           
           
           	TUn		- query background task n
           	(function 308)	  
           	
           The TU command returns the following value in the accumulator (R0)
           
           	n			accumulator contents
               ---             	       ----------------------	
           	0			number of currently running background tasks
           	task id			task index: if task is still executing	
           				0: if task is not currently executing
           	

           When the task is generated, the task id is loaded into the accumulator
           and stored in a table of background tasks, along with a counter indicating
           the number of tasks running.  The user must record this value in his 
           application when the task is created.  Subsequently, the TU command can
           be issued with the task number as the command argument.  If the task is 
           still running, the table index (1, 2, ...) of that task will be returned 
           in the accumulator.  If the task has been suspended, a value of 0 is returned.
           
           A MCAPI application or macro can then determine whether a given background
           task is executing by the following commands:
           
           	TU<task_id>
           	TR0
           	
           The accumulator will then hold the result as discussed above.


05/29/15   Added another network broadcast function, similar to the one
           described in TechNote 1071.  This broadcsast provides the user
           with information on the current status of the contour buffer without
           having to poll or query the controller.  Briefly, the broadcast packet
           consists of the following fields:
           
           	byte1:		sfd (Oxaa)
           	byte2:  	axis number
           	byte 3-4:	contour index (total contour moves sent to buffer)
           	byte 5-6:	contour count (total contour moves completed)
           	
           Broadcasts will occur while the count is less than or equal to the index
           such that the user can monitor the socket (on port 65020) and get
           information about when the buffer is nearly or completely empty to allow
           further contour moves to be entered.  Please refer to TN1071 for complete
           details about the UDP/IP broadcasts.  Other than the port number and 
           contents of the data field, the mechanism is the same.

06/04/15   Merged piezo UHR support fromthe nm1_5.5a special build.  The revision
	   history is summarized below.

nm1_5.5a revisions:
04/16/15   Implementation of NanoMotion ultra high resolution (UHR) positioning 
	   algorithm which includes a PWM gating mechanism for the DAC command 
	   signal and a DC offset control that adds or subtracts from the command
	   signal based upon direction of travel.  The new feature requires two
	   MCCL commands:
           
           	aYWn	a: axis
           	 	n: PWM duty cycle % (integer 0 - 100)
           	 	
          	aYVn	a: axis
          		n: DC offset V (floating point 0 - 9.999)
          		
05/14/15   Removed PAM signal jitter by re-designing the mechanism that synchronizes
           the PWM signal generator with the DAC interface.  This has the significant
           drawback that all four axes must have the same duty cycle.  This will
           be resolved in the next release.
           
           In order to enable PAM on axes 1-4, the aYWn command must be issued with
           a non-zero parameter.  For this release, the parameter for axis 1 determines
           the duty cycle for all 4 axes, regardless of the parameter passed for that
           axis.  For example,
           
           
           	1YW50,2YW20,3YW10,4YW25	- all 4 axes PAM enabled with 50% duty cycle
           	1YW25,2YW20,3YW10,4YW25	- all 4 axes PAM enabled with 25% duty cycle
           	1YW25,2YW20,3YW0,4YW0	- axes 1,2 PAM enabled with 25% duty cycle
           	                          axes 3,4 PAM disabled
           	
05/21/15   Revised effect of YV command such that the DC offset applies now to both
           active and inactive phases of PWM signal, rather than just modifying the
           on-phase amplitude as before.
          
05/22/15   Fixed bug in UHR offset logic 

05/29/15   Provided support in RT command and MN/MF to account for UHR settings.
           Also modified motor update loop to set DC offset to zero when the
           axis is off to force output to zero.  Added information in ID12 command

05/31/15   Added support for axes 9-12 for 1840 board type

06/01/15   Modified 1840 fpga logic to allow independent DAC duty cycles.  With 
           this revision, axis 1 determines the duty cycle for axes 1-4 and
           axis 9 determines the duty cycle for axes 9-12

06/03/15   Implemented probable final revision to logic controlling the piezo mode
	   UHR modulating pulse widths.  The duty cycles are still dependent but
	   somewhat more flexible.  Now, axis 1 (or 9 on the 1840) is not always
	   the controlling axis.  Instead, it is the lowest numbered axis in the 
	   group (1-4 or 9-12) that has PAM enabled which will determine the duty
	   cycle for the higher numbered axes of the group.
	   
	   The changes will be summarized in a new TechNote 1086 that summarizes
	   piezo mode.

06/09/15   Corrected flaw in direction control of PAM DC offset.  Had previously
           been inverted offset from direction sign

06/26/15   Debugged new ICN-126 interconnect board and associated 1080 board type
           firmware.  The board had no defects and appears to work properly.  The
           following bugs were discovered and corrected during test:
           
           	micwcc.v
           		had error in pulse multiplexer code that decoded
           		axis 3 incorrectly, preventing pulse generation
           	motifc.v
           		dircw on axes 1-4 had to be inverted to compensate for
           	  	open-collector driver on ETH board
           	init.c
           	        SPI interface was not being initialized based on detection
           	        of ICN-126 since it had not previously existed
           	        
07/01/15   Added piezo mode UHR algorithm to 1800 and 1400 fpga types

07/16/15   Corrected flaw in jog mode that was preventing limit switches from
           being detected.  This was corrected in motupd.c

07/21/15   Modified Motor On command to supress check for axis in slave mode.
           Previously had been setting actual and optimal to that of master
           which resulted in a jerk in the slave axis upon issuing MN
           
07/27/15   Added enable support for contour buffer broadcast function (described
           in 5/29/15 release note).  The enable function is
           
           	BBn	Broadcast Contour Data Enable
           		(function 264)
           		a = axis
           		n = 0 (disable) 1 (enable)
           		
08/02/15   Changed function numbers to avoid conflicts with MFXPCI opcodes.  The
           revised numbers are:
           
                 BIn	Broadcast Interval
           	(function 265) 
           	
                 BEn	Broadcast Enable
           	(function 266)            	
           	

	   Added feature to VE command that returns a pointer to the version string
	   in the accumulator.  This came as a result of a customer request to 
	   query the version with their application without having to parse the 
	   value returned by the VE string
	              		
08/02/15   Deleleted RS function due to redundancy.  It was originally implemented
           to eliminate anomolies when slaving to a contour axis but  It is equivalent
           to issuing SS,SM. Also deleted slvoffset motor variable . 
         



===============================================================================
End of Revision History
===============================================================================
    