?? 通用同步和異步串行接收器和轉發器(usart).txt
字號:
;*******************************************************************************
;*
;* 子程序名: USART_AINT.asm
;* 程序名稱: 通用同步和異步串行接收器和轉發器(USART)
;* 異步中斷接收和發送通信程序
;* 版本: 1.0
;* 適用 MCU 型號: AVR所有型號
;* 使用資源: r5,r6,r16,r17,r18,r19,r20,r28,r29,r30,r31
;* 定時器/計數器0(溢出中斷)
;*
;* 程序功能:
;* 本程序是通用同步和異步串行接收器和轉發器(USART)在異步狀態下使用中斷
;* 方式進行全雙工接收和發送數據的通信程序。共包括下面列表中這四個子程序。這
;* 四個子程序的具體使用方法請參考各自的說明。
;* ┏───────────┳───────────────────────┓
;* ┃ 子程序名稱 ┃ 子程序功能描述 ┃
;* ┣───────────╋───────────────────────┫
;* ┃ USART_AINT_INI ┃ USART 異步通信中斷接收和發送初始化 ┃
;* ┣───────────╋───────────────────────┫
;* ┃ USART_INT_ACOM ┃USART 異步通信中斷接收與發送協議命令和數據處理┃
;* ┣───────────╋───────────────────────┫
;* ┃ USART_RXCINT ┃ USART 異步通信接收結束中斷處理 ┃
;* ┣───────────╋───────────────────────┫
;* ┃ USART_TXDREINT ┃ USART 異步通信數據寄存器空中斷發送處理 ┃
;* ┗───────────┻───────────────────────┛
;*
;* 注意:
;* ①.r5 (USARTAI_RXNum)《接收作業次數寄存器》和 r6 (USARTAI_TXNum)
;* 《發送作業次數寄存器》為全局寄存器變量,不得被其他程序使用,否則將導致接收
;* 和發送的數據錯誤。
;* ②.本程序共使用了3個中斷向量,需在主程序中設置其中斷向量轉移地址,分
;* 別為如下具體設置:
;* ┏─────────────┳───────┳─────────────┓
;* ┃ 中斷名稱 ┃ 中斷向量地址 ┃ 中斷處理程序 ┃
;* ┣─────────────╋───────╋─────────────┫
;* ┃ USART 接收結束中斷 ┃ URXCaddr ┃ USART_RXCINT ┃
;* ┣─────────────╋───────╋─────────────┫
;* ┃ USART 數據寄存器空中斷 ┃ UDREaddr ┃ USART_TXDREINT ┃
;* ┣─────────────╋───────╋─────────────┫
;* ┃ T/C0溢出中斷 ┃ OVF0addr ┃ TC0_Timer_OVFINT ┃
;* ┗─────────────┻───────┻─────────────┛
;*
;* 通信協議:
;* ①.每次進行接收和發送的作業時均以協議命令來決定下一步操作方式,關于通信
;* 協議命令的約定方法請見下述詳細說明和命令字符串的具體定義。接收和發送的命令
;* 的數據字節長度固定為 10 個字節,其格式定義如下:COM(命令起始標識字符串)+
;* 設備編號(4 個字節)+ 命令字(3 個字節)。
;* ②.接收或發送的數據幀格式:“8 個數據位, 1 個停止位,使用奇校驗”。注:如
;* 需更改本程序的數據幀格式可在“USART_AINT_INI”子程序中進行修改。
;* ③.本程序約定雙方通信的波特率為“ 115.2 Kbps ”。注:如需更改本程序的通
;* 信波特率可在“波特率(bps)常數定義”中進行設置,但雙方通信的波特率受定時器/
;* 計數器0定時時間的約束,如果要修改最小雙方通信波特率,則需修改定時器/計數器
;* 0的定時時間(減小最小波特率需延長定時時間,增大則縮短定時時間)。定時器/計
;* 數器0的定時時間應略大于在約定雙方通信的波特率下接收完 255 個字節所用的時間
;* 總和,也不宜取得過大,過大則影響雙方通信的速度。
;* ④.接收和發送的數據時均以[命令>數據,命令>數據……]形式為作業方式進行
;* 通信,但接收和發送的命令時可以任意形式進行通信。對于接收和發送的數據的校驗方
;* 法采用循環冗余檢測(CRC)校驗法,接收和發送的雙方必須采用相同的校驗算法,具
;* 體的檢測校驗算法請參考子程序“Data_CRC_2Byte”中的具體說明。
;* ⑤.每次接收和發送的數據總長度均不超過 255 個字節。而且每次接收或發送數據
;* 的第一個字節為本次接收或發送的數據長度字符,最后兩個字節為循環冗余檢測校驗字
;* 節,因此每次接收和發送的有效數據長度均不得超過 252 個字節。,其計算公式如下:
;* 數據長度數值 = 有效數據字節長度 + 3( 1 個長度字符本身 + 2 個校驗字節)
;* ⑥.在發送數據前要向對方先發送一請求發送數據命令字符串“COMXXXXATX”,等待
;* 對方回應一允許發送命令字符串“COMXXXXYET”的握手信號后,方可接著進行發送數據。
;* ⑦.當接收到的數據或命令有錯誤時,可向對方發送要求重新發送命令字符串“CO
;* MXXXXRPT”,要求對方重新發送。對方在接收到此命令字符串后,依據上次發送的作業
;* 類型來重新發送數據或命令。對于接收到的數據經循環冗余檢測校驗錯誤后,也可使用
;* 重新發送一次允許發送命令字符串“COMXXXXYET”來要求對方重新發送數據。
;* ⑧.當接收到的數據(不包括命令)經循環冗余檢測校驗正確后,必須向對方發送
;* 一接收數據正確命令字符串“COMXXXXOKD”,來結束本次接收數據操作。如果對方不發
;* 送收到此命令字符串“COMXXXXOKD”錯誤的信息(即發回“COMXXXXRPT”),不允許多
;* 次發送此命令字符串,否則將導致接收數據錯誤。
;* ⑨.本程序通信協議命令還包括了下面三個協議命令字符串,具體用法如下述:
;* “COMXXXXSTD”[要求對方發送指定數據],此命令用于啟動雙方對指定數據的收發
;* 操作。
;* “COMXXXXRII”[要求對方重新初始化 USART 端口狀態],此命令用于當通信協議命令
;* 混亂,致使收發作業操作無法正常運行時,向對方發出從頭再重新開始收發作業請求。
;* 此命令也可用于雙方開始通信前向對方發送開始通信命令使用,使雙方的 USART 端口
;* 均處于起始狀態。
;* “COMXXXXYRI”[重新初始化 USART 端口狀態完成],此命令用于通知對方,我方己可
;* 以從頭再重新開始收發作業。
;* ⑩.“COMXXXXCIT”[從 USART 端口傳送控制操作指令],此命令用于通知對方下
;* 面接著發送的數據為控制操作指令字符串,其字符串的第一個字節也為數據長度字符,
;* 但字符串的數值有無 CRC 校驗碼都可以,有 CRC 校驗碼時長度值相應也加 2 個。發送
;* 和回應控制操作指令字符串的通信協議遵循發送數據方式。接收方在收到控制操作指令
;* 字符串后,可能會發回三種回應協議命令:
;* ⑴.無法正確識別控制操作指令字符串的內容,表示接收到的指令錯誤或受到干擾,將
;* 發回要求對方重新發送命令字符串“COMXXXXRPT”。
;* ⑵.己經完成了控制操作指令字符串的內容指定的操作程序,將發回接收數據正確命令
;* 字符串“COMXXXXOKD”。
;* ⑶.控制操作指令字符串的內容為要求向其發送指定的數據,將發回請求發送數據命令
;* 字符串“COMXXXXATX”。
;*
;* 注釋:
;* ①.定時器/計數器0用于約束接收作業全部完成(指從接收第一個數據到最后一
;* 個數據之間)的時間范圍,如果在規定的時間內沒有接收作業全部完成,則強制結束
;* 此次接收作業,以便下次接收作業正確操作。其定時時間應略大于在約定雙方通信的
;* 波特率下接收完 256 個字節所用的時間總和。
;* ②.當收發命令字符串“COMXXXXRPT”超過 16 次時,即雙方接收和發送無論是數
;* 據還是協議命令只要其錯誤總次數超過 16 次,那么就認為雙方通信處于不同步狀態,
;* 或通信協議命令混亂。系統將會首先重新初始化本身的 USART 端口狀態和數據處理狀
;* 態,然后向對方發送要求對方重新初始化 USART 端口狀態命令字符串“COMXXXXRII”,
;* 以使雙方通信重新處于同步狀態。
;*
;* 編作者:
;* 編作者 E-Mail: PTZSW@163.COM
;* 編制日期: 2004年12月18日
;*
;*******************************************************************************
;*
;* 指令條數: 1398 + return
;* 指令執行周期: 0 + return
;* 低位寄存器使用: 2 (r5,r6)(注:此兩個為全局寄存器變量,不得被其他程序使用)
;* 高位寄存器使用: 5 (r16,r17,r18,r19,r20)
;* 指針寄存器使用: Y,Z
;*
;*******************************************************************************
;******** 本程序需調用的子程序定義:
.include "DataCheck_CRC2B.asm" ;包括2字節數據循環冗余檢測校驗子程序
;******** 依據硬件設置需修改的 SRAM 存儲地址定義:
.equ USARTAI_TXCOM = $0070 ;發送命令作業標志
.equ DataUPD_TXALW = $0071 ;允許更新發送數據標志
.equ USARTAI_TXEnd = $0072 ;發送作業全部結束標志
.equ USARTAI_TXAPL = $0074 ;發送地址指針低字節
.equ USARTAI_TXAPH = $0075 ;發送地址指針高字節
.equ USARTAI_TXCOA = $0076 ;首個發送命令字符地址
;要再占用往下的 10 個字節位置
.equ USARTAI_TXDAA = $0080 ;首個發送數據地址
;要再占用往下的 255 個字節位置
.equ USARTAI_RXCOM = $0182 ;接收命令作業標志
.equ DataUPD_RXALW = $0183 ;允許處理接收數據標志
.equ USARTAI_RXUPD = $0184 ;接收作業己更新標志
.equ USARTAI_RXEnd = $0185 ;接收作業全部結束標志
.equ USARTAI_RXAPL = $0186 ;接收作業地址指針低字節
.equ USARTAI_RXAPH = $0187 ;接收作業地址指針高字節
.equ USARTAI_RXCOA = $0188 ;首個接收命令字符地址
;要再占用往下的 10 個字節位置
.equ USARTAI_RXDAA = $0192 ;首個接收數據地址
;要再占用往下的 255 個字節位置
.equ USARTAI_ERRNum = $0293 ;USART 發生收發錯誤次數計數器
.equ USARTAI_T0VNum = $0294 ;定時器/計數器0溢出次數計數器
;*** 波特率(bps)常數定義:
;下面波特率設置以單片機的時鐘= 11.0592 MHz ,且不打開倍速的條件下進行定義。
;波特率(bps) = 115.2 Kbps,誤差 = 0.0%
.equ USARTAI_UBRRL = $05
.equ USARTAI_UBRRH = 0
;*** 定時器/計數器0定時 2 秒常數定義:
;下面定時器/計數器0定時參數設置以單片機的時鐘= 11.0592 MHz ,且定時器/計數
;器0的預分頻因子 = 1024 進行的條件下定義。其計算公式如下:
;定時時間 = 1 ÷ 單片機的時鐘頻率 × 1024 × USARTAI_T0CNT × USARTAI_T0Num
.equ USARTAI_T0CNTI = $80 ;定時器/計數器0計數預定比例值
.equ USARTAI_T0NumI = $03 ;定時器/計數器0溢出次數值
;*******************************************************************************
;*
;* 通用同步和異步串行接收器和轉發器(USART)異步中斷接收和發送通信程序:
;*
;* “USART_AINT_INI” --- USART 異步通信中斷接收和發送初始化子程序
;*
;* “USART_RXCINT”------ USART 異步通信接收結束中斷處理子程序。
;*
;* “USART_TXDREINT”---- USART 異步通信數據寄存器空中斷發送處理子程序。
;*
;* “USART_INT_ACOM”---- USART 異步通信中斷接收與發送協議命令和數據處理子程序
;*
;*******************************************************************************
;******** 全局程序寄存器變量定義(不得被其他程序使用):
.def USARTAI_RXNum = r5 ;接收作業次數寄存器
.def USARTAI_TXNum = r6 ;發送作業次數寄存器
;******** 本程序寄存器變量定義:
.def USARTAI_TEMP = r16 ;暫存寄存器
.def USARTAI_TEMP2 = r17 ;暫存寄存器2
.def USARTAI_TEMP3 = r18 ;暫存寄存器3
;******** 本程序常數定義:
.equ USARTAI_TCOMI = $e0 ;發送命令作業標志值(11100000)
.equ DataUPD_TALWI = $c0 ;允許更新發送數據標志值(11000000)
.equ USARTAI_TEndI = $f0 ;全部數據發送結束標志值(11110000)
.equ USARTAI_RCOMI = $07 ;接收命令作業標志值(00000111)
.equ DataUPD_RALWI = $03 ;允許處理接收數據標志值(00000011)
.equ USARTAI_RUPDI = $0a ;接收作業己更新標志值(00001010)
.equ USARTAI_REndI = $0f ;全部數據接收結束標志值(00001111)
.equ USARTAI_ENALWI = $10 ;允許 USART 發生收發錯誤次數值(16次)
.equ USARTAI_CMATNI = $0a ;收發命令的字符串總長度數值(10個)
.equ USARTAI_CMANI = $03 ;收發命令的有效字符串長度數值(3個)
;******** 程序指令代碼清單:
;*******************************************************************************
;*
;* USART 異步通信中斷接收和發送初始化子程序 - “USART_AINT_INI”
;*
;* 說明:
;* 本子程序用于初始化 USART 異步中斷接收和發送通信。本初始化子程序只打開了
;* USART 的中斷接收功能,沒有打開中斷發送功能。
;* 本子程序只需在主程序中運行一次即可。除非釋放 RXD 與 TXD 引腳功能作為其
;* 他用途,如要再使用 USART 通信則需在主程序中再運行一次本子程序。
;*
;*******************************************************************************
USART_AINT_INI:
push ZL ;壓入寄存器中的數值到堆棧
push ZH
in ZL,SREG ;壓狀態寄存器中的標志值到堆棧
push ZL
ldi ZL,USARTAI_TEndI ;置發送作業全部結束標志值
sts USARTAI_TXEnd,ZL
ldi ZL,USARTAI_TCOMI ;置發送命令作業標志值,首次發送一定為
sts USARTAI_TXCOM,ZL ;請求向對方發送或允許對方發送命令
clr ZL ;清除允許更新發送數據標志
sts DataUPD_TXALW,ZL
ldi ZL,USARTAI_REndI ;置接收作業全部結束標志值
sts USARTAI_RXEnd,ZL
ldi ZL,USARTAI_RCOMI ;置接收命令作業標志值,首次接收一定為
sts USARTAI_RXCOM,ZL ;對方請求發送或對方允許發送命令
clr ZL ;清除接收作業己更新標志
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -