📄 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.
AD_Value EQU $0440
ONE EQU $045A
TWO EQU $045C
WAI1 EQU $0460
MIN EQU $046A
Counter ds.w 1
FiboRes ds.w 1
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中用2个通道PROTAD8~9,共用10个通道 *
;*--------------------------------------------------------------------------------------------------*
AD_INI: LDAA #$C2
STAA ATD0CTL2;开启AD0模块,每次读取结果寄存器后快速标志位自动清零,等待模式下禁止转换,忽略;外部触发,AD顺序完成中断使能
LDAA #$00
STAA ATD0CTL3;结果寄存器映射到转换序列,转换通道数为8
LDAA #$81
STAA ATD0CTL4;AD精度为8位,采样时间为2AD时钟周期,AD的时钟周期为2MHZ
LDAA #$B0
STAA ATD0CTL5;连续转换模式,无符号,右对齐,多通道转换,从通道0开始转换
LDAA #$00
STAA ATD0DIEN;禁止数字输入缓冲
LDAA #$C2
STAA ATD1CTL2;开启AD1模块,每次读取结果寄存器后快速标志位自动清零,等待模式下禁止转换,忽略;外部触发,AD顺序完成中断使能
LDAA #$18
STAA ATD1CTL3;结果寄存器映射到转换序列,转换通道数为2
LDAA #$81
STAA ATD1CTL4;AD精度为8位,采样时间为2AD时钟周期,AD的时钟周期为2MHZ
LDAA #$B0
STAA ATD1CTL5;连续转换模式,无符号,右对齐,多通道转换,从通道0开始转换
LDAA #$00
STAA ATD1DIEN;禁止数字输入缓冲
;调用延时子程序
;LDX #$32
;Delaysub:
;DBNE X,Delaysub
;//***********数据预处理***************//
;*--------------------------------------------------------------------------------------------*
;*程序功能:最小值和次小值地址送内存单元ONE和TWO *
;*程序入口:AD_Value中的十个AD值 *
;*程序出口:存放最小AD值和次小AD值的地址,送ONE和TWO中。 *
;*--------------------------------------------------------------------------------------------*
AD_VUP: SEI ;程序总循环入口
;LDY #$02 ;要求出最小和次小值
START1: MOVB #$FF,MIN ;将MIN中取$FF
START: LDAB #$0B
LDX #AD_Value ;将指针指向AD_Value
LOOP: LDAA 0,X ;将AD_Value中内容送A
CMPA MIN ;将(A)与(MIN)比较
BHI NEXT ;若(A)≥(MIN),转NEXT
STAA MIN ;将小值送MIN中
STX ONE ;将小值地址送(ONE:ONE+1)
NEXT: INX ;指向AD_Value+1
DBNE B,LOOP ;若(B)-1≠0,转LOOP
lDAA MIN
CMPA #$CC
BHS PWM_SET
AD_CB: LDAA ONE+1 ;左边传感器地址低8位送A
ANDA #$0F ;保留左边传感器地址低4位
LDAB #5
MUL
EXG B,X ;B中放的是乘积之后的低8位
INX
LDAA AD_Table,X ;将查询到的值送入到A中
STAA WAI1+6
INX
LDAA AD_Table,X
STAA WAI1+7
INX
LDAA AD_Table,X
STAA WAI1+8
INX
LDAA AD_Table,X
STAA WAI1+9
JMP PWM_SET
AD_Table:
FCB $63,$0D,$C0,$05,$AA ;1 8.8
. FCB $4E,$0D,$C0,$06,$22 ;2
FCB $34,$0D,$78,$06,$22 ;3
FCB $20,$0D,$78,$06,$66 ;4
FCB $07,$0C,$80,$06,$66 ;5 7.7
FCB $0C,$0B,$B8,$06,$CC ;6 中间 7.5
FCB $27,$0B,$80,$06,$66 ;7 7.3
FCB $42,$09,$F8,$06,$66 ;8
FCB $5C,$09,$F8,$06,$22 ;9
FCB $75,$08,$E8,$06,$22 ;10 5.7
FCB $75,$08,$E8,$05,$AA ;11 5.7
;*----------------改写通道占空比寄存器PWMDTY0的值------------------------------*
;*程序功能:将T0中值写入道占空比寄存器PWMDTY0 *
;*程序入口:T0_Vallue *
;*程序出口:T0_Vallue中T0写入PWMDTY0 *
;*-------------------------------------------------------------------------------*
PWM_SET: LDAA #$00;
STAA PWME;关PWM通道
LDAA #$9C
STAA PWMPER0
LDAA #$40
STAA PWMPER1;设置50HzPWM
LDAA WAI1+6
STAA PWMDTY0;T0送通道占空比寄存器,产生所需占空比PWM波
LDAA WAI1+7
STAA PWMDTY1
LDAA WAI1+8
STAA PWMDTY2
LDAA WAI1+9
STAA PWMDTY3
LDAA #%00001111;
STAA PWME;开启channel0、1:channel2、3
CLI
JMP AD_VUP
EndlessLoop:
LDX #1 ; X contains counter
CouterLoop:
STX Counter ; update global.
BSR CalcFibo
STD FiboRes ; store result
LDX Counter
INX
CPX #24 ; larger values cause overflow.
BNE CouterLoop
BRA EndlessLoop ; restart.
; Function to calculate fibonacci numbers. Argument is in X.
;*------------------将结果寄存器的内容放到AD_Value中(中断服务子程序)-----------*
;*程序功能:将结果寄存器的内容放到AD_Value中 *
;*程序入口:ATD结果寄存器中的AD值 *
;*程序出口:AD值送AD_Value中 *
;*-------------------------------------------------------------------------------*
AD0_TR: SEI
LDAA #$FF
STAA DDRB
LDAA #$00
STAA PORTB
LDAB #$08 ;将8送入B中
LDX #ATD0DR0L ;将ADT0DR的地址送入X中
LDY #AD_Value ;将AD_value中的数送入Y中
LOOP1: LDAA $02,X+ ;先将AD_VALUE中的值送入A中,再将X中的内容加2
STAA $01,Y+ ;先将A中的内容送以Y中的内容为地址的单元中
DBNE B,LOOP1 ;若数据没有传输完,跳转到LOOP
CLI
RTI
AD1_TR: SEI
LDX #ATD1DR0L ;将ADI转换模块的结果寄存器0的地址送入到X中
LDY #AD_Value+8 ;将AD_VALUE+8的地址送入到Y中
LDAA 0,X ;将结果寄存器中的内容送入到A中
STAA 0,Y ;再将结果寄存器中的内容送到AD_value+8中
LDX #ATD1DR1L ;将ADI转换模块的结果寄存器1的地址送入到X中
LDY #AD_Value+9 ;将AD_VALUE+9的地址送入到Y中
LDAA 0,X ;将结果寄存器中的内容送入到A中
STAA 0,Y ;再将结果寄存器中的内容送到AD_value+9中
LDX #ATD1DR2L ;将ADI转换模块的结果寄存器1的地址送入到X中
LDY #AD_Value+10 ;将AD_VALUE+9的地址送入到Y中
LDAA 0,X ;将结果寄存器中的内容送入到A中
STAA 0,Y ;再将结果寄存器中的内容送到AD_value+9中
CLI
RTI
DelaySub: ldx #$01
Delay: ldaa #$01
Delay1: ldab #$01
Delay2:
nop
dbne b,Delay2
dbne a,Delay1
dbne x,Delay
rts
CalcFibo:
LDY #$00 ; second last
LDD #$01 ; last
DBEQ X,FiboDone ; loop once more (if X was 1, were done already)
FiboLoop:
LEAY D,Y ; overwrite second last with new value
EXG D,Y ; exchange them -> order is correct again
DBNE X,FiboLoop
FiboDone:
RTS ; result in D
ORG $FFD2
FDB AD0_TR
ORG $FFD0
FDB AD1_TR
;;;;
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -