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