📄 main.asm
字号:
;**************************************************************
;* This stationery serves as the framework for a *
;* user application. For a more comprehensive program that *
;* demonstrates the more advanced functionality of this *
;* processor, please see the demonstration applications *
;* located in the examples subdirectory of the *
;* Freescale CodeWarrior for the HC12 Program directory *
;**************************************************************
; export symbols
XDEF Entry, main
; we use export 'Entry' as symbol. This allows us to
; reference 'Entry' either in the linker .prm file
; or from C/C++ later on
XREF __SEG_END_SSTACK ;symbol defined by the linker for the end of the stack
; include derivative specific macros
INCLUDE 'mc9s12dg128.inc'
; variable/data section
MY_EXTENDED_RAM: SECTION
;Insert here your data definition.
need_speed1 EQU $0486 ; need_speed中放的是需要的速度,即需要的脉冲数
need_speed2 EQU $0487
high_speed FDB $0E10 ; 电机hign_speed的PWM占空比为90%
low_speed FDB $0320 ; 电机low_speed的PWM占空比为20%
AD_Value EQU $0440
ONE EQU $045A
WAI1 EQU $0460
MIN EQU $046A
cur_speed_h EQU $046C
cur_speed_l EQU $046E
COUNT EQU $046F
;speed_high FDB #$64 ; 高速度 (存放脉冲数)
;speed_mid FDB #$3c ; 中等速度 (存放脉冲数)
;speed_low FDB #$19 ; 低速度 (存放脉冲数)
Counter ds.w 1
FiboRes ds.w 1
; code section
MyCode: SECTION
main:
Entry:
LDS #__SEG_END_SSTACK ; initialize the stack pointer
CLI ; enable interrupts
;初始化
;PWM初始化
;*-------------------------------PWM初始化-------------------------------------------------------*
;*A口4分频,B口不用,PWMSCLA=50。 *
;*Clock_A=8MHz/4=2MHz; Clock_SA=(8MHz/4)/2*50=20KHz. *
;*channel0: *
;* 时钟源:Clock_SA,PWMPERO=200(周期为50Hz=Clock_SA/(2*PWMPERO)) *
;* 功能:用着转向输出 *
;*channel1: *
;* 时钟源:Clock_A, PWMPER1=125(周期为8KHz=Clock_A/(2*PWMPER1)) *
;* 功能:用着驱动输出 *
;*-----------------------------------------------------------------------------------------------*
PWM_INIT: LDAA #%00000000
STAA PWME ; 禁止PWM
STAA PWMCAE ; 左对齐
LDAA #%00110000
STAA PWMCTL ; 16位
LDAA #%00000011
STAA PWMCLK ; channe0、1 use Clock_SA,channel2、3 use Clock_B
LDAA #02
STAA PWMSCLA ;时钟源Clock_SA=2MHz
LDAA #%00001111
STAA PWMPOL ;channel0、1,channel2、3正极性
LDAA #$9C
STAA PWMPER0
LDAA #$40
STAA PWMPER1 ;设置50HzPWM
LDAA #$0B
STAA PWMDTY0
LDAA #$B8
STAA PWMDTY1 ;占空比7.5%
LDAA #$0F
STAA PWMPER2
LDAA #$A0
STAA PWMPER3 ;设置2KHzPWM
LDAA #%00001111
STAA PWME ;开启channel0、1,channel2、3
;AD初始化
;*-------------------------------AD初始化-----------------------------------------------------------*
;*AD0中用8个通道PROTAD0~7,AD1中用7个通道PROTAD8~14,共用15个通道 *
;*--------------------------------------------------------------------------------------------------*
AD_INI: LDAA #$C0
STAA ATD0CTL2;开启AD0模块,每次读取结果寄存器后快速标志位自动清零,等待模式下禁止转换,忽略;禁止中断
LDAA #$00
STAA ATD0CTL3;结果寄存器映射到转换序列,转换通道数为8
LDAA #$81
STAA ATD0CTL4;AD精度为8位,采样时间为2AD时钟周期,AD的时钟周期为2MHZ
LDAA #$B0
STAA ATD0CTL5;连续转换模式,无符号,右对齐,多通道转换,从通道0开始转换
LDAA #$00
STAA ATD0DIEN;禁止数字输入缓冲
LDAA #$C0
STAA ATD1CTL2;开启AD1模块,每次读取结果寄存器后快速标志位自动清零,等待模式下禁止转换,忽略;禁止中断
LDAA #$00
STAA ATD1CTL3;结果寄存器映射到转换序列,转换通道数为8
LDAA #$81
STAA ATD1CTL4;AD精度为8位,采样时间为2AD时钟周期,AD的时钟周期为2MHZ
LDAA #$B0
STAA ATD1CTL5;连续转换模式,无符号,右对齐,多通道转换,从通道0开始转换
LDAA #$00
STAA ATD1DIEN;禁止数字输入缓冲
;调用延时子程序
;LDX #$32
;Delaysub:
;DBNE X,Delaysub
;******************************************************************************
;*********************脉冲累加初始化************************************************
PAI_INI: LDAA #$02
STAA TCTL4 ;设置通道0,1捕捉上升沿 用通道0,1级联,结果放于PACN10,单片机输入引脚为IC0
LDAA #$40
STAA PBCTL ;脉冲累加器打开,记录下降沿事件
LDAA #$80
STAA TSCR1 ;关闭计数器
LDAA #$03
STAA ICPAR ;使能累加器
;******************************************************************************
;**********************串行口通信初始化****************************************
SCI_INI: LDY #$007A
LDD #$1200
LDX #$2580
EDIV
STY SCI0BD
LDAA #$00
STAA SCI0CR1
LDAA #$0C
STAA SCI0CR2
;******************************************************************************
;//***********数据预处理***************//
;*--------------------------------------------------------------------------------------------*
;*程序功能:最小值和次小值地址送内存单元ONE和TWO *
;*程序入口:AD_Value中的十个AD值 *
;*程序出口:存放最小AD值和次小AD值的地址,送ONE和TWO中。 *
;*--------------------------------------------------------------------------------------------*
CLR COUNT
AD_VUP: LDAA #$FF
STAA DDRB
LDAA #$00
STAA PORTB
J0:BRCLR ATD0STAT1,#$01,J0
LDX #ATD0DR0L ;将AD0转换模块的结果寄存器0的地址送入到X中
LDY #AD_Value+0 ;将AD_VALUE+0的地址送入到Y中
LDAA 0,X ;将结果寄存器中的内容送入到A中
STAA 0,Y ;再将结果寄存器中的内容送到AD_value+0中
J1:BRCLR ATD0STAT1,#$02,J1
LDX #ATD0DR1L
LDY #AD_Value+1
LDAA 0,X
STAA 0,Y
J2:BRCLR ATD0STAT1,#$04,J2
LDX #ATD0DR2L
LDY #AD_Value+2
LDAA 0,X
STAA 0,Y
J3:BRCLR ATD0STAT1,#$08,J3
LDX #ATD0DR3L
LDY #AD_Value+3
LDAA 0,X
STAA 0,Y
J4:BRCLR ATD0STAT1,#$10,J4
LDX #ATD0DR4L
LDY #AD_Value+4
LDAA 0,X
STAA 0,Y
J5:BRCLR ATD0STAT1,#$20,J5
LDX #ATD0DR5L
LDY #AD_Value+5
LDAA 0,X
STAA 0,Y
J6:BRCLR ATD0STAT1,#$40,J6
LDX #ATD0DR6L
LDY #AD_Value+6
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -