Browse Source

refactor: Simplify DShot command direction handling

main
Mathias Rasmussen 4 years ago
parent
commit
be845d6782
  1. 109
      Bluejay.asm

109
Bluejay.asm

@ -2613,33 +2613,28 @@ dshot_cmd_check:
mov Temp1, A mov Temp1, A
clr C clr C
subb A, #6 ; Beacon beeps for command 1-5 subb A, #6 ; Beacon beeps for command 1-5
jnc dshot_cmd_direction_1
jnc dshot_cmd_direction_normal
call beacon_beep call beacon_beep
call wait200ms call wait200ms
sjmp dshot_cmd_exit sjmp dshot_cmd_exit
dshot_cmd_direction_1:
; Change programmed motor direction to normal
cjne Temp1, #7, dshot_cmd_direction_2
dshot_cmd_direction_normal:
; Set motor spinning direction to normal
cjne Temp1, #7, dshot_cmd_direction_reverse
clr C clr C
mov A, DShot_Cmd_Cnt mov A, DShot_Cmd_Cnt
subb A, #6 ; Needs to receive it 6 times in a row subb A, #6 ; Needs to receive it 6 times in a row
jc dshot_cmd_exit_no_clear jc dshot_cmd_exit_no_clear
mov A, #1
jnb Flag_Pgm_Bidir, ($+5)
mov A, #3
mov Temp1, #Pgm_Direction
mov @Temp1, A
clr Flag_Pgm_Dir_Rev clr Flag_Pgm_Dir_Rev
sjmp dshot_cmd_exit sjmp dshot_cmd_exit
dshot_cmd_direction_2:
; Change programmed motor direction to reversed
dshot_cmd_direction_reverse:
; Set motor spinning direction to reversed
cjne Temp1, #8, dshot_cmd_direction_bidir_off cjne Temp1, #8, dshot_cmd_direction_bidir_off
clr C clr C
@ -2647,17 +2642,12 @@ dshot_cmd_direction_2:
subb A, #6 ; Needs to receive it 6 times in a row subb A, #6 ; Needs to receive it 6 times in a row
jc dshot_cmd_exit_no_clear jc dshot_cmd_exit_no_clear
mov A, #2
jnb Flag_Pgm_Bidir, ($+5)
mov A, #4
mov Temp1, #Pgm_Direction
mov @Temp1, A
setb Flag_Pgm_Dir_Rev setb Flag_Pgm_Dir_Rev
sjmp dshot_cmd_exit sjmp dshot_cmd_exit
dshot_cmd_direction_bidir_off: dshot_cmd_direction_bidir_off:
; Change programmed motor mode to normal (not bidirectional)
; Set motor control mode to normal (not bidirectional)
cjne Temp1, #9, dshot_cmd_direction_bidir_on cjne Temp1, #9, dshot_cmd_direction_bidir_on
clr C clr C
@ -2665,69 +2655,42 @@ dshot_cmd_direction_bidir_off:
subb A, #6 ; Needs to receive it 6 times in a row subb A, #6 ; Needs to receive it 6 times in a row
jc dshot_cmd_exit_no_clear jc dshot_cmd_exit_no_clear
jnb Flag_Pgm_Bidir, dshot_cmd_exit
clr C
mov Temp1, #Pgm_Direction
mov A, @Temp1
dec A
clr ACC.1
inc A
mov @Temp1, A
clr Flag_Pgm_Bidir clr Flag_Pgm_Bidir
sjmp dshot_cmd_exit sjmp dshot_cmd_exit
dshot_cmd_direction_bidir_on: dshot_cmd_direction_bidir_on:
; Change programmed motor mode to bidirectional
cjne Temp1, #10, dshot_cmd_direction_normal
; Set motor control mode to bidirectional
cjne Temp1, #10, dshot_cmd_direction_user_normal
clr C clr C
mov A, DShot_Cmd_Cnt mov A, DShot_Cmd_Cnt
subb A, #6 ; Needs to receive it 6 times in a row subb A, #6 ; Needs to receive it 6 times in a row
jc dshot_cmd_exit_no_clear jc dshot_cmd_exit_no_clear
jb Flag_Pgm_Bidir, dshot_cmd_exit
mov Temp1, #Pgm_Direction
mov A, @Temp1
dec A
setb ACC.1
inc A
mov @Temp1, A
setb Flag_Pgm_Bidir setb Flag_Pgm_Bidir
dshot_cmd_exit:
mov DShot_Cmd, #0
mov DShot_Cmd_Cnt, #0
dshot_cmd_exit_no_clear:
ret
sjmp dshot_cmd_exit
dshot_cmd_direction_normal:
; Change programmed motor direction to that stored in eeprom
cjne Temp1, #20, dshot_cmd_direction_reverse
dshot_cmd_direction_user_normal:
; Set motor spinning direction to user programmed direction
cjne Temp1, #20, dshot_cmd_direction_user_reverse
clr C clr C
mov A, DShot_Cmd_Cnt mov A, DShot_Cmd_Cnt
subb A, #6 ; Needs to receive it 6 times in a row subb A, #6 ; Needs to receive it 6 times in a row
jc dshot_cmd_exit_no_clear jc dshot_cmd_exit_no_clear
clr IE_EA ; DPTR used in interrupts
mov DPTR, #Eep_Pgm_Direction ; Read from flash
mov A, #0
movc A, @A+DPTR
setb IE_EA
mov Temp1, #Pgm_Direction
mov @Temp1, A
rrc A ; Lsb to carry
cpl C
mov Temp2, #Pgm_Direction ; Read programmed direction
mov A, @Temp2
dec A
mov C, ACC.0 ; Set direction
mov Flag_Pgm_Dir_Rev, C mov Flag_Pgm_Dir_Rev, C
sjmp dshot_cmd_exit sjmp dshot_cmd_exit
dshot_cmd_direction_reverse: ; Temporary reverse
; Change programmed motor direction to the reverse of what is stored in eeprom
dshot_cmd_direction_user_reverse: ; Temporary reverse
; Set motor spinning direction to reverse of user programmed direction
cjne Temp1, #21, dshot_cmd_save_settings cjne Temp1, #21, dshot_cmd_save_settings
clr C clr C
@ -2735,22 +2698,19 @@ dshot_cmd_direction_reverse: ; Temporary reverse
subb A, #6 ; Needs to receive it 6 times in a row subb A, #6 ; Needs to receive it 6 times in a row
jc dshot_cmd_exit_no_clear jc dshot_cmd_exit_no_clear
clr IE_EA ; DPTR used in interrupts
mov DPTR, #Eep_Pgm_Direction ; Read from flash
mov A, #0
movc A, @A+DPTR
setb IE_EA
mov Temp2, #Pgm_Direction ; Read programmed direction
mov A, @Temp2
dec A dec A
cpl ACC.0
inc A
mov Temp1, #Pgm_Direction
mov @Temp1, A
rrc A ; Lsb to carry
cpl C
mov C, ACC.0
cpl C ; Set reverse direction
mov Flag_Pgm_Dir_Rev, C mov Flag_Pgm_Dir_Rev, C
sjmp dshot_cmd_exit
dshot_cmd_exit:
mov DShot_Cmd, #0
mov DShot_Cmd_Cnt, #0
dshot_cmd_exit_no_clear:
ret
dshot_cmd_save_settings: dshot_cmd_save_settings:
cjne Temp1, #12, dshot_cmd_exit cjne Temp1, #12, dshot_cmd_exit
@ -2760,12 +2720,21 @@ dshot_cmd_save_settings:
subb A, #6 ; Needs to receive it 6 times in a row subb A, #6 ; Needs to receive it 6 times in a row
jc dshot_cmd_exit_no_clear jc dshot_cmd_exit_no_clear
clr A ; Set programmed direction from flags
mov C, Flag_Pgm_Dir_Rev
mov ACC.0, C
mov C, Flag_Pgm_Bidir
mov ACC.1, C
inc A
mov Temp2, #Pgm_Direction ; Store programmed direction
mov @Temp2, A
mov Flash_Key_1, #0A5h ; Initialize flash keys to valid values mov Flash_Key_1, #0A5h ; Initialize flash keys to valid values
mov Flash_Key_2, #0F1h mov Flash_Key_2, #0F1h
call erase_and_store_all_in_eeprom call erase_and_store_all_in_eeprom
mov Flash_Key_1, #0 ; Initialize flash keys to invalid values
mov Flash_Key_1, #0 ; Reset flash keys to invalid values
mov Flash_Key_2, #0 mov Flash_Key_2, #0
setb IE_EA setb IE_EA

Loading…
Cancel
Save