⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 main.asm

📁 飞思卡尔智能车 开环设计 大家不妨借鉴一下。
💻 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 + -