GetA_Error:
movff a_Error0,BARGB0 ;load error & a_error
movff a_Error1,BARGB1
movff a_Error2,BARGB2
clrf AARGB0
movff error0,AARGB1
movff error1,AARGB2
call SpecSign ;call routine for add/sub sign numbers
btfss pidStat1,mag ;which is greater in magnitude ?
bra a_err_zero ;bargb, keep sign as is or both are same sign
bcf pidStat1,a_err_sign ;aargb, make sign same as error, a_error is negative
btfsc pidStat1,err_sign
bsf pidStat1,a_err_sign ;a_error is positive
a_err_zero
bcf pidStat1,a_err_z ;clear a_error zero flag
movlw 0
cpfseq AARGB0 ;is byte 0 = 00
bra chk_a_err_limit ;NO, done checking
cpfseq AARGB1 ;is byte 1 = 00
bra chk_a_err_limit ;NO, done checking
cpfseq AARGB2 ;is byte 2 = 00
bra chk_a_err_limit ;NO, done checking
bsf pidStat1,a_err_z ;YES, set zero flag
movff AARGB0,a_Error0 ;store the a_error
movff AARGB1,a_Error1
movff AARGB2,a_Error2
return ;a_error = 00, return
chk_a_err_limit
movff AARGB0,a_Error0 ;store the a_error
movff AARGB1,a_Error1
movff AARGB2,a_Error2
movlw 0 ;a_error reached limits?
cpfseq a_Error0 ;Is a_Error0 > 0 ??, if yes limit has been exceeded
bra restore_limit ;YES, restore limit value
cpfseq a_Error1 ;Is a_Error1 = 0 ??, if yes, limit not exceeded
bra chk_a_Error1 ;NO
return ;YES
chk_a_Error1
movlw aErr1Lim
cpfsgt a_Error1 ;Is a_Error1 > aErr1Lim??
bra equal_value ;NO, check for a_Error1 = aErr1Lim ?
bra restore_limit ;YES, restore limit value
equal_value
cpfseq a_Error1 ;a_Error1 = aErr1Lim?
return ;no, done checking a_error
chk_a_Error2
movlw aErr2Lim ;Yes, a_Error1 = aErr1Lim
cpfsgt a_Error2 ;Is a_Error2 > aErr2Lim ??
return ;NO, return to mainline code
restore_limit
clrf a_Error0 ;YES, a_error limit has been exceeded
movlw aErr1Lim
movwf a_Error1
movlw aErr2Lim
movwf a_Error2
return ;return to mainline code