Browse Source

feat: Add DShot150 support on 24MHz MCUs

main
Mathias Rasmussen 4 years ago
parent
commit
f16cd2c4da
  1. 54
      Bluejay.asm

54
Bluejay.asm

@ -527,7 +527,7 @@ ENDM
; ;
; Requirements: ; Requirements:
; - Must NOT be called while Flag_Telemetry_Pending is cleared ; - Must NOT be called while Flag_Telemetry_Pending is cleared
; - Must NOT use Temp5
; - Must NOT write to Temp5, Temp8
;**** **** **** **** **** **** **** **** **** **** **** **** **** ;**** **** **** **** **** **** **** **** **** **** **** **** ****
t0_int: t0_int:
push PSW push PSW
@ -557,9 +557,7 @@ t0_int_dshot_tlm_finish:
clr IE_ET0 ; Disable timer 0 interrupts clr IE_ET0 ; Disable timer 0 interrupts
; todo: dshot150
;mov CKCON0, Temp2 ; Restore normal DShot timer 0/1 clock settings
mov CKCON0, #0Ch
mov CKCON0, Temp8 ; Restore regular DShot timer 0/1 clock settings
mov TMOD, #0AAh ; Timer 0/1 gated by INT0/1 mov TMOD, #0AAh ; Timer 0/1 gated by INT0/1
clr TCON_IE0 ; Clear int0 pending flag clr TCON_IE0 ; Clear int0 pending flag
@ -956,8 +954,6 @@ ENDIF
jnb Flag_Telemetry_Pending, t1_int_exit_no_tlm ; Check if telemetry packet is ready jnb Flag_Telemetry_Pending, t1_int_exit_no_tlm ; Check if telemetry packet is ready
; Prepare timer 0 for sending telemetry data ; Prepare timer 0 for sending telemetry data
; todo: dshot150
;mov Temp2, CKCON0 ; Save value to restore later
mov CKCON0, #01h ; Timer 0 is system clock divided by 4 mov CKCON0, #01h ; Timer 0 is system clock divided by 4
mov TMOD, #0A2h ; Timer 0 runs free not gated by INT0 mov TMOD, #0A2h ; Timer 0 runs free not gated by INT0
@ -3614,31 +3610,22 @@ ENDIF
setb IE_EA ; Enable all interrupts setb IE_EA ; Enable all interrupts
; Setup variables for DShot150
; TODO: dshot150 not supported for now
; IF MCU_48MHZ == 1
; mov DShot_Timer_Preset, #128 ; Load DShot sync timer preset (for DShot150)
; ELSE
; mov DShot_Timer_Preset, #192
; ENDIF
; ; TODO: we cannot currently support DShot150 on 48MHz (because of DShot_Frame_Length_Thr)
; IF MCU_48MHZ == 0
; mov DShot_Pwm_Thr, #10 ; Load DShot qualification pwm threshold (for DShot150)
; mov DShot_Frame_Length_Thr, #160 ; Load DShot frame length criteria
; Set_DShot_Tlm_Bitrate 187500 ; = 5/4 * 150000
; ; Test whether signal is DShot150
; mov Rcp_Outside_Range_Cnt, #10 ; Set out of range counter
; call wait100ms ; Wait for new RC pulse
; mov DShot_Pwm_Thr, #8 ; Load DShot regular pwm threshold
; clr C
; mov A, Rcp_Outside_Range_Cnt ; Check if pulses were accepted
; subb A, #10
; mov DShot_Cmd, #0
; mov DShot_Cmd_Cnt, #0
; jc arming_begin
; ENDIF
; Setup variables for DShot150 (Only on 24MHz because frame length threshold cannot be scaled up)
IF MCU_48MHZ == 0
mov DShot_Timer_Preset, #-64 ; Load DShot sync timer preset (for DShot150)
mov DShot_Pwm_Thr, #8 ; Load DShot qualification pwm threshold (for DShot150)
mov DShot_Frame_Length_Thr, #160 ; Load DShot frame length criteria
Set_DShot_Tlm_Bitrate 187500 ; = 5/4 * 150000
; Test whether signal is DShot150
mov Rcp_Outside_Range_Cnt, #10 ; Set out of range counter
call wait100ms ; Wait for new RC pulse
mov A, Rcp_Outside_Range_Cnt ; Check if pulses were accepted
mov DShot_Cmd, #0
mov DShot_Cmd_Cnt, #0
jz arming_begin
ENDIF
mov CKCON0, #0Ch ; Timer 0/1 clock is system clock (for DShot300/600) mov CKCON0, #0Ch ; Timer 0/1 clock is system clock (for DShot300/600)
@ -3675,6 +3662,11 @@ ENDIF
ljmp init_no_signal ljmp init_no_signal
arming_begin: arming_begin:
push PSW
mov PSW, #10h ; Temp8 in register bank 2 holds value
mov Temp8, CKCON0 ; Save DShot clock settings for telemetry
pop PSW
clr IE_EA clr IE_EA
call beep_f1_short ; Beep signal that RC pulse is ready call beep_f1_short ; Beep signal that RC pulse is ready
setb IE_EA setb IE_EA

Loading…
Cancel
Save