Hysteresis2 EQU StepBank-PrevStepPos ;Hysteresis2 Con StepBank-PrevStepPos RelStep EQU (StepBank-PrevStepPos) ;RelStep Con (StepBank-PrevStepPos) ContinueAddr EQU 5 ;ContinueAddr Con 5 PrevStepAddr EQU 6 ;PrevStepAddr Con 6 Bank1Addr EQU 1 ;Bank1Addr Con 1 Bank2Addr EQU 2 ;Bank2Addr Con 2 Bank3Addr EQU 3 ;Bank3Addr Con 3 Bank4Addr EQU 4 ;Bank4Addr Con 4 ; 'Main Protocol RESET __PROGSTART ;PROGRAM Main __PROGSTART: JNB TO,@__RESTORETRIS JB PD,@__POWERUP CLR W MODE $09 MOV !RB,W MOV FSR,W MODE $0F CJE FSR,#0,@__POWERUP CJNE FSR,#$FF,@__RESTORETRIS __POWERUP: CLR RA CLR RB CLR RC MOV FSR,#$08 SB FSR.3 SETB FSR.4 CLR IND IJNZ FSR,@$-3 MOV FSR,#__TRISA MOV IND,#255 INC FSR MOV IND,W INC FSR MOV IND,W __RESTORETRIS: MOV FSR,#__TRISA MOV !RA,IND INC FSR MOV !RB,IND INC FSR MOV !RC,IND CLR FSR JMP @Main ORG $+2 ; FOR DEBUGGER Main: ;Main: ;'IF SleepSense=LOW THEN GOSUB ClearCoils 'Resets stepper motor ; 'Pause 500 'Pause 500us ; 'GOTO Main CLR __PARAMCNT ;GOSUB ClearCoils CALL @ClearCoils MOV FSR,#__TRISB ;PULSIN RB.5,1,DutyCycle MODE $0F SETB IND.5 MOV !RB,IND BANK $00 CLR __PARAM1 MOV __PARAM4,#98 DJNZ __PARAM4,@$ NOP NOP JNB RB.5,@$+8 DJNZ __PARAM1,@$-10 JMP @$+33 CLR __PARAM1 MOV __PARAM4,#98 DJNZ __PARAM4,@$ NOP NOP JB RB.5,@$+8 DJNZ __PARAM1,@$-10 JMP @$+17 MOV __PARAM1,#1 MOV __PARAM4,#98 DJNZ __PARAM4,@$ NOP NOP JNB RB.5,@$+6 IJNZ __PARAM1,@$-10 MOV DutyCycle,__PARAM1 MOV FSR,#ContinueAddr ;GET ContinueAddr,ContinueBank MOV __PARAM1,IND BANK $00 MOV ContinueBank,__PARAM1 CJNE ContinueBank,#0,@__ELSE_1 ;IF ContinueBank=0 THEN CLR __PARAMCNT ;GOSUB InitMove CALL @InitMove JMP @__ENDIF_1 ;ELSE __ELSE_1: CLR __PARAMCNT ;GOSUB HysteresisDet CALL @HysteresisDet __ENDIF_1: ;ENDIF JMP @Main ;GOTO Main ; 'Subroutines InitMove: ;InitMove: MOV FSR,#ContinueAddr ;PUT ContinueAddr,1 MOV IND,#1 BANK $00 CLR StepBank_LSB ;FOR StepBank = 0 to StepCon CLR StepBank_MSB __FOR_StepBank_1: CLR __PARAMCNT ;GOSUB ForwardStep CALL @ForwardStep CJA StepBank_MSB,#(StepCon >> 8),@__NEXT_StepBank_1 ;NEXT CJB StepBank_MSB,#(StepCon >> 8),@$+10 CJAE StepBank_LSB,#(StepCon & 255),@__NEXT_StepBank_1 INC StepBank_LSB ADDB StepBank_MSB,Z JNZ @__FOR_StepBank_1 __NEXT_StepBank_1: MOV __PARAM1,#PrevStepAddr ;PUT PrevStepAddr,StepBank MOV __PARAM2,StepBank_LSB MOV __PARAM3,StepBank_MSB MOV FSR,__PARAM1 MOV IND,__PARAM2 INC FSR MOV IND,__PARAM3 BANK $00 JMP @Main ;GOTO Main HysteresisDet: ;HysteresisDet: MOV FSR,#PrevStepAddr ;GET PrevStepAddr,PrevStepPos MOV PrevStepPos_LSB,IND INC FSR MOV PrevStepPos_MSB,IND BANK $00 MOV HysteresisVar,#Hysteresis ;LET HysteresisVar = Hysteresis CJAE HysteresisVar,#10,@__ELSE_2 ;IF HysteresisVar < 10 THEN CLR __PARAMCNT ;GOSUB Pause1 'Hysteresis statement CALL @Pause1 JMP @__ENDIF_2 ;ELSE __ELSE_2: CLR __PARAMCNT ;GOSUB MoveDet CALL @MoveDet __ENDIF_2: ;ENDIF MoveDet: ;MoveDet: MOV FSR,#Bank1Addr ;PUT Bank1Addr,0 CLR IND BANK $00 MOV FSR,#Bank2Addr ;PUT Bank2Addr,0 CLR IND BANK $00 MOV FSR,#Bank3Addr ;PUT Bank3Addr,0 CLR IND BANK $00 MOV FSR,#Bank4Addr ;PUT Bank4Addr,0 CLR IND BANK $00 MOV RelStepVar,#RelStep ;LET RelStepVar = RelStep CJBE RelStepVar,#0,@__ELSE_3 ;IF RelStepVar > 0 THEN 'RelStep CLR __PARAMCNT ;GOSUB FwdMov CALL @FwdMov JMP @__ENDIF_3 ;ELSE __ELSE_3: CLR __PARAMCNT ;GOSUB RvsMov CALL @RvsMov __ENDIF_3: ;ENDIF FwdMov: ;FwdMov: CLR StepBank_LSB ;FOR StepBank = 0 to Hysteresis CLR StepBank_MSB __FOR_StepBank_2: CLR __PARAMCNT ;GOSUB ForwardStep CALL @ForwardStep CJA StepBank_MSB,#(Hysteresis >> 8),@__NEXT_StepBank_2 ;NEXT CJB StepBank_MSB,#(Hysteresis >> 8),@$+10 CJAE StepBank_LSB,#(Hysteresis & 255),@__NEXT_StepBank_2 INC StepBank_LSB ADDB StepBank_MSB,Z JNZ @__FOR_StepBank_2 __NEXT_StepBank_2: CLR __PARAMCNT ;GOSUB HoldCoils CALL @HoldCoils MOV FSR,#PrevStepAddr ;PUT PrevStepAddr,StepCon 'Will this overwrite? MOV IND,#StepCon BANK $00 RvsMov: ;RvsMov: CLR StepBank_LSB ;FOR StepBank = 0 to Hysteresis CLR StepBank_MSB __FOR_StepBank_3: CLR __PARAMCNT ;GOSUB ReverseStep CALL @ReverseStep CJA StepBank_MSB,#(Hysteresis >> 8),@__NEXT_StepBank_3 ;NEXT CJB StepBank_MSB,#(Hysteresis >> 8),@$+10 CJAE StepBank_LSB,#(Hysteresis & 255),@__NEXT_StepBank_3 INC StepBank_LSB ADDB StepBank_MSB,Z JNZ @__FOR_StepBank_3 __NEXT_StepBank_3: CLR __PARAMCNT ;GOSUB HoldCoils CALL @HoldCoils MOV FSR,#PrevStepAddr ;PUT PrevStepAddr,StepCon MOV IND,#StepCon BANK $00 Pause1: ;Pause1: MOV __PARAM2,#250 ;PAUSE 250 MOV __PARAM3,#39 MOV __PARAM4,#233 DJNZ __PARAM4,@$ DJNZ __PARAM3,@$-3 DJNZ __PARAM2,@$-10 JMP @Main ;GOTO Main ForwardStep: ;ForwardStep: MOV FSR,#Bank1Addr ;GET Bank1Addr, Bank1 MOV __PARAM1,IND BANK $00 MOV Bank1,__PARAM1 CJNE Bank1,#0,@__ELSE_4 ; IF Bank1=0 THEN MOV FSR,#__TRISB ; HIGH StepperCoil1 CLRB IND.0 MODE $0F MOV !RB,IND BANK $00 SETB StepperCoil1 MOV FSR,#Bank1Addr ; PUT Bank1Addr,1 MOV IND,#1 BANK $00 RETP ; RETURN __ELSE_4: ; ENDIF __ENDIF_4: MOV FSR,#Bank2Addr ;GET Bank2Addr, Bank2 MOV __PARAM1,IND BANK $00 MOV Bank2,__PARAM1 CJNE Bank2,#0,@__ELSE_5 ; IF Bank2=0 THEN MOV FSR,#__TRISB ; HIGH StepperCoil2 CLRB IND.1 MODE $0F MOV !RB,IND BANK $00 SETB StepperCoil2 MOV FSR,#Bank2Addr ; PUT Bank2Addr,1 MOV IND,#1 BANK $00 RETP ; RETURN __ELSE_5: ; ENDIF __ENDIF_5: MOV FSR,#Bank3Addr ;GET Bank3Addr, Bank3 MOV __PARAM1,IND BANK $00 MOV Bank3,__PARAM1 CJNE Bank3,#0,@__ELSE_6 ; IF Bank3=0 THEN MOV FSR,#__TRISB ; HIGH StepperCoil3 CLRB IND.2 MODE $0F MOV !RB,IND BANK $00 SETB StepperCoil3 MOV FSR,#Bank3Addr ; PUT Bank3Addr,1 MOV IND,#1 BANK $00 RETP ; RETURN __ELSE_6: ; ENDIF __ENDIF_6: MOV FSR,#__TRISB ;HIGH StepperCoil4 CLRB IND.3 MODE $0F MOV !RB,IND BANK $00 SETB StepperCoil4 MOV FSR,#Bank1Addr ;PUT Bank1Addr,0 CLR IND BANK $00 MOV FSR,#Bank2Addr ;PUT Bank2Addr,0 CLR IND BANK $00 MOV FSR,#Bank3Addr ;PUT Bank3Addr,0 CLR IND BANK $00 RETP ;RETURN ReverseStep: ;ReverseStep: MOV FSR,#Bank4Addr ;GET Bank4Addr, Bank4 MOV __PARAM1,IND BANK $00 MOV Bank4,__PARAM1 CJNE Bank4,#0,@__ELSE_7 ; IF Bank4 = 0 THEN MOV FSR,#__TRISB ; HIGH StepperCoil4 CLRB IND.3 MODE $0F MOV !RB,IND BANK $00 SETB StepperCoil4 MOV FSR,#Bank4Addr ; PUT Bank4Addr,1 MOV IND,#1 BANK $00 RETP ; RETURN __ELSE_7: ; ENDIF __ENDIF_7: MOV FSR,#Bank3Addr ;GET Bank3Addr, Bank3 MOV __PARAM1,IND BANK $00 MOV Bank3,__PARAM1 CJNE Bank3,#0,@__ELSE_8 ; IF Bank3 = 0 THEN MOV FSR,#__TRISB ; HIGH StepperCoil3 CLRB IND.2 MODE $0F MOV !RB,IND BANK $00 SETB StepperCoil3 MOV FSR,#Bank3Addr ; PUT Bank3Addr,1 MOV IND,#1 BANK $00 RETP ; RETURN __ELSE_8: ; ENDIF __ENDIF_8: MOV FSR,#Bank2Addr ;GET Bank2Addr, Bank2 MOV __PARAM1,IND BANK $00 MOV Bank2,__PARAM1 CJNE Bank2,#0,@__ELSE_9 ; IF Bank2 = 0 THEN MOV FSR,#__TRISB ; HIGH StepperCoil2 CLRB IND.1 MODE $0F MOV !RB,IND BANK $00 SETB StepperCoil2 MOV FSR,#Bank2Addr ; PUT Bank2Addr,1 MOV IND,#1 BANK $00 RETP ; RETURN __ELSE_9: ; ENDIF __ENDIF_9: MOV FSR,#__TRISB ;HIGH StepperCoil1 CLRB IND.0 MODE $0F MOV !RB,IND BANK $00 SETB StepperCoil1 MOV FSR,#Bank1Addr ;PUT Bank1Addr,0 CLR IND BANK $00 MOV FSR,#Bank2Addr ;PUT Bank2Addr,0 CLR IND BANK $00 MOV FSR,#Bank3Addr ;PUT Bank3Addr,0 CLR IND BANK $00 RETP ;RETURN HoldCoils: ;HoldCoils: MOV FSR,#__TRISB ;HIGH StepperCoil1 CLRB IND.0 MODE $0F MOV !RB,IND BANK $00 SETB StepperCoil1 MOV FSR,#__TRISB ;HIGH StepperCoil2 CLRB IND.1 MODE $0F MOV !RB,IND BANK $00 SETB StepperCoil2 MOV FSR,#__TRISB ;HIGH StepperCoil3 CLRB IND.2 MODE $0F MOV !RB,IND BANK $00 SETB StepperCoil3 MOV FSR,#__TRISB ;HIGH StepperCoil4 CLRB IND.3 MODE $0F MOV !RB,IND BANK $00 SETB StepperCoil4 RETP ;RETURN ClearCoils: ;ClearCoils: 'Shutdown routine MOV FSR,#__TRISB ;LOW StepperCoil1 CLRB IND.0 MODE $0F MOV !RB,IND BANK $00 CLRB StepperCoil1 MOV FSR,#__TRISB ;LOW StepperCoil2 CLRB IND.1 MODE $0F MOV !RB,IND BANK $00 CLRB StepperCoil2 MOV FSR,#__TRISB ;LOW StepperCoil3 CLRB IND.2 MODE $0F MOV !RB,IND BANK $00 CLRB StepperCoil3 MOV FSR,#__TRISB ;LOW StepperCoil4 CLRB IND.3 MODE $0F MOV !RB,IND BANK $00 CLRB StepperCoil4 MOV FSR,#ContinueAddr ;PUT ContinueAddr,0 CLR IND BANK $00 RETP ;RETURN