Browse Source

BLHeli_S source code

main
Mathias Rasmussen 4 years ago
commit
64ca286c90
  1. 553
      A.inc
  2. 558
      B.inc
  3. 385
      BLHeliBootLoad.inc
  4. 329
      BLHeliPgm.inc
  5. BIN
      BLHeli_S manual SiLabs Rev16.x.pdf
  6. 4536
      BLHeli_S.asm
  7. 560
      C.inc
  8. 674
      COPYING
  9. 553
      D.inc
  10. 27
      Dshotprog spec BLHeli_S.txt
  11. 566
      E.inc
  12. 553
      F.inc
  13. 553
      G.inc
  14. 558
      H.inc
  15. 552
      I.inc
  16. 558
      J.inc
  17. 554
      K.inc
  18. 552
      L.inc
  19. 557
      M.inc
  20. 267
      MakeHexfiles.bat
  21. 127
      Makefile
  22. 558
      N.inc
  23. 554
      O.inc
  24. 555
      P.inc
  25. 564
      Q.inc
  26. 552
      R.inc
  27. 16
      README.md
  28. 557
      S.inc
  29. 323
      SI_EFM8BB1_Defs.inc
  30. 431
      SI_EFM8BB2_Defs.inc
  31. 558
      SI_EFM8LB1_Defs.inc
  32. 558
      T.inc
  33. 562
      U.inc
  34. 564
      V.inc
  35. 518
      W.inc

553
A.inc

@ -0,0 +1,553 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "A"
; X X RC X MC MB MA CC X X Cc Cp Bc Bp Ac Ap
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#A_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#A_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#A_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#A_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#A_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#A_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#A_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#A_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#A_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#A_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#A_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#A_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#A_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#A_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#A_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#A_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#A_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#A_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#A_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#A_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#A_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#A_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 5 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
Rcp_In EQU 5 ;i
; EQU 4 ;i
Mux_C EQU 3 ;i
Mux_B EQU 2 ;i
Mux_A EQU 1 ;i
Comp_Com EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #02h ; Damping inverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
CcomFET EQU 5 ;o
CpwmFET EQU 4 ;o
BcomFET EQU 3 ;o
BpwmFET EQU 2 ;o
AcomFET EQU 1 ;o
ApwmFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 3Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #3Eh
ELSE
mov P1SKIP, #3Ch
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #3Bh
ELSE
mov P1SKIP, #33h
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #2Fh
ELSE
mov P1SKIP, #0Fh
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #3Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #10h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #20h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #30h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

558
B.inc

@ -0,0 +1,558 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "B". Equals "A", but with A and C fets swapped and pwm and com fets swapped
; X X RC X MC MB MA CC X X Ap Ac Bp Bc Cp Cc
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#B_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#B_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#B_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#B_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#B_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#B_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#B_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#B_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#B_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#B_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#B_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#B_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#B_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#B_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#B_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#B_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#B_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#B_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#B_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#B_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#B_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#B_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 5 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
Rcp_In EQU 5 ;i
; EQU 4 ;i
Mux_C EQU 3 ;i
Mux_B EQU 2 ;i
Mux_A EQU 1 ;i
Comp_Com EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
IF FETON_DELAY == 0
mov PCA0POL, #00h ; Pwm noninverted
ELSE
mov PCA0POL, #01h ; Damping inverted, pwm noninverted
ENDIF
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO ; CCF interrupt is only used for FETON_DELAY == 0
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
ApwmFET EQU 5 ;o
AcomFET EQU 4 ;o
BpwmFET EQU 3 ;o
BcomFET EQU 2 ;o
CpwmFET EQU 1 ;o
CcomFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 3Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #1Fh
ELSE
mov P1SKIP, #0Fh
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #37h
ELSE
mov P1SKIP, #33h
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #3Dh
ELSE
mov P1SKIP, #3Ch
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #3Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #10h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #20h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #30h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

385
BLHeliBootLoad.inc

@ -0,0 +1,385 @@
; BLHeli bootloader for SiLabs MCUs. Based upon AVRootloader (copyright HR)
XTAL EQU 25000000
BOOT_START EQU 1C00h ; Bootloader segment address
BOOT_DELAY EQU XTAL/4 ; About 250ms (don't set to fast to avoid connection problems)
BOOT_BAUDRATE EQU 19200 ; Only used if no baudrate detection activated, XTAL is than important
BOOT_VERSION EQU 6 ; Version 6 (must be not changed)
BOOT_PAGES EQU 1 ; Number of flash segments for bootloader
UART_LOOP EQU 26 ; Depends upon timing of putc, getc
BAUDTIME EQU ((XTAL/BOOT_BAUDRATE)/3)-UART_LOOP
SUCCESS EQU 030h
ERRORVERIFY EQU 0C0h
ERRORCOMMAND EQU 0C1h
ERRORCRC EQU 0C2h
ERRORPROG EQU 0C5h
POLYNOM EQU 0A001h ; CRC Polynom
Xl EQU R0 ; Temporary X
Xh EQU R1
Paral EQU R2 ; Params for UART
Parah EQU R3
Cmdl EQU R4 ; Commands
Cmdh EQU R5
Cntl EQU R6 ; Baudtime
Cnth EQU R7
DSEG AT 20h
Bit_Reg: DS 1 ; Bit storage register
Byte_Reg: DS 1 ; Byte storage register
Crcl: DS 1 ; CRC 16Bit
Crch: DS 1
Baudl: DS 1 ; Baudtime
Baudh: DS 1
Bit_Cnt: DS 1 ; Counter in UART loops
Byte_Cntl: DS 1 ; Generic counter
Byte_Cnth: DS 1
BL_Flash_Key_1: DS 1 ; Flash keys
BL_Flash_Key_2: DS 1
CSEG AT BOOT_START ; Bootloader start
init:clr IE_EA
; Select register bank 0 for main program routines
clr PSW.3 ; Select register bank 0 for main program routines
; Disable the WDT.
mov WDTCN, #0DEh ; Disable watchdog
mov WDTCN, #0ADh
; Initialize stack
mov SP, #0c0h ; Stack = 64 upper bytes of RAM
; Initialize clock
mov CLKSEL, #00h ; Set clock divider to 1
; Initialize VDD monitor
orl VDM0CN, #080h ; Enable the VDD monitor
mov Baudl, #38h ; Wait 100us
mov Baudh, #03h
acall waitf
; Initialize flash keys
mov BL_Flash_Key_1, #0A5h ; First key code
mov BL_Flash_Key_2, #0F1h ; Second key code
; Initialize ports
orl RTX_MDIN, #(1 SHL RTX_PIN) ; Set digital
anl RTX_MDOUT, #NOT(1 SHL RTX_PIN) ; Disable pushpull
setb RTX_PORT.RTX_PIN ; Set data high
mov RTX_SKIP, #0FFh
mov XBR2, #40h; ; Enable crossbar
; Set number of connect attempts before exiting bootloader
mov Cmdh, #250
; Identifier scanning
abd: mov Xl, #(low(BOOT_DELAY / 6)+1)
mov Xh, #(high(BOOT_DELAY / 6)+1)
mov Cmdl, #(high((BOOT_DELAY / 6) SHR 8)+1)
mov Crcl, #0
mov Crch, #0
mov DPTR, #BOOT_SIGN
mov Parah, #(BOOT_MSG - BOOT_SIGN)
mov Baudl, #low(BAUDTIME)
mov Baudh, #high(BAUDTIME)
wait_for_low:
jnb RTX_PORT.RTX_PIN, ($+5)
ajmp wait_for_low
; Identifier (BOOT_SIGN) scanning with timeout and checksum
id1: jb RTX_PORT.RTX_PIN, id3 ; Look for high
djnz Xl, id1 ; Subtract 1 from X (BOOT_DELAY)
djnz Xh, id1
djnz Cmdl, id1
ajmp exit
id3: jnb RTX_PORT.RTX_PIN, id4 ; Look for low
djnz Xl, id3 ; Subtract 1 from X (BOOT_DELAY)
djnz Xh, id3
djnz Cmdl, id3
ajmp exit
id4: acall getx ; Read character
clr A
movc A, @A+DPTR ; Load BOOT_SIGN character
inc DPTR
clr C
subb A, Paral ; Compare with read character
jz id5
djnz Cmdh, abd ; Retry if not last connect attempt
ajmp exit
id5:
djnz Parah, id1
acall getw ; Read CRC
jz ($+4) ; Check CRC
ajmp abd
; Send info about chip/bootloader (BOOT_MSG + BOOT_INFO)
mov Parah, #((BOOT_INFO - BOOT_MSG) + 4)
in1: clr A
movc A, @A+DPTR ; Load character
mov Paral, A
inc DPTR
acall putc
djnz Parah, in1
; Main commandloop
; 0=Run/restart
; 1=Program flash, 2=Erase flash, 3=Read flash
; 0xFF=Set address, 0xFE=Set buffer, 0xFD=Keep alive
main:mov Paral, #SUCCESS
mai1:acall putc
mov Crcl, #0 ; Reset CRC
mov Crch, #0
acall getw ; Get command
mov A, Paral
mov Cmdl, A
mov A, Parah
mov Cmdh, A
clr C
mov A, Cmdh
subb A, #0FEh
jc mai2 ; Jump if not set address or set buffer
acall getw ; Address or number of bytes
mov Byte_Cntl, Paral ; Store number of bytes for set buffer
mov Byte_Cnth, Parah
mov A, Cmdh
jnb ACC.0, mai2 ; Jump if set buffer
mov DPL, Paral ; Store flash address (for set address)
mov DPH, Parah
mai2:acall getw ; Get CRC
mov Paral, #ERRORCRC
jnz mai1
clr C
mov A, Cmdh
subb A, #0FEh
jz setbuf ; If command is set buffer, receive data
jnc main
cjne Cmdh, #0, mai4 ; Jump if command != 0 (and not set buffer)
; Run application/restart bootloader
mov A, Cmdl
jz rst
exit:mov Bit_Access, #0 ; Clear variable used by flash lock detect
mov Bit_Access_Int, #0FFh ; Set variable to indicate that program execution came from bootloader
mov BL_Flash_Key_1, #0 ; Set flash keys to invalid values
mov BL_Flash_Key_2, #0
ljmp 0000h
rst: ajmp init
; Set buffer
setbuf:mov Xl, Byte_Cntl ; Set number of bytes
mov Xh, Byte_Cnth
inc Xl
inc Xh
set4:djnz Xl, set5
djnz Xh, set5
ajmp set6
set5:acall getc ; Receive data
mov A, Paral
movx @Xl, A ; Store data in XRAM
ajmp set4
set6:inc Cmdh
ajmp mai2
mai4:clr C
mov A, Cmdh
subb A, #3
jnc mai5 ; Jump if command >= 3
; Program/erase
mov A, Cmdh
mov C, ACC.0
mov Bit_Reg.0, C
mov Paral, #ERRORPROG
clr C
mov A, DPL
subb A, #low(BOOT_START)
mov A, DPH
subb A, #high(BOOT_START)
jnc mai1 ; Jump if in bootloader segment
jb Bit_Reg.0, pro3 ; Jump if program command
; Erase flash
orl PSCTL, #02h ; Set the PSEE bit
orl PSCTL, #01h ; Set the PSWE bit
mov FLKEY, BL_Flash_Key_1 ; First key code
mov FLKEY, BL_Flash_Key_2 ; Second key code
movx @DPTR, A
jnb Bit_Reg.0, pro6 ; Jump if erase command
; Program flash
pro3:mov Xl, Byte_Cntl ; Set number of bytes
mov Xh, Byte_Cnth
inc Xl
inc Xh
orl PSCTL, #01h ; Set the PSWE bit
anl PSCTL, #0FDh ; Clear the PSEE bit
pro4:djnz Xl, pro5
djnz Xh, pro5
ajmp pro6
pro5:
clr C
mov A, DPH ; Check that address is not in bootloader area
subb A, #1Ch
jc ($+5)
inc DPTR ; Increment flash address
ajmp pro4
movx A, @Xl ; Read from XRAM
mov FLKEY, BL_Flash_Key_1 ; First key code
mov FLKEY, BL_Flash_Key_2 ; Second key code
movx @DPTR, A ; Write to flash
inc DPTR ; Increment flash address
ajmp pro4
pro6:anl PSCTL, #0FCh ; Clear the PSEE and PSWE bits
ajmp main ; Successfully done erase or program
; Read flash
mai5:mov Paral, #ERRORCOMMAND ; Illegal command
cjne Cmdh, #3, mai6 ; Jump if not read flash command
rd1: clr A
movc A, @A+DPTR ; Read from flash
inc DPTR ; Increment flash address
mov Paral, A
acall putp
djnz Cmdl, rd1 ; Decrement bytes to read
acall putw ; CRC
ajmp main
mai6:ajmp mai1
; Send char with crc
putw:mov Paral, Crcl
mov Parah, Crch
acall putc
mov A, Parah
mov Paral, A
putp:mov A, Paral
xrl Crcl, A
mov Bit_Cnt, #8
put1:clr C
mov A, Crch
rrc A
mov Crch, A
mov A, Crcl
rrc A
mov Crcl, A
jnc put2
xrl Crch, #high(POLYNOM)
xrl Crcl, #low(POLYNOM)
put2:djnz Bit_Cnt, put1
; Send char
putc:acall waitf
acall waitf
mov Bit_Cnt, #10
mov A, Paral
cpl A
put3:jb Bit_Reg.1, ($+5)
setb RTX_PORT.RTX_PIN ; Set pin high
jnb Bit_Reg.1, ($+5)
clr RTX_PORT.RTX_PIN ; Set pin low
acall waitf
clr C
rrc A
jc put4
clr Bit_Reg.1
put4:djnz Bit_Cnt, put3
ret
; Receive char/word
getw:acall getc
mov A, Paral
mov Parah, A
getc:jb RTX_PORT.RTX_PIN, ($+5) ; Wait for high
ajmp getc
get1:jnb RTX_PORT.RTX_PIN, ($+5) ; Wait for low
ajmp get1
getx:mov Bit_Cnt, #8
mov Cntl, Baudl
mov Cnth, Baudh
clr C
mov A, Cnth ; Wait half a baud
rrc A
mov Cnth, A
mov A, Cntl
rrc A
mov Cntl, A
acall waith
get2:acall waitf ; Wait one baud
clr C
mov A, Paral
rrc A
jnb RTX_PORT.RTX_PIN, ($+5)
orl A, #080h
mov Paral, A
jnb ACC.7, ($+6)
xrl Crcl, #low(POLYNOM)
clr C
mov A, Crch
rrc A
mov Crch, A
mov A, Crcl
rrc A
mov Crcl, A
jnc get3
xrl Crch, #high(POLYNOM)
xrl Crcl, #low(POLYNOM)
get3:djnz Bit_Cnt, get2
mov A, Crcl
xrl A, Crch
xrl A, Crch
mov Crcl, A
ret
; UART delays
waitf:mov Cntl, Baudl
mov Cnth, Baudh
waith:inc Cntl
inc Cnth
wait1:djnz Cntl, wait1
djnz Cnth, wait1
setb Bit_Reg.1
ret
BOOT_SIGN: DB "BLHeli"
BOOT_MSG: DB "471d" ; Interface-MCU_BootlaoderRevision
BOOT_INFO: DB SIGNATURE_001, SIGNATURE_002, BOOT_VERSION, BOOT_PAGES

329
BLHeliPgm.inc

@ -0,0 +1,329 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; BLHeliTxPgm SiLabs
;
; EEPROM is not available in SiLabs MCUs
; Therefore a segment of the flash is used as "EEPROM"
;
;**** **** **** **** ****
;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Read all eeprom parameters routine
;
; No assumptions
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
read_all_eeprom_parameters:
; Check initialized signature
mov DPTR, #Eep_Initialized_L
mov Temp1, #Bit_Access
call read_eeprom_byte
mov A, Bit_Access
cjne A, #055h, read_eeprom_store_defaults
inc DPTR ; Now Eep_Initialized_H
call read_eeprom_byte
mov A, Bit_Access
cjne A, #0AAh, read_eeprom_store_defaults
jmp read_eeprom_read
read_eeprom_store_defaults:
mov Flash_Key_1, #0A5h
mov Flash_Key_2, #0F1h
call set_default_parameters
call erase_and_store_all_in_eeprom
mov Flash_Key_1, #0
mov Flash_Key_2, #0
jmp read_eeprom_exit
read_eeprom_read:
; Read eeprom
mov DPTR, #_Eep_Pgm_Gov_P_Gain
mov Temp1, #_Pgm_Gov_P_Gain
mov Temp4, #10
read_eeprom_block1:
call read_eeprom_byte
inc DPTR
inc Temp1
djnz Temp4, read_eeprom_block1
mov DPTR, #Eep_Enable_TX_Program
mov Temp1, #Pgm_Enable_TX_Program
mov Temp4, #26 ; 26 parameters
read_eeprom_block2:
call read_eeprom_byte
inc DPTR
inc Temp1
djnz Temp4, read_eeprom_block2
mov DPTR, #Eep_Dummy ; Set pointer to uncritical area
read_eeprom_exit:
ret
;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Erase flash and store all parameter value in EEPROM routine
;
; No assumptions
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
erase_and_store_all_in_eeprom:
clr IE_EA ; Disable interrupts
call read_tags
call erase_flash ; Erase flash
mov DPTR, #Eep_FW_Main_Revision ; Store firmware main revision
mov A, #EEPROM_FW_MAIN_REVISION
call write_eeprom_byte_from_acc
inc DPTR ; Now firmware sub revision
mov A, #EEPROM_FW_SUB_REVISION
call write_eeprom_byte_from_acc
inc DPTR ; Now layout revision
mov A, #EEPROM_LAYOUT_REVISION
call write_eeprom_byte_from_acc
; Write eeprom
mov DPTR, #_Eep_Pgm_Gov_P_Gain
mov Temp1, #_Pgm_Gov_P_Gain
mov Temp4, #10
write_eeprom_block1:
call write_eeprom_byte
inc DPTR
inc Temp1
djnz Temp4, write_eeprom_block1
mov DPTR, #Eep_Enable_TX_Program
mov Temp1, #Pgm_Enable_TX_Program
mov Temp4, #26 ; 26 parameters
write_eeprom_block2:
call write_eeprom_byte
inc DPTR
inc Temp1
djnz Temp4, write_eeprom_block2
call write_tags
call write_eeprom_signature
mov DPTR, #Eep_Dummy ; Set pointer to uncritical area
ret
;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Read eeprom byte routine
;
; Gives data in A and in address given by Temp1. Assumes address in DPTR
; Also assumes address high byte to be zero
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
read_eeprom_byte:
clr A
movc A, @A+DPTR ; Read from flash
mov @Temp1, A
ret
;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Write eeprom byte routine
;
; Assumes data in address given by Temp1, or in accumulator. Assumes address in DPTR
; Also assumes address high byte to be zero
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
write_eeprom_byte:
mov A, @Temp1
write_eeprom_byte_from_acc:
orl PSCTL, #01h ; Set the PSWE bit
anl PSCTL, #0FDh ; Clear the PSEE bit
mov Temp8, A
clr C
mov A, DPH ; Check that address is not in bootloader area
subb A, #1Ch
jc ($+3)
ret
mov A, Temp8
mov FLKEY, Flash_Key_1 ; First key code
mov FLKEY, Flash_Key_2 ; Second key code
movx @DPTR, A ; Write to flash
anl PSCTL, #0FEh ; Clear the PSWE bit
ret
;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Erase flash routine (erases the flash segment used for "eeprom" variables)
;
; No assumptions
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
erase_flash:
orl PSCTL, #02h ; Set the PSEE bit
orl PSCTL, #01h ; Set the PSWE bit
mov FLKEY, Flash_Key_1 ; First key code
mov FLKEY, Flash_Key_2 ; Second key code
mov DPTR, #Eep_Initialized_L
movx @DPTR, A
anl PSCTL, #0FCh ; Clear the PSEE and PSWE bits
ret
;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Write eeprom signature routine
;
; No assumptions
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
write_eeprom_signature:
mov DPTR, #Eep_Initialized_L
mov A, #055h
call write_eeprom_byte_from_acc
mov DPTR, #Eep_Initialized_H
mov A, #0AAh
call write_eeprom_byte_from_acc
ret
;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Read all tags from flash and store in temporary storage
;
; No assumptions
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
read_tags:
mov Temp3, #48 ; Number of tags
mov Temp2, #Temp_Storage ; Set RAM address
mov Temp1, #Bit_Access
mov DPTR, #Eep_ESC_Layout ; Set flash address
read_tag:
call read_eeprom_byte
mov A, Bit_Access
mov @Temp2, A ; Write to RAM
inc Temp2
inc DPTR
djnz Temp3, read_tag
ret
;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Write all tags from temporary storage and store in flash
;
; No assumptions
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
write_tags:
mov Temp3, #48 ; Number of tags
mov Temp2, #Temp_Storage ; Set RAM address
mov DPTR, #Eep_ESC_Layout ; Set flash address
write_tag:
mov A, @Temp2 ; Read from RAM
call write_eeprom_byte_from_acc
inc Temp2
inc DPTR
djnz Temp3, write_tag
ret
;**;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Wait 1 second routine
;
; No assumptions
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
wait1s:
mov Temp5, #5
wait1s_loop:
call wait200ms
djnz Temp5, wait1s_loop
ret
;**;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Success beep routine
;
; No assumptions
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
success_beep:
clr IE_EA ; Disable all interrupts
call beep_f1
call beep_f2
call beep_f3
call beep_f4
call wait10ms
call beep_f1
call beep_f2
call beep_f3
call beep_f4
call wait10ms
call beep_f1
call beep_f2
call beep_f3
call beep_f4
setb IE_EA ; Enable all interrupts
ret
;**;**** **** **** **** **** **** **** **** **** **** **** **** ****
;
; Success beep inverted routine
;
; No assumptions
;
;**** **** **** **** **** **** **** **** **** **** **** **** ****
success_beep_inverted:
clr IE_EA ; Disable all interrupts
call beep_f4
call beep_f3
call beep_f2
call beep_f1
call wait10ms
call beep_f4
call beep_f3
call beep_f2
call beep_f1
call wait10ms
call beep_f4
call beep_f3
call beep_f2
call beep_f1
setb IE_EA ; Enable all interrupts
ret

BIN
BLHeli_S manual SiLabs Rev16.x.pdf

4536
BLHeli_S.asm
File diff suppressed because it is too large
View File

560
C.inc

@ -0,0 +1,560 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "C"
; Ac Ap MC MB MA CC X RC X X X X Cc Cp Bc Bp
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#C_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#C_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#C_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#C_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#C_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#C_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#C_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#C_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#C_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#C_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#C_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#C_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#C_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#C_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#C_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#C_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#C_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#C_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#C_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#C_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#C_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#C_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 0 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
AcomFET EQU 7 ;o
ApwmFET EQU 6 ;o
Mux_C EQU 5 ;i
Mux_B EQU 4 ;i
Mux_A EQU 3 ;i
Comp_Com EQU 2 ;i
; EQU 1 ;i
Rcp_In EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU NOT((1 SHL ApwmFET)+(1 SHL AcomFET))
P0_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL AcomFET)
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #02h ; Damping inverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
; EQU 5 ;i
; EQU 4 ;i
CcomFET EQU 3 ;o
CpwmFET EQU 2 ;o
BcomFET EQU 1 ;o
BpwmFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 0Fh
ApwmFET_on MACRO
setb P0.ApwmFET
IF FETON_DELAY == 0
setb P0.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P0.ApwmFET
ELSE
clr P0.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P0.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P0.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P0.ApwmFET
ENDIF
setb P0.AcomFET
ENDM
AcomFET_off MACRO
clr P0.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P0.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P0.AcomFET
mov P0SKIP, #0BFh
mov P1SKIP, #0Fh
ELSE
mov P0SKIP, #03Fh
mov P1SKIP, #0Fh
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P0SKIP, #0FFh
mov P1SKIP, #0Eh
ELSE
mov P0SKIP, #0FFh
mov P1SKIP, #0Ch
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P0SKIP, #0FFh
mov P1SKIP, #0Bh
ELSE
mov P0SKIP, #0FFh
mov P1SKIP, #03h
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P0SKIP, #0FFh
mov P1SKIP, #0Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #32h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #42h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #52h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

674
COPYING

@ -0,0 +1,674 @@
GNU GENERAL PUBLIC LICENSE
Version 3, 29 June 2007
Copyright (C) 2007 Free Software Foundation, Inc. <http://fsf.org/>
Everyone is permitted to copy and distribute verbatim copies
of this license document, but changing it is not allowed.
Preamble
The GNU General Public License is a free, copyleft license for
software and other kinds of works.
The licenses for most software and other practical works are designed
to take away your freedom to share and change the works. By contrast,
the GNU General Public License is intended to guarantee your freedom to
share and change all versions of a program--to make sure it remains free
software for all its users. We, the Free Software Foundation, use the
GNU General Public License for most of our software; it applies also to
any other work released this way by its authors. You can apply it to
your programs, too.
When we speak of free software, we are referring to freedom, not
price. Our General Public Licenses are designed to make sure that you
have the freedom to distribute copies of free software (and charge for
them if you wish), that you receive source code or can get it if you
want it, that you can change the software or use pieces of it in new
free programs, and that you know you can do these things.
To protect your rights, we need to prevent others from denying you
these rights or asking you to surrender the rights. Therefore, you have
certain responsibilities if you distribute copies of the software, or if
you modify it: responsibilities to respect the freedom of others.
For example, if you distribute copies of such a program, whether
gratis or for a fee, you must pass on to the recipients the same
freedoms that you received. You must make sure that they, too, receive
or can get the source code. And you must show them these terms so they
know their rights.
Developers that use the GNU GPL protect your rights with two steps:
(1) assert copyright on the software, and (2) offer you this License
giving you legal permission to copy, distribute and/or modify it.
For the developers' and authors' protection, the GPL clearly explains
that there is no warranty for this free software. For both users' and
authors' sake, the GPL requires that modified versions be marked as
changed, so that their problems will not be attributed erroneously to
authors of previous versions.
Some devices are designed to deny users access to install or run
modified versions of the software inside them, although the manufacturer
can do so. This is fundamentally incompatible with the aim of
protecting users' freedom to change the software. The systematic
pattern of such abuse occurs in the area of products for individuals to
use, which is precisely where it is most unacceptable. Therefore, we
have designed this version of the GPL to prohibit the practice for those
products. If such problems arise substantially in other domains, we
stand ready to extend this provision to those domains in future versions
of the GPL, as needed to protect the freedom of users.
Finally, every program is threatened constantly by software patents.
States should not allow patents to restrict development and use of
software on general-purpose computers, but in those that do, we wish to
avoid the special danger that patents applied to a free program could
make it effectively proprietary. To prevent this, the GPL assures that
patents cannot be used to render the program non-free.
The precise terms and conditions for copying, distribution and
modification follow.
TERMS AND CONDITIONS
0. Definitions.
"This License" refers to version 3 of the GNU General Public License.
"Copyright" also means copyright-like laws that apply to other kinds of
works, such as semiconductor masks.
"The Program" refers to any copyrightable work licensed under this
License. Each licensee is addressed as "you". "Licensees" and
"recipients" may be individuals or organizations.
To "modify" a work means to copy from or adapt all or part of the work
in a fashion requiring copyright permission, other than the making of an
exact copy. The resulting work is called a "modified version" of the
earlier work or a work "based on" the earlier work.
A "covered work" means either the unmodified Program or a work based
on the Program.
To "propagate" a work means to do anything with it that, without
permission, would make you directly or secondarily liable for
infringement under applicable copyright law, except executing it on a
computer or modifying a private copy. Propagation includes copying,
distribution (with or without modification), making available to the
public, and in some countries other activities as well.
To "convey" a work means any kind of propagation that enables other
parties to make or receive copies. Mere interaction with a user through
a computer network, with no transfer of a copy, is not conveying.
An interactive user interface displays "Appropriate Legal Notices"
to the extent that it includes a convenient and prominently visible
feature that (1) displays an appropriate copyright notice, and (2)
tells the user that there is no warranty for the work (except to the
extent that warranties are provided), that licensees may convey the
work under this License, and how to view a copy of this License. If
the interface presents a list of user commands or options, such as a
menu, a prominent item in the list meets this criterion.
1. Source Code.
The "source code" for a work means the preferred form of the work
for making modifications to it. "Object code" means any non-source
form of a work.
A "Standard Interface" means an interface that either is an official
standard defined by a recognized standards body, or, in the case of
interfaces specified for a particular programming language, one that
is widely used among developers working in that language.
The "System Libraries" of an executable work include anything, other
than the work as a whole, that (a) is included in the normal form of
packaging a Major Component, but which is not part of that Major
Component, and (b) serves only to enable use of the work with that
Major Component, or to implement a Standard Interface for which an
implementation is available to the public in source code form. A
"Major Component", in this context, means a major essential component
(kernel, window system, and so on) of the specific operating system
(if any) on which the executable work runs, or a compiler used to
produce the work, or an object code interpreter used to run it.
The "Corresponding Source" for a work in object code form means all
the source code needed to generate, install, and (for an executable
work) run the object code and to modify the work, including scripts to
control those activities. However, it does not include the work's
System Libraries, or general-purpose tools or generally available free
programs which are used unmodified in performing those activities but
which are not part of the work. For example, Corresponding Source
includes interface definition files associated with source files for
the work, and the source code for shared libraries and dynamically
linked subprograms that the work is specifically designed to require,
such as by intimate data communication or control flow between those
subprograms and other parts of the work.
The Corresponding Source need not include anything that users
can regenerate automatically from other parts of the Corresponding
Source.
The Corresponding Source for a work in source code form is that
same work.
2. Basic Permissions.
All rights granted under this License are granted for the term of
copyright on the Program, and are irrevocable provided the stated
conditions are met. This License explicitly affirms your unlimited
permission to run the unmodified Program. The output from running a
covered work is covered by this License only if the output, given its
content, constitutes a covered work. This License acknowledges your
rights of fair use or other equivalent, as provided by copyright law.
You may make, run and propagate covered works that you do not
convey, without conditions so long as your license otherwise remains
in force. You may convey covered works to others for the sole purpose
of having them make modifications exclusively for you, or provide you
with facilities for running those works, provided that you comply with
the terms of this License in conveying all material for which you do
not control copyright. Those thus making or running the covered works
for you must do so exclusively on your behalf, under your direction
and control, on terms that prohibit them from making any copies of
your copyrighted material outside their relationship with you.
Conveying under any other circumstances is permitted solely under
the conditions stated below. Sublicensing is not allowed; section 10
makes it unnecessary.
3. Protecting Users' Legal Rights From Anti-Circumvention Law.
No covered work shall be deemed part of an effective technological
measure under any applicable law fulfilling obligations under article
11 of the WIPO copyright treaty adopted on 20 December 1996, or
similar laws prohibiting or restricting circumvention of such
measures.
When you convey a covered work, you waive any legal power to forbid
circumvention of technological measures to the extent such circumvention
is effected by exercising rights under this License with respect to
the covered work, and you disclaim any intention to limit operation or
modification of the work as a means of enforcing, against the work's
users, your or third parties' legal rights to forbid circumvention of
technological measures.
4. Conveying Verbatim Copies.
You may convey verbatim copies of the Program's source code as you
receive it, in any medium, provided that you conspicuously and
appropriately publish on each copy an appropriate copyright notice;
keep intact all notices stating that this License and any
non-permissive terms added in accord with section 7 apply to the code;
keep intact all notices of the absence of any warranty; and give all
recipients a copy of this License along with the Program.
You may charge any price or no price for each copy that you convey,
and you may offer support or warranty protection for a fee.
5. Conveying Modified Source Versions.
You may convey a work based on the Program, or the modifications to
produce it from the Program, in the form of source code under the
terms of section 4, provided that you also meet all of these conditions:
a) The work must carry prominent notices stating that you modified
it, and giving a relevant date.
b) The work must carry prominent notices stating that it is
released under this License and any conditions added under section
7. This requirement modifies the requirement in section 4 to
"keep intact all notices".
c) You must license the entire work, as a whole, under this
License to anyone who comes into possession of a copy. This
License will therefore apply, along with any applicable section 7
additional terms, to the whole of the work, and all its parts,
regardless of how they are packaged. This License gives no
permission to license the work in any other way, but it does not
invalidate such permission if you have separately received it.
d) If the work has interactive user interfaces, each must display
Appropriate Legal Notices; however, if the Program has interactive
interfaces that do not display Appropriate Legal Notices, your
work need not make them do so.
A compilation of a covered work with other separate and independent
works, which are not by their nature extensions of the covered work,
and which are not combined with it such as to form a larger program,
in or on a volume of a storage or distribution medium, is called an
"aggregate" if the compilation and its resulting copyright are not
used to limit the access or legal rights of the compilation's users
beyond what the individual works permit. Inclusion of a covered work
in an aggregate does not cause this License to apply to the other
parts of the aggregate.
6. Conveying Non-Source Forms.
You may convey a covered work in object code form under the terms
of sections 4 and 5, provided that you also convey the
machine-readable Corresponding Source under the terms of this License,
in one of these ways:
a) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by the
Corresponding Source fixed on a durable physical medium
customarily used for software interchange.
b) Convey the object code in, or embodied in, a physical product
(including a physical distribution medium), accompanied by a
written offer, valid for at least three years and valid for as
long as you offer spare parts or customer support for that product
model, to give anyone who possesses the object code either (1) a
copy of the Corresponding Source for all the software in the
product that is covered by this License, on a durable physical
medium customarily used for software interchange, for a price no
more than your reasonable cost of physically performing this
conveying of source, or (2) access to copy the
Corresponding Source from a network server at no charge.
c) Convey individual copies of the object code with a copy of the
written offer to provide the Corresponding Source. This
alternative is allowed only occasionally and noncommercially, and
only if you received the object code with such an offer, in accord
with subsection 6b.
d) Convey the object code by offering access from a designated
place (gratis or for a charge), and offer equivalent access to the
Corresponding Source in the same way through the same place at no
further charge. You need not require recipients to copy the
Corresponding Source along with the object code. If the place to
copy the object code is a network server, the Corresponding Source
may be on a different server (operated by you or a third party)
that supports equivalent copying facilities, provided you maintain
clear directions next to the object code saying where to find the
Corresponding Source. Regardless of what server hosts the
Corresponding Source, you remain obligated to ensure that it is
available for as long as needed to satisfy these requirements.
e) Convey the object code using peer-to-peer transmission, provided
you inform other peers where the object code and Corresponding
Source of the work are being offered to the general public at no
charge under subsection 6d.
A separable portion of the object code, whose source code is excluded
from the Corresponding Source as a System Library, need not be
included in conveying the object code work.
A "User Product" is either (1) a "consumer product", which means any
tangible personal property which is normally used for personal, family,
or household purposes, or (2) anything designed or sold for incorporation
into a dwelling. In determining whether a product is a consumer product,
doubtful cases shall be resolved in favor of coverage. For a particular
product received by a particular user, "normally used" refers to a
typical or common use of that class of product, regardless of the status
of the particular user or of the way in which the particular user
actually uses, or expects or is expected to use, the product. A product
is a consumer product regardless of whether the product has substantial
commercial, industrial or non-consumer uses, unless such uses represent
the only significant mode of use of the product.
"Installation Information" for a User Product means any methods,
procedures, authorization keys, or other information required to install
and execute modified versions of a covered work in that User Product from
a modified version of its Corresponding Source. The information must
suffice to ensure that the continued functioning of the modified object
code is in no case prevented or interfered with solely because
modification has been made.
If you convey an object code work under this section in, or with, or
specifically for use in, a User Product, and the conveying occurs as
part of a transaction in which the right of possession and use of the
User Product is transferred to the recipient in perpetuity or for a
fixed term (regardless of how the transaction is characterized), the
Corresponding Source conveyed under this section must be accompanied
by the Installation Information. But this requirement does not apply
if neither you nor any third party retains the ability to install
modified object code on the User Product (for example, the work has
been installed in ROM).
The requirement to provide Installation Information does not include a
requirement to continue to provide support service, warranty, or updates
for a work that has been modified or installed by the recipient, or for
the User Product in which it has been modified or installed. Access to a
network may be denied when the modification itself materially and
adversely affects the operation of the network or violates the rules and
protocols for communication across the network.
Corresponding Source conveyed, and Installation Information provided,
in accord with this section must be in a format that is publicly
documented (and with an implementation available to the public in
source code form), and must require no special password or key for
unpacking, reading or copying.
7. Additional Terms.
"Additional permissions" are terms that supplement the terms of this
License by making exceptions from one or more of its conditions.
Additional permissions that are applicable to the entire Program shall
be treated as though they were included in this License, to the extent
that they are valid under applicable law. If additional permissions
apply only to part of the Program, that part may be used separately
under those permissions, but the entire Program remains governed by
this License without regard to the additional permissions.
When you convey a copy of a covered work, you may at your option
remove any additional permissions from that copy, or from any part of
it. (Additional permissions may be written to require their own
removal in certain cases when you modify the work.) You may place
additional permissions on material, added by you to a covered work,
for which you have or can give appropriate copyright permission.
Notwithstanding any other provision of this License, for material you
add to a covered work, you may (if authorized by the copyright holders of
that material) supplement the terms of this License with terms:
a) Disclaiming warranty or limiting liability differently from the
terms of sections 15 and 16 of this License; or
b) Requiring preservation of specified reasonable legal notices or
author attributions in that material or in the Appropriate Legal
Notices displayed by works containing it; or
c) Prohibiting misrepresentation of the origin of that material, or
requiring that modified versions of such material be marked in
reasonable ways as different from the original version; or
d) Limiting the use for publicity purposes of names of licensors or
authors of the material; or
e) Declining to grant rights under trademark law for use of some
trade names, trademarks, or service marks; or
f) Requiring indemnification of licensors and authors of that
material by anyone who conveys the material (or modified versions of
it) with contractual assumptions of liability to the recipient, for
any liability that these contractual assumptions directly impose on
those licensors and authors.
All other non-permissive additional terms are considered "further
restrictions" within the meaning of section 10. If the Program as you
received it, or any part of it, contains a notice stating that it is
governed by this License along with a term that is a further
restriction, you may remove that term. If a license document contains
a further restriction but permits relicensing or conveying under this
License, you may add to a covered work material governed by the terms
of that license document, provided that the further restriction does
not survive such relicensing or conveying.
If you add terms to a covered work in accord with this section, you
must place, in the relevant source files, a statement of the
additional terms that apply to those files, or a notice indicating
where to find the applicable terms.
Additional terms, permissive or non-permissive, may be stated in the
form of a separately written license, or stated as exceptions;
the above requirements apply either way.
8. Termination.
You may not propagate or modify a covered work except as expressly
provided under this License. Any attempt otherwise to propagate or
modify it is void, and will automatically terminate your rights under
this License (including any patent licenses granted under the third
paragraph of section 11).
However, if you cease all violation of this License, then your
license from a particular copyright holder is reinstated (a)
provisionally, unless and until the copyright holder explicitly and
finally terminates your license, and (b) permanently, if the copyright
holder fails to notify you of the violation by some reasonable means
prior to 60 days after the cessation.
Moreover, your license from a particular copyright holder is
reinstated permanently if the copyright holder notifies you of the
violation by some reasonable means, this is the first time you have
received notice of violation of this License (for any work) from that
copyright holder, and you cure the violation prior to 30 days after
your receipt of the notice.
Termination of your rights under this section does not terminate the
licenses of parties who have received copies or rights from you under
this License. If your rights have been terminated and not permanently
reinstated, you do not qualify to receive new licenses for the same
material under section 10.
9. Acceptance Not Required for Having Copies.
You are not required to accept this License in order to receive or
run a copy of the Program. Ancillary propagation of a covered work
occurring solely as a consequence of using peer-to-peer transmission
to receive a copy likewise does not require acceptance. However,
nothing other than this License grants you permission to propagate or
modify any covered work. These actions infringe copyright if you do
not accept this License. Therefore, by modifying or propagating a
covered work, you indicate your acceptance of this License to do so.
10. Automatic Licensing of Downstream Recipients.
Each time you convey a covered work, the recipient automatically
receives a license from the original licensors, to run, modify and
propagate that work, subject to this License. You are not responsible
for enforcing compliance by third parties with this License.
An "entity transaction" is a transaction transferring control of an
organization, or substantially all assets of one, or subdividing an
organization, or merging organizations. If propagation of a covered
work results from an entity transaction, each party to that
transaction who receives a copy of the work also receives whatever
licenses to the work the party's predecessor in interest had or could
give under the previous paragraph, plus a right to possession of the
Corresponding Source of the work from the predecessor in interest, if
the predecessor has it or can get it with reasonable efforts.
You may not impose any further restrictions on the exercise of the
rights granted or affirmed under this License. For example, you may
not impose a license fee, royalty, or other charge for exercise of
rights granted under this License, and you may not initiate litigation
(including a cross-claim or counterclaim in a lawsuit) alleging that
any patent claim is infringed by making, using, selling, offering for
sale, or importing the Program or any portion of it.
11. Patents.
A "contributor" is a copyright holder who authorizes use under this
License of the Program or a work on which the Program is based. The
work thus licensed is called the contributor's "contributor version".
A contributor's "essential patent claims" are all patent claims
owned or controlled by the contributor, whether already acquired or
hereafter acquired, that would be infringed by some manner, permitted
by this License, of making, using, or selling its contributor version,
but do not include claims that would be infringed only as a
consequence of further modification of the contributor version. For
purposes of this definition, "control" includes the right to grant
patent sublicenses in a manner consistent with the requirements of
this License.
Each contributor grants you a non-exclusive, worldwide, royalty-free
patent license under the contributor's essential patent claims, to
make, use, sell, offer for sale, import and otherwise run, modify and
propagate the contents of its contributor version.
In the following three paragraphs, a "patent license" is any express
agreement or commitment, however denominated, not to enforce a patent
(such as an express permission to practice a patent or covenant not to
sue for patent infringement). To "grant" such a patent license to a
party means to make such an agreement or commitment not to enforce a
patent against the party.
If you convey a covered work, knowingly relying on a patent license,
and the Corresponding Source of the work is not available for anyone
to copy, free of charge and under the terms of this License, through a
publicly available network server or other readily accessible means,
then you must either (1) cause the Corresponding Source to be so
available, or (2) arrange to deprive yourself of the benefit of the
patent license for this particular work, or (3) arrange, in a manner
consistent with the requirements of this License, to extend the patent
license to downstream recipients. "Knowingly relying" means you have
actual knowledge that, but for the patent license, your conveying the
covered work in a country, or your recipient's use of the covered work
in a country, would infringe one or more identifiable patents in that
country that you have reason to believe are valid.
If, pursuant to or in connection with a single transaction or
arrangement, you convey, or propagate by procuring conveyance of, a
covered work, and grant a patent license to some of the parties
receiving the covered work authorizing them to use, propagate, modify
or convey a specific copy of the covered work, then the patent license
you grant is automatically extended to all recipients of the covered
work and works based on it.
A patent license is "discriminatory" if it does not include within
the scope of its coverage, prohibits the exercise of, or is
conditioned on the non-exercise of one or more of the rights that are
specifically granted under this License. You may not convey a covered
work if you are a party to an arrangement with a third party that is
in the business of distributing software, under which you make payment
to the third party based on the extent of your activity of conveying
the work, and under which the third party grants, to any of the
parties who would receive the covered work from you, a discriminatory
patent license (a) in connection with copies of the covered work
conveyed by you (or copies made from those copies), or (b) primarily
for and in connection with specific products or compilations that
contain the covered work, unless you entered into that arrangement,
or that patent license was granted, prior to 28 March 2007.
Nothing in this License shall be construed as excluding or limiting
any implied license or other defenses to infringement that may
otherwise be available to you under applicable patent law.
12. No Surrender of Others' Freedom.
If conditions are imposed on you (whether by court order, agreement or
otherwise) that contradict the conditions of this License, they do not
excuse you from the conditions of this License. If you cannot convey a
covered work so as to satisfy simultaneously your obligations under this
License and any other pertinent obligations, then as a consequence you may
not convey it at all. For example, if you agree to terms that obligate you
to collect a royalty for further conveying from those to whom you convey
the Program, the only way you could satisfy both those terms and this
License would be to refrain entirely from conveying the Program.
13. Use with the GNU Affero General Public License.
Notwithstanding any other provision of this License, you have
permission to link or combine any covered work with a work licensed
under version 3 of the GNU Affero General Public License into a single
combined work, and to convey the resulting work. The terms of this
License will continue to apply to the part which is the covered work,
but the special requirements of the GNU Affero General Public License,
section 13, concerning interaction through a network will apply to the
combination as such.
14. Revised Versions of this License.
The Free Software Foundation may publish revised and/or new versions of
the GNU General Public License from time to time. Such new versions will
be similar in spirit to the present version, but may differ in detail to
address new problems or concerns.
Each version is given a distinguishing version number. If the
Program specifies that a certain numbered version of the GNU General
Public License "or any later version" applies to it, you have the
option of following the terms and conditions either of that numbered
version or of any later version published by the Free Software
Foundation. If the Program does not specify a version number of the
GNU General Public License, you may choose any version ever published
by the Free Software Foundation.
If the Program specifies that a proxy can decide which future
versions of the GNU General Public License can be used, that proxy's
public statement of acceptance of a version permanently authorizes you
to choose that version for the Program.
Later license versions may give you additional or different
permissions. However, no additional obligations are imposed on any
author or copyright holder as a result of your choosing to follow a
later version.
15. Disclaimer of Warranty.
THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY
APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT
HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY
OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO,
THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM
IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF
ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
16. Limitation of Liability.
IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING
WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS
THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY
GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE
USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF
DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD
PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS),
EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF
SUCH DAMAGES.
17. Interpretation of Sections 15 and 16.
If the disclaimer of warranty and limitation of liability provided
above cannot be given local legal effect according to their terms,
reviewing courts shall apply local law that most closely approximates
an absolute waiver of all civil liability in connection with the
Program, unless a warranty or assumption of liability accompanies a
copy of the Program in return for a fee.
END OF TERMS AND CONDITIONS
How to Apply These Terms to Your New Programs
If you develop a new program, and you want it to be of the greatest
possible use to the public, the best way to achieve this is to make it
free software which everyone can redistribute and change under these terms.
To do so, attach the following notices to the program. It is safest
to attach them to the start of each source file to most effectively
state the exclusion of warranty; and each file should have at least
the "copyright" line and a pointer to where the full notice is found.
<one line to give the program's name and a brief idea of what it does.>
Copyright (C) <year> <name of author>
This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program. If not, see <http://www.gnu.org/licenses/>.
Also add information on how to contact you by electronic and paper mail.
If the program does terminal interaction, make it output a short
notice like this when it starts in an interactive mode:
<program> Copyright (C) <year> <name of author>
This program comes with ABSOLUTELY NO WARRANTY; for details type `show w'.
This is free software, and you are welcome to redistribute it
under certain conditions; type `show c' for details.
The hypothetical commands `show w' and `show c' should show the appropriate
parts of the General Public License. Of course, your program's commands
might be different; for a GUI interface, you would use an "about box".
You should also get your employer (if you work as a programmer) or school,
if any, to sign a "copyright disclaimer" for the program, if necessary.
For more information on this, and how to apply and follow the GNU GPL, see
<http://www.gnu.org/licenses/>.
The GNU General Public License does not permit incorporating your program
into proprietary programs. If your program is a subroutine library, you
may consider it more useful to permit linking proprietary applications with
the library. If this is what you want to do, use the GNU Lesser General
Public License instead of this License. But first, please read
<http://www.gnu.org/philosophy/why-not-lgpl.html>.

553
D.inc

@ -0,0 +1,553 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "D". Com fets are active low for H/L_N driver and EN_N/PWM driver
; X X RC X CC MA MC MB X X Cc Cp Bc Bp Ac Ap
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#D_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#D_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#D_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#D_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#D_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#D_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#D_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#D_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#D_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#D_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#D_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#D_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#D_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#D_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#D_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#D_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#D_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#D_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#D_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#D_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#D_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#D_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 5 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
Rcp_In EQU 5 ;i
; EQU 4 ;i
Comp_Com EQU 3 ;i
Mux_A EQU 2 ;i
Mux_C EQU 1 ;i
Mux_B EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #00h ; Damping noninverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
CcomFET EQU 5 ;o
CpwmFET EQU 4 ;o
BcomFET EQU 3 ;o
BpwmFET EQU 2 ;o
AcomFET EQU 1 ;o
ApwmFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU (1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 3Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
clr P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
setb P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
clr P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
setb P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
clr P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
setb P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
setb P1.AcomFET
setb P1.BcomFET
setb P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
clr P1.AcomFET
ENDM
AcomFET_off MACRO
setb P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
clr P1.BcomFET
ENDM
BcomFET_off MACRO
setb P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
clr P1.CcomFET
ENDM
CcomFET_off MACRO
setb P1.CcomFET
ENDM
All_comFETs_Off MACRO
setb P1.AcomFET
setb P1.BcomFET
setb P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
clr P1.AcomFET
mov P1SKIP, #3Eh
ELSE
mov P1SKIP, #3Ch
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
clr P1.BcomFET
mov P1SKIP, #3Bh
ELSE
mov P1SKIP, #33h
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
clr P1.CcomFET
mov P1SKIP, #2Fh
ELSE
mov P1SKIP, #0Fh
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #3Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #23h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #03h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #13h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

27
Dshotprog spec BLHeli_S.txt

@ -0,0 +1,27 @@
0 DSHOT_CMD_MOTOR_STOP, // Currently not implemented
1 DSHOT_CMD_BEEP1, // Wait at least length of beep (380ms) before next command
2 DSHOT_CMD_BEEP2, // Wait at least length of beep (380ms) before next command
3 DSHOT_CMD_BEEP3, // Wait at least length of beep (400ms) before next command
4 DSHOT_CMD_BEEP4, // Wait at least length of beep (400ms) before next command
5 DSHOT_CMD_BEEP5, // Wait at least length of beep (400ms) before next command
6 DSHOT_CMD_ESC_INFO, // Currently not implemented
7 DSHOT_CMD_SPIN_DIRECTION_1, // Need 6x, no wait required
8 DSHOT_CMD_SPIN_DIRECTION_2, // Need 6x, no wait required
9 DSHOT_CMD_3D_MODE_OFF, // Need 6x, no wait required
10 DSHOT_CMD_3D_MODE_ON, // Need 6x, no wait required
11 DSHOT_CMD_SETTINGS_REQUEST, // Currently not implemented
12 DSHOT_CMD_SAVE_SETTINGS, // Need 6x, wait at least 12ms before next command
20 DSHOT_CMD_SPIN_DIRECTION_NORMAL, // Need 6x, no wait required
21 DSHOT_CMD_SPIN_DIRECTION_REVERSED, // Need 6x, no wait required
22 DSHOT_CMD_LED0_ON, // Currently not implemented
23 DSHOT_CMD_LED1_ON, // Currently not implemented
24 DSHOT_CMD_LED2_ON, // Currently not implemented
25 DSHOT_CMD_LED3_ON, // Currently not implemented
26 DSHOT_CMD_LED0_OFF, // Currently not implemented
27 DSHOT_CMD_LED1_OFF, // Currently not implemented
28 DSHOT_CMD_LED2_OFF, // Currently not implemented
29 DSHOT_CMD_LED3_OFF, // Currently not implemented
DSHOT_CMD_MAX = 47

566
E.inc

@ -0,0 +1,566 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "E". Equals "A", but with LED control. And with HIP2103/4 driver initialization
; L1 L0 RC X MC MB MA CC X L2 Cc Cp Bc Bp Ac Ap
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#E_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#E_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#E_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#E_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#E_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#E_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#E_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#E_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#E_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#E_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#E_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#E_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#E_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#E_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#E_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#E_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#E_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#E_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#E_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#E_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#E_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#E_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 5 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
LED_1 EQU 7 ;o
LED_0 EQU 6 ;o
Rcp_In EQU 5 ;i
; EQU 4 ;i
Mux_C EQU 3 ;i
Mux_B EQU 2 ;i
Mux_A EQU 1 ;i
Comp_Com EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU NOT((1 SHL LED_0)+(1 SHL LED_1))
P0_PUSHPULL EQU (1 SHL LED_0)+(1 SHL LED_1)
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #02h ; Damping inverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
LED_2 EQU 6 ;o
CcomFET EQU 5 ;o
CpwmFET EQU 4 ;o
BcomFET EQU 3 ;o
BpwmFET EQU 2 ;o
AcomFET EQU 1 ;o
ApwmFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)+(1 SHL LED_2)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)+(1 SHL LED_2)
P1_SKIP EQU 7Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #7Eh
ELSE
mov P1SKIP, #7Ch
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #7Bh
ELSE
mov P1SKIP, #73h
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #6Fh
ELSE
mov P1SKIP, #4Fh
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #7Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #10h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #20h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #30h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
All_pwmFETs_off ; For unlocking of HIP2103/4 driver circuits
call wait100ms
AcomFET_on
BcomFET_on
CcomFET_on
call wait1ms
All_comFETs_off
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
setb P0.LED_0
ENDM
Clear_LED_0 MACRO
clr P0.LED_0
ENDM
Set_LED_1 MACRO
setb P0.LED_1
ENDM
Clear_LED_1 MACRO
clr P0.LED_1
ENDM
Set_LED_2 MACRO
setb P1.LED_2
ENDM
Clear_LED_2 MACRO
clr P1.LED_2
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

553
F.inc

@ -0,0 +1,553 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "F". Equals "A", but with Mux_A and Mux_C swapped
; X X RC X MA MB MC CC X X Cc Cp Bc Bp Ac Ap
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#F_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#F_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#F_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#F_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#F_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#F_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#F_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#F_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#F_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#F_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#F_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#F_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#F_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#F_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#F_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#F_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#F_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#F_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#F_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#F_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#F_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#F_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 5 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
Rcp_In EQU 5 ;i
; EQU 4 ;i
Mux_A EQU 3 ;i
Mux_B EQU 2 ;i
Mux_C EQU 1 ;i
Comp_Com EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #02h ; Damping inverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
CcomFET EQU 5 ;o
CpwmFET EQU 4 ;o
BcomFET EQU 3 ;o
BpwmFET EQU 2 ;o
AcomFET EQU 1 ;o
ApwmFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 3Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #3Eh
ELSE
mov P1SKIP, #3Ch
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #3Bh
ELSE
mov P1SKIP, #33h
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #2Fh
ELSE
mov P1SKIP, #0Fh
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #3Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #30h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #20h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #10h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

553
G.inc

@ -0,0 +1,553 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "G"
; X X RC X CC MA MC MB X X Cc Cp Bc Bp Ac Ap
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#G_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#G_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#G_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#G_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#G_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#G_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#G_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#G_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#G_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#G_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#G_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#G_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#G_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#G_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#G_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#G_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#G_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#G_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#G_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#G_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#G_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#G_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 5 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
Rcp_In EQU 5 ;i
; EQU 4 ;i
Comp_Com EQU 3 ;i
Mux_A EQU 2 ;i
Mux_C EQU 1 ;i
Mux_B EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #02h ; Damping inverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
CcomFET EQU 5 ;o
CpwmFET EQU 4 ;o
BcomFET EQU 3 ;o
BpwmFET EQU 2 ;o
AcomFET EQU 1 ;o
ApwmFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 3Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #3Eh
ELSE
mov P1SKIP, #3Ch
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #3Bh
ELSE
mov P1SKIP, #33h
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #2Fh
ELSE
mov P1SKIP, #0Fh
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #3Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #23h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #03h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #13h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

558
H.inc

@ -0,0 +1,558 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "H".
; RC X X X MA MB CC MC X Ap Bp Cp X Ac Bc Cc
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#H_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#H_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#H_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#H_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#H_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#H_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#H_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#H_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#H_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#H_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#H_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#H_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#H_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#H_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#H_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#H_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#H_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#H_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#H_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#H_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#H_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#H_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 7 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
Rcp_In EQU 7 ;i
; EQU 6 ;i
; EQU 5 ;i
; EQU 4 ;i
Mux_A EQU 3 ;i
Mux_B EQU 2 ;i
Comp_Com EQU 1 ;i
Mux_C EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
IF FETON_DELAY == 0
mov PCA0POL, #00h ; Pwm noninverted
ELSE
mov PCA0POL, #01h ; Damping inverted, pwm noninverted
ENDIF
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO ; CCF interrupt is only used for FETON_DELAY == 0
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
ApwmFET EQU 6 ;o
BpwmFET EQU 5 ;o
CpwmFET EQU 4 ;o
; EQU 3 ;i
AcomFET EQU 2 ;o
BcomFET EQU 1 ;o
CcomFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 7Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #3Fh
ELSE
mov P1SKIP, #3Bh
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #5Fh
ELSE
mov P1SKIP, #5Dh
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #6Fh
ELSE
mov P1SKIP, #6Eh
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #7Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #31h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #21h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #01h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

552
I.inc

@ -0,0 +1,552 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "I"
; X X RC X MC MB MA CC X X Ac Bc Cc Ap Bp Cp
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#I_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#I_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#I_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#I_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#I_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#I_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#I_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#I_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#I_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#I_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#I_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#I_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#I_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#I_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#I_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#I_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#I_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#I_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#I_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#I_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#I_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#I_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 5 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
Rcp_In EQU 5 ;i
; EQU 4 ;i
Mux_C EQU 3 ;i
Mux_B EQU 2 ;i
Mux_A EQU 1 ;i
Comp_Com EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #02h ; Damping inverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
AcomFET EQU 5 ;o
BcomFET EQU 4 ;o
CcomFET EQU 3 ;o
ApwmFET EQU 2 ;o
BpwmFET EQU 1 ;o
CpwmFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 3Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #3Bh
ELSE
mov P1SKIP, #1Bh
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #3Dh
ELSE
mov P1SKIP, #2Dh
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #3Eh
ELSE
mov P1SKIP, #36h
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #7Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #10h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #20h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #30h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

558
J.inc

@ -0,0 +1,558 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "J"
; L2 L1 L0 RC CC MB MC MA X X Cc Bc Ac Cp Bp Ap
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#J_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#J_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#J_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#J_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#J_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#J_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#J_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#J_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#J_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#J_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#J_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#J_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#J_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#J_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#J_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#J_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#J_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#J_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#J_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#J_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#J_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#J_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 4 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
LED_2 EQU 7 ;o
LED_1 EQU 6 ;o
LED_0 EQU 5 ;o
Rcp_In EQU 4 ;i
Comp_Com EQU 3 ;i
Mux_B EQU 2 ;i
Mux_C EQU 1 ;i
Mux_A EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU (1 SHL LED_0)+(1 SHL LED_1)+(1 SHL LED_2)
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #02h ; Damping inverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
CcomFET EQU 5 ;o
BcomFET EQU 4 ;o
AcomFET EQU 3 ;o
CpwmFET EQU 2 ;o
BpwmFET EQU 1 ;o
ApwmFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 3Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #3Eh
ELSE
mov P1SKIP, #36h
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #3Dh
ELSE
mov P1SKIP, #2Dh
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #3Bh
ELSE
mov P1SKIP, #1Bh
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #7Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #03h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #23h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #13h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
clr P0.LED_0
ENDM
Clear_LED_0 MACRO
setb P0.LED_0
ENDM
Set_LED_1 MACRO
clr P0.LED_1
ENDM
Clear_LED_1 MACRO
setb P0.LED_1
ENDM
Set_LED_2 MACRO
clr P0.LED_2
ENDM
Clear_LED_2 MACRO
setb P0.LED_2
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

554
K.inc

@ -0,0 +1,554 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "K". Com fets are active low for H/L_N driver and EN_N/PWM driver
; X X MC X MB CC MA RC X X Ap Bp Cp Cc Bc Ac Com fets inverted
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#K_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#K_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#K_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#K_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#K_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#K_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#K_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#K_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#K_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#K_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#K_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#K_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#K_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#K_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#K_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#K_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#K_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#K_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#K_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#K_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#K_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#K_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 0 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
Mux_C EQU 5 ;i
; EQU 4 ;i
Mux_B EQU 3 ;i
Comp_Com EQU 2 ;i
Mux_A EQU 1 ;i
Rcp_In EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #00h ; Damping noninverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO ; CCF interrupt is only used for FETON_DELAY == 0
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
ApwmFET EQU 5 ;o
BpwmFET EQU 4 ;o
CpwmFET EQU 3 ;o
CcomFET EQU 2 ;o
BcomFET EQU 1 ;o
AcomFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU (1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 3Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
clr P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
setb P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
clr P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
setb P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
clr P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
setb P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
setb P1.AcomFET
setb P1.BcomFET
setb P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
clr P1.AcomFET
ENDM
AcomFET_off MACRO
setb P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
clr P1.BcomFET
ENDM
BcomFET_off MACRO
setb P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
clr P1.CcomFET
ENDM
CcomFET_off MACRO
setb P1.CcomFET
ENDM
All_comFETs_Off MACRO
setb P1.AcomFET
setb P1.BcomFET
setb P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
clr P1.AcomFET
mov P1SKIP, #1Fh
ELSE
mov P1SKIP, #1Eh
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
clr P1.BcomFET
mov P1SKIP, #2Fh
ELSE
mov P1SKIP, #2Dh
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
clr P1.CcomFET
mov P1SKIP, #37h
ELSE
mov P1SKIP, #33h
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #3Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #12h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #32h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #52h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

552
L.inc

@ -0,0 +1,552 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "L"
; X X RC X CC MA MB MC X X Ac Bc Cc Ap Bp Cp
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#L_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#L_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#L_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#L_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#L_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#L_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#L_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#L_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#L_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#L_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#L_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#L_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#L_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#L_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#L_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#L_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#L_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#L_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#L_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#L_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#L_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#L_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 5 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
Rcp_In EQU 5 ;i
; EQU 4 ;i
Comp_Com EQU 3 ;i
Mux_A EQU 2 ;i
Mux_B EQU 1 ;i
Mux_C EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #02h ; Damping inverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
AcomFET EQU 5 ;o
BcomFET EQU 4 ;o
CcomFET EQU 3 ;o
ApwmFET EQU 2 ;o
BpwmFET EQU 1 ;o
CpwmFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 3Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #3Bh
ELSE
mov P1SKIP, #1Bh
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #3Dh
ELSE
mov P1SKIP, #2Dh
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #3Eh
ELSE
mov P1SKIP, #36h
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #7Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #23h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #13h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #03h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

557
M.inc

@ -0,0 +1,557 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "M".
; MA MC CC MB RC L0 X X X Cc Bc Ac Cp Bp Ap X
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#M_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#M_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#M_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#M_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#M_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#M_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#M_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#M_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#M_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#M_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#M_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#M_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#M_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#M_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#M_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#M_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#M_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#M_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#M_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#M_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#M_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#M_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 3 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
Mux_A EQU 7 ;i
Mux_C EQU 6 ;i
Comp_Com EQU 5 ;i
Mux_B EQU 4 ;i
Rcp_In EQU 3 ;i
LED_0 EQU 2 ;i
; EQU 1 ;i
; EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU NOT(1 SHL LED_0)
P0_PUSHPULL EQU (1 SHL LED_0)
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #02h ; Damping inverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
CcomFET EQU 6 ;o
BcomFET EQU 5 ;o
AcomFET EQU 4 ;o
CpwmFET EQU 3 ;i
BpwmFET EQU 2 ;o
ApwmFET EQU 1 ;o
; EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 7Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #7Dh
ELSE
mov P1SKIP, #6Dh
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #7Bh
ELSE
mov P1SKIP, #5Bh
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #77h
ELSE
mov P1SKIP, #37h
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #7Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #75h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #45h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #65h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
setb P0.LED_0
ENDM
Clear_LED_0 MACRO
clr P0.LED_0
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

267
MakeHexfiles.bat

@ -0,0 +1,267 @@
@ECHO off
@ECHO ***** Batch file for BlHeli_S (from 4712) v.2 *****
@ECHO ***** All Messages will be saved to MakeHex_Result.txt *****
@ECHO ***** Start compile with any key - CTRL-C to abort *****
Break ON
@pause
DEL MakeHex_Result.txt /Q
rem ***** Adapt settings to your enviroment ****
DEL Output\Hex\*.* /Q
RMDIR Output\Hex
DEL Output\*.* /Q
RMDIR Output
MKDIR Output
MKDIR Output\Hex
SET Revision=REV16_7
SET KeilPath=C:\SiliconLabs\SimplicityStudio\v4\developer\toolchains\keil_8051\9.53\BIN
@ECHO Revision: %Revision% >> MakeHex_Result.txt
@ECHO Path for Keil toolchain: %KeilPath% >> MakeHex_Result.txt
@ECHO Start compile ..... >> MakeHex_Result.txt
SET ESCNO=1
SET ESC=A_L_
SET MCU_48MHZ=0
call:compile
SET ESC=A_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=B_L_
SET MCU_48MHZ=0
call:compile
SET ESC=B_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=C_L_
SET MCU_48MHZ=0
call:compile
SET ESC=C_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=D_L_
SET MCU_48MHZ=0
call:compile
SET ESC=D_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=E_L_
SET MCU_48MHZ=0
call:compile
SET ESC=E_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=F_L_
SET MCU_48MHZ=0
call:compile
SET ESC=F_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=G_L_
SET MCU_48MHZ=0
call:compile
SET ESC=G_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=H_L_
SET MCU_48MHZ=0
call:compile
SET ESC=H_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=I_L_
SET MCU_48MHZ=0
call:compile
SET ESC=I_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=J_L_
SET MCU_48MHZ=0
call:compile
SET ESC=J_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=K_L_
SET MCU_48MHZ=0
call:compile
SET ESC=K_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=L_L_
SET MCU_48MHZ=0
call:compile
SET ESC=L_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=M_L_
SET MCU_48MHZ=0
call:compile
SET ESC=M_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=N_L_
SET MCU_48MHZ=0
call:compile
SET ESC=N_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=O_L_
SET MCU_48MHZ=0
call:compile
SET ESC=O_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=P_L_
SET MCU_48MHZ=0
call:compile
SET ESC=P_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=Q_L_
SET MCU_48MHZ=0
call:compile
SET ESC=Q_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=R_L_
SET MCU_48MHZ=0
call:compile
SET ESC=R_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=S_L_
SET MCU_48MHZ=0
call:compile
SET ESC=S_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=T_L_
SET MCU_48MHZ=0
call:compile
SET ESC=T_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=U_L_
SET MCU_48MHZ=0
call:compile
SET ESC=U_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=V_L_
SET MCU_48MHZ=0
call:compile
SET ESC=V_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
SET ESC=W_L_
SET MCU_48MHZ=0
call:compile
SET ESC=W_H_
SET MCU_48MHZ=1
call:compile
SET /A ESCNO+=1
goto :end
:compile
SET FETON_DELAY=0
SET ESCNAME=%ESC%%FETON_DELAY%
call :compile_code
SET /A FETON_DELAY=5
SET ESCNAME=%ESC%%FETON_DELAY%
call :compile_code
SET /A FETON_DELAY=10
SET ESCNAME=%ESC%%FETON_DELAY%
call :compile_code
SET /A FETON_DELAY=15
SET ESCNAME=%ESC%%FETON_DELAY%
call :compile_code
SET /A FETON_DELAY=20
SET ESCNAME=%ESC%%FETON_DELAY%
call :compile_code
SET /A FETON_DELAY=25
SET ESCNAME=%ESC%%FETON_DELAY%
call :compile_code
SET /A FETON_DELAY=30
SET ESCNAME=%ESC%%FETON_DELAY%
call :compile_code
SET /A FETON_DELAY=40
SET ESCNAME=%ESC%%FETON_DELAY%
call :compile_code
SET /A FETON_DELAY=50
SET ESCNAME=%ESC%%FETON_DELAY%
call :compile_code
SET /A FETON_DELAY=70
SET ESCNAME=%ESC%%FETON_DELAY%
call :compile_code
SET /A FETON_DELAY=90
SET ESCNAME=%ESC%%FETON_DELAY%
call :compile_code
goto :eof
:compile_code
@ECHO compiling %ESCNAME%
@ECHO. >> MakeHex_Result.txt
@ECHO ******************************************************************** >> MakeHex_Result.txt
@ECHO %ESCNAME% >> MakeHex_Result.txt
@ECHO ******************************************************************** >> MakeHex_Result.txt
%KeilPath%\AX51.exe "BLHeli_S.asm" DEFINE(ESCNO=%ESCNO%) DEFINE(MCU_48MHZ=%MCU_48MHZ%) DEFINE(FETON_DELAY=%FETON_DELAY%) OBJECT(Output\%ESCNAME%_%Revision%.OBJ) DEBUG MACRO NOMOD51 COND SYMBOLS PAGEWIDTH(120) PAGELENGTH(65) >> MakeHex_Result.txt
%KeilPath%\LX51.exe "Output\%ESCNAME%_%Revision%.OBJ" TO "Output\%ESCNAME%_%Revision%.OMF" PAGEWIDTH (120) PAGELENGTH (65) >> MakeHex_Result.txt
%KeilPath%\Ohx51 "Output\%ESCNAME%_%Revision%.OMF" "HEXFILE (Output\%ESCNAME%_%Revision%.HEX)" "H386" >> MakeHex_Result.txt
copy "Output\%ESCNAME%_%Revision%.HEX" "Output\Hex\%ESCNAME%_%Revision%.HEX" > nul
del "Output\%ESCNAME%_%Revision%.HEX" > nul
@ECHO. >> MakeHex_Result.txt
goto :eof
:end
@pause
exit

127
Makefile

@ -0,0 +1,127 @@
# set current revision
REVISION ?= REV16_7
# targets
TARGETS = A B C D E F G H I J K L M N O P Q R S T U V W
MCUS = H L
FETON_DELAYS = 0 5 10 15 20 25 30 40 50 70 90
# example single target
VARIANT ?= A
MCU ?= H
FETON_DELAY ?= 5
# configure the script to use the wine installation delivered with
# SimplicityStudio. these wine settings are quite important. if you get
# ERROR L250: CODE SIZE LIMIT IN RESTRICTED VERSION EXCEEDED
# you messed up your simplicity studio install/path settins below:
SIMPLICITY_PATH ?= ~/local/SimplicityStudio_v4/
WINE_PREFIX ?= ~/.config/SimplicityStudio/v4/studio-wine
WINE_BIN ?= $(SIMPLICITY_PATH)/support/common/wine/usr/bin/wine
WINE = export WINEPREFIX=`realpath $(WINE_PREFIX)`; $(WINE_BIN)
# path to the keil binaries
KEIL_PATH = $(SIMPLICITY_PATH)/developer/toolchains/keil_8051/9.53/BIN
# some directory config
OUTPUT_DIR ?= build
OUTPUT_DIR_HEX ?= $(OUTPUT_DIR)/hex
LOG_DIR ?= $(OUTPUT_DIR)/log
# define the assembler/linker scripts
AX51_BIN = $(KEIL_PATH)/AX51.exe
LX51_BIN = $(KEIL_PATH)/LX51.exe
OX51_BIN = $(KEIL_PATH)/Ohx51.exe
AX51 = $(WINE) $(AX51_BIN)
LX51 = $(WINE) $(LX51_BIN)
OX51 = $(WINE) $(OX51_BIN)
# set up flags
AX51_FLAGS = DEBUG MACRO NOMOD51 COND SYMBOLS PAGEWIDTH(120) PAGELENGTH(65)
LX51_FLAGS = PAGEWIDTH (120) PAGELENGTH (65)
# set up sources
ASM_SRC = BLHeli_S.asm
ASM_INC = $(TARGETS:=.inc) BLHeliBootLoad.inc BLHeliPgm.inc SI_EFM8BB1_Defs.inc SI_EFM8BB2_Defs.inc
# check that wine/simplicity studio is available
EXECUTABLES = $(WINE_BIN) $(AX51_BIN) $(LX51_BIN) $(OX51_BIN)
DUMMYVAR := $(foreach exec, $(EXECUTABLES), \
$(if $(wildcard $(exec)),found, \
$(error "Could not find $(exec). Make sure to set the correct paths to the simplicity install location")))
# make sure the list of obj files is expanded twice
.SECONDEXPANSION:
OBJS =
define MAKE_OBJ
OBJS += $(OUTPUT_DIR)/$(1)_$(2)_$(3)_$(REVISION).OBJ
$(OUTPUT_DIR)/$(1)_$(2)_$(3)_$(REVISION).OBJ : $(ASM_SRC) $(ASM_INC)
$(eval _ESC := $(1))
$(eval _ESC_INT := $(shell printf "%d" "'${_ESC}"))
$(eval _ESCNO := $(shell echo $$(( $(_ESC_INT) - 65 + 1))))
$(eval _MCU_48MHZ := $(subst L,0,$(subst H,1,$(2))))
$(eval _FETON_DELAY := $(3))
$(eval _LOG := $(LOG_DIR)/$(1)_$(2)_$(3)_$(REVISION).log)
@mkdir -p $(OUTPUT_DIR)
@mkdir -p $(LOG_DIR)
@echo "AX51 : $$@"
@$(AX51) $(ASM_SRC) \
"DEFINE(ESCNO=$(_ESCNO)) " \
"DEFINE(MCU_48MHZ=$(_MCU_48MHZ)) "\
"DEFINE(FETON_DELAY=$(_FETON_DELAY)) "\
"OBJECT($$@) "\
"$(AX51_FLAGS)" >> $(_LOG) 2>&1; test $$$$? -lt 2 || tail $(_LOG)
endef
HEX_TARGETS = $(OBJS:.OBJ=.HEX)
EFM8_LOAD_BIN ?= efm8load.py
EFM8_LOAD_PORT ?= /dev/ttyUSB0
EFM8_LOAD_BAUD ?= 57600
SINGLE_TARGET_HEX = $(OUTPUT_DIR)/$(VARIANT)_$(MCU)_$(FETON_DELAY)_$(REVISION).HEX
single_target : $(SINGLE_TARGET_HEX)
all : $$(HEX_TARGETS)
@echo "\nbuild finished. built $(shell ls -l $(OUTPUT_DIR_HEX) | wc -l) hex targets\n"
# create all obj targets using macro expansion
$(foreach _e,$(TARGETS), \
$(foreach _m, $(MCUS), \
$(foreach _f, $(FETON_DELAYS), \
$(eval $(call MAKE_OBJ,$(_e),$(_m),$(_f))))))
$(OUTPUT_DIR)/%.OMF : $(OUTPUT_DIR)/%.OBJ
$(eval LOG := $(LOG_DIR)/$(basename $(notdir $@)).log)
@echo "LX51 : linking $< to $@"
@$(LX51) "$<" TO "$@" "$(LX51_FLAGS)" >> $(LOG) 2>&1; test $$? -lt 2 || tail $(LOG)
$(OUTPUT_DIR)/%.HEX : $(OUTPUT_DIR)/%.OMF
$(eval LOG := $(LOG_DIR)/$(basename $(notdir $@)).log)
@mkdir -p $(OUTPUT_DIR_HEX)
@echo "OHX : generating hex file $@"
@$(OX51) "$<" "HEXFILE ($@)" "H386" >> $(LOG) 2>&1; test $$? -lt 2 || tail $(LOG)
@cp $@ $(OUTPUT_DIR_HEX)/$(notdir $@)
help:
@echo ""
@echo "usage examples:"
@echo "================================================================="
@echo "make all # build all targets"
@echo "make VARIANT=A MCU=H FETON_DELAY=5 # to build a single target"
@echo
clean:
@rm -rf $(LOG_DIR)/*
@rm -rf $(OUTPUT_DIR)/*
efm8load: single_target
$(EFM8_LOAD_BIN) -p $(EFM8_LOAD_PORT) -b $(EFM8_LOAD_BAUD) -w $(SINGLE_TARGET_HEX)
.PHONY: all clean help efm8load

558
N.inc

@ -0,0 +1,558 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "N"
; X X RC X MC MB MA CC X X Cp Cc Bp Bc Ap Ac
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#N_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#N_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#N_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#N_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#N_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#N_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#N_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#N_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#N_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#N_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#N_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#N_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#N_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#N_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#N_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#N_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#N_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#N_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#N_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#N_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#N_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#N_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 5 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
Rcp_In EQU 5 ;i
; EQU 4 ;i
Mux_C EQU 3 ;i
Mux_B EQU 2 ;i
Mux_A EQU 1 ;i
Comp_Com EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
IF FETON_DELAY == 0
mov PCA0POL, #00h ; Pwm noninverted
ELSE
mov PCA0POL, #01h ; Damping inverted, pwm noninverted
ENDIF
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO ; CCF interrupt is only used for FETON_DELAY == 0
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
CpwmFET EQU 5 ;o
CcomFET EQU 4 ;o
BpwmFET EQU 3 ;o
BcomFET EQU 2 ;o
ApwmFET EQU 1 ;o
AcomFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 3Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #3Dh
ELSE
mov P1SKIP, #3Ch
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #37h
ELSE
mov P1SKIP, #33h
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #1Fh
ELSE
mov P1SKIP, #0Fh
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #3Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #10h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #20h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #30h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

554
O.inc

@ -0,0 +1,554 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "O". Com fets are active low for H/L_N driver and EN_N/PWM driver. Low side pwm and 1S flag set
; X X RC X CC MA MC MB X X Cc Cp Bc Bp Ac Ap
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#O_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#O_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#O_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#O_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#O_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#O_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#O_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#O_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#O_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#O_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#O_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#O_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#O_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#O_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#O_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#O_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#O_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#O_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#O_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#O_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#O_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#O_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 5 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
Rcp_In EQU 5 ;i
; EQU 4 ;i
Comp_Com EQU 3 ;i
Mux_A EQU 2 ;i
Mux_C EQU 1 ;i
Mux_B EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #00h ; Damping noninverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
CcomFET EQU 5 ;o
CpwmFET EQU 4 ;o
BcomFET EQU 3 ;o
BpwmFET EQU 2 ;o
AcomFET EQU 1 ;o
ApwmFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU (1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 3Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
clr P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
setb P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
clr P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
setb P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
clr P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
setb P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
setb P1.AcomFET
setb P1.BcomFET
setb P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
clr P1.AcomFET
ENDM
AcomFET_off MACRO
setb P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
clr P1.BcomFET
ENDM
BcomFET_off MACRO
setb P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
clr P1.CcomFET
ENDM
CcomFET_off MACRO
setb P1.CcomFET
ENDM
All_comFETs_Off MACRO
setb P1.AcomFET
setb P1.BcomFET
setb P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
clr P1.AcomFET
mov P1SKIP, #3Eh
ELSE
mov P1SKIP, #3Ch
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
clr P1.BcomFET
mov P1SKIP, #3Bh
ELSE
mov P1SKIP, #33h
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
clr P1.CcomFET
mov P1SKIP, #2Fh
ELSE
mov P1SKIP, #0Fh
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #3Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #23h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #03h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #13h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
cpl A
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

555
P.inc

@ -0,0 +1,555 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "P".
; X X RC MA CC MB MC X X Cc Bc Ac Cp Bp Ap X
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#P_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#P_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#P_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#P_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#P_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#P_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#P_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#P_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#P_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#P_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#P_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#P_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#P_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#P_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#P_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#P_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#P_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#P_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#P_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#P_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#P_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#P_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 5 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
Rcp_In EQU 5 ;i
Mux_A EQU 4 ;i
Comp_Com EQU 3 ;i
Mux_B EQU 2 ;i
Mux_C EQU 1 ;i
; EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #02h ; Damping inverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
CcomFET EQU 6 ;o
BcomFET EQU 5 ;o
AcomFET EQU 4 ;o
CpwmFET EQU 3 ;i
BpwmFET EQU 2 ;o
ApwmFET EQU 1 ;o
; EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 7Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #7Dh
ELSE
mov P1SKIP, #6Dh
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #7Bh
ELSE
mov P1SKIP, #5Bh
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #77h
ELSE
mov P1SKIP, #37h
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #7Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #43h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #23h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #13h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

564
Q.inc

@ -0,0 +1,564 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "Q"
; Cp Bp Ap L1 L0 X RC X X MA MB MC CC Cc Bc Ac
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#Q_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#Q_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#Q_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#Q_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#Q_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#Q_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#Q_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#Q_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#Q_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#Q_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#Q_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#Q_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#Q_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#Q_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#Q_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#Q_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#Q_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#Q_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#Q_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#Q_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#Q_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#Q_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 1 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
CpwmFET EQU 7 ;o
BpwmFET EQU 6 ;o
ApwmFET EQU 5 ;o
LED_1 EQU 4 ;i
LED_0 EQU 3 ;i
; EQU 2 ;i
Rcp_In EQU 1 ;i
; EQU 0 ;i
P0_DIGITAL EQU 0FFh
P0_INIT EQU (1 SHL Rcp_In)
P0_PUSHPULL EQU (1 SHL LED_0)+(1 SHL LED_1)+(1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #02h ; Damping inverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
Mux_A EQU 6 ;i
Mux_B EQU 5 ;i
Mux_C EQU 4 ;i
Comp_Com EQU 3 ;o
CcomFET EQU 2 ;o
BcomFET EQU 1 ;o
AcomFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 07h
ApwmFET_on MACRO
setb P0.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P0.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P0.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P0.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P0.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P0.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P0.ApwmFET
clr P0.BpwmFET
clr P0.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P0.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P0.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P0.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P0SKIP, #0DFh
mov P1SKIP, #07h
ELSE
mov P0SKIP, #0DFh
mov P1SKIP, #06h
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P0SKIP, #0BFh
mov P1SKIP, #07h
ELSE
mov P0SKIP, #0BFh
mov P1SKIP, #05h
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P0SKIP, #07Fh
mov P1SKIP, #07h
ELSE
mov P0SKIP, #07Fh
mov P1SKIP, #03h
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P0SKIP, #0FFh
mov P1SKIP, #07h
ENDM
Set_Comp_Phase_A MACRO
mov CMP1MX, #63h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP1MX, #53h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP1MX, #43h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP1CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP1CN0, #80h ; Comparator enabled, no hysteresis
mov CMP1MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
setb P0.LED_0
ENDM
Clear_LED_0 MACRO
clr P0.LED_0
ENDM
Set_LED_1 MACRO
setb P0.LED_1
ENDM
Clear_LED_1 MACRO
clr P0.LED_1
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

552
R.inc

@ -0,0 +1,552 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "R".
; X X RC X MC MB MA CC X X Ac Bc Cc Ap Bp Cp
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#R_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#R_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#R_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#R_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#R_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#R_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#R_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#R_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#R_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#R_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#R_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#R_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#R_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#R_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#R_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#R_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#R_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#R_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#R_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#R_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#R_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#R_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 5 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
Rcp_In EQU 5 ;i
; EQU 4 ;i
Mux_C EQU 3 ;i
Mux_B EQU 2 ;i
Mux_A EQU 1 ;i
Comp_Com EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #02h ; Damping inverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO ; CCF interrupt is only used for FETON_DELAY == 0
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
AcomFET EQU 5 ;o
BcomFET EQU 4 ;o
CcomFET EQU 3 ;o
ApwmFET EQU 2 ;o
BpwmFET EQU 1 ;o
CpwmFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 3Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #3Bh
ELSE
mov P1SKIP, #1Bh
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #3Dh
ELSE
mov P1SKIP, #2Dh
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #3Eh
ELSE
mov P1SKIP, #36h
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #3Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #10h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #20h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #30h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

16
README.md

@ -0,0 +1,16 @@
This tree contains BLHeli code for sensorless brushless motor electronic speed control (ESC) boards.
To view and use the files, click the "Clone or download" button on this page,
and then select "Download ZIP" to download the repository to your computer.
For flashing and configuration, download the BLHeliSuite PC software:
https://www.mediafire.com/folder/dx6kfaasyo24l/BLHeliSuite
For more information, check out these threads:
https://www.rcgroups.com/forums/showthread.php?2640796 (for BLHeli_S)
http://www.rcgroups.com/forums/showthread.php?t=2136895 (for BLHeli)
And look in the "BLHeli_32 ARM" folder for info on BLHeli_32.
October 2018,
Steffen Skaug

557
S.inc

@ -0,0 +1,557 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "S". like "O" but Com fets are active high, Pwm fets are active low
; X X RC X CC MA MC MB X X Cc Cp Bc Bp Ac Ap
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#S_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#S_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#S_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#S_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#S_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#S_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#S_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#S_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#S_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#S_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#S_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#S_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#S_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#S_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#S_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#S_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#S_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#S_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#S_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#S_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#S_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#S_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 5 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
Rcp_In EQU 5 ;i
; EQU 4 ;i
Comp_Com EQU 3 ;i
Mux_A EQU 2 ;i
Mux_C EQU 1 ;i
Mux_B EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
IF FETON_DELAY == 0
mov PCA0POL, #00h ; Pwm noninverted
ELSE
mov PCA0POL, #01h ; Damping inverted, pwm noninverted
ENDIF
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
CpwmFET EQU 5 ;o
CcomFET EQU 4 ;o
BpwmFET EQU 3 ;o
BcomFET EQU 2 ;o
ApwmFET EQU 1 ;o
AcomFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU (0 SHL AcomFET)+(0 SHL BcomFET)+(0 SHL CcomFET)
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 3Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #3Dh
ELSE
mov P1SKIP, #3Ch
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #37h
ELSE
mov P1SKIP, #33h
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #1Fh
ELSE
mov P1SKIP, #0Fh
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #3Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #23h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #03h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #13h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

323
SI_EFM8BB1_Defs.inc

@ -0,0 +1,323 @@
;------------------------------------------------------------------------------
; Copyright 2014 Silicon Laboratories, Inc.
; All rights reserved. This program and the accompanying materials
; are made available under the terms of the Silicon Laboratories End User
; License Agreement which accompanies this distribution, and is available at
; http://developer.silabs.com/legal/version/v11/Silicon_Labs_Software_License_Agreement.txt
; Original content and implementation provided by Silicon Laboratories.
;------------------------------------------------------------------------------
;Supported Devices:
; EFM8BB10F2G
; EFM8BB10F2I
; EFM8BB10F2Y
; EFM8BB10F4G
; EFM8BB10F4I
; EFM8BB10F4Y
; EFM8BB10F8G
; EFM8BB10F8G
; EFM8BB10F8G
; EFM8BB10F8I
; EFM8BB10F8I
; EFM8BB10F8I
; EFM8BB10F8Y
; EFM8BB10F8Y
; EFM8BB10F8Y
;-----------------------------------------------------------------------------
; Register Definitions
;-----------------------------------------------------------------------------
ACC DATA 0E0H; Accumulator
ADC0AC DATA 0B3H; ADC0 Accumulator Configuration
ADC0CF DATA 0BCH; ADC0 Configuration
ADC0CN0 DATA 0E8H; ADC0 Control 0
ADC0CN1 DATA 0B2H; ADC0 Control 1
ADC0GTH DATA 0C4H; ADC0 Greater-Than High Byte
ADC0GTL DATA 0C3H; ADC0 Greater-Than Low Byte
ADC0H DATA 0BEH; ADC0 Data Word High Byte
ADC0L DATA 0BDH; ADC0 Data Word Low Byte
ADC0LTH DATA 0C6H; ADC0 Less-Than High Byte
ADC0LTL DATA 0C5H; ADC0 Less-Than Low Byte
ADC0MX DATA 0BBH; ADC0 Multiplexer Selection
ADC0PWR DATA 0DFH; ADC0 Power Control
ADC0TK DATA 0B9H; ADC0 Burst Mode Track Time
B DATA 0F0H; B Register
CKCON0 DATA 08EH; Clock Control 0
CLKSEL DATA 0A9H; Clock Select
CMP0CN0 DATA 09BH; Comparator 0 Control 0
CMP0MD DATA 09DH; Comparator 0 Mode
CMP0MX DATA 09FH; Comparator 0 Multiplexer Selection
CMP1CN0 DATA 0BFH; Comparator 1 Control 0
CMP1MD DATA 0ABH; Comparator 1 Mode
CMP1MX DATA 0AAH; Comparator 1 Multiplexer Selection
CRC0AUTO DATA 0D2H; CRC0 Automatic Control
CRC0CN0 DATA 0CEH; CRC0 Control 0
CRC0CNT DATA 0D3H; CRC0 Automatic Flash Sector Count
CRC0DAT DATA 0DEH; CRC0 Data Output
CRC0FLIP DATA 0CFH; CRC0 Bit Flip
CRC0IN DATA 0DDH; CRC0 Data Input
DERIVID DATA 0ADH; Derivative Identification
DEVICEID DATA 0B5H; Device Identification
DPH DATA 083H; Data Pointer High
DPL DATA 082H; Data Pointer Low
EIE1 DATA 0E6H; Extended Interrupt Enable 1
EIP1 DATA 0F3H; Extended Interrupt Priority 1
FLKEY DATA 0B7H; Flash Lock and Key
HFO0CAL DATA 0C7H; High Frequency Oscillator 0 Calibration
IE DATA 0A8H; Interrupt Enable
IP DATA 0B8H; Interrupt Priority
IT01CF DATA 0E4H; INT0/INT1 Configuration
LFO0CN DATA 0B1H; Low Frequency Oscillator Control
P0 DATA 080H; Port 0 Pin Latch
P0MASK DATA 0FEH; Port 0 Mask
P0MAT DATA 0FDH; Port 0 Match
P0MDIN DATA 0F1H; Port 0 Input Mode
P0MDOUT DATA 0A4H; Port 0 Output Mode
P0SKIP DATA 0D4H; Port 0 Skip
P1 DATA 090H; Port 1 Pin Latch
P1MASK DATA 0EEH; Port 1 Mask
P1MAT DATA 0EDH; Port 1 Match
P1MDIN DATA 0F2H; Port 1 Input Mode
P1MDOUT DATA 0A5H; Port 1 Output Mode
P1SKIP DATA 0D5H; Port 1 Skip
P2 DATA 0A0H; Port 2 Pin Latch
P2MDOUT DATA 0A6H; Port 2 Output Mode
PCA0CENT DATA 09EH; PCA Center Alignment Enable
PCA0CLR DATA 09CH; PCA Comparator Clear Control
PCA0CN0 DATA 0D8H; PCA Control
PCA0CPH0 DATA 0FCH; PCA Channel 0 Capture Module High Byte
PCA0CPH1 DATA 0EAH; PCA Channel 1 Capture Module High Byte
PCA0CPH2 DATA 0ECH; PCA Channel 2 Capture Module High Byte
PCA0CPL0 DATA 0FBH; PCA Channel 0 Capture Module Low Byte
PCA0CPL1 DATA 0E9H; PCA Channel 1 Capture Module Low Byte
PCA0CPL2 DATA 0EBH; PCA Channel 2 Capture Module Low Byte
PCA0CPM0 DATA 0DAH; PCA Channel 0 Capture/Compare Mode
PCA0CPM1 DATA 0DBH; PCA Channel 1 Capture/Compare Mode
PCA0CPM2 DATA 0DCH; PCA Channel 2 Capture/Compare Mode
PCA0H DATA 0FAH; PCA Counter/Timer High Byte
PCA0L DATA 0F9H; PCA Counter/Timer Low Byte
PCA0MD DATA 0D9H; PCA Mode
PCA0POL DATA 096H; PCA Output Polarity
PCA0PWM DATA 0F7H; PCA PWM Configuration
PCON0 DATA 087H; Power Control
PRTDRV DATA 0F6H; Port Drive Strength
PSCTL DATA 08FH; Program Store Control
PSW DATA 0D0H; Program Status Word
REF0CN DATA 0D1H; Voltage Reference Control
REG0CN DATA 0C9H; Voltage Regulator 0 Control
REVID DATA 0B6H; Revision Identifcation
RSTSRC DATA 0EFH; Reset Source
SBUF0 DATA 099H; UART0 Serial Port Data Buffer
SCON0 DATA 098H; UART0 Serial Port Control
SMB0ADM DATA 0D6H; SMBus 0 Slave Address Mask
SMB0ADR DATA 0D7H; SMBus 0 Slave Address
SMB0CF DATA 0C1H; SMBus 0 Configuration
SMB0CN0 DATA 0C0H; SMBus 0 Control
SMB0DAT DATA 0C2H; SMBus 0 Data
SMB0TC DATA 0ACH; SMBus 0 Timing and Pin Control
SP DATA 081H; Stack Pointer
SPI0CFG DATA 0A1H; SPI0 Configuration
SPI0CKR DATA 0A2H; SPI0 Clock Rate
SPI0CN0 DATA 0F8H; SPI0 Control
SPI0DAT DATA 0A3H; SPI0 Data
TCON DATA 088H; Timer 0/1 Control
TH0 DATA 08CH; Timer 0 High Byte
TH1 DATA 08DH; Timer 1 High Byte
TL0 DATA 08AH; Timer 0 Low Byte
TL1 DATA 08BH; Timer 1 Low Byte
TMOD DATA 089H; Timer 0/1 Mode
TMR2CN0 DATA 0C8H; Timer 2 Control 0
TMR2H DATA 0CDH; Timer 2 High Byte
TMR2L DATA 0CCH; Timer 2 Low Byte
TMR2RLH DATA 0CBH; Timer 2 Reload High Byte
TMR2RLL DATA 0CAH; Timer 2 Reload Low Byte
TMR3CN0 DATA 091H; Timer 3 Control 0
TMR3H DATA 095H; Timer 3 High Byte
TMR3L DATA 094H; Timer 3 Low Byte
TMR3RLH DATA 093H; Timer 3 Reload High Byte
TMR3RLL DATA 092H; Timer 3 Reload Low Byte
VDM0CN DATA 0FFH; Supply Monitor Control
WDTCN DATA 097H; Watchdog Timer Control
XBR0 DATA 0E1H; Port I/O Crossbar 0
XBR1 DATA 0E2H; Port I/O Crossbar 1
XBR2 DATA 0E3H; Port I/O Crossbar 2
;------------------------------------------------------------------------------
; 16-bit Register Definitions (may not work on all compilers)
;------------------------------------------------------------------------------
ADC0GT DATA 0C3H ; ADC0 Greater-Than Low Byte
ADC0 DATA 0BDH ; ADC0 Data Word Low Byte
ADC0LT DATA 0C5H ; ADC0 Less-Than Low Byte
DP DATA 082H ; Data Pointer Low
PCA0CP0 DATA 0FBH ; PCA Channel 0 Capture Module Low Byte
PCA0CP1 DATA 0E9H ; PCA Channel 1 Capture Module Low Byte
PCA0CP2 DATA 0EBH ; PCA Channel 2 Capture Module Low Byte
PCA0 DATA 0F9H ; PCA Counter/Timer Low Byte
TMR2 DATA 0CCH ; Timer 2 Low Byte
TMR2RL DATA 0CAH ; Timer 2 Reload Low Byte
TMR3 DATA 094H ; Timer 3 Low Byte
TMR3RL DATA 092H ; Timer 3 Reload Low Byte
;------------------------------------------------------------------------------
; Indirect Register Definitions
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; Bit Definitions
;------------------------------------------------------------------------------
; ACC 0xE0 (Accumulator)
ACC_ACC0 BIT ACC.0 ; Accumulator Bit 0
ACC_ACC1 BIT ACC.1 ; Accumulator Bit 1
ACC_ACC2 BIT ACC.2 ; Accumulator Bit 2
ACC_ACC3 BIT ACC.3 ; Accumulator Bit 3
ACC_ACC4 BIT ACC.4 ; Accumulator Bit 4
ACC_ACC5 BIT ACC.5 ; Accumulator Bit 5
ACC_ACC6 BIT ACC.6 ; Accumulator Bit 6
ACC_ACC7 BIT ACC.7 ; Accumulator Bit 7
; ADC0CN0 0xE8 (ADC0 Control 0)
ADC0CN0_ADCM0 BIT ADC0CN0.0 ; Start of Conversion Mode Select Bit 0
ADC0CN0_ADCM1 BIT ADC0CN0.1 ; Start of Conversion Mode Select Bit 1
ADC0CN0_ADCM2 BIT ADC0CN0.2 ; Start of Conversion Mode Select Bit 2
ADC0CN0_ADWINT BIT ADC0CN0.3 ; Window Compare Interrupt Flag
ADC0CN0_ADBUSY BIT ADC0CN0.4 ; ADC Busy
ADC0CN0_ADINT BIT ADC0CN0.5 ; Conversion Complete Interrupt Flag
ADC0CN0_ADBMEN BIT ADC0CN0.6 ; Burst Mode Enable
ADC0CN0_ADEN BIT ADC0CN0.7 ; ADC Enable
; B 0xF0 (B Register)
B_B0 BIT B.0 ; B Register Bit 0
B_B1 BIT B.1 ; B Register Bit 1
B_B2 BIT B.2 ; B Register Bit 2
B_B3 BIT B.3 ; B Register Bit 3
B_B4 BIT B.4 ; B Register Bit 4
B_B5 BIT B.5 ; B Register Bit 5
B_B6 BIT B.6 ; B Register Bit 6
B_B7 BIT B.7 ; B Register Bit 7
; IE 0xA8 (Interrupt Enable)
IE_EX0 BIT IE.0 ; External Interrupt 0 Enable
IE_ET0 BIT IE.1 ; Timer 0 Interrupt Enable
IE_EX1 BIT IE.2 ; External Interrupt 1 Enable
IE_ET1 BIT IE.3 ; Timer 1 Interrupt Enable
IE_ES0 BIT IE.4 ; UART0 Interrupt Enable
IE_ET2 BIT IE.5 ; Timer 2 Interrupt Enable
IE_ESPI0 BIT IE.6 ; SPI0 Interrupt Enable
IE_EA BIT IE.7 ; All Interrupts Enable
; IP 0xB8 (Interrupt Priority)
IP_PX0 BIT IP.0 ; External Interrupt 0 Priority Control
IP_PT0 BIT IP.1 ; Timer 0 Interrupt Priority Control
IP_PX1 BIT IP.2 ; External Interrupt 1 Priority Control
IP_PT1 BIT IP.3 ; Timer 1 Interrupt Priority Control
IP_PS0 BIT IP.4 ; UART0 Interrupt Priority Control
IP_PT2 BIT IP.5 ; Timer 2 Interrupt Priority Control
IP_PSPI0 BIT IP.6 ; Serial Peripheral Interface (SPI0) Interrupt Priority Control
; P0 0x80 (Port 0 Pin Latch)
P0_B0 BIT P0.0 ; Port 0 Bit 0 Latch
P0_B1 BIT P0.1 ; Port 0 Bit 1 Latch
P0_B2 BIT P0.2 ; Port 0 Bit 2 Latch
P0_B3 BIT P0.3 ; Port 0 Bit 3 Latch
P0_B4 BIT P0.4 ; Port 0 Bit 4 Latch
P0_B5 BIT P0.5 ; Port 0 Bit 5 Latch
P0_B6 BIT P0.6 ; Port 0 Bit 6 Latch
P0_B7 BIT P0.7 ; Port 0 Bit 7 Latch
; P1 0x90 (Port 1 Pin Latch)
P1_B0 BIT P1.0 ; Port 1 Bit 0 Latch
P1_B1 BIT P1.1 ; Port 1 Bit 1 Latch
P1_B2 BIT P1.2 ; Port 1 Bit 2 Latch
P1_B3 BIT P1.3 ; Port 1 Bit 3 Latch
P1_B4 BIT P1.4 ; Port 1 Bit 4 Latch
P1_B5 BIT P1.5 ; Port 1 Bit 5 Latch
P1_B6 BIT P1.6 ; Port 1 Bit 6 Latch
P1_B7 BIT P1.7 ; Port 1 Bit 7 Latch
; P2 0xA0 (Port 2 Pin Latch)
P2_B0 BIT P2.0 ; Port 2 Bit 0 Latch
P2_B1 BIT P2.1 ; Port 2 Bit 1 Latch
; PCA0CN0 0xD8 (PCA Control)
PCA0CN0_CCF0 BIT PCA0CN0.0 ; PCA Module 0 Capture/Compare Flag
PCA0CN0_CCF1 BIT PCA0CN0.1 ; PCA Module 1 Capture/Compare Flag
PCA0CN0_CCF2 BIT PCA0CN0.2 ; PCA Module 2 Capture/Compare Flag
PCA0CN0_CR BIT PCA0CN0.6 ; PCA Counter/Timer Run Control
PCA0CN0_CF BIT PCA0CN0.7 ; PCA Counter/Timer Overflow Flag
; PSW 0xD0 (Program Status Word)
PSW_PARITY BIT PSW.0 ; Parity Flag
PSW_F1 BIT PSW.1 ; User Flag 1
PSW_OV BIT PSW.2 ; Overflow Flag
PSW_RS0 BIT PSW.3 ; Register Bank Select Bit 0
PSW_RS1 BIT PSW.4 ; Register Bank Select Bit 1
PSW_F0 BIT PSW.5 ; User Flag 0
PSW_AC BIT PSW.6 ; Auxiliary Carry Flag
PSW_CY BIT PSW.7 ; Carry Flag
; SCON0 0x98 (UART0 Serial Port Control)
SCON0_RI BIT SCON0.0 ; Receive Interrupt Flag
SCON0_TI BIT SCON0.1 ; Transmit Interrupt Flag
SCON0_RB8 BIT SCON0.2 ; Ninth Receive Bit
SCON0_TB8 BIT SCON0.3 ; Ninth Transmission Bit
SCON0_REN BIT SCON0.4 ; Receive Enable
SCON0_MCE BIT SCON0.5 ; Multiprocessor Communication Enable
SCON0_SMODE BIT SCON0.7 ; Serial Port 0 Operation Mode
; SMB0CN0 0xC0 (SMBus 0 Control)
SMB0CN0_SI BIT SMB0CN0.0 ; SMBus Interrupt Flag
SMB0CN0_ACK BIT SMB0CN0.1 ; SMBus Acknowledge
SMB0CN0_ARBLOST BIT SMB0CN0.2 ; SMBus Arbitration Lost Indicator
SMB0CN0_ACKRQ BIT SMB0CN0.3 ; SMBus Acknowledge Request
SMB0CN0_STO BIT SMB0CN0.4 ; SMBus Stop Flag
SMB0CN0_STA BIT SMB0CN0.5 ; SMBus Start Flag
SMB0CN0_TXMODE BIT SMB0CN0.6 ; SMBus Transmit Mode Indicator
SMB0CN0_MASTER BIT SMB0CN0.7 ; SMBus Master/Slave Indicator
; SPI0CN0 0xF8 (SPI0 Control)
SPI0CN0_SPIEN BIT SPI0CN0.0 ; SPI0 Enable
SPI0CN0_TXBMT BIT SPI0CN0.1 ; Transmit Buffer Empty
SPI0CN0_NSSMD0 BIT SPI0CN0.2 ; Slave Select Mode Bit 0
SPI0CN0_NSSMD1 BIT SPI0CN0.3 ; Slave Select Mode Bit 1
SPI0CN0_RXOVRN BIT SPI0CN0.4 ; Receive Overrun Flag
SPI0CN0_MODF BIT SPI0CN0.5 ; Mode Fault Flag
SPI0CN0_WCOL BIT SPI0CN0.6 ; Write Collision Flag
SPI0CN0_SPIF BIT SPI0CN0.7 ; SPI0 Interrupt Flag
; TCON 0x88 (Timer 0/1 Control)
TCON_IT0 BIT TCON.0 ; Interrupt 0 Type Select
TCON_IE0 BIT TCON.1 ; External Interrupt 0
TCON_IT1 BIT TCON.2 ; Interrupt 1 Type Select
TCON_IE1 BIT TCON.3 ; External Interrupt 1
TCON_TR0 BIT TCON.4 ; Timer 0 Run Control
TCON_TF0 BIT TCON.5 ; Timer 0 Overflow Flag
TCON_TR1 BIT TCON.6 ; Timer 1 Run Control
TCON_TF1 BIT TCON.7 ; Timer 1 Overflow Flag
; TMR2CN0 0xC8 (Timer 2 Control 0)
TMR2CN0_T2XCLK BIT TMR2CN0.0 ; Timer 2 External Clock Select
TMR2CN0_TR2 BIT TMR2CN0.2 ; Timer 2 Run Control
TMR2CN0_T2SPLIT BIT TMR2CN0.3 ; Timer 2 Split Mode Enable
TMR2CN0_TF2CEN BIT TMR2CN0.4 ; Timer 2 Capture Enable
TMR2CN0_TF2LEN BIT TMR2CN0.5 ; Timer 2 Low Byte Interrupt Enable
TMR2CN0_TF2L BIT TMR2CN0.6 ; Timer 2 Low Byte Overflow Flag
TMR2CN0_TF2H BIT TMR2CN0.7 ; Timer 2 High Byte Overflow Flag
;------------------------------------------------------------------------------
; Interrupt Definitions
;------------------------------------------------------------------------------
INT0_IRQn EQU 0 ; External Interrupt 0
TIMER0_IRQn EQU 1 ; Timer 0 Overflow
INT1_IRQn EQU 2 ; External Interrupt 1
TIMER1_IRQn EQU 3 ; Timer 1 Overflow
UART0_IRQn EQU 4 ; UART0
TIMER2_IRQn EQU 5 ; Timer 2 Overflow / Capture
SPI0_IRQn EQU 6 ; SPI0
SMBUS0_IRQn EQU 7 ; SMBus 0
PMATCH_IRQn EQU 8 ; Port Match
ADC0WC_IRQn EQU 9 ; ADC0 Window Compare
ADC0EOC_IRQn EQU 10 ; ADC0 End of Conversion
PCA0_IRQn EQU 11 ; PCA0
CMP0_IRQn EQU 12 ; Comparator 0
CMP1_IRQn EQU 13 ; Comparator 1
TIMER3_IRQn EQU 14 ; Timer 3 Overflow / Capture

431
SI_EFM8BB2_Defs.inc

@ -0,0 +1,431 @@
;------------------------------------------------------------------------------
; Copyright 2014 Silicon Laboratories, Inc.
; All rights reserved. This program and the accompanying materials
; are made available under the terms of the Silicon Laboratories End User
; License Agreement which accompanies this distribution, and is available at
; http://developer.silabs.com/legal/version/v11/Silicon_Labs_Software_License_Agreement.txt
; Original content and implementation provided by Silicon Laboratories.
;------------------------------------------------------------------------------
;Supported Devices:
; EFM8BB21F16G_QFN20
; EFM8BB21F16G_QSOP24
; EFM8BB21F16I_QFN20
; EFM8BB21F16I_QSOP24
; EFM8BB22F16G_QFN28
; EFM8BB22F16I_QFN28
;-----------------------------------------------------------------------------
; Register Definitions
;-----------------------------------------------------------------------------
ACC DATA 0E0H; Accumulator
ADC0AC DATA 0B3H; ADC0 Accumulator Configuration
ADC0CF DATA 0BCH; ADC0 Configuration
ADC0CN0 DATA 0E8H; ADC0 Control 0
ADC0CN1 DATA 0B2H; ADC0 Control 1
ADC0GTH DATA 0C4H; ADC0 Greater-Than High Byte
ADC0GTL DATA 0C3H; ADC0 Greater-Than Low Byte
ADC0H DATA 0BEH; ADC0 Data Word High Byte
ADC0L DATA 0BDH; ADC0 Data Word Low Byte
ADC0LTH DATA 0C6H; ADC0 Less-Than High Byte
ADC0LTL DATA 0C5H; ADC0 Less-Than Low Byte
ADC0MX DATA 0BBH; ADC0 Multiplexer Selection
ADC0PWR DATA 0DFH; ADC0 Power Control
ADC0TK DATA 0B9H; ADC0 Burst Mode Track Time
B DATA 0F0H; B Register
CKCON0 DATA 08EH; Clock Control 0
CKCON1 DATA 0A6H; Clock Control 1
CLKSEL DATA 0A9H; Clock Select
CMP0CN0 DATA 09BH; Comparator 0 Control 0
CMP0CN1 DATA 099H; Comparator 0 Control 1
CMP0MD DATA 09DH; Comparator 0 Mode
CMP0MX DATA 09FH; Comparator 0 Multiplexer Selection
CMP1CN0 DATA 0BFH; Comparator 1 Control 0
CMP1CN1 DATA 0ACH; Comparator 1 Control 1
CMP1MD DATA 0ABH; Comparator 1 Mode
CMP1MX DATA 0AAH; Comparator 1 Multiplexer Selection
CRC0CN0 DATA 0CEH; CRC0 Control 0
CRC0CN1 DATA 086H; CRC0 Control 1
CRC0CNT DATA 0D3H; CRC0 Automatic Flash Sector Count
CRC0DAT DATA 0DEH; CRC0 Data Output
CRC0FLIP DATA 0CFH; CRC0 Bit Flip
CRC0IN DATA 0DDH; CRC0 Data Input
CRC0ST DATA 0D2H; CRC0 Automatic Flash Sector Start
DERIVID DATA 0ADH; Derivative Identification
DEVICEID DATA 0B5H; Device Identification
DPH DATA 083H; Data Pointer High
DPL DATA 082H; Data Pointer Low
EIE1 DATA 0E6H; Extended Interrupt Enable 1
EIE2 DATA 0CEH; Extended Interrupt Enable 2
EIP1 DATA 0F3H; Extended Interrupt Priority 1 Low
EIP1H DATA 0F5H; Extended Interrupt Priority 1 High
EIP2 DATA 0F4H; Extended Interrupt Priority 2
EIP2H DATA 0F6H; Extended Interrupt Priority 2 High
EMI0CN DATA 0E7H; External Memory Interface Control
FLKEY DATA 0B7H; Flash Lock and Key
HFO0CAL DATA 0C7H; High Frequency Oscillator 0 Calibration
HFO1CAL DATA 0D6H; High Frequency Oscillator 1 Calibration
HFOCN DATA 0EFH; High Frequency Oscillator Control
I2C0CN0 DATA 0BAH; I2C0 Control
I2C0DIN DATA 0BCH; I2C0 Received Data
I2C0DOUT DATA 0BBH; I2C0 Transmit Data
I2C0FCN0 DATA 0ADH; I2C0 FIFO Control 0
I2C0FCN1 DATA 0ABH; I2C0 FIFO Control 1
I2C0FCT DATA 0F5H; I2C0 FIFO Count
I2C0SLAD DATA 0BDH; I2C0 Slave Address
I2C0STAT DATA 0B9H; I2C0 Status
IE DATA 0A8H; Interrupt Enable
IP DATA 0B8H; Interrupt Priority
IPH DATA 0F2H; Interrupt Priority High
IT01CF DATA 0E4H; INT0/INT1 Configuration
LFO0CN DATA 0B1H; Low Frequency Oscillator Control
P0 DATA 080H; Port 0 Pin Latch
P0MASK DATA 0FEH; Port 0 Mask
P0MAT DATA 0FDH; Port 0 Match
P0MDIN DATA 0F1H; Port 0 Input Mode
P0MDOUT DATA 0A4H; Port 0 Output Mode
P0SKIP DATA 0D4H; Port 0 Skip
P1 DATA 090H; Port 1 Pin Latch
P1MASK DATA 0EEH; Port 1 Mask
P1MAT DATA 0EDH; Port 1 Match
P1MDIN DATA 0F2H; Port 1 Input Mode
P1MDOUT DATA 0A5H; Port 1 Output Mode
P1SKIP DATA 0D5H; Port 1 Skip
P2 DATA 0A0H; Port 2 Pin Latch
P2MASK DATA 0FCH; Port 2 Mask
P2MAT DATA 0FBH; Port 2 Match
P2MDIN DATA 0F3H; Port 2 Input Mode
P2MDOUT DATA 0A6H; Port 2 Output Mode
P2SKIP DATA 0CCH; Port 2 Skip
P3 DATA 0B0H; Port 3 Pin Latch
P3MDIN DATA 0F4H; Port 3 Input Mode
P3MDOUT DATA 09CH; Port 3 Output Mode
PCA0CENT DATA 09EH; PCA Center Alignment Enable
PCA0CLR DATA 09CH; PCA Comparator Clear Control
PCA0CN0 DATA 0D8H; PCA Control
PCA0CPH0 DATA 0FCH; PCA Channel 0 Capture Module High Byte
PCA0CPH1 DATA 0EAH; PCA Channel 1 Capture Module High Byte
PCA0CPH2 DATA 0ECH; PCA Channel 2 Capture Module High Byte
PCA0CPL0 DATA 0FBH; PCA Channel 0 Capture Module Low Byte
PCA0CPL1 DATA 0E9H; PCA Channel 1 Capture Module Low Byte
PCA0CPL2 DATA 0EBH; PCA Channel 2 Capture Module Low Byte
PCA0CPM0 DATA 0DAH; PCA Channel 0 Capture/Compare Mode
PCA0CPM1 DATA 0DBH; PCA Channel 1 Capture/Compare Mode
PCA0CPM2 DATA 0DCH; PCA Channel 2 Capture/Compare Mode
PCA0H DATA 0FAH; PCA Counter/Timer High Byte
PCA0L DATA 0F9H; PCA Counter/Timer Low Byte
PCA0MD DATA 0D9H; PCA Mode
PCA0POL DATA 096H; PCA Output Polarity
PCA0PWM DATA 0F7H; PCA PWM Configuration
PCON0 DATA 087H; Power Control
PCON1 DATA 09AH; Power Control 1
PFE0CN DATA 0C1H; Prefetch Engine Control
PRTDRV DATA 0F6H; Port Drive Strength
PSCTL DATA 08FH; Program Store Control
PSW DATA 0D0H; Program Status Word
REF0CN DATA 0D1H; Voltage Reference Control
REG0CN DATA 0C9H; Voltage Regulator 0 Control
REG1CN DATA 0C6H; Voltage Regulator 1 Control
REVID DATA 0B6H; Revision Identifcation
RSTSRC DATA 0EFH; Reset Source
SBCON1 DATA 094H; UART1 Baud Rate Generator Control
SBRLH1 DATA 096H; UART1 Baud Rate Generator High Byte
SBRLL1 DATA 095H; UART1 Baud Rate Generator Low Byte
SBUF0 DATA 099H; UART0 Serial Port Data Buffer
SBUF1 DATA 092H; UART1 Serial Port Data Buffer
SCON0 DATA 098H; UART0 Serial Port Control
SCON1 DATA 0C8H; UART1 Serial Port Control
SFRPAGE DATA 0A7H; SFR Page
SFRPGCN DATA 0CFH; SFR Page Control
SFRSTACK DATA 0D7H; SFR Page Stack
SMB0ADM DATA 0D6H; SMBus 0 Slave Address Mask
SMB0ADR DATA 0D7H; SMBus 0 Slave Address
SMB0CF DATA 0C1H; SMBus 0 Configuration
SMB0CN0 DATA 0C0H; SMBus 0 Control
SMB0DAT DATA 0C2H; SMBus 0 Data
SMB0FCN0 DATA 0C3H; SMBus 0 FIFO Control 0
SMB0FCN1 DATA 0C4H; SMBus 0 FIFO Control 1
SMB0FCT DATA 0EFH; SMBus 0 FIFO Count
SMB0RXLN DATA 0C5H; SMBus 0 Receive Length Counter
SMB0TC DATA 0ACH; SMBus 0 Timing and Pin Control
SMOD1 DATA 093H; UART1 Mode
SP DATA 081H; Stack Pointer
SPI0CFG DATA 0A1H; SPI0 Configuration
SPI0CKR DATA 0A2H; SPI0 Clock Rate
SPI0CN0 DATA 0F8H; SPI0 Control
SPI0DAT DATA 0A3H; SPI0 Data
SPI0FCN0 DATA 09AH; SPI0 FIFO Control 0
SPI0FCN1 DATA 09BH; SPI0 FIFO Control 1
SPI0FCT DATA 0F7H; SPI0 FIFO Count
TCON DATA 088H; Timer 0/1 Control
TH0 DATA 08CH; Timer 0 High Byte
TH1 DATA 08DH; Timer 1 High Byte
TL0 DATA 08AH; Timer 0 Low Byte
TL1 DATA 08BH; Timer 1 Low Byte
TMOD DATA 089H; Timer 0/1 Mode
TMR2CN0 DATA 0C8H; Timer 2 Control 0
TMR2CN1 DATA 0FDH; Timer 2 Control 1
TMR2H DATA 0CDH; Timer 2 High Byte
TMR2L DATA 0CCH; Timer 2 Low Byte
TMR2RLH DATA 0CBH; Timer 2 Reload High Byte
TMR2RLL DATA 0CAH; Timer 2 Reload Low Byte
TMR3CN0 DATA 091H; Timer 3 Control 0
TMR3CN1 DATA 0FEH; Timer 3 Control 1
TMR3H DATA 095H; Timer 3 High Byte
TMR3L DATA 094H; Timer 3 Low Byte
TMR3RLH DATA 093H; Timer 3 Reload High Byte
TMR3RLL DATA 092H; Timer 3 Reload Low Byte
TMR4CN0 DATA 098H; Timer 4 Control 0
TMR4CN1 DATA 0FFH; Timer 4 Control 1
TMR4H DATA 0A5H; Timer 4 High Byte
TMR4L DATA 0A4H; Timer 4 Low Byte
TMR4RLH DATA 0A3H; Timer 4 Reload High Byte
TMR4RLL DATA 0A2H; Timer 4 Reload Low Byte
UART1FCN0 DATA 09DH; UART1 FIFO Control 0
UART1FCN1 DATA 0D8H; UART1 FIFO Control 1
UART1FCT DATA 0FAH; UART1 FIFO Count
UART1LIN DATA 09EH; UART1 LIN Configuration
VDM0CN DATA 0FFH; Supply Monitor Control
WDTCN DATA 097H; Watchdog Timer Control
XBR0 DATA 0E1H; Port I/O Crossbar 0
XBR1 DATA 0E2H; Port I/O Crossbar 1
XBR2 DATA 0E3H; Port I/O Crossbar 2
;------------------------------------------------------------------------------
; 16-bit Register Definitions (may not work on all compilers)
;------------------------------------------------------------------------------
ADC0GT DATA 0C3H ; ADC0 Greater-Than Low Byte
ADC0 DATA 0BDH ; ADC0 Data Word Low Byte
ADC0LT DATA 0C5H ; ADC0 Less-Than Low Byte
DP DATA 082H ; Data Pointer Low
PCA0CP0 DATA 0FBH ; PCA Channel 0 Capture Module Low Byte
PCA0CP1 DATA 0E9H ; PCA Channel 1 Capture Module Low Byte
PCA0CP2 DATA 0EBH ; PCA Channel 2 Capture Module Low Byte
PCA0 DATA 0F9H ; PCA Counter/Timer Low Byte
SBRL1 DATA 095H ; UART1 Baud Rate Generator Low Byte
TMR2 DATA 0CCH ; Timer 2 Low Byte
TMR2RL DATA 0CAH ; Timer 2 Reload Low Byte
TMR3 DATA 094H ; Timer 3 Low Byte
TMR3RL DATA 092H ; Timer 3 Reload Low Byte
TMR4 DATA 0A4H ; Timer 4 Low Byte
TMR4RL DATA 0A2H ; Timer 4 Reload Low Byte
;------------------------------------------------------------------------------
; Indirect Register Definitions
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; Bit Definitions
;------------------------------------------------------------------------------
; ACC 0xE0 (Accumulator)
ACC_ACC0 BIT ACC.0 ; Accumulator Bit 0
ACC_ACC1 BIT ACC.1 ; Accumulator Bit 1
ACC_ACC2 BIT ACC.2 ; Accumulator Bit 2
ACC_ACC3 BIT ACC.3 ; Accumulator Bit 3
ACC_ACC4 BIT ACC.4 ; Accumulator Bit 4
ACC_ACC5 BIT ACC.5 ; Accumulator Bit 5
ACC_ACC6 BIT ACC.6 ; Accumulator Bit 6
ACC_ACC7 BIT ACC.7 ; Accumulator Bit 7
; ADC0CN0 0xE8 (ADC0 Control 0)
ADC0CN0_ADCM0 BIT ADC0CN0.0 ; Start of Conversion Mode Select Bit 0
ADC0CN0_ADCM1 BIT ADC0CN0.1 ; Start of Conversion Mode Select Bit 1
ADC0CN0_ADCM2 BIT ADC0CN0.2 ; Start of Conversion Mode Select Bit 2
ADC0CN0_ADWINT BIT ADC0CN0.3 ; Window Compare Interrupt Flag
ADC0CN0_ADBUSY BIT ADC0CN0.4 ; ADC Busy
ADC0CN0_ADINT BIT ADC0CN0.5 ; Conversion Complete Interrupt Flag
ADC0CN0_ADBMEN BIT ADC0CN0.6 ; Burst Mode Enable
ADC0CN0_ADEN BIT ADC0CN0.7 ; ADC Enable
; B 0xF0 (B Register)
B_B0 BIT B.0 ; B Register Bit 0
B_B1 BIT B.1 ; B Register Bit 1
B_B2 BIT B.2 ; B Register Bit 2
B_B3 BIT B.3 ; B Register Bit 3
B_B4 BIT B.4 ; B Register Bit 4
B_B5 BIT B.5 ; B Register Bit 5
B_B6 BIT B.6 ; B Register Bit 6
B_B7 BIT B.7 ; B Register Bit 7
; IE 0xA8 (Interrupt Enable)
IE_EX0 BIT IE.0 ; External Interrupt 0 Enable
IE_ET0 BIT IE.1 ; Timer 0 Interrupt Enable
IE_EX1 BIT IE.2 ; External Interrupt 1 Enable
IE_ET1 BIT IE.3 ; Timer 1 Interrupt Enable
IE_ES0 BIT IE.4 ; UART0 Interrupt Enable
IE_ET2 BIT IE.5 ; Timer 2 Interrupt Enable
IE_ESPI0 BIT IE.6 ; SPI0 Interrupt Enable
IE_EA BIT IE.7 ; All Interrupts Enable
; IP 0xB8 (Interrupt Priority)
IP_PX0 BIT IP.0 ; External Interrupt 0 Priority Control LSB
IP_PT0 BIT IP.1 ; Timer 0 Interrupt Priority Control LSB
IP_PX1 BIT IP.2 ; External Interrupt 1 Priority Control LSB
IP_PT1 BIT IP.3 ; Timer 1 Interrupt Priority Control LSB
IP_PS0 BIT IP.4 ; UART0 Interrupt Priority Control LSB
IP_PT2 BIT IP.5 ; Timer 2 Interrupt Priority Control LSB
IP_PSPI0 BIT IP.6 ; Serial Peripheral Interface (SPI0) Interrupt Priority Control LSB
; P0 0x80 (Port 0 Pin Latch)
P0_B0 BIT P0.0 ; Port 0 Bit 0 Latch
P0_B1 BIT P0.1 ; Port 0 Bit 1 Latch
P0_B2 BIT P0.2 ; Port 0 Bit 2 Latch
P0_B3 BIT P0.3 ; Port 0 Bit 3 Latch
P0_B4 BIT P0.4 ; Port 0 Bit 4 Latch
P0_B5 BIT P0.5 ; Port 0 Bit 5 Latch
P0_B6 BIT P0.6 ; Port 0 Bit 6 Latch
P0_B7 BIT P0.7 ; Port 0 Bit 7 Latch
; P1 0x90 (Port 1 Pin Latch)
P1_B0 BIT P1.0 ; Port 1 Bit 0 Latch
P1_B1 BIT P1.1 ; Port 1 Bit 1 Latch
P1_B2 BIT P1.2 ; Port 1 Bit 2 Latch
P1_B3 BIT P1.3 ; Port 1 Bit 3 Latch
P1_B4 BIT P1.4 ; Port 1 Bit 4 Latch
P1_B5 BIT P1.5 ; Port 1 Bit 5 Latch
P1_B6 BIT P1.6 ; Port 1 Bit 6 Latch
P1_B7 BIT P1.7 ; Port 1 Bit 7 Latch
; P2 0xA0 (Port 2 Pin Latch)
P2_B0 BIT P2.0 ; Port 2 Bit 0 Latch
P2_B1 BIT P2.1 ; Port 2 Bit 1 Latch
P2_B2 BIT P2.2 ; Port 2 Bit 2 Latch
P2_B3 BIT P2.3 ; Port 2 Bit 3 Latch
; P3 0xB0 (Port 3 Pin Latch)
P3_B0 BIT P3.0 ; Port 3 Bit 0 Latch
P3_B1 BIT P3.1 ; Port 3 Bit 1 Latch
; PCA0CN0 0xD8 (PCA Control)
PCA0CN0_CCF0 BIT PCA0CN0.0 ; PCA Module 0 Capture/Compare Flag
PCA0CN0_CCF1 BIT PCA0CN0.1 ; PCA Module 1 Capture/Compare Flag
PCA0CN0_CCF2 BIT PCA0CN0.2 ; PCA Module 2 Capture/Compare Flag
PCA0CN0_CR BIT PCA0CN0.6 ; PCA Counter/Timer Run Control
PCA0CN0_CF BIT PCA0CN0.7 ; PCA Counter/Timer Overflow Flag
; PSW 0xD0 (Program Status Word)
PSW_PARITY BIT PSW.0 ; Parity Flag
PSW_F1 BIT PSW.1 ; User Flag 1
PSW_OV BIT PSW.2 ; Overflow Flag
PSW_RS0 BIT PSW.3 ; Register Bank Select Bit 0
PSW_RS1 BIT PSW.4 ; Register Bank Select Bit 1
PSW_F0 BIT PSW.5 ; User Flag 0
PSW_AC BIT PSW.6 ; Auxiliary Carry Flag
PSW_CY BIT PSW.7 ; Carry Flag
; SCON0 0x98 (UART0 Serial Port Control)
SCON0_RI BIT SCON0.0 ; Receive Interrupt Flag
SCON0_TI BIT SCON0.1 ; Transmit Interrupt Flag
SCON0_RB8 BIT SCON0.2 ; Ninth Receive Bit
SCON0_TB8 BIT SCON0.3 ; Ninth Transmission Bit
SCON0_REN BIT SCON0.4 ; Receive Enable
SCON0_MCE BIT SCON0.5 ; Multiprocessor Communication Enable
SCON0_SMODE BIT SCON0.7 ; Serial Port 0 Operation Mode
; SCON1 0xC8 (UART1 Serial Port Control)
SCON1_RI BIT SCON1.0 ; Receive Interrupt Flag
SCON1_TI BIT SCON1.1 ; Transmit Interrupt Flag
SCON1_RBX BIT SCON1.2 ; Extra Receive Bit
SCON1_TBX BIT SCON1.3 ; Extra Transmission Bit
SCON1_REN BIT SCON1.4 ; Receive Enable
SCON1_PERR BIT SCON1.6 ; Parity Error Flag
SCON1_OVR BIT SCON1.7 ; Receive FIFO Overrun Flag
; SMB0CN0 0xC0 (SMBus 0 Control)
SMB0CN0_SI BIT SMB0CN0.0 ; SMBus Interrupt Flag
SMB0CN0_ACK BIT SMB0CN0.1 ; SMBus Acknowledge
SMB0CN0_ARBLOST BIT SMB0CN0.2 ; SMBus Arbitration Lost Indicator
SMB0CN0_ACKRQ BIT SMB0CN0.3 ; SMBus Acknowledge Request
SMB0CN0_STO BIT SMB0CN0.4 ; SMBus Stop Flag
SMB0CN0_STA BIT SMB0CN0.5 ; SMBus Start Flag
SMB0CN0_TXMODE BIT SMB0CN0.6 ; SMBus Transmit Mode Indicator
SMB0CN0_MASTER BIT SMB0CN0.7 ; SMBus Master/Slave Indicator
; SPI0CN0 0xF8 (SPI0 Control)
SPI0CN0_SPIEN BIT SPI0CN0.0 ; SPI0 Enable
SPI0CN0_TXNF BIT SPI0CN0.1 ; TX FIFO Not Full
SPI0CN0_NSSMD0 BIT SPI0CN0.2 ; Slave Select Mode Bit 0
SPI0CN0_NSSMD1 BIT SPI0CN0.3 ; Slave Select Mode Bit 1
SPI0CN0_RXOVRN BIT SPI0CN0.4 ; Receive Overrun Flag
SPI0CN0_MODF BIT SPI0CN0.5 ; Mode Fault Flag
SPI0CN0_WCOL BIT SPI0CN0.6 ; Write Collision Flag
SPI0CN0_SPIF BIT SPI0CN0.7 ; SPI0 Interrupt Flag
; TCON 0x88 (Timer 0/1 Control)
TCON_IT0 BIT TCON.0 ; Interrupt 0 Type Select
TCON_IE0 BIT TCON.1 ; External Interrupt 0
TCON_IT1 BIT TCON.2 ; Interrupt 1 Type Select
TCON_IE1 BIT TCON.3 ; External Interrupt 1
TCON_TR0 BIT TCON.4 ; Timer 0 Run Control
TCON_TF0 BIT TCON.5 ; Timer 0 Overflow Flag
TCON_TR1 BIT TCON.6 ; Timer 1 Run Control
TCON_TF1 BIT TCON.7 ; Timer 1 Overflow Flag
; TMR2CN0 0xC8 (Timer 2 Control 0)
TMR2CN0_T2XCLK0 BIT TMR2CN0.0 ; Timer 2 External Clock Select Bit 0
TMR2CN0_T2XCLK1 BIT TMR2CN0.1 ; Timer 2 External Clock Select Bit 1
TMR2CN0_TR2 BIT TMR2CN0.2 ; Timer 2 Run Control
TMR2CN0_T2SPLIT BIT TMR2CN0.3 ; Timer 2 Split Mode Enable
TMR2CN0_TF2CEN BIT TMR2CN0.4 ; Timer 2 Capture Enable
TMR2CN0_TF2LEN BIT TMR2CN0.5 ; Timer 2 Low Byte Interrupt Enable
TMR2CN0_TF2L BIT TMR2CN0.6 ; Timer 2 Low Byte Overflow Flag
TMR2CN0_TF2H BIT TMR2CN0.7 ; Timer 2 High Byte Overflow Flag
; TMR4CN0 0x98 (Timer 4 Control 0)
TMR4CN0_T4XCLK0 BIT TMR4CN0.0 ; Timer 4 External Clock Select Bit 0
TMR4CN0_T4XCLK1 BIT TMR4CN0.1 ; Timer 4 External Clock Select Bit 1
TMR4CN0_TR4 BIT TMR4CN0.2 ; Timer 4 Run Control
TMR4CN0_T4SPLIT BIT TMR4CN0.3 ; Timer 4 Split Mode Enable
TMR4CN0_TF4CEN BIT TMR4CN0.4 ; Timer 4 Capture Enable
TMR4CN0_TF4LEN BIT TMR4CN0.5 ; Timer 4 Low Byte Interrupt Enable
TMR4CN0_TF4L BIT TMR4CN0.6 ; Timer 4 Low Byte Overflow Flag
TMR4CN0_TF4H BIT TMR4CN0.7 ; Timer 4 High Byte Overflow Flag
; UART1FCN1 0xD8 (UART1 FIFO Control 1)
UART1FCN1_RIE BIT UART1FCN1.0 ; Receive Interrupt Enable
UART1FCN1_RXTO0 BIT UART1FCN1.1 ; Receive Timeout Bit 0
UART1FCN1_RXTO1 BIT UART1FCN1.2 ; Receive Timeout Bit 1
UART1FCN1_RFRQ BIT UART1FCN1.3 ; Receive FIFO Request
UART1FCN1_TIE BIT UART1FCN1.4 ; Transmit Interrupt Enable
UART1FCN1_TXHOLD BIT UART1FCN1.5 ; Transmit Hold
UART1FCN1_TXNF BIT UART1FCN1.6 ; TX FIFO Not Full
UART1FCN1_TFRQ BIT UART1FCN1.7 ; Transmit FIFO Request
;------------------------------------------------------------------------------
; Interrupt Definitions
;------------------------------------------------------------------------------
INT0_IRQn EQU 0 ; External Interrupt 0
TIMER0_IRQn EQU 1 ; Timer 0 Overflow
INT1_IRQn EQU 2 ; External Interrupt 1
TIMER1_IRQn EQU 3 ; Timer 1 Overflow
UART0_IRQn EQU 4 ; UART0
TIMER2_IRQn EQU 5 ; Timer 2 Overflow / Capture
SPI0_IRQn EQU 6 ; SPI0
SMBUS0_IRQn EQU 7 ; SMBus 0
PMATCH_IRQn EQU 8 ; Port Match
ADC0WC_IRQn EQU 9 ; ADC0 Window Compare
ADC0EOC_IRQn EQU 10 ; ADC0 End of Conversion
PCA0_IRQn EQU 11 ; PCA0
CMP0_IRQn EQU 12 ; Comparator 0
CMP1_IRQn EQU 13 ; Comparator 1
TIMER3_IRQn EQU 14 ; Timer 3 Overflow / Capture
UART1_IRQn EQU 17 ; UART1
I2C0_IRQn EQU 18 ; I2C0 Slave
TIMER4_IRQn EQU 19 ; Timer 4 Overflow / Capture
;------------------------------------------------------------------------------
; SFR Page Definitions
;------------------------------------------------------------------------------
CRC0_PAGE EQU 000H ; CRC0 Page
LEGACY_PAGE EQU 000H ; Legacy SFR Page
PCA0_PAGE EQU 000H ; PCA0 Page
PG2_PAGE EQU 010H ; Page2
TIMER2_PAGE EQU 010H ; Timer 2 Page
TIMER3_PAGE EQU 010H ; Timer 3 Page
TIMER4_PAGE EQU 010H ; Timer 4 Page
I2CSLAVE0_PAGE EQU 020H ; I2C Slave 0 Page
PG3_PAGE EQU 020H ; Page3
SMB0_PAGE EQU 020H ; SMBus 0 Page
SPI0_PAGE EQU 020H ; SPI0 Page
UART0_PAGE EQU 020H ; UART0 Page
UART1_PAGE EQU 020H ; UART1 Page

558
SI_EFM8LB1_Defs.inc

@ -0,0 +1,558 @@
;------------------------------------------------------------------------------
; Copyright 2014 Silicon Laboratories, Inc.
; All rights reserved. This program and the accompanying materials
; are made available under the terms of the Silicon Laboratories End User
; License Agreement which accompanies this distribution, and is available at
; http://developer.silabs.com/legal/version/v11/Silicon_Labs_Software_License_Agreement.txt
; Original content and implementation provided by Silicon Laboratories.
;------------------------------------------------------------------------------
;Supported Devices:
; EFM8LB10F16E_QFN24
; EFM8LB10F16E_QFN32
; EFM8LB10F16E_QFP32
; EFM8LB10F16E_QSOP24
; EFM8LB10F16ES0_QFN24
; EFM8LB10F16ES0_QFN32
; EFM8LB11F16E_QFN24
; EFM8LB11F16E_QFN32
; EFM8LB11F16E_QFP32
; EFM8LB11F16E_QSOP24
; EFM8LB11F16ES0_QFN24
; EFM8LB11F16ES0_QFN32
; EFM8LB11F32E_QFN24
; EFM8LB11F32E_QFN32
; EFM8LB11F32E_QFP32
; EFM8LB11F32E_QSOP24
; EFM8LB11F32ES0_QFN24
; EFM8LB11F32ES0_QFN32
; EFM8LB12F32E_QFN24
; EFM8LB12F32E_QFN32
; EFM8LB12F32E_QFP32
; EFM8LB12F32E_QSOP24
; EFM8LB12F32ES0_QFN24
; EFM8LB12F32ES0_QFN32
; EFM8LB12F64E_QFN24
; EFM8LB12F64E_QFN32
; EFM8LB12F64E_QFP32
; EFM8LB12F64E_QSOP24
; EFM8LB12F64ES0_QFN24
; EFM8LB12F64ES0_QFN32
;-----------------------------------------------------------------------------
; Register Definitions
;-----------------------------------------------------------------------------
ACC DATA 0E0H; Accumulator
ADC0ASAH DATA 0B6H; ADC0 Autoscan Start Address High Byte
ADC0ASAL DATA 0B5H; ADC0 Autoscan Start Address Low Byte
ADC0ASCF DATA 0A1H; ADC0 Autoscan Configuration
ADC0ASCT DATA 0C7H; ADC0 Autoscan Output Count
ADC0CF0 DATA 0BCH; ADC0 Configuration
ADC0CF1 DATA 0B9H; ADC0 Configuration
ADC0CF2 DATA 0DFH; ADC0 Power Control
ADC0CN0 DATA 0E8H; ADC0 Control 0
ADC0CN1 DATA 0B2H; ADC0 Control 1
ADC0CN2 DATA 0B3H; ADC0 Control 2
ADC0GTH DATA 0C4H; ADC0 Greater-Than High Byte
ADC0GTL DATA 0C3H; ADC0 Greater-Than Low Byte
ADC0H DATA 0BEH; ADC0 Data Word High Byte
ADC0L DATA 0BDH; ADC0 Data Word Low Byte
ADC0LTH DATA 0C6H; ADC0 Less-Than High Byte
ADC0LTL DATA 0C5H; ADC0 Less-Than Low Byte
ADC0MX DATA 0BBH; ADC0 Multiplexer Selection
B DATA 0F0H; B Register
CKCON0 DATA 08EH; Clock Control 0
CKCON1 DATA 0A6H; Clock Control 1
CLEN0 DATA 0C6H; Configurable Logic Enable 0
CLIE0 DATA 0C7H; Configurable Logic Interrupt Enable 0
CLIF0 DATA 0E8H; Configurable Logic Interrupt Flag 0
CLKSEL DATA 0A9H; Clock Select
CLOUT0 DATA 0D1H; Configurable Logic Output 0
CLU0CF DATA 0B1H; Configurable Logic Unit 0 Configuration
CLU0FN DATA 0AFH; Configurable Logic Unit 0 Function Select
CLU0MX DATA 084H; Configurable Logic Unit 0 Multiplexer
CLU1CF DATA 0B3H; Configurable Logic Unit 1 Configuration
CLU1FN DATA 0B2H; Configurable Logic Unit 1 Function Select
CLU1MX DATA 085H; Configurable Logic Unit 1 Multiplexer
CLU2CF DATA 0B6H; Configurable Logic Unit 2 Configuration
CLU2FN DATA 0B5H; Configurable Logic Unit 2 Function Select
CLU2MX DATA 091H; Configurable Logic Unit 2 Multiplexer
CLU3CF DATA 0BFH; Configurable Logic Unit 3 Configuration
CLU3FN DATA 0BEH; Configurable Logic Unit 3 Function Select
CLU3MX DATA 0AEH; Configurable Logic Unit 3 Multiplexer
CMP0CN0 DATA 09BH; Comparator 0 Control 0
CMP0CN1 DATA 099H; Comparator 0 Control 1
CMP0MD DATA 09DH; Comparator 0 Mode
CMP0MX DATA 09FH; Comparator 0 Multiplexer Selection
CMP1CN0 DATA 0BFH; Comparator 1 Control 0
CMP1CN1 DATA 0ACH; Comparator 1 Control 1
CMP1MD DATA 0ABH; Comparator 1 Mode
CMP1MX DATA 0AAH; Comparator 1 Multiplexer Selection
CRC0CN0 DATA 0CEH; CRC0 Control 0
CRC0CN1 DATA 086H; CRC0 Control 1
CRC0CNT DATA 0D3H; CRC0 Automatic Flash Sector Count
CRC0DAT DATA 0CBH; CRC0 Data Output
CRC0FLIP DATA 0CFH; CRC0 Bit Flip
CRC0IN DATA 0CAH; CRC0 Data Input
CRC0ST DATA 0D2H; CRC0 Automatic Flash Sector Start
DAC0CF0 DATA 091H; DAC0 Configuration 0
DAC0CF1 DATA 092H; DAC0 Configuration 1
DAC0H DATA 085H; DAC0 Data Word High Byte
DAC0L DATA 084H; DAC0 Data Word Low Byte
DAC1CF0 DATA 093H; DAC1 Configuration 0
DAC1CF1 DATA 094H; DAC1 Configuration 1
DAC1H DATA 08AH; DAC1 Data Word High Byte
DAC1L DATA 089H; DAC1 Data Word Low Byte
DAC2CF0 DATA 095H; DAC2 Configuration 0
DAC2CF1 DATA 096H; DAC2 Configuration 1
DAC2H DATA 08CH; DAC2 Data Word High Byte
DAC2L DATA 08BH; DAC2 Data Word Low Byte
DAC3CF0 DATA 09AH; DAC3 Configuration 0
DAC3CF1 DATA 09CH; DAC3 Configuration 1
DAC3H DATA 08EH; DAC3 Data Word High Byte
DAC3L DATA 08DH; DAC3 Data Word Low Byte
DACGCF0 DATA 088H; DAC Global Configuration 0
DACGCF1 DATA 098H; DAC Global Configuration 1
DACGCF2 DATA 0A2H; DAC Global Configuration 2
DERIVID DATA 0ADH; Derivative Identification
DEVICEID DATA 0B5H; Device Identification
DPH DATA 083H; Data Pointer High
DPL DATA 082H; Data Pointer Low
EIE1 DATA 0E6H; Extended Interrupt Enable 1
EIE2 DATA 0F3H; Extended Interrupt Enable 2
EIP1 DATA 0BBH; Extended Interrupt Priority 1 Low
EIP1H DATA 0EEH; Extended Interrupt Priority 1 High
EIP2 DATA 0EDH; Extended Interrupt Priority 2
EIP2H DATA 0F6H; Extended Interrupt Priority 2 High
EMI0CN DATA 0E7H; External Memory Interface Control
FLKEY DATA 0B7H; Flash Lock and Key
HFO0CAL DATA 0C7H; High Frequency Oscillator 0 Calibration
HFO1CAL DATA 0D6H; High Frequency Oscillator 1 Calibration
HFOCN DATA 0EFH; High Frequency Oscillator Control
I2C0ADM DATA 0FFH; I2C0 Slave Address Mask
I2C0CN0 DATA 0BAH; I2C0 Control
I2C0DIN DATA 0BCH; I2C0 Received Data
I2C0DOUT DATA 0BBH; I2C0 Transmit Data
I2C0FCN0 DATA 0ADH; I2C0 FIFO Control 0
I2C0FCN1 DATA 0ABH; I2C0 FIFO Control 1
I2C0FCT DATA 0F5H; I2C0 FIFO Count
I2C0SLAD DATA 0BDH; I2C0 Slave Address
I2C0STAT DATA 0B9H; I2C0 Status
IE DATA 0A8H; Interrupt Enable
IP DATA 0B8H; Interrupt Priority
IPH DATA 0F2H; Interrupt Priority High
IT01CF DATA 0E4H; INT0/INT1 Configuration
LFO0CN DATA 0B1H; Low Frequency Oscillator Control
P0 DATA 080H; Port 0 Pin Latch
P0MASK DATA 0FEH; Port 0 Mask
P0MAT DATA 0FDH; Port 0 Match
P0MDIN DATA 0F1H; Port 0 Input Mode
P0MDOUT DATA 0A4H; Port 0 Output Mode
P0SKIP DATA 0D4H; Port 0 Skip
P1 DATA 090H; Port 1 Pin Latch
P1MASK DATA 0EEH; Port 1 Mask
P1MAT DATA 0EDH; Port 1 Match
P1MDIN DATA 0F2H; Port 1 Input Mode
P1MDOUT DATA 0A5H; Port 1 Output Mode
P1SKIP DATA 0D5H; Port 1 Skip
P2 DATA 0A0H; Port 2 Pin Latch
P2MASK DATA 0FCH; Port 2 Mask
P2MAT DATA 0FBH; Port 2 Match
P2MDIN DATA 0F3H; Port 2 Input Mode
P2MDOUT DATA 0A6H; Port 2 Output Mode
P2SKIP DATA 0CCH; Port 2 Skip
P3 DATA 0B0H; Port 3 Pin Latch
P3MDIN DATA 0F4H; Port 3 Input Mode
P3MDOUT DATA 09CH; Port 3 Output Mode
PCA0CENT DATA 09EH; PCA Center Alignment Enable
PCA0CLR DATA 09CH; PCA Comparator Clear Control
PCA0CN0 DATA 0D8H; PCA Control
PCA0CPH0 DATA 0FCH; PCA Channel 0 Capture Module High Byte
PCA0CPH1 DATA 0EAH; PCA Channel 1 Capture Module High Byte
PCA0CPH2 DATA 0ECH; PCA Channel 2 Capture Module High Byte
PCA0CPH3 DATA 0F5H; PCA Channel 3 Capture Module High Byte
PCA0CPH4 DATA 085H; PCA Channel 4 Capture Module High Byte
PCA0CPH5 DATA 0DEH; PCA Channel 5 Capture Module High Byte
PCA0CPL0 DATA 0FBH; PCA Channel 0 Capture Module Low Byte
PCA0CPL1 DATA 0E9H; PCA Channel 1 Capture Module Low Byte
PCA0CPL2 DATA 0EBH; PCA Channel 2 Capture Module Low Byte
PCA0CPL3 DATA 0F4H; PCA Channel 3 Capture Module Low Byte
PCA0CPL4 DATA 084H; PCA Channel 4 Capture Module Low Byte
PCA0CPL5 DATA 0DDH; PCA Channel 5 Capture Module Low Byte
PCA0CPM0 DATA 0DAH; PCA Channel 0 Capture/Compare Mode
PCA0CPM1 DATA 0DBH; PCA Channel 1 Capture/Compare Mode
PCA0CPM2 DATA 0DCH; PCA Channel 2 Capture/Compare Mode
PCA0CPM3 DATA 0AEH; PCA Channel 3 Capture/Compare Mode
PCA0CPM4 DATA 0AFH; PCA Channel 4 Capture/Compare Mode
PCA0CPM5 DATA 0CCH; PCA Channel 5 Capture/Compare Mode
PCA0H DATA 0FAH; PCA Counter/Timer High Byte
PCA0L DATA 0F9H; PCA Counter/Timer Low Byte
PCA0MD DATA 0D9H; PCA Mode
PCA0POL DATA 096H; PCA Output Polarity
PCA0PWM DATA 0F7H; PCA PWM Configuration
PCON0 DATA 087H; Power Control
PCON1 DATA 0CDH; Power Control 1
PFE0CN DATA 0C1H; Prefetch Engine Control
PRTDRV DATA 0F6H; Port Drive Strength
PSCTL DATA 08FH; Program Store Control
PSTAT0 DATA 0AAH; PMU Status 0
PSW DATA 0D0H; Program Status Word
REF0CN DATA 0D1H; Voltage Reference Control
REG0CN DATA 0C9H; Voltage Regulator 0 Control
REVID DATA 0B6H; Revision Identifcation
RSTSRC DATA 0EFH; Reset Source
SBCON1 DATA 094H; UART1 Baud Rate Generator Control
SBRLH1 DATA 096H; UART1 Baud Rate Generator High Byte
SBRLL1 DATA 095H; UART1 Baud Rate Generator Low Byte
SBUF0 DATA 099H; UART0 Serial Port Data Buffer
SBUF1 DATA 092H; UART1 Serial Port Data Buffer
SCON0 DATA 098H; UART0 Serial Port Control
SCON1 DATA 0C8H; UART1 Serial Port Control
SFRPAGE DATA 0A7H; SFR Page
SFRPGCN DATA 0BCH; SFR Page Control
SFRSTACK DATA 0D7H; SFR Page Stack
SMB0ADM DATA 0D6H; SMBus 0 Slave Address Mask
SMB0ADR DATA 0D7H; SMBus 0 Slave Address
SMB0CF DATA 0C1H; SMBus 0 Configuration
SMB0CN0 DATA 0C0H; SMBus 0 Control
SMB0DAT DATA 0C2H; SMBus 0 Data
SMB0FCN0 DATA 0C3H; SMBus 0 FIFO Control 0
SMB0FCN1 DATA 0C4H; SMBus 0 FIFO Control 1
SMB0FCT DATA 0EFH; SMBus 0 FIFO Count
SMB0RXLN DATA 0C5H; SMBus 0 Receive Length Counter
SMB0TC DATA 0ACH; SMBus 0 Timing and Pin Control
SMOD1 DATA 093H; UART1 Mode
SP DATA 081H; Stack Pointer
SPI0CFG DATA 0A1H; SPI0 Configuration
SPI0CKR DATA 0A2H; SPI0 Clock Rate
SPI0CN0 DATA 0F8H; SPI0 Control
SPI0DAT DATA 0A3H; SPI0 Data
SPI0FCN0 DATA 09AH; SPI0 FIFO Control 0
SPI0FCN1 DATA 09BH; SPI0 FIFO Control 1
SPI0FCT DATA 0F7H; SPI0 FIFO Count
SPI0PCF DATA 0DFH; SPI0 Pin Configuration
TCON DATA 088H; Timer 0/1 Control
TH0 DATA 08CH; Timer 0 High Byte
TH1 DATA 08DH; Timer 1 High Byte
TL0 DATA 08AH; Timer 0 Low Byte
TL1 DATA 08BH; Timer 1 Low Byte
TMOD DATA 089H; Timer 0/1 Mode
TMR2CN0 DATA 0C8H; Timer 2 Control 0
TMR2CN1 DATA 0FDH; Timer 2 Control 1
TMR2H DATA 0CFH; Timer 2 High Byte
TMR2L DATA 0CEH; Timer 2 Low Byte
TMR2RLH DATA 0CBH; Timer 2 Reload High Byte
TMR2RLL DATA 0CAH; Timer 2 Reload Low Byte
TMR3CN0 DATA 091H; Timer 3 Control 0
TMR3CN1 DATA 0FEH; Timer 3 Control 1
TMR3H DATA 095H; Timer 3 High Byte
TMR3L DATA 094H; Timer 3 Low Byte
TMR3RLH DATA 093H; Timer 3 Reload High Byte
TMR3RLL DATA 092H; Timer 3 Reload Low Byte
TMR4CN0 DATA 098H; Timer 4 Control 0
TMR4CN1 DATA 0FFH; Timer 4 Control 1
TMR4H DATA 0A5H; Timer 4 High Byte
TMR4L DATA 0A4H; Timer 4 Low Byte
TMR4RLH DATA 0A3H; Timer 4 Reload High Byte
TMR4RLL DATA 0A2H; Timer 4 Reload Low Byte
TMR5CN0 DATA 0C0H; Timer 5 Control 0
TMR5CN1 DATA 0F1H; Timer 5 Control 1
TMR5H DATA 0D5H; Timer 5 High Byte
TMR5L DATA 0D4H; Timer 5 Low Byte
TMR5RLH DATA 0D3H; Timer 5 Reload High Byte
TMR5RLL DATA 0D2H; Timer 5 Reload Low Byte
UART0PCF DATA 0D9H; UART0 Pin Configuration
UART1FCN0 DATA 09DH; UART1 FIFO Control 0
UART1FCN1 DATA 0D8H; UART1 FIFO Control 1
UART1FCT DATA 0FAH; UART1 FIFO Count
UART1LIN DATA 09EH; UART1 LIN Configuration
UART1PCF DATA 0DAH; UART1 Pin Configuration
VDM0CN DATA 0FFH; Supply Monitor Control
WDTCN DATA 097H; Watchdog Timer Control
XBR0 DATA 0E1H; Port I/O Crossbar 0
XBR1 DATA 0E2H; Port I/O Crossbar 1
XBR2 DATA 0E3H; Port I/O Crossbar 2
XOSC0CN DATA 086H; External Oscillator Control
;------------------------------------------------------------------------------
; 16-bit Register Definitions (may not work on all compilers)
;------------------------------------------------------------------------------
ADC0ASA DATA 0B5H ; ADC0 Autoscan Start Address Low Byte
ADC0GT DATA 0C3H ; ADC0 Greater-Than Low Byte
ADC0 DATA 0BDH ; ADC0 Data Word Low Byte
ADC0LT DATA 0C5H ; ADC0 Less-Than Low Byte
DP DATA 082H ; Data Pointer Low
PCA0CP0 DATA 0FBH ; PCA Channel 0 Capture Module Low Byte
PCA0CP1 DATA 0E9H ; PCA Channel 1 Capture Module Low Byte
PCA0CP2 DATA 0EBH ; PCA Channel 2 Capture Module Low Byte
PCA0CP3 DATA 0F4H ; PCA Channel 3 Capture Module Low Byte
PCA0CP4 DATA 084H ; PCA Channel 4 Capture Module Low Byte
PCA0CP5 DATA 0DDH ; PCA Channel 5 Capture Module Low Byte
PCA0 DATA 0F9H ; PCA Counter/Timer Low Byte
TMR2 DATA 0CEH ; Timer 2 Low Byte
TMR2RL DATA 0CAH ; Timer 2 Reload Low Byte
TMR3 DATA 094H ; Timer 3 Low Byte
TMR3RL DATA 092H ; Timer 3 Reload Low Byte
TMR4 DATA 0A4H ; Timer 4 Low Byte
TMR4RL DATA 0A2H ; Timer 4 Reload Low Byte
TMR5 DATA 0D4H ; Timer 5 Low Byte
TMR5RL DATA 0D2H ; Timer 5 Reload Low Byte
;------------------------------------------------------------------------------
; Indirect Register Definitions
;------------------------------------------------------------------------------
;------------------------------------------------------------------------------
; Bit Definitions
;------------------------------------------------------------------------------
; ACC 0xE0 (Accumulator)
ACC_ACC0 BIT ACC.0 ; Accumulator Bit 0
ACC_ACC1 BIT ACC.1 ; Accumulator Bit 1
ACC_ACC2 BIT ACC.2 ; Accumulator Bit 2
ACC_ACC3 BIT ACC.3 ; Accumulator Bit 3
ACC_ACC4 BIT ACC.4 ; Accumulator Bit 4
ACC_ACC5 BIT ACC.5 ; Accumulator Bit 5
ACC_ACC6 BIT ACC.6 ; Accumulator Bit 6
ACC_ACC7 BIT ACC.7 ; Accumulator Bit 7
; ADC0CN0 0xE8 (ADC0 Control 0)
ADC0CN0_TEMPE BIT ADC0CN0.0 ; Temperature Sensor Enable
ADC0CN0_ADGN0 BIT ADC0CN0.1 ; Gain Control Bit 0
ADC0CN0_ADGN1 BIT ADC0CN0.2 ; Gain Control Bit 1
ADC0CN0_ADWINT BIT ADC0CN0.3 ; Window Compare Interrupt Flag
ADC0CN0_ADBUSY BIT ADC0CN0.4 ; ADC Busy
ADC0CN0_ADINT BIT ADC0CN0.5 ; Conversion Complete Interrupt Flag
ADC0CN0_IPOEN BIT ADC0CN0.6 ; Idle Powered-off Enable
ADC0CN0_ADEN BIT ADC0CN0.7 ; ADC Enable
; B 0xF0 (B Register)
B_B0 BIT B.0 ; B Register Bit 0
B_B1 BIT B.1 ; B Register Bit 1
B_B2 BIT B.2 ; B Register Bit 2
B_B3 BIT B.3 ; B Register Bit 3
B_B4 BIT B.4 ; B Register Bit 4
B_B5 BIT B.5 ; B Register Bit 5
B_B6 BIT B.6 ; B Register Bit 6
B_B7 BIT B.7 ; B Register Bit 7
; CLIF0 0xE8 (Configurable Logic Interrupt Flag 0)
CLIF0_C0FIF BIT CLIF0.0 ; CLU0 Falling Edge Interrupt Flag
CLIF0_C0RIF BIT CLIF0.1 ; CLU0 Rising Edge Interrupt Flag
CLIF0_C1FIF BIT CLIF0.2 ; CLU1 Falling Edge Interrupt Flag
CLIF0_C1RIF BIT CLIF0.3 ; CLU1 Rising Edge Interrupt Flag
CLIF0_C2FIF BIT CLIF0.4 ; CLU2 Falling Edge Interrupt Flag
CLIF0_C2RIF BIT CLIF0.5 ; CLU2 Rising Edge Interrupt Flag
CLIF0_C3FIF BIT CLIF0.6 ; CLU3 Falling Edge Interrupt Flag
CLIF0_C3RIF BIT CLIF0.7 ; CLU3 Rising Edge Interrupt Flag
; DACGCF0 0x88 (DAC Global Configuration 0)
DACGCF0_D1SRC0 BIT DACGCF0.0 ; DAC1 Data Source Bit 0
DACGCF0_D1SRC1 BIT DACGCF0.1 ; DAC1 Data Source Bit 1
DACGCF0_D1AMEN BIT DACGCF0.2 ; DAC1 Alternating Mode Enable
DACGCF0_D01REFSL BIT DACGCF0.3 ; DAC0 and DAC1 Reference Voltage Select
DACGCF0_D3SRC0 BIT DACGCF0.4 ; DAC3 Data Source Bit 0
DACGCF0_D3SRC1 BIT DACGCF0.5 ; DAC3 Data Source Bit 1
DACGCF0_D3AMEN BIT DACGCF0.6 ; DAC3 Alternating Mode Enable
DACGCF0_D23REFSL BIT DACGCF0.7 ; DAC2 and DAC3 Reference Voltage Select
; DACGCF1 0x98 (DAC Global Configuration 1)
DACGCF1_D0UDIS BIT DACGCF1.0 ; DAC0 Update Disable
DACGCF1_D1UDIS BIT DACGCF1.1 ; DAC1 Update Disable
DACGCF1_D2UDIS BIT DACGCF1.2 ; DAC2 Update Disable
DACGCF1_D3UDIS BIT DACGCF1.3 ; DAC3 Update Disable
; IE 0xA8 (Interrupt Enable)
IE_EX0 BIT IE.0 ; External Interrupt 0 Enable
IE_ET0 BIT IE.1 ; Timer 0 Interrupt Enable
IE_EX1 BIT IE.2 ; External Interrupt 1 Enable
IE_ET1 BIT IE.3 ; Timer 1 Interrupt Enable
IE_ES0 BIT IE.4 ; UART0 Interrupt Enable
IE_ET2 BIT IE.5 ; Timer 2 Interrupt Enable
IE_ESPI0 BIT IE.6 ; SPI0 Interrupt Enable
IE_EA BIT IE.7 ; All Interrupts Enable
; IP 0xB8 (Interrupt Priority)
IP_PX0 BIT IP.0 ; External Interrupt 0 Priority Control LSB
IP_PT0 BIT IP.1 ; Timer 0 Interrupt Priority Control LSB
IP_PX1 BIT IP.2 ; External Interrupt 1 Priority Control LSB
IP_PT1 BIT IP.3 ; Timer 1 Interrupt Priority Control LSB
IP_PS0 BIT IP.4 ; UART0 Interrupt Priority Control LSB
IP_PT2 BIT IP.5 ; Timer 2 Interrupt Priority Control LSB
IP_PSPI0 BIT IP.6 ; Serial Peripheral Interface (SPI0) Interrupt Priority Control LSB
; P0 0x80 (Port 0 Pin Latch)
P0_B0 BIT P0.0 ; Port 0 Bit 0 Latch
P0_B1 BIT P0.1 ; Port 0 Bit 1 Latch
P0_B2 BIT P0.2 ; Port 0 Bit 2 Latch
P0_B3 BIT P0.3 ; Port 0 Bit 3 Latch
P0_B4 BIT P0.4 ; Port 0 Bit 4 Latch
P0_B5 BIT P0.5 ; Port 0 Bit 5 Latch
P0_B6 BIT P0.6 ; Port 0 Bit 6 Latch
P0_B7 BIT P0.7 ; Port 0 Bit 7 Latch
; P1 0x90 (Port 1 Pin Latch)
P1_B0 BIT P1.0 ; Port 1 Bit 0 Latch
P1_B1 BIT P1.1 ; Port 1 Bit 1 Latch
P1_B2 BIT P1.2 ; Port 1 Bit 2 Latch
P1_B3 BIT P1.3 ; Port 1 Bit 3 Latch
P1_B4 BIT P1.4 ; Port 1 Bit 4 Latch
P1_B5 BIT P1.5 ; Port 1 Bit 5 Latch
P1_B6 BIT P1.6 ; Port 1 Bit 6 Latch
P1_B7 BIT P1.7 ; Port 1 Bit 7 Latch
; P2 0xA0 (Port 2 Pin Latch)
P2_B0 BIT P2.0 ; Port 2 Bit 0 Latch
P2_B1 BIT P2.1 ; Port 2 Bit 1 Latch
P2_B2 BIT P2.2 ; Port 2 Bit 2 Latch
P2_B3 BIT P2.3 ; Port 2 Bit 3 Latch
P2_B4 BIT P2.4 ; Port 2 Bit 4 Latch
P2_B5 BIT P2.5 ; Port 2 Bit 5 Latch
P2_B6 BIT P2.6 ; Port 2 Bit 6 Latch
; P3 0xB0 (Port 3 Pin Latch)
P3_B0 BIT P3.0 ; Port 3 Bit 0 Latch
P3_B1 BIT P3.1 ; Port 3 Bit 1 Latch
P3_B2 BIT P3.2 ; Port 3 Bit 2 Latch
P3_B3 BIT P3.3 ; Port 3 Bit 3 Latch
P3_B4 BIT P3.4 ; Port 3 Bit 4 Latch
P3_B7 BIT P3.7 ; Port 3 Bit 7 Latch
; PCA0CN0 0xD8 (PCA Control)
PCA0CN0_CCF0 BIT PCA0CN0.0 ; PCA Module 0 Capture/Compare Flag
PCA0CN0_CCF1 BIT PCA0CN0.1 ; PCA Module 1 Capture/Compare Flag
PCA0CN0_CCF2 BIT PCA0CN0.2 ; PCA Module 2 Capture/Compare Flag
PCA0CN0_CCF3 BIT PCA0CN0.3 ; PCA Module 3 Capture/Compare Flag
PCA0CN0_CCF4 BIT PCA0CN0.4 ; PCA Module 4 Capture/Compare Flag
PCA0CN0_CCF5 BIT PCA0CN0.5 ; PCA Module 5 Capture/Compare Flag
PCA0CN0_CR BIT PCA0CN0.6 ; PCA Counter/Timer Run Control
PCA0CN0_CF BIT PCA0CN0.7 ; PCA Counter/Timer Overflow Flag
; PSW 0xD0 (Program Status Word)
PSW_PARITY BIT PSW.0 ; Parity Flag
PSW_F1 BIT PSW.1 ; User Flag 1
PSW_OV BIT PSW.2 ; Overflow Flag
PSW_RS0 BIT PSW.3 ; Register Bank Select Bit 0
PSW_RS1 BIT PSW.4 ; Register Bank Select Bit 1
PSW_F0 BIT PSW.5 ; User Flag 0
PSW_AC BIT PSW.6 ; Auxiliary Carry Flag
PSW_CY BIT PSW.7 ; Carry Flag
; SCON0 0x98 (UART0 Serial Port Control)
SCON0_RI BIT SCON0.0 ; Receive Interrupt Flag
SCON0_TI BIT SCON0.1 ; Transmit Interrupt Flag
SCON0_RB8 BIT SCON0.2 ; Ninth Receive Bit
SCON0_TB8 BIT SCON0.3 ; Ninth Transmission Bit
SCON0_REN BIT SCON0.4 ; Receive Enable
SCON0_MCE BIT SCON0.5 ; Multiprocessor Communication Enable
SCON0_SMODE BIT SCON0.7 ; Serial Port 0 Operation Mode
; SCON1 0xC8 (UART1 Serial Port Control)
SCON1_RI BIT SCON1.0 ; Receive Interrupt Flag
SCON1_TI BIT SCON1.1 ; Transmit Interrupt Flag
SCON1_RBX BIT SCON1.2 ; Extra Receive Bit
SCON1_TBX BIT SCON1.3 ; Extra Transmission Bit
SCON1_REN BIT SCON1.4 ; Receive Enable
SCON1_PERR BIT SCON1.6 ; Parity Error Flag
SCON1_OVR BIT SCON1.7 ; Receive FIFO Overrun Flag
; SMB0CN0 0xC0 (SMBus 0 Control)
SMB0CN0_SI BIT SMB0CN0.0 ; SMBus Interrupt Flag
SMB0CN0_ACK BIT SMB0CN0.1 ; SMBus Acknowledge
SMB0CN0_ARBLOST BIT SMB0CN0.2 ; SMBus Arbitration Lost Indicator
SMB0CN0_ACKRQ BIT SMB0CN0.3 ; SMBus Acknowledge Request
SMB0CN0_STO BIT SMB0CN0.4 ; SMBus Stop Flag
SMB0CN0_STA BIT SMB0CN0.5 ; SMBus Start Flag
SMB0CN0_TXMODE BIT SMB0CN0.6 ; SMBus Transmit Mode Indicator
SMB0CN0_MASTER BIT SMB0CN0.7 ; SMBus Master/Slave Indicator
; SPI0CN0 0xF8 (SPI0 Control)
SPI0CN0_SPIEN BIT SPI0CN0.0 ; SPI0 Enable
SPI0CN0_TXNF BIT SPI0CN0.1 ; TX FIFO Not Full
SPI0CN0_NSSMD0 BIT SPI0CN0.2 ; Slave Select Mode Bit 0
SPI0CN0_NSSMD1 BIT SPI0CN0.3 ; Slave Select Mode Bit 1
SPI0CN0_RXOVRN BIT SPI0CN0.4 ; Receive Overrun Flag
SPI0CN0_MODF BIT SPI0CN0.5 ; Mode Fault Flag
SPI0CN0_WCOL BIT SPI0CN0.6 ; Write Collision Flag
SPI0CN0_SPIF BIT SPI0CN0.7 ; SPI0 Interrupt Flag
; TCON 0x88 (Timer 0/1 Control)
TCON_IT0 BIT TCON.0 ; Interrupt 0 Type Select
TCON_IE0 BIT TCON.1 ; External Interrupt 0
TCON_IT1 BIT TCON.2 ; Interrupt 1 Type Select
TCON_IE1 BIT TCON.3 ; External Interrupt 1
TCON_TR0 BIT TCON.4 ; Timer 0 Run Control
TCON_TF0 BIT TCON.5 ; Timer 0 Overflow Flag
TCON_TR1 BIT TCON.6 ; Timer 1 Run Control
TCON_TF1 BIT TCON.7 ; Timer 1 Overflow Flag
; TMR2CN0 0xC8 (Timer 2 Control 0)
TMR2CN0_T2XCLK0 BIT TMR2CN0.0 ; Timer 2 External Clock Select Bit 0
TMR2CN0_T2XCLK1 BIT TMR2CN0.1 ; Timer 2 External Clock Select Bit 1
TMR2CN0_TR2 BIT TMR2CN0.2 ; Timer 2 Run Control
TMR2CN0_T2SPLIT BIT TMR2CN0.3 ; Timer 2 Split Mode Enable
TMR2CN0_TF2CEN BIT TMR2CN0.4 ; Timer 2 Capture Enable
TMR2CN0_TF2LEN BIT TMR2CN0.5 ; Timer 2 Low Byte Interrupt Enable
TMR2CN0_TF2L BIT TMR2CN0.6 ; Timer 2 Low Byte Overflow Flag
TMR2CN0_TF2H BIT TMR2CN0.7 ; Timer 2 High Byte Overflow Flag
; TMR4CN0 0x98 (Timer 4 Control 0)
TMR4CN0_T4XCLK0 BIT TMR4CN0.0 ; Timer 4 External Clock Select Bit 0
TMR4CN0_T4XCLK1 BIT TMR4CN0.1 ; Timer 4 External Clock Select Bit 1
TMR4CN0_TR4 BIT TMR4CN0.2 ; Timer 4 Run Control
TMR4CN0_T4SPLIT BIT TMR4CN0.3 ; Timer 4 Split Mode Enable
TMR4CN0_TF4CEN BIT TMR4CN0.4 ; Timer 4 Capture Enable
TMR4CN0_TF4LEN BIT TMR4CN0.5 ; Timer 4 Low Byte Interrupt Enable
TMR4CN0_TF4L BIT TMR4CN0.6 ; Timer 4 Low Byte Overflow Flag
TMR4CN0_TF4H BIT TMR4CN0.7 ; Timer 4 High Byte Overflow Flag
; TMR5CN0 0xC0 (Timer 5 Control 0)
TMR5CN0_T5XCLK0 BIT TMR5CN0.0 ; Timer 5 External Clock Select Bit 0
TMR5CN0_T5XCLK1 BIT TMR5CN0.1 ; Timer 5 External Clock Select Bit 1
TMR5CN0_TR5 BIT TMR5CN0.2 ; Timer 5 Run Control
TMR5CN0_T5SPLIT BIT TMR5CN0.3 ; Timer 5 Split Mode Enable
TMR5CN0_TF5CEN BIT TMR5CN0.4 ; Timer 5 Capture Enable
TMR5CN0_TF5LEN BIT TMR5CN0.5 ; Timer 5 Low Byte Interrupt Enable
TMR5CN0_TF5L BIT TMR5CN0.6 ; Timer 5 Low Byte Overflow Flag
TMR5CN0_TF5H BIT TMR5CN0.7 ; Timer 5 High Byte Overflow Flag
; UART1FCN1 0xD8 (UART1 FIFO Control 1)
UART1FCN1_RIE BIT UART1FCN1.0 ; Receive Interrupt Enable
UART1FCN1_RXTO0 BIT UART1FCN1.1 ; Receive Timeout Bit 0
UART1FCN1_RXTO1 BIT UART1FCN1.2 ; Receive Timeout Bit 1
UART1FCN1_RFRQ BIT UART1FCN1.3 ; Receive FIFO Request
UART1FCN1_TIE BIT UART1FCN1.4 ; Transmit Interrupt Enable
UART1FCN1_TXHOLD BIT UART1FCN1.5 ; Transmit Hold
UART1FCN1_TXNF BIT UART1FCN1.6 ; TX FIFO Not Full
UART1FCN1_TFRQ BIT UART1FCN1.7 ; Transmit FIFO Request
;------------------------------------------------------------------------------
; Interrupt Definitions
;------------------------------------------------------------------------------
INT0_IRQn EQU 0 ; External Interrupt 0
TIMER0_IRQn EQU 1 ; Timer 0 Overflow
INT1_IRQn EQU 2 ; External Interrupt 1
TIMER1_IRQn EQU 3 ; Timer 1 Overflow
UART0_IRQn EQU 4 ; UART0
TIMER2_IRQn EQU 5 ; Timer 2 Overflow / Capture
SPI0_IRQn EQU 6 ; SPI0
SMBUS0_IRQn EQU 7 ; SMBus 0
PMATCH_IRQn EQU 8 ; Port Match
ADC0WC_IRQn EQU 9 ; ADC0 Window Compare
ADC0EOC_IRQn EQU 10 ; ADC0 End of Conversion
PCA0_IRQn EQU 11 ; PCA0
CMP0_IRQn EQU 12 ; Comparator 0
CMP1_IRQn EQU 13 ; Comparator 1
TIMER3_IRQn EQU 14 ; Timer 3 Overflow / Capture
UART1_IRQn EQU 15 ; UART1
I2C0_IRQn EQU 16 ; I2C0 Slave
TIMER4_IRQn EQU 17 ; Timer 4 Overflow / Capture
TIMER5_IRQn EQU 18 ; Timer 5 Overflow / Capture
CL0_IRQn EQU 19 ; Configurable Logic
;------------------------------------------------------------------------------
; SFR Page Definitions
;------------------------------------------------------------------------------
LEGACY_PAGE EQU 000H ; Legacy SFR Page
PG2_PAGE EQU 010H ; Page2
PG3_PAGE EQU 020H ; Page3
PG4_PAGE EQU 030H ; Page4

558
T.inc

@ -0,0 +1,558 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "T".
; RC X MA X MB CC MC X X X Cp Bp Ap Ac Bc Cc
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#T_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#T_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#T_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#T_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#T_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#T_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#T_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#T_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#T_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#T_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#T_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#T_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#T_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#T_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#T_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#T_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#T_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#T_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#T_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#T_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#T_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#T_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 7 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
Rcp_In EQU 7 ;i
; EQU 6 ;i
Mux_A EQU 5 ;i
; EQU 4 ;i
Mux_B EQU 3 ;i
Comp_Com EQU 2 ;i
Mux_C EQU 1 ;i
; EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
IF FETON_DELAY == 0
mov PCA0POL, #00h ; Pwm noninverted
ELSE
mov PCA0POL, #01h ; Damping inverted, pwm noninverted
ENDIF
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO ; CCF interrupt is only used for FETON_DELAY == 0
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
; EQU 6 ;i
CpwmFET EQU 5 ;o
BpwmFET EQU 4 ;o
ApwmFET EQU 3 ;o
AcomFET EQU 2 ;o
BcomFET EQU 1 ;o
CcomFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 3Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #37h
ELSE
mov P1SKIP, #33h
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #2Fh
ELSE
mov P1SKIP, #2Dh
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #1Fh
ELSE
mov P1SKIP, #1Eh
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #3Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #52h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #32h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #12h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

562
U.inc

@ -0,0 +1,562 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "U".
; MA MC CC MB RC L0 L1 L2 X Cc Bc Ac Cp Bp Ap X
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#U_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#U_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#U_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#U_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#U_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#U_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#U_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#U_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#U_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#U_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#U_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#U_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#U_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#U_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#U_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#U_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#U_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#U_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#U_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#U_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#U_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#U_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 3 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
Mux_A EQU 7 ;i
Mux_C EQU 6 ;i
Comp_Com EQU 5 ;i
Mux_B EQU 4 ;i
Rcp_In EQU 3 ;i
LED_0 EQU 2 ;i
LED_1 EQU 1 ;i
LED_2 EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU (1 SHL LED_0)+(1 SHL LED_1)+(1 SHL LED_2)
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
mov PCA0POL, #02h ; Damping inverted, pwm noninverted
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
CcomFET EQU 6 ;o
BcomFET EQU 5 ;o
AcomFET EQU 4 ;o
CpwmFET EQU 3 ;i
BpwmFET EQU 2 ;o
ApwmFET EQU 1 ;o
; EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)+(1 SHL CcomFET)
P1_SKIP EQU 7Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P1.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P1.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P1.CcomFET
ENDM
CcomFET_off MACRO
clr P1.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P1.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P1SKIP, #7Dh
ELSE
mov P1SKIP, #6Dh
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P1SKIP, #7Bh
ELSE
mov P1SKIP, #5Bh
ENDIF
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P1.CcomFET
mov P1SKIP, #77h
ELSE
mov P1SKIP, #37h
ENDIF
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #7Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #75h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #45h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #65h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
clr P0.LED_0
ENDM
Clear_LED_0 MACRO
setb P0.LED_0
ENDM
Set_LED_1 MACRO
clr P0.LED_1
ENDM
Clear_LED_1 MACRO
setb P0.LED_1
ENDM
Set_LED_2 MACRO
clr P0.LED_2
ENDM
Clear_LED_2 MACRO
setb P0.LED_2
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

564
V.inc

@ -0,0 +1,564 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "V"
; Cc X RC X MC CC MB MA X Ap Ac Bp X X Bc Cp
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#V_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#V_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#V_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#V_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#V_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#V_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#V_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#V_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#V_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#V_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#V_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#V_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#V_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#V_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#V_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#V_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#V_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#V_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#V_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#V_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#V_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#V_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 5 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
CcomFET EQU 7 ;o
; EQU 6 ;i
Rcp_In EQU 5 ;i
; EQU 4 ;i
Mux_C EQU 3 ;i
Comp_Com EQU 2 ;i
Mux_B EQU 1 ;i
Mux_A EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU NOT(1 SHL CcomFET)
P0_PUSHPULL EQU (1 SHL CcomFET)
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
IF FETON_DELAY == 0
mov PCA0POL, #00h ; Pwm noninverted
ELSE
mov PCA0POL, #01h ; Damping inverted, pwm noninverted
ENDIF
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
ApwmFET EQU 6 ;i
AcomFET EQU 5 ;i
BpwmFET EQU 4 ;o
; EQU 3 ;o
; EQU 2 ;o
BcomFET EQU 1 ;o
CpwmFET EQU 0 ;o
P1_DIGITAL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)
P1_INIT EQU 00h
P1_PUSHPULL EQU (1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET)+(1 SHL AcomFET)+(1 SHL BcomFET)
P1_SKIP EQU 7Fh
ApwmFET_on MACRO
setb P1.ApwmFET
IF FETON_DELAY == 0
setb P1.AcomFET
ENDIF
ENDM
ApwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
ELSE
clr P1.AcomFET
ENDIF
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET
IF FETON_DELAY == 0
setb P1.BcomFET
ENDIF
ENDM
BpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.BpwmFET
ELSE
clr P1.BcomFET
ENDIF
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET
IF FETON_DELAY == 0
setb P0.CcomFET
ENDIF
ENDM
CpwmFET_off MACRO
IF FETON_DELAY != 0
clr P1.CpwmFET
ELSE
clr P0.CcomFET
ENDIF
ENDM
All_pwmFETs_Off MACRO
IF FETON_DELAY != 0
clr P1.ApwmFET
clr P1.BpwmFET
clr P1.CpwmFET
ELSE
clr P1.AcomFET
clr P1.BcomFET
clr P0.CcomFET
ENDIF
ENDM
AcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.ApwmFET
ENDIF
setb P1.AcomFET
ENDM
AcomFET_off MACRO
clr P1.AcomFET
ENDM
BcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.BpwmFET
ENDIF
setb P1.BcomFET
ENDM
BcomFET_off MACRO
clr P1.BcomFET
ENDM
CcomFET_on MACRO
IF FETON_DELAY == 0
clr P1.CpwmFET
ENDIF
setb P0.CcomFET
ENDM
CcomFET_off MACRO
clr P0.CcomFET
ENDM
All_comFETs_Off MACRO
clr P1.AcomFET
clr P1.BcomFET
clr P0.CcomFET
ENDM
Set_Pwm_A MACRO
IF FETON_DELAY == 0
setb P1.AcomFET
mov P0SKIP, #0FFh
mov P1SKIP, #3Fh
ELSE
mov P0SKIP, #0FFh
mov P1SKIP, #1Fh
ENDIF
ENDM
Set_Pwm_B MACRO
IF FETON_DELAY == 0
setb P1.BcomFET
mov P0SKIP, #0FFh
mov P1SKIP, #6Fh
ELSE
mov P0SKIP, #0FFh
mov P1SKIP, #6Dh
endif
ENDM
Set_Pwm_C MACRO
IF FETON_DELAY == 0
setb P0.CcomFET
mov P0SKIP, #0FFh
mov P1SKIP, #7Fh
ELSE
mov P0SKIP, #7Fh
mov P1SKIP, #7Eh
endif
ENDM
Set_Pwms_Off MACRO
mov P0SKIP, #0FFh
mov P1SKIP, #7Fh
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #02h ; Set comparator multiplexer to phase A
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #12h ; Set comparator multiplexer to phase B
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #32h ; Set comparator multiplexer to phase C
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM

518
W.inc

@ -0,0 +1,518 @@
;**** **** **** **** ****
;
; BLHeli program for controlling brushless motors in helicopters and multirotors
;
; Copyright 2011, 2012 Steffen Skaug
; This program is distributed under the terms of the GNU General Public License
;
; This file is part of BLHeli.
;
; BLHeli is free software: you can redistribute it and/or modify
; it under the terms of the GNU General Public License as published by
; the Free Software Foundation, either version 3 of the License, or
; (at your option) any later version.
;
; BLHeli is distributed in the hope that it will be useful,
; but WITHOUT ANY WARRANTY; without even the implied warranty of
; MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
; GNU General Public License for more details.
;
; You should have received a copy of the GNU General Public License
; along with BLHeli. If not, see <http://www.gnu.org/licenses/>.
;
;**** **** **** **** ****
;
; Hardware definition file "W". This is for tristate input style FET driver chips
; RC MC MB X CC MA X X X Ap Bp Cp X X X X
;
;**** **** **** **** ****
;*********************
; Device SiLabs EFM8BB1x/2x
;*********************
IF MCU_48MHZ == 0
$include (SI_EFM8BB1_Defs.inc)
ELSE
$include (SI_EFM8BB2_Defs.inc)
ENDIF
;**** **** **** **** ****
; Uses internal calibrated oscillator set to 24/48Mhz
;**** **** **** **** ****
;**** **** **** **** ****
; Constant definitions
;**** **** **** **** ****
IF MCU_48MHZ == 0
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#W_L_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#W_L_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#W_L_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#W_L_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#W_L_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#W_L_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#W_L_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#W_L_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#W_L_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#W_L_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#W_L_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B10#" ; Project and MCU tag (16 Bytes)
ELSE
CSEG AT 1A40h
IF FETON_DELAY == 0
Eep_ESC_Layout: DB "#W_H_00# " ; ESC layout tag
ELSEIF FETON_DELAY == 5
Eep_ESC_Layout: DB "#W_H_05# "
ELSEIF FETON_DELAY == 10
Eep_ESC_Layout: DB "#W_H_10# "
ELSEIF FETON_DELAY == 15
Eep_ESC_Layout: DB "#W_H_15# "
ELSEIF FETON_DELAY == 20
Eep_ESC_Layout: DB "#W_H_20# "
ELSEIF FETON_DELAY == 25
Eep_ESC_Layout: DB "#W_H_25# "
ELSEIF FETON_DELAY == 30
Eep_ESC_Layout: DB "#W_H_30# "
ELSEIF FETON_DELAY == 40
Eep_ESC_Layout: DB "#W_H_40# "
ELSEIF FETON_DELAY == 50
Eep_ESC_Layout: DB "#W_H_50# "
ELSEIF FETON_DELAY == 70
Eep_ESC_Layout: DB "#W_H_70# "
ELSEIF FETON_DELAY == 90
Eep_ESC_Layout: DB "#W_H_90# "
ENDIF
CSEG AT 1A50h
Eep_ESC_MCU: DB "#BLHELI$EFM8B21#" ; Project and MCU tag (16 Bytes)
ENDIF
TEMP_LIMIT EQU 49 ; Temperature measurement ADC value for which main motor power is limited at 80degC (low byte, assuming high byte is 1)
TEMP_LIMIT_STEP EQU 9 ; Temperature measurement ADC value increment for another 10degC
;**** **** **** **** ****
; Bootloader definitions
;**** **** **** **** ****
RTX_PORT EQU P0 ; Receive/Transmit port
RTX_MDOUT EQU P0MDOUT ; Set to 1 for PUSHPULL
RTX_MDIN EQU P0MDIN ; Set to 1 for DIGITAL
RTX_SKIP EQU P0SKIP ; Set to 1 for SKIP
RTX_PIN EQU 7 ; RTX pin
SIGNATURE_001 EQU 0E8h ; Device signature
IF MCU_48MHZ == 0
SIGNATURE_002 EQU 0B1h
ELSE
SIGNATURE_002 EQU 0B2h
ENDIF
;*********************
; PORT 0 definitions *
;*********************
Rcp_In EQU 7 ;i
Mux_C EQU 6 ;i
Mux_B EQU 5 ;i
; EQU 4 ;i
Comp_Com EQU 3 ;i
Mux_A EQU 2 ;i
; EQU 1 ;i
; EQU 0 ;i
P0_DIGITAL EQU NOT((1 SHL Mux_A)+(1 SHL Mux_B)+(1 SHL Mux_C)+(1 SHL Comp_Com))
P0_INIT EQU 0FFh
P0_PUSHPULL EQU 0
P0_SKIP EQU 0FFh
Get_Rcp_Capture_Values MACRO
anl TCON, #0EFh ; Disable timer0
mov Temp1, TL0 ; Get timer0 values
mov Temp2, TH0
IF MCU_48MHZ == 1
mov Temp3, Timer0_X
jnb TCON_TF0, ($+4) ; Check if interrupt is pending
inc Temp3 ; If it is pending, then timer has already wrapped
ENDIF
mov TL0, #0 ; Reset timer0
mov TH0, #0
IF MCU_48MHZ == 1
mov Timer0_X, #0
ENDIF
orl TCON, #10h ; Enable timer0 again
IF MCU_48MHZ == 1
mov A, Clock_Set_At_48MHz
jnz Get_Rcp_End
clr C
mov A, Temp1
rlc A
mov Temp1, A
mov A, Temp2
rlc A
mov Temp2, A
mov A, Temp3
rlc A
mov Temp3, A
Get_Rcp_End:
ENDIF
ENDM
Decode_Dshot_2Msb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_msb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp4 ; Shift bit into data byte
rlc A
mov Temp4, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_msb_fail
subb A, Temp1
mov A, Temp4
rlc A
mov Temp4, A
inc DPL
ENDM
Decode_Dshot_2Lsb MACRO
movx A, @DPTR
mov Temp6, A
clr C
subb A, Temp5 ; Subtract previous timestamp
clr C
subb A, Temp1
jc t1_int_lsb_fail ; Check that bit is longer than minimum
subb A, Temp1 ; Check if bit is zero or one
mov A, Temp3 ; Shift bit into data byte
rlc A
mov Temp3, A
inc DPL ; Next bit
movx A, @DPTR
mov Temp5, A
clr C
subb A, Temp6
clr C
subb A, Temp1
jc t1_int_lsb_fail
subb A, Temp1
mov A, Temp3
rlc A
mov Temp3, A
inc DPL
ENDM
Initialize_PCA MACRO
mov PCA0CN0, #40h ; PCA enabled
mov PCA0MD, #08h ; PCA clock is system clock
IF FETON_DELAY == 0
IF MCU_48MHZ == 0
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ELSE
mov PCA0PWM, #83h ; PCA ARSEL set and 11bits pwm
ENDIF
mov PCA0CENT, #00h ; Edge aligned pwm
ELSE
IF MCU_48MHZ == 0
mov PCA0PWM, #81h ; PCA ARSEL set and 9bits pwm
ELSE
mov PCA0PWM, #82h ; PCA ARSEL set and 10bits pwm
ENDIF
mov PCA0CENT, #03h ; Center aligned pwm
ENDIF
ENDM
Set_Pwm_Polarity MACRO
IF FETON_DELAY == 0
mov PCA0POL, #00h ; Pwm noninverted
ELSE
mov PCA0POL, #01h ; Damping inverted, pwm noninverted
ENDIF
ENDM
Enable_Power_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM0, #4Ah ; Enable comparator of module, enable match, set pwm mode
ELSE
mov PCA0CPM1, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Enable_Damp_Pwm_Module MACRO
IF FETON_DELAY == 0
mov PCA0CPM1, #00h ; Disable
ELSE
mov PCA0CPM0, #42h ; Enable comparator of module, set pwm mode
ENDIF
ENDM
Set_Power_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL0, Power_Pwm_Reg_L
mov PCA0CPH0, Power_Pwm_Reg_H
ELSE
clr C
mov A, Power_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Power_Pwm_Reg_L
rrc A
mov PCA0CPL1, A
mov PCA0CPH1, Temp1
ENDIF
ENDM
Set_Damp_Pwm_Regs MACRO
IF FETON_DELAY == 0
mov PCA0CPL1, Damp_Pwm_Reg_L
mov PCA0CPH1, Damp_Pwm_Reg_H
ELSE
clr C
mov A, Damp_Pwm_Reg_H
rrc A
mov Temp1, A
mov A, Damp_Pwm_Reg_L
rrc A
mov PCA0CPL0, A
mov PCA0CPH0, Temp1
ENDIF
ENDM
Clear_COVF_Interrupt MACRO
anl PCA0PWM, #0DFh
ENDM
Clear_CCF_Interrupt MACRO ; CCF interrupt is only used for FETON_DELAY == 0
anl PCA0CN0, #0FEh
ENDM
Enable_COVF_Interrupt MACRO
orl PCA0PWM, #40h
ENDM
Enable_CCF_Interrupt MACRO
orl PCA0CPM0,#01h
ENDM
Disable_COVF_Interrupt MACRO
anl PCA0PWM, #0BFh
ENDM
Disable_CCF_Interrupt MACRO
anl PCA0CPM0,#0FEh
ENDM
;*********************
; PORT 1 definitions *
;*********************
; EQU 7 ;i
ApwmFET EQU 6 ;o
BpwmFET EQU 5 ;o
CpwmFET EQU 4 ;o
; EQU 3 ;i
; EQU 2 ;i
; EQU 1 ;i
; EQU 0 ;i
; pwm outputs start as analog in -> floating
; this ensures all mosfet drivers start with floating outputs
P1_DIGITAL EQU NOT((1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET))
P1_INIT EQU 00h
P1_PUSHPULL EQU ((1 SHL ApwmFET)+(1 SHL BpwmFET)+(1 SHL CpwmFET))
;
P1_SKIP EQU 0FFh
ApwmFET_on MACRO
setb P1.ApwmFET ; set pin to high
orl P1MDIN, #(1 SHL ApwmFET) ; enable pin driver
ENDM
ApwmFET_off MACRO
anl P1MDIN, #(NOT(1 SHL ApwmFET)) ; analog in -> pullup, driver and digital in is disable = floating
ENDM
BpwmFET_on MACRO
setb P1.BpwmFET ; set pin to high
orl P1MDIN, #(1 SHL BpwmFET) ; enable pin driver
ENDM
BpwmFET_off MACRO
anl P1MDIN, #(NOT(1 SHL BpwmFET)) ; analog in -> pullup, driver and digital in is disable = floating
ENDM
CpwmFET_on MACRO
setb P1.CpwmFET ; set pin to high
orl P1MDIN, #(1 SHL CpwmFET) ; enable pin driver
ENDM
CpwmFET_off MACRO
anl P1MDIN, #(NOT(1 SHL CpwmFET)) ; analog in -> pullup, driver and digital in is disable = floating
ENDM
All_pwmFETs_Off MACRO
anl P1MDIN, #(NOT((1 SHL ApwmFET) + (1 SHL BpwmFET) + (1 SHL CpwmFET))) ; analog in -> pullup, driver and digital in is disable = floating
ENDM
AcomFET_on MACRO
clr P1.ApwmFET ; set pin to low
orl P1MDIN, #(1 SHL ApwmFET) ; enable pin driver
ENDM
AcomFET_off MACRO
anl P1MDIN, #(NOT(1 SHL ApwmFET)) ; analog in -> pullup, driver and digital in is disable = floating
ENDM
BcomFET_on MACRO
clr P1.BpwmFET ; set pin to low
orl P1MDIN, #(1 SHL BpwmFET) ; enable pin driver
ENDM
BcomFET_off MACRO
anl P1MDIN, #(NOT(1 SHL BpwmFET)) ; analog in -> pullup, driver and digital in is disable = floating
ENDM
CcomFET_on MACRO
clr P1.CpwmFET ; set pin to low
orl P1MDIN, #(1 SHL CpwmFET) ; enable pin driver
ENDM
CcomFET_off MACRO
anl P1MDIN, #(NOT(1 SHL CpwmFET)) ; analog in -> pullup, driver and digital in is disable = floating
ENDM
All_comFETs_Off MACRO
anl P1MDIN, #(NOT((1 SHL ApwmFET) + (1 SHL BpwmFET) + (1 SHL CpwmFET))) ; analog in -> pullup, driver and digital in is disable = floating
ENDM
Set_Pwm_A MACRO
mov P1SKIP, #(NOT(1 SHL ApwmFET));
orl P1MDIN, #(1 SHL ApwmFET) ; enable pin driver
ENDM
Set_Pwm_B MACRO
mov P1SKIP, #(NOT(1 SHL BpwmFET));
orl P1MDIN, #(1 SHL BpwmFET) ; enable pin driver
ENDM
Set_Pwm_C MACRO
mov P1SKIP, #(NOT(1 SHL CpwmFET));
orl P1MDIN, #(1 SHL CpwmFET) ; enable pin driver
ENDM
Set_Pwms_Off MACRO
mov P1SKIP, #P1_SKIP;
ENDM
Set_Comp_Phase_A MACRO
mov CMP0MX, #((Mux_A) SHL 4)+((Comp_Com) SHL 0);
ENDM
Set_Comp_Phase_B MACRO
mov CMP0MX, #((Mux_B) SHL 4)+((Comp_Com) SHL 0);
ENDM
Set_Comp_Phase_C MACRO
mov CMP0MX, #((Mux_C) SHL 4)+((Comp_Com) SHL 0);
ENDM
Read_Comp_Out MACRO
mov A, CMP0CN0 ; Read comparator output
ENDM
;*********************
; PORT 2 definitions *
;*********************
DebugPin EQU 0 ;o
P2_PUSHPULL EQU (1 SHL DebugPin)
;**********************
; MCU specific macros *
;**********************
Interrupt_Table_Definition MACRO
CSEG AT 0 ; Code segment start
jmp reset
CSEG AT 03h ; Int0 interrupt
jmp int0_int
IF MCU_48MHZ == 1
CSEG AT 0Bh ; Timer0 overflow interrupt
jmp t0_int
ENDIF
CSEG AT 13h ; Int1 interrupt
jmp int1_int
CSEG AT 1Bh ; Timer1 overflow interrupt
jmp t1_int
CSEG AT 2Bh ; Timer2 overflow interrupt
jmp t2_int
CSEG AT 5Bh ; Pca interrupt
jmp pca_int
CSEG AT 73h ; Timer3 overflow/compare interrupt
jmp t3_int
ENDM
Initialize_Xbar MACRO
mov XBR2, #40h ; Xbar enabled
mov XBR1, #02h ; CEX0 and CEX1 routed to pins
ENDM
Initialize_Comparator MACRO
mov CMP0CN0, #80h ; Comparator enabled, no hysteresis
mov CMP0MD, #00h ; Comparator response time 100ns
ENDM
Initialize_Adc MACRO
mov REF0CN, #0Ch ; Set vdd (3.3V) as reference. Enable temp sensor and bias
IF MCU_48MHZ == 0
mov ADC0CF, #59h ; ADC clock 2MHz, PGA gain 1
ELSE
mov ADC0CF, #0B9h ; ADC clock 2MHz, PGA gain 1
ENDIF
mov ADC0MX, #10h ; Select temp sensor input
mov ADC0CN0, #80h ; ADC enabled
mov ADC0CN1, #01h ; Common mode buffer enabled
ENDM
Start_Adc MACRO
mov ADC0CN0, #90h ; ADC start
ENDM
Read_Adc_Result MACRO
mov Temp1, ADC0L
mov Temp2, ADC0H
ENDM
Stop_Adc MACRO
ENDM
Set_RPM_Out MACRO
ENDM
Clear_RPM_Out MACRO
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 SFRPAGE, #00h
mov Clock_Set_At_48MHz, #0
ENDM
Set_MCU_Clk_48MHz MACRO
mov SFRPAGE, #10h
mov PFE0CN, #30h ; Set flash timing for 48MHz
mov SFRPAGE, #00h
mov CLKSEL, #03h ; Set clock to 48MHz
mov Clock_Set_At_48MHz, #1
ENDM
Set_LED_0 MACRO
ENDM
Clear_LED_0 MACRO
ENDM
Set_LED_1 MACRO
ENDM
Clear_LED_1 MACRO
ENDM
Set_LED_2 MACRO
ENDM
Clear_LED_2 MACRO
ENDM
Set_LED_3 MACRO
ENDM
Clear_LED_3 MACRO
ENDM
Loading…
Cancel
Save