SET 0.050 1 0 VAR V1,minPrd=s(0.5) VAR V2,maxPrd=s(2.0) VAR V3,prdSteps=4 VAR V4,minDC=20 ;percent VAR V5,maxDC=80 VAR V6,DCSteps=4 VAR V7,numPulse=10 VAR V8,hold=S(2) ;end of user vars VAR V9,period VAR V10,DC VAR V11,upTime VAR V12,downTime VAR V13,prdInc VAR V14,DCInc VAR V15,stepI VAR V16,stepJ VAR V17,stepK VAR V18,numer ;must be set before call VAR V19,denom ;must be set before call VAR V20,result ;must be 0 before call 0000 'q DIGOUT [00001000] 0001 HALT ;setup period 0002 's MOV period,minPrd 0003 MOV stepI,prdSteps 0004 MOV prdInc,maxPrd 0005 SUB prdInc,minPrd 0006 MOV numer,prdInc 0007 MOV denom,prdSteps 0008 ADDI denom,-1 0009 MOVI result,0 0010 CALL DIVIDE 0011 MOV prdInc,result ;setup duty cycle 0012 MOV DCInc,maxDC 0013 SUB DCInc,minDC 0014 MOV numer,DCInc 0015 MOV denom,DCSteps 0016 ADDI denom,-1 0017 MOVI result,0 0018 CALL DIVIDE 0019 MOV DCInc,result 0020 PRDLOOP: MOV DC,minDC 0021 MOV stepJ,DCSteps 0022 DCLOOP: MOV numer,period 0023 MOVI denom,100 ;percent 0024 MOVI result,0 0025 CALL DIVIDE 0026 MOV downTime,result 0027 MUL downTime,DC 0028 MOV upTime,period 0029 SUB upTime,downTime 0030 MOV stepK,numPulse 0031 PLSLOOP: DIGOUT [00100000] 0032 DELAY upTime 0033 DIGOUT [00001000] 0034 DELAY downTime 0035 DBNZ stepK,PLSLOOP ;PLSLOOP DONE 0036 DELAY hold 0037 ADD DC,DCInc 0038 DBNZ stepJ,DCLOOP ;DCLOOP DONE 0039 ADD period,prdInc 0040 DBNZ stepI,PRDLOOP ;PRDLOOP DONE 0041 DIGOUT [00001000] 0042 HALT 0043 DIVIDE: BGT denom,numer,DONE 0044 SUB numer,denom 0045 ADDI result,1 0046 JUMP DIVIDE 0047 DONE: RETURN