Knowledge Base

Programming Tutorial for Camera Guided Laser Marking

Below is the sample program for the laser marking application using  a Class 5 SmartMotor.  For this application, FireTag used the two features in Class 5: interrupt and soft limit trigger without fault. These features are not available with Class 4.  We used the soft limit to tell the set the position mark as to where to fire the laser tag.  When the position is reached, the soft limit will set a status bit which caused the interrupt to output the trigger a laser fire, then update the next position mark for the next fire.  In the sample program, the label C10 is the routine that sets up the interrupt and C0 is the routine that does the output.

'sample program output I/O while in motion using soft limit interrupt trigger

ADDR=1                'set motor address
ECHO                    'set echo on

EIGN(W,0,127)      'configure all I/Os as general input
ZS                          'reset status bits

SLM(0)                  'configure soft limit not to fault when triggered.


'list of variables used
a=0                       'extract offset position
b=0                       '# of encoder count increment
c=0                       '# of index
i=0                        'index counter
j=536870912      'value of the 30th bit to mask
k=16777215       'value of the first 24bits.

PAUSE                 'pause program to wait for GOSUB() command to use interrupt


C10                     'interrupt to start motion
a=al[i]&k             'extract value of offset and store into a
PT=a                  'set this as final position if no firing is required
IF (al[i]&j)==j      'check if 30th bit is set for firing

    i=i+1                   'increment array to ready next value
    b=al[i]                 'increment position
    i=i+1                   'increment array to ready next value
    c=al[i]                 'number of fires
    IF b<0                 'check if increment is neg or pos to determine direction of motion

        SLN=a                       'set neg soft limit
        SLP=1000000000   'set pos soft limit to be a big number
        ITR(0,1,13,1,0)         'enable neg limit interrupt on neg direction


        SLN=-500                'set neg soft to a smaller number
        SLP=a                      'set pos soft limit
        ITR(0,1,12,1,0)        'enable pos limit interrupt on pos direction

    SLE                               'enable software limit
    EITR(0)                         'enable interrupt
    ITRE                              'enable global interrupt
    PT=a+b*c                     'calculate final target position base on initial first position and number of fires
G                   'start motion
TWAIT          'wait for motion to end
i=i+1             'increment array
DITR(0)        'disable interrupt
SLD              'disable software limit
ZS                 'reset status bits
RETURN' return


    C0                 'interrupt
    IF SLP<PT   'check if this the last point
    OR(4)            'output I/O A to low
    ELSE             'if last point
    WAIT=500    'have delay
    OR(4)            'then output
    SLP=SLP+b   'increment to next interrupt
    ZS                 'reset status bits
    WAIT=200   'wait for 0.5 sec
    OS(4)            'set output I/O A to high
    RETURNI     'return