2013年7月23日 星期二

AVR assembly範本程式建立


程式撰寫初期有很多重覆性的工作,因此若先行建立一個共用的範本程式,可以先把一些重覆的內容儲存起來;以後不管做什麼樣的程式都可以套用,就能夠省下不少時間。


以目前的需求來看,這個範本程式需要下列幾項內容:

○ 整體的說明註解
○ 檔頭引入及固定變數宣告
○ 中斷向量表
○ 中斷副程式
○ 堆疊設置

  • 整體的說明註解:包括專案名稱、適用的單晶片、撰寫日期 ... 等相關資訊,主要是用以表達程式的目的及作用。
;****************************************************************
; Project                   : Basic Example Project
; Target MCU            : Atmel Atmega8A
; Application Memory : $000 ~ $FFF (4K x 16 bis)
; Date & Time            : 2013/7/23, 9:41AM
; Compiler                 : Atmel AVR Studio 4
; Designer                 : Hrean Chang
; Description              : Example
;-------------------------------------------------------------------------------
; [Update]
; 2013/7/23 - Initial edition.
;****************************************************************
  • 檔頭引入及固定變數宣告:檔頭引入與使用的單晶片有關,當中會有相關暫存器、I/O埠位址及旗標的宣告;另外一些與硬體有關的固定變數宣告也在此進行。
.include         "m8def.inc"
.equ              stack_size = 32
.equ              system_clock = 16000000


  • 中斷向量表:其實就是一堆跳越指令,分別跳到對應的副程式上。
                         .csg
                         .org      $000
                         rjmp     BootStart
;=================== Interrupt Vector ==================
                         rjmp     ExtInterrupt0               ;External Interrupt 0

                         rjmp     ExtInterrupt1               ;External Interrupt 1
                         rjmp     Timer2Match               ;Timer/Counter2 compare match
                         rjmp     Timer2Overflow            ;Timer/Counter2 overflow
                         rjmp     Timer1Event                ;Timer/Counter1 capture event
                         rjmp     Timer1MatchA             ;Timer/Counter1 compare match A
                         rjmp     Timer1MatchB             ;Timer/Counter1 compare match B
                         rjmp     Timer1Overflow            ;Timer/Counter1 overflow
                         rjmp     Timer0Overflow             ;Timer/Counter0 overflow
                         rjmp     SPITransforComplete    ;Serial port transfer complete
                         rjmp     UART_RX_complete     ;USART RX complete
                         rjmp     UART_DataEmpty        ;USART data register empty
                         rjmp     UART_TX_complete      ;USART TX complete
                         rjmp     ADCcomplete               ;ADC conversion complete
                         rjmp     EEPROMready             ;EEPROM ready
                         rjmp     AnalogComparator        ;Analog Comparator
                         rjmp     TWIinterface                 ;Two-wire serial interface
                         rjmp     SPMready                    ;Store Program Memory ready

  • 中斷副程式
;=================== Interrupt Function Code ===================

ExtInterrupt0:
                        reti
ExtInterrupt1:
                        reti
Timer2Match:
                        reti
Timer2Overflow:
                        reti
Timer1Event:
                        reti
Timer1MatchA:
                        reti
Timer1MatchB:
                        reti
Timer1Overflow:
                        reti
Timer0Overflow:
                        reti
SPITransforComplete:
                        reti
UART_RX_complete:
                        reti
UART_DataEmpty:
                        reti
UART_TX_complete:
                        reti
ADCcomplete:
                        reti
EEPROMready:
                        reti
AnalogComparator:
                        reti
TWIinterface:
                        reti
SPMready:
                        reti

  • 堆疊設置:放在主程式開始的第一件工作,之後才容許中斷使用或做副程式跳躍。
;======================== Main Code =======================

BootStart:
                        ;Initial stack buffer
                        ldi       r16, low(stack_area) + stack_size
                        out      SPL, r16
                        ldi       r16, high(stack_area)
                        out      SPH, r16


;====================== Stack Segment ====================== 
                        .dseg
stack_area:       .byte   stack_size



沒有留言:

張貼留言