diff --git a/Bluejay.asm b/Bluejay.asm index b043eef..1cfe9e6 100644 --- a/Bluejay.asm +++ b/Bluejay.asm @@ -25,15 +25,11 @@ $NOMOD51 ; ; Bluejay is a fork of BLHeli_S by Steffen Skaug. ; -; The input signal can be DShot with rates: DShot150, DShot300 and DShot600. A 48MHz MCU is required for DShot600. +; The input signal can be DShot with rates: DShot150, DShot300 and DShot600. ; ; This file is best viewed with tab width set to 5. ; ;**** **** **** **** **** -; Minimum 8K Bytes of In-System Self-Programmable Flash -; Minimum 512 Bytes Internal SRAM -; -;**** **** **** **** **** ; Master clock is internal 24MHz oscillator (or 48MHz, for which the times below are halved) ; Although 24/48 are used in the code, the exact clock frequencies are 24.5MHz or 49.0 MHz ; Timer 0 (41.67ns counts) always counts up and is used for @@ -49,13 +45,6 @@ $NOMOD51 ; - Hardware PWM generation ; ;**** **** **** **** **** -; Interrupt handling -; The C8051 does not disable interrupts when entering an interrupt routine. -; Also some interrupt flags need to be cleared by software -; The code disables interrupts in some interrupt routines -; - Interrupts are disabled during beeps, to avoid audible interference from interrupts -; -;**** **** **** **** **** ; Motor control: ; - Brushless motor control with 6 states for each electrical 360 degrees ; - An advance timing of 0deg has zero cross 30deg after one commutation and 30deg before the next @@ -253,44 +242,44 @@ DShot_GCR_Pulse_Time_3: DS 1 ; Encodes binary: 001 ; Indirect addressing data segment. The variables below must be in this sequence ISEG AT 080h -_Pgm_Gov_P_Gain: DS 1 ; Programmed governor P gain -_Pgm_Gov_I_Gain: DS 1 ; Programmed governor I gain -_Pgm_Gov_Mode: DS 1 ; Programmed governor mode -_Pgm_Low_Voltage_Lim: DS 1 ; Programmed low voltage limit -_Pgm_Motor_Gain: DS 1 ; Programmed motor gain -_Pgm_Motor_Idle: DS 1 ; Programmed motor idle speed -Pgm_Startup_Pwr: DS 1 ; Programmed startup power -_Pgm_Pwm_Freq: DS 1 ; Programmed pwm frequency -Pgm_Direction: DS 1 ; Programmed rotation direction -_Pgm_Input_Pol: DS 1 ; Programmed input pwm polarity +_Pgm_Gov_P_Gain: DS 1 ; Governor P gain +_Pgm_Gov_I_Gain: DS 1 ; Governor I gain +_Pgm_Gov_Mode: DS 1 ; Governor mode +_Pgm_Low_Voltage_Lim: DS 1 ; Low voltage limit +_Pgm_Motor_Gain: DS 1 ; Motor gain +_Pgm_Motor_Idle: DS 1 ; Motor idle speed +Pgm_Startup_Pwr: DS 1 ; Startup power +_Pgm_Pwm_Freq: DS 1 ; PWM frequency +Pgm_Direction: DS 1 ; Rotation direction +_Pgm_Input_Pol: DS 1 ; Input PWM polarity Initialized_L_Dummy: DS 1 ; Place holder Initialized_H_Dummy: DS 1 ; Place holder -_Pgm_Enable_TX_Program: DS 1 ; Programmed enable/disable value for TX programming -_Pgm_Main_Rearm_Start: DS 1 ; Programmed enable/disable re-arming main every start -_Pgm_Gov_Setup_Target: DS 1 ; Programmed main governor setup target -_Pgm_Startup_Rpm: DS 1 ; Programmed startup rpm (unused - place holder) -_Pgm_Startup_Accel: DS 1 ; Programmed startup acceleration (unused - place holder) -_Pgm_Volt_Comp: DS 1 ; Place holder -Pgm_Comm_Timing: DS 1 ; Programmed commutation timing -_Pgm_Damping_Force: DS 1 ; Programmed damping force (unused - place holder) -_Pgm_Gov_Range: DS 1 ; Programmed governor range -_Pgm_Startup_Method: DS 1 ; Programmed startup method (unused - place holder) -_Pgm_Min_Throttle: DS 1 ; Programmed throttle minimum -_Pgm_Max_Throttle: DS 1 ; Programmed throttle maximum -Pgm_Beep_Strength: DS 1 ; Programmed beep strength -Pgm_Beacon_Strength: DS 1 ; Programmed beacon strength -Pgm_Beacon_Delay: DS 1 ; Programmed beacon delay -_Pgm_Throttle_Rate: DS 1 ; Programmed throttle rate (unused - place holder) -Pgm_Demag_Comp: DS 1 ; Programmed demag compensation -_Pgm_BEC_Voltage_High: DS 1 ; Programmed BEC voltage -_Pgm_Center_Throttle: DS 1 ; Programmed throttle center (in bidirectional mode) -_Pgm_Main_Spoolup_Time: DS 1 ; Programmed main spoolup time -Pgm_Enable_Temp_Prot: DS 1 ; Programmed temperature protection enable -Pgm_Enable_Power_Prot: DS 1 ; Programmed low rpm power protection enable -_Pgm_Enable_Pwm_Input: DS 1 ; Programmed PWM input signal enable -_Pgm_Pwm_Dither: DS 1 ; Programmed output PWM dither -Pgm_Brake_On_Stop: DS 1 ; Programmed braking when throttle is zero -Pgm_LED_Control: DS 1 ; Programmed LED control +_Pgm_Enable_TX_Program: DS 1 ; Enable/disable value for TX programming +_Pgm_Main_Rearm_Start: DS 1 ; Enable/disable re-arming main every start +_Pgm_Gov_Setup_Target: DS 1 ; Main governor setup target +_Pgm_Startup_Rpm: DS 1 ; Startup RPM +_Pgm_Startup_Accel: DS 1 ; Startup acceleration +_Pgm_Volt_Comp: DS 1 ; Voltage comp +Pgm_Comm_Timing: DS 1 ; Commutation timing +_Pgm_Damping_Force: DS 1 ; Damping force +_Pgm_Gov_Range: DS 1 ; Governor range +_Pgm_Startup_Method: DS 1 ; Startup method +_Pgm_Min_Throttle: DS 1 ; Minimum throttle +_Pgm_Max_Throttle: DS 1 ; Maximum throttle +Pgm_Beep_Strength: DS 1 ; Beep strength +Pgm_Beacon_Strength: DS 1 ; Beacon strength +Pgm_Beacon_Delay: DS 1 ; Beacon delay +_Pgm_Throttle_Rate: DS 1 ; Throttle rate +Pgm_Demag_Comp: DS 1 ; Demag compensation +_Pgm_BEC_Voltage_High: DS 1 ; BEC voltage +_Pgm_Center_Throttle: DS 1 ; Center throttle (in bidirectional mode) +_Pgm_Main_Spoolup_Time: DS 1 ; Main spoolup time +Pgm_Enable_Temp_Prot: DS 1 ; Temperature protection enable +Pgm_Enable_Power_Prot: DS 1 ; Low RPM power protection enable +_Pgm_Enable_Pwm_Input: DS 1 ; Enable PWM input signal +_Pgm_Pwm_Dither: DS 1 ; Output PWM dither +Pgm_Brake_On_Stop: DS 1 ; Braking when throttle is zero +Pgm_LED_Control: DS 1 ; LED control ; The sequence of the variables below is no longer of importance Pgm_Startup_Pwr_Decoded: DS 1 ; Programmed startup power decoded @@ -529,7 +518,6 @@ t1_int_outside_range: inc Rcp_Outside_Range_Cnt mov A, Rcp_Outside_Range_Cnt jnz ($+4) - dec Rcp_Outside_Range_Cnt clr C @@ -791,7 +779,7 @@ IF PWM_BITS_H < 2 rl A ; Rotate pattern mov @Temp1, A ; Store pattern - jnb ACC.0, dithering_done + jnb ACC.0, dithering_done mov A, Temp2 add A, #1 @@ -1430,10 +1418,10 @@ dshot_packet_stage_6: dshot_packet_factory: push PSW - mov PSW, #10h ; Select register bank 2 + mov PSW, #10h ; Select register bank 2 - mov A, Temp5 ; dshot_packet_stage - rl A ; multiply by 2 to match jump offsets + mov A, Temp5 ; dshot_packet_stage + rl A ; Multiply by 2 to match jump offsets mov DPTR, #dshot_packet_stage_jump_table jmp @A+DPTR dshot_packet_stage_jump_table: @@ -1563,9 +1551,9 @@ ENDIF set_pwm_limit_high_rpm_inc_limit: inc A + set_pwm_limit_high_rpm_store: jz ($+4) - mov Pwm_Limit_By_Rpm, A ret @@ -2016,8 +2004,7 @@ calc_next_comm_timing_fast: clr C subb A, Temp1 mov Temp3, A - jc load_min_time_fast ; Check that result is still positive - + jc load_min_time_fast ; Check that result is still positive jnz calc_new_wait_times_fast_done ; Check that result is still above minumum load_min_time_fast: @@ -2158,7 +2145,8 @@ store_times_decrease: mov Wt_Zc_Scan_Start_H, Temp6 jnb Flag_STARTUP_PHASE, store_times_exit - mov Wt_Comm_Start_L, #0F0h ; Set very short delays for all but advance time during startup, in order to widen zero cross capture range + ; Set very short delays for all but advance time during startup, in order to widen zero cross capture range + mov Wt_Comm_Start_L, #0F0h mov Wt_Comm_Start_H, #0FFh mov Wt_Zc_Scan_Start_L, #0F0h mov Wt_Zc_Scan_Start_H, #0FFh @@ -2803,46 +2791,46 @@ switch_power_off: ;**** **** **** **** **** **** **** **** **** **** **** **** **** set_default_parameters: mov Temp1, #_Pgm_Gov_P_Gain - Push_Mem Temp1, #0FFh ; Governor P gain - Push_Mem Temp1, #0FFh ; Governor I gain - Push_Mem Temp1, #0FFh ; Governor mode - Push_Mem Temp1, #0FFh ; Low voltage limit - Push_Mem Temp1, #0FFh ; Multi gain - Push_Mem Temp1, #0FFh - Push_Mem Temp1, #DEFAULT_PGM_STARTUP_PWR - Push_Mem Temp1, #0FFh ; Pwm freq - Push_Mem Temp1, #DEFAULT_PGM_DIRECTION - Push_Mem Temp1, #0FFh ; Input polarity - - inc Temp1 ; Skip Eep_Initialized_L - inc Temp1 ; Skip Eep_Initialized_H - - Push_Mem Temp1, #0FFh ; Enable tx programming - Push_Mem Temp1, #0FFh ; Main rearm start - Push_Mem Temp1, #0FFh ; Governor setup target - Push_Mem Temp1, #0FFh ; Startup rpm - Push_Mem Temp1, #0FFh ; Startup accel - Push_Mem Temp1, #0FFh ; Voltage comp - Push_Mem Temp1, #DEFAULT_PGM_COMM_TIMING - Push_Mem Temp1, #0FFh ; Damping force - Push_Mem Temp1, #0FFh ; Governor range - Push_Mem Temp1, #0FFh ; Startup method - Push_Mem Temp1, #0FFh ; Minimum throttle - Push_Mem Temp1, #0FFh ; Maximum throttle - Push_Mem Temp1, #DEFAULT_PGM_BEEP_STRENGTH - Push_Mem Temp1, #DEFAULT_PGM_BEACON_STRENGTH - Push_Mem Temp1, #DEFAULT_PGM_BEACON_DELAY - Push_Mem Temp1, #0FFh ; Throttle rate - Push_Mem Temp1, #DEFAULT_PGM_DEMAG_COMP - Push_Mem Temp1, #0FFh ; Bec voltage high - Push_Mem Temp1, #0FFh ; Center throttle - Push_Mem Temp1, #0FFh - Push_Mem Temp1, #DEFAULT_PGM_ENABLE_TEMP_PROT - Push_Mem Temp1, #DEFAULT_PGM_ENABLE_POWER_PROT - Push_Mem Temp1, #0FFh ; Enable pwm input - Push_Mem Temp1, #0FFh ; Pwm dither - Push_Mem Temp1, #DEFAULT_PGM_BRAKE_ON_STOP - Push_Mem Temp1, #DEFAULT_PGM_LED_CONTROL + Push_Mem Temp1, #0FFh ; _Pgm_Gov_P_Gain + Push_Mem Temp1, #0FFh ; _Pgm_Gov_I_Gain + Push_Mem Temp1, #0FFh ; _Pgm_Gov_Mode + Push_Mem Temp1, #0FFh ; _Pgm_Low_Voltage_Lim + Push_Mem Temp1, #0FFh ; _Pgm_Motor_Gain + Push_Mem Temp1, #0FFh ; _Pgm_Motor_Idle + Push_Mem Temp1, #DEFAULT_PGM_STARTUP_PWR ; Pgm_Startup_Pwr + Push_Mem Temp1, #0FFh ; _Pgm_Pwm_Freq + Push_Mem Temp1, #DEFAULT_PGM_DIRECTION ; Pgm_Direction + Push_Mem Temp1, #0FFh ; _Pgm_Input_Pol + + inc Temp1 ; Skip Initialized_L_Dummy + inc Temp1 ; Skip Initialized_H_Dummy + + Push_Mem Temp1, #0FFh ; _Pgm_Enable_TX_Program + Push_Mem Temp1, #0FFh ; _Pgm_Main_Rearm_Start + Push_Mem Temp1, #0FFh ; _Pgm_Gov_Setup_Target + Push_Mem Temp1, #0FFh ; _Pgm_Startup_Rpm + Push_Mem Temp1, #0FFh ; _Pgm_Startup_Accel + Push_Mem Temp1, #0FFh ; _Pgm_Volt_Comp + Push_Mem Temp1, #DEFAULT_PGM_COMM_TIMING ; Pgm_Comm_Timing + Push_Mem Temp1, #0FFh ; _Pgm_Damping_Force + Push_Mem Temp1, #0FFh ; _Pgm_Gov_Range + Push_Mem Temp1, #0FFh ; _Pgm_Startup_Method + Push_Mem Temp1, #0FFh ; _Pgm_Min_Throttle + Push_Mem Temp1, #0FFh ; _Pgm_Max_Throttle + Push_Mem Temp1, #DEFAULT_PGM_BEEP_STRENGTH ; Pgm_Beep_Strength + Push_Mem Temp1, #DEFAULT_PGM_BEACON_STRENGTH ; Pgm_Beacon_Strength + Push_Mem Temp1, #DEFAULT_PGM_BEACON_DELAY ; Pgm_Beacon_Delay + Push_Mem Temp1, #0FFh ; _Pgm_Throttle_Rate + Push_Mem Temp1, #DEFAULT_PGM_DEMAG_COMP ; Pgm_Demag_Comp + Push_Mem Temp1, #0FFh ; _Pgm_BEC_Voltage_High + Push_Mem Temp1, #0FFh ; _Pgm_Center_Throttle + Push_Mem Temp1, #0FFh ; _Pgm_Main_Spoolup_Time + Push_Mem Temp1, #DEFAULT_PGM_ENABLE_TEMP_PROT ; Pgm_Enable_Temp_Prot + Push_Mem Temp1, #DEFAULT_PGM_ENABLE_POWER_PROT ; Pgm_Enable_Power_Prot + Push_Mem Temp1, #0FFh ; _Pgm_Enable_Pwm_Input + Push_Mem Temp1, #0FFh ; _Pgm_Pwm_Dither + Push_Mem Temp1, #DEFAULT_PGM_BRAKE_ON_STOP ; Pgm_Brake_On_Stop + Push_Mem Temp1, #DEFAULT_PGM_LED_CONTROL ; Pgm_LED_Control ret @@ -2995,7 +2983,6 @@ led_3_done: -;**** **** **** **** **** **** **** **** **** **** **** **** **** ;**** **** **** **** **** **** **** **** **** **** **** **** **** ;**** **** **** **** **** **** **** **** **** **** **** **** **** ; @@ -3003,8 +2990,6 @@ led_3_done: ; ;**** **** **** **** **** **** **** **** **** **** **** **** **** ;**** **** **** **** **** **** **** **** **** **** **** **** **** -;**** **** **** **** **** **** **** **** **** **** **** **** **** - pgm_start: ; Initialize flash keys to invalid values mov Flash_Key_1, #0 @@ -3385,6 +3370,7 @@ dshot_beep_5: sjmp clear_dshot_cmd dshot_direction_1: + ; Change programmed motor direction to normal cjne Temp1, #7, dshot_direction_2 clr C @@ -3402,6 +3388,7 @@ dshot_direction_1: sjmp clear_dshot_cmd dshot_direction_2: + ; Change programmed motor direction to reversed cjne Temp1, #8, dshot_direction_bidir_off clr C @@ -3419,6 +3406,7 @@ dshot_direction_2: sjmp clear_dshot_cmd dshot_direction_bidir_off: + ; Change programmed motor mode to normal (not bidirectional) cjne Temp1, #9, dshot_direction_bidir_on clr C @@ -3437,6 +3425,7 @@ dshot_direction_bidir_off: sjmp clear_dshot_cmd dshot_direction_bidir_on: + ; Change programmed motor mode to bidirectional cjne Temp1, #10, dshot_direction_normal clr C @@ -3460,6 +3449,7 @@ dont_clear_dshot_cmd: ajmp wait_for_power_on_not_missing dshot_direction_normal: + ; Change programmed motor direction to that stored in eeprom cjne Temp1, #20, dshot_direction_reverse clr C @@ -3484,6 +3474,7 @@ dshot_direction_normal: sjmp clear_dshot_cmd dshot_direction_reverse: ; Temporary reverse + ; Change programmed motor direction to the reverse of what is stored in eeprom cjne Temp1, #21, dshot_save_settings clr C diff --git a/Common.inc b/Common.inc index 28d7fbf..d4b8494 100644 --- a/Common.inc +++ b/Common.inc @@ -253,16 +253,20 @@ ENDM Set_MCU_Clk_24MHz MACRO mov CLKSEL, #13h ; Set clock to 24MHz + mov SFRPAGE, #10h - mov PFE0CN, #00h ; Set flash timing for 24MHz + mov PFE0CN, #00h ; Set flash timing for 24MHz and disable prefetch engine mov SFRPAGE, #00h + clr Flag_CLOCK_SET_AT_48MHZ ENDM Set_MCU_Clk_48MHz MACRO mov SFRPAGE, #10h - mov PFE0CN, #30h ; Set flash timing for 48MHz + mov PFE0CN, #30h ; Set flash timing for 48MHz and enable prefetch engine mov SFRPAGE, #00h + mov CLKSEL, #03h ; Set clock to 48MHz + setb Flag_CLOCK_SET_AT_48MHZ ENDM