www.久久久久|狼友网站av天堂|精品国产无码a片|一级av色欲av|91在线播放视频|亚洲无码主播在线|国产精品草久在线|明星AV网站在线|污污内射久久一区|婷婷综合视频网站

當(dāng)前位置:首頁(yè) > 單片機(jī) > 單片機(jī)
[導(dǎo)讀] ;*******************************************************************************;*;*子程序名:USART_AINT.asm;*程序名稱:通用同步和異步串行接收器和轉(zhuǎn)發(fā)器(USART);*異步中斷接收和發(fā)送通信程序;*

;*******************************************************************************
;*
;*子程序名:USART_AINT.asm
;*程序名稱:通用同步和異步串行接收器和轉(zhuǎn)發(fā)器(USART)

;*異步中斷接收和發(fā)送通信程序
;*版本:1.0
;*適用MCU型號(hào):AVR所有型號(hào)
;*使用資源:r5,r6,r16,r17,r18,r19,r20,r28,r29,r30,r31
;*定時(shí)器/計(jì)數(shù)器0(溢出中斷)
;*
;*程序功能:
;*  本程序是通用同步和異步串行接收器和轉(zhuǎn)發(fā)器(USART)在異步狀態(tài)下使用中斷
;*方式進(jìn)行全雙工接收和發(fā)送數(shù)據(jù)的通信程序。共包括下面列表中這四個(gè)子程序。這
;*四個(gè)子程序的具體使用方法請(qǐng)參考各自的說(shuō)明。
;*┏───────────┳───────────────────────┓
;*┃子程序名稱┃子程序功能描述┃
;*┣───────────╋───────────────────────┫
;*┃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ù)錯(cuò)誤。
;*  ②.本程序共使用了3個(gè)中斷向量,需在主程序中設(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è)時(shí)均以協(xié)議命令來(lái)決定下一步操作方式,關(guān)于通信
;*協(xié)議命令的約定方法請(qǐng)見(jiàn)下述詳細(xì)說(shuō)明和命令字符串的具體定義。接收和發(fā)送的命令
;*的數(shù)據(jù)字節(jié)長(zhǎng)度固定為10個(gè)字節(jié),其格式定義如下:COM(命令起始標(biāo)識(shí)字符串)+
;*設(shè)備編號(hào)(4個(gè)字節(jié))+命令字(3個(gè)字節(jié))。
;*  ②.接收或發(fā)送的數(shù)據(jù)幀格式:“8個(gè)數(shù)據(jù)位,1個(gè)停止位,使用奇校驗(yàn)”。注:如
;*需更改本程序的數(shù)據(jù)幀格式可在“USART_AINT_INI”子程序中進(jìn)行修改。
;* ?、?本程序約定雙方通信的波特率為“115.2Kbps”。注:如需更改本程序的通
;*信波特率可在“波特率(bps)常數(shù)定義”中進(jìn)行設(shè)置,但雙方通信的波特率受定時(shí)器/
;*計(jì)數(shù)器0定時(shí)時(shí)間的約束,如果要修改最小雙方通信波特率,則需修改定時(shí)器/計(jì)數(shù)器
;*0的定時(shí)時(shí)間(減小最小波特率需延長(zhǎng)定時(shí)時(shí)間,增大則縮短定時(shí)時(shí)間)。定時(shí)器/計(jì)
;*數(shù)器0的定時(shí)時(shí)間應(yīng)略大于在約定雙方通信的波特率下接收完255個(gè)字節(jié)所用的時(shí)間
;*總和,也不宜取得過(guò)大,過(guò)大則影響雙方通信的速度。
;* ?、?接收和發(fā)送的數(shù)據(jù)時(shí)均以[命令>數(shù)據(jù),命令>數(shù)據(jù)……]形式為作業(yè)方式進(jìn)行
;*通信,但接收和發(fā)送的命令時(shí)可以任意形式進(jìn)行通信。對(duì)于接收和發(fā)送的數(shù)據(jù)的校驗(yàn)方
;*法采用循環(huán)冗余檢測(cè)(CRC)校驗(yàn)法,接收和發(fā)送的雙方必須采用相同的校驗(yàn)算法,具
;*體的檢測(cè)校驗(yàn)算法請(qǐng)參考子程序“Data_CRC_2Byte”中的具體說(shuō)明。
;* ?、?每次接收和發(fā)送的數(shù)據(jù)總長(zhǎng)度均不超過(guò)255個(gè)字節(jié)。而且每次接收或發(fā)送數(shù)據(jù)
;*的第一個(gè)字節(jié)為本次接收或發(fā)送的數(shù)據(jù)長(zhǎng)度字符,最后兩個(gè)字節(jié)為循環(huán)冗余檢測(cè)校驗(yàn)字
;*節(jié),因此每次接收和發(fā)送的有效數(shù)據(jù)長(zhǎng)度均不得超過(guò)252個(gè)字節(jié)。,其計(jì)算公式如下:
;*數(shù)據(jù)長(zhǎng)度數(shù)值=有效數(shù)據(jù)字節(jié)長(zhǎng)度+3(1個(gè)長(zhǎng)度字符本身+2個(gè)校驗(yàn)字節(jié))
;*  ⑥.在發(fā)送數(shù)據(jù)前要向?qū)Ψ较劝l(fā)送一請(qǐng)求發(fā)送數(shù)據(jù)命令字符串“COMXXXXATX”,等待
;*對(duì)方回應(yīng)一允許發(fā)送命令字符串“COMXXXXYET”的握手信號(hào)后,方可接著進(jìn)行發(fā)送數(shù)據(jù)。
;* ?、?當(dāng)接收到的數(shù)據(jù)或命令有錯(cuò)誤時(shí),可向?qū)Ψ桨l(fā)送要求重新發(fā)送命令字符串“CO
;*MXXXXRPT”,要求對(duì)方重新發(fā)送。對(duì)方在接收到此命令字符串后,依據(jù)上次發(fā)送的作業(yè)
;*類型來(lái)重新發(fā)送數(shù)據(jù)或命令。對(duì)于接收到的數(shù)據(jù)經(jīng)循環(huán)冗余檢測(cè)校驗(yàn)錯(cuò)誤后,也可使用
;*重新發(fā)送一次允許發(fā)送命令字符串“COMXXXXYET”來(lái)要求對(duì)方重新發(fā)送數(shù)據(jù)。
;* ?、?當(dāng)接收到的數(shù)據(jù)(不包括命令)經(jīng)循環(huán)冗余檢測(cè)校驗(yàn)正確后,必須向?qū)Ψ桨l(fā)送
;*一接收數(shù)據(jù)正確命令字符串“COMXXXXOKD”,來(lái)結(jié)束本次接收數(shù)據(jù)操作。如果對(duì)方不發(fā)
;*送收到此命令字符串“COMXXXXOKD”錯(cuò)誤的信息(即發(fā)回“COMXXXXRPT”),不允許多
;*次發(fā)送此命令字符串,否則將導(dǎo)致接收數(shù)據(jù)錯(cuò)誤。
;* ?、?本程序通信協(xié)議命令還包括了下面三個(gè)協(xié)議命令字符串,具體用法如下述:
;*“COMXXXXSTD”[要求對(duì)方發(fā)送指定數(shù)據(jù)],此命令用于啟動(dòng)雙方對(duì)指定數(shù)據(jù)的收發(fā)
;*操作。
;*“COMXXXXRII”[要求對(duì)方重新初始化USART端口狀態(tài)],此命令用于當(dāng)通信協(xié)議命令
;*混亂,致使收發(fā)作業(yè)操作無(wú)法正常運(yùn)行時(shí),向?qū)Ψ桨l(fā)出從頭再重新開(kāi)始收發(fā)作業(yè)請(qǐng)求。
;*此命令也可用于雙方開(kāi)始通信前向?qū)Ψ桨l(fā)送開(kāi)始通信命令使用,使雙方的USART端口
;*均處于起始狀態(tài)。
;*“COMXXXXYRI”[重新初始化USART端口狀態(tài)完成],此命令用于通知對(duì)方,我方己可
;*以從頭再重新開(kāi)始收發(fā)作業(yè)。
;* ?、?“COMXXXXCIT”[從USART端口傳送控制操作指令],此命令用于通知對(duì)方下
;*面接著發(fā)送的數(shù)據(jù)為控制操作指令字符串,其字符串的第一個(gè)字節(jié)也為數(shù)據(jù)長(zhǎng)度字符,
;*但字符串的數(shù)值有無(wú)CRC校驗(yàn)碼都可以,有CRC校驗(yàn)碼時(shí)長(zhǎng)度值相應(yīng)也加2個(gè)。發(fā)送
;*和回應(yīng)控制操作指令字符串的通信協(xié)議遵循發(fā)送數(shù)據(jù)方式。接收方在收到控制操作指令
;*字符串后,可能會(huì)發(fā)回三種回應(yīng)協(xié)議命令:
;*⑴.無(wú)法正確識(shí)別控制操作指令字符串的內(nèi)容,表示接收到的指令錯(cuò)誤或受到干擾,將
;*發(fā)回要求對(duì)方重新發(fā)送命令字符串“COMXXXXRPT”。
;*⑵.己經(jīng)完成了控制操作指令字符串的內(nèi)容指定的操作程序,將發(fā)回接收數(shù)據(jù)正確命令
;*字符串“COMXXXXOKD”。
;*⑶.控制操作指令字符串的內(nèi)容為要求向其發(fā)送指定的數(shù)據(jù),將發(fā)回請(qǐng)求發(fā)送數(shù)據(jù)命令
;*字符串“COMXXXXATX”。
;*
;*注釋: 
;* ?、?定時(shí)器/計(jì)數(shù)器0用于約束接收作業(yè)全部完成(指從接收第一個(gè)數(shù)據(jù)到最后一
;*個(gè)數(shù)據(jù)之間)的時(shí)間范圍,如果在規(guī)定的時(shí)間內(nèi)沒(méi)有接收作業(yè)全部完成,則強(qiáng)制結(jié)束
;*此次接收作業(yè),以便下次接收作業(yè)正確操作。其定時(shí)時(shí)間應(yīng)略大于在約定雙方通信的
;*波特率下接收完256個(gè)字節(jié)所用的時(shí)間總和。
;* ?、?當(dāng)收發(fā)命令字符串“COMXXXXRPT”超過(guò)16次時(shí),即雙方接收和發(fā)送無(wú)論是數(shù)
;*據(jù)還是協(xié)議命令只要其錯(cuò)誤總次數(shù)超過(guò)16次,那么就認(rèn)為雙方通信處于不同步狀態(tài),
;*或通信協(xié)議命令混亂。系統(tǒng)將會(huì)首先重新初始化本身的USART端口狀態(tài)和數(shù)據(jù)處理狀
;*態(tài),然后向?qū)Ψ桨l(fā)送要求對(duì)方重新初始化USART端口狀態(tài)命令字符串“COMXXXXRII”,
;*以使雙方通信重新處于同步狀態(tài)。
;*
;*******************************************************************************
;*
;*指令條數(shù):1398+return
;*指令執(zhí)行周期:0+return
;*低位寄存器使用:2(r5,r6)(注:此兩個(gè)為全局寄存器變量,不得被其他程序使用)
;*高位寄存器使用:5(r16,r17,r18,r19,r20)
;*指針寄存器使用:Y,Z
;*
;*******************************************************************************

;********本程序需調(diào)用的子程序定義:

.include"DataCheck_CRC2B.asm";包括2字節(jié)數(shù)據(jù)循環(huán)冗余檢測(cè)校驗(yàn)子程序


;********依據(jù)硬件設(shè)置需修改的SRAM存儲(chǔ)地址定義:

.equUSARTAI_TXCOM=$0070;發(fā)送命令作業(yè)標(biāo)志
.equDataUPD_TXALW=$0071;允許更新發(fā)送數(shù)據(jù)標(biāo)志
.equUSARTAI_TXEnd=$0072;發(fā)送作業(yè)全部結(jié)束標(biāo)志
.equUSARTAI_TXAPL=$0074;發(fā)送地址指針低字節(jié)
.equUSARTAI_TXAPH=$0075;發(fā)送地址指針高字節(jié)
.equUSARTAI_TXCOA=$0076;首個(gè)發(fā)送命令字符地址
;要再占用往下的10個(gè)字節(jié)位置
.equUSARTAI_TXDAA=$0080;首個(gè)發(fā)送數(shù)據(jù)地址
;要再占用往下的255個(gè)字節(jié)位置

.equUSARTAI_RXCOM=$0182;接收命令作業(yè)標(biāo)志
.equDataUPD_RXALW=$0183;允許處理接收數(shù)據(jù)標(biāo)志
.equUSARTAI_RXUPD=$0184;接收作業(yè)己更新標(biāo)志
.equUSARTAI_RXEnd=$0185;接收作業(yè)全部結(jié)束標(biāo)志
.equUSARTAI_RXAPL=$0186;接收作業(yè)地址指針低字節(jié)
.equUSARTAI_RXAPH=$0187;接收作業(yè)地址指針高字節(jié)
.equUSARTAI_RXCOA=$0188;首個(gè)接收命令字符地址
;要再占用往下的10個(gè)字節(jié)位置
.equUSARTAI_RXDAA=$0192;首個(gè)接收數(shù)據(jù)地址
;要再占用往下的255個(gè)字節(jié)位置

.equUSARTAI_ERRNum=$0293;USART發(fā)生收發(fā)錯(cuò)誤次數(shù)計(jì)數(shù)器
.equUSARTAI_T0VNum=$0294;定時(shí)器/計(jì)數(shù)器0溢出次數(shù)計(jì)數(shù)器


;***波特率(bps)常數(shù)定義:
;下面波特率設(shè)置以單片機(jī)的時(shí)鐘=11.0592MHz,且不打開(kāi)倍速的條件下進(jìn)行定義。
;波特率(bps)=115.2Kbps,誤差=0.0%
.equUSARTAI_UBRRL=$05
.equUSARTAI_UBRRH=0

;***定時(shí)器/計(jì)數(shù)器0定時(shí)2秒常數(shù)定義:
;下面定時(shí)器/計(jì)數(shù)器0定時(shí)參數(shù)設(shè)置以 單片機(jī) 的時(shí)鐘=11.0592MHz,且定時(shí)器/計(jì)數(shù)
;器0的預(yù)分頻因子=1024進(jìn)行的條件下定義。其計(jì)算公式如下:
;定時(shí)時(shí)間=1÷ 單片機(jī) 的時(shí)鐘頻率×1024×USARTAI_T0CNT×USARTAI_T0Num
.equUSARTAI_T0CNTI=$80;定時(shí)器/計(jì)數(shù)器0計(jì)數(shù)預(yù)定比例值
.equUSARTAI_T0NumI=$03;定時(shí)器/計(jì)數(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ù)處理子程序
;*
;*******************************************************************************


;********全局程序寄存器變量定義(不得被其他程序使用):
.defUSARTAI_RXNum=r5;接收作業(yè)次數(shù)寄存器
.defUSARTAI_TXNum=r6;發(fā)送作業(yè)次數(shù)寄存器


;********本程序寄存器變量定義:

.defUSARTAI_TEMP=r16;暫存寄存器
.defUSARTAI_TEMP2=r17;暫存寄存器2
.defUSARTAI_TEMP3=r18;暫存寄存器3


;********本程序常數(shù)定義:

.equUSARTAI_TCOMI=$e0;發(fā)送命令作業(yè)標(biāo)志值(11100000)
.equDataUPD_TALWI=$c0;允許更新發(fā)送數(shù)據(jù)標(biāo)志值(11000000)
.equUSARTAI_TEndI=$f0;全部數(shù)據(jù)發(fā)送結(jié)束標(biāo)志值(11110000)
.equUSARTAI_RCOMI=$07;接收命令作業(yè)標(biāo)志值(00000111)
.equDataUPD_RALWI=$03;允許處理接收數(shù)據(jù)標(biāo)志值(00000011)
.equUSARTAI_RUPDI=$0a;接收作業(yè)己更新標(biāo)志值(00001010)
.equUSARTAI_REndI=$0f;全部數(shù)據(jù)接收結(jié)束標(biāo)志值(00001111)
.equUSARTAI_ENALWI=$10;允許USART發(fā)生收發(fā)錯(cuò)誤次數(shù)值(16次)
.equUSARTAI_CMATNI=$0a;收發(fā)命令的字符串總長(zhǎng)度數(shù)值(10個(gè))
.equUSARTAI_CMANI=$03;收發(fā)命令的有效字符串長(zhǎng)度數(shù)值(3個(gè))


;********程序指令代碼清單:

;*******************************************************************************
;*
;*USART異步通信中斷接收和發(fā)送初始化子程序?。 癠SART_AINT_INI”
;*
;*說(shuō)明:
;*  本子程序用于初始化USART異步中斷接收和發(fā)送通信。本初始化子程序只打開(kāi)了
;*USART的中斷接收功能,沒(méi)有打開(kāi)中斷發(fā)送功能。
;*  本子程序只需在主程序中運(yùn)行一次即可。除非釋放RXD與TXD引腳功能作為其
;*他用途,如要再使用USART通信則需在主程序中再運(yùn)行一次本子程序。
;*
;*******************************************************************************

USART_AINT_INI:
pushZL;壓入寄存器中的數(shù)值到堆棧
pushZH
inZL,SREG;壓狀態(tài)寄存器中的標(biāo)志值到堆棧
pushZL
ldiZL,USARTAI_TEndI;置發(fā)送作業(yè)全部結(jié)束標(biāo)志值
stsUSARTAI_TXEnd,ZL
ldiZL,USARTAI_TCOMI;置發(fā)送命令作業(yè)標(biāo)志值,首次發(fā)送一定為
stsUSARTAI_TXCOM,ZL;請(qǐng)求向?qū)Ψ桨l(fā)送或允許對(duì)方發(fā)送命令
clrZL;清除允許更新發(fā)送數(shù)據(jù)標(biāo)志
stsDataUPD_TXALW,ZL
ldiZL,USARTAI_REndI;置接收作業(yè)全部結(jié)束標(biāo)志值
stsUSARTAI_RXEnd,ZL
ldiZL,USARTAI_RCOMI;置接收命令作業(yè)標(biāo)志值,首次接收一定為
stsUSARTAI_RXCOM,ZL;對(duì)方請(qǐng)求發(fā)送或?qū)Ψ皆试S發(fā)送命令
clrZL;清除接收作業(yè)己更新標(biāo)志
stsUSARTAI_RXUPD,ZL
clrZL;清除允許處理接收數(shù)據(jù)標(biāo)志
stsDataUPD_RXALW,ZL
clrZL;清除USART發(fā)生收發(fā)錯(cuò)誤次數(shù)計(jì)數(shù)器值
stsUSARTAI_ERRNum,ZL
clrZL;清除定時(shí)器/計(jì)數(shù)器0溢出次數(shù)計(jì)數(shù)器值
stsUSARTAI_T0VNum,ZL
cli;禁止全局中斷
ldiZL,USARTAI_UBRRL;設(shè)置通信波特率
outUBRRL,ZL
ldiZL,USARTAI_UBRRH
outUBRRH,ZL
ldiZL,(1<;設(shè)置幀格式:8個(gè)數(shù)據(jù)位,1個(gè)停止位,
;并使能奇校驗(yàn)。USART異步模式
;ldiZL,(1<;設(shè)置幀格式:8個(gè)數(shù)據(jù)位,2個(gè)停止位,
;并使能奇校驗(yàn)。USART異步模式
outUCSRC,ZL
ldiZL,(1<outUCSRB,ZL;接收器與發(fā)送器使能和接收結(jié)束中斷使能
sei;打開(kāi)全局中斷
popZL
outSREG,ZL;彈出堆棧中的標(biāo)志值到狀態(tài)寄存器
popZH;彈出堆棧中的數(shù)值到寄存器
popZL
ret;子程序返回


;*******************************************************************************
;*
;*USART異步通信接收結(jié)束中斷處理子程序?。 癠SART_RXCINT”
;*
;*說(shuō)明:
;*  本子程序用于USART異步通信接收結(jié)束中斷處理。
;*
;*SRAM中標(biāo)志字節(jié)用法:
;*  入口標(biāo)志:本子程序?qū)z查這些標(biāo)志,依據(jù)這些標(biāo)志置值來(lái)控制不同接收作業(yè)。
;*接收作業(yè)全部結(jié)束(USARTAI_RXEnd)=$07(USARTAI_REndI)
;*≠$07(USARTAI_REndI)
;*r5---接收作業(yè)次數(shù)(USARTAI_RXNum)
;*  出口標(biāo)志:①.接收作業(yè)全部正確接收完成后,將對(duì)下面這兩個(gè)標(biāo)志置值。
;*接收作業(yè)全部結(jié)束(USARTAI_RXEnd)=$0f(USARTAI_REndI)
;*接收作業(yè)己更新(USARTAI_RXUPD)=$0a(USARTAI_RUPDI)
;*r5---接收作業(yè)次數(shù)(USARTAI_RXNum)=$00
;* ?、冢邮兆鳂I(yè)開(kāi)始后(正在進(jìn)行中),將對(duì)下面這兩個(gè)標(biāo)志置值。
;*接收作業(yè)全部結(jié)束(USARTAI_RXEnd)=$00
;*接收作業(yè)己更新(USARTAI_RXUPD)=$00
;* ?、郏邮兆鳂I(yè)發(fā)生錯(cuò)誤時(shí),將對(duì)下面這兩個(gè)標(biāo)志置值。
;*接收作業(yè)全部結(jié)束(USARTAI_RXEnd)=$00
;*接收作業(yè)己更新(USARTAI_RXUPD)=$0a(USARTAI_RUPDI)
;*
;*******************************************************************************

USART_RXCINT:
pushUSARTAI_TEMP;壓入寄存器中的數(shù)值到堆棧
pushZL
pushZH
inUSARTAI_TEMP,SREG;壓狀態(tài)寄存器中的標(biāo)志值到堆棧
pushUSARTAI_TEMP
ldsUSARTAI_TEMP,USARTAI_RXEnd;檢查接收作業(yè)是否己全部結(jié)束?
cpiUSARTAI_TEMP,USARTAI_REndI;否,則繼續(xù)
breqUSART_RXCINT_First;是,就轉(zhuǎn)至接收第一個(gè)字節(jié)處理
ldiZH,(1<inUSARTAI_TEMP,UCSRA;數(shù)據(jù)溢出(DOR)及奇偶校驗(yàn)錯(cuò)誤(UPE)
andUSARTAI_TEMP,ZH;否,則繼續(xù)
brneUSART_RXCINT_Error;是,就轉(zhuǎn)至接收錯(cuò)誤處理
ldsZL,USARTAI_RXAPL;置接收作業(yè)地址指針
ldsZH,USARTAI_RXAPH
inUSARTAI_TEMP,UDR;從USART數(shù)據(jù)寄存器取出接收數(shù)據(jù)
stZ,USARTAI_TEMP;存儲(chǔ)進(jìn)SRAM中
adiwZL,$01;接收作業(yè)地址指針+1
stsUSARTAI_RXAPL,ZL;存儲(chǔ)回SRAM中
stsUSARTAI_RXAPH,ZH
decUSARTAI_RXNum;全部接收作業(yè)完畢否?
breqUSART_RXCINT_End;是,就轉(zhuǎn)至結(jié)束處理
rjmpUSART_RXCINT_RET;否,轉(zhuǎn)到中斷返回
USART_RXCINT_End:
ldiZL,USARTAI_REndI;置接收作業(yè)全部結(jié)束標(biāo)志值
stsUSARTAI_RXEnd,ZL
ldiZL,USARTAI_RUPDI;置接收作業(yè)己更新標(biāo)志值
stsUSARTAI_RXUPD,ZL
ldiZH,(1<comZH;注:僅只改變T/C中斷屏蔽寄存
inZL,TIMSK;器中的此項(xiàng)設(shè)置,對(duì)于其他T/C
andZL,ZH;中斷狀態(tài)保留原來(lái)設(shè)置
outTIMSK,ZL
rjmpUSART_RXCINT_RET;轉(zhuǎn)到中斷返回
USART_RXCINT_Error:
ldiZH,(1<comZH;注:僅只改變T/C中斷屏蔽寄存
inZL,TIMSK;器中的此項(xiàng)設(shè)置,對(duì)于其他T/C
andZL,ZH;中斷狀態(tài)保留原來(lái)設(shè)置
outTIMSK,ZL
inUSARTAI_TEMP,UDR;讀USART數(shù)據(jù)寄存器使RXC標(biāo)志清除,
;以結(jié)束本次USART接收結(jié)束中斷處理
ldiZL,USARTAI_RUPDI;置接收作業(yè)己更新標(biāo)志值
stsUSARTAI_RXUPD,ZL
rjmpUSART_RXCINT_RET;轉(zhuǎn)到中斷返回
USART_RXCINT_First:
clrZL;清除接收作業(yè)全部結(jié)束標(biāo)志
stsUSARTAI_RXEnd,ZL
stsUSARTAI_T0VNum,ZL;定時(shí)器/計(jì)數(shù)器0溢出次數(shù)清0
inZL,TIFR;清除T/C0計(jì)數(shù)溢出標(biāo)志
oriZL,(1<outTIFR,ZL;器中的此項(xiàng)標(biāo)志,對(duì)于其他T/C
;中斷標(biāo)志保留原來(lái)狀態(tài)
ldiZL,USARTAI_T0CNTI;置T/C0定時(shí)參數(shù)的預(yù)定計(jì)數(shù)比例值
outTCNT0,ZL
inZL,TIMSK;使能T/C0計(jì)數(shù)溢出中斷
oriZL,(1<outTIMSK,ZL;器中的此項(xiàng)設(shè)置,對(duì)于其他T/C
;中斷狀態(tài)保留原來(lái)設(shè)置
ldiZL,(1<outTCCR0,ZL;按CK÷1024預(yù)分頻因子啟動(dòng)T/C0
ldsZL,USARTAI_RXCOM;接收作業(yè)是否為接收命令
cpiZL,USARTAI_RCOMI;否,則為接收數(shù)據(jù)
breqUSART_RXCINT_FCOMM;是,就轉(zhuǎn)至接收命令處理
USART_RXCINT_FData:
ldiZL,Low(USARTAI_RXDAA);置接收作業(yè)地址指針為
ldiZH,High(USARTAI_RXDAA);首個(gè)接收數(shù)據(jù)地址指針
inUSARTAI_TEMP,UDR;從USART數(shù)據(jù)寄存器取出接收數(shù)據(jù)
stZ,USARTAI_TEMP;存儲(chǔ)進(jìn)SRAM中
adiwZL,$01;接收作業(yè)地址指針+1
stsUSARTAI_RXAPL,ZL;存儲(chǔ)回SRAM中
stsUSARTAI_RXAPH,ZH
MOV USARTAI_RXNum,USARTAI_TEMP;置接收作業(yè)次數(shù)計(jì)數(shù)器初值
decUSARTAI_RXNum;接收作業(yè)次數(shù)-1
rjmpUSART_RXCINT_RET;轉(zhuǎn)到中斷返回
USART_RXCINT_FCOMM:
ldiZL,Low(USARTAI_RXCOA);置接收作業(yè)地址指針為
ldiZH,High(USARTAI_RXCOA);首個(gè)接收命令地址指針
inUSARTAI_TEMP,UDR;從USART數(shù)據(jù)寄存器取出接收數(shù)據(jù)
stZ,USARTAI_TEMP;存儲(chǔ)進(jìn)SRAM中
adiwZL,$01;接收作業(yè)地址指針+1
stsUSARTAI_RXAPL,ZL;存儲(chǔ)回SRAM中
stsUSARTAI_RXAPH,ZH
ldiUSARTAI_TEMP,(USARTAI_CMATNI-1)
;置接收作業(yè)次數(shù)計(jì)數(shù)器初值,
MOV USARTAI_RXNum,USARTAI_TEMP;第一個(gè)命令的字符串己接收
USART_RXCINT_RET:
popUSARTAI_TEMP;彈出堆棧中的標(biāo)志值到狀態(tài)寄存器
outSREG,USARTAI_TEMP
popZH;彈出堆棧中的數(shù)值到寄存器
popZL
popUSARTAI_TEMP
reti;中斷返回


;*******************************************************************************
;*
;*USART異步通信數(shù)據(jù)寄存器空中斷發(fā)送處理子程序?。 癠SART_TXDREINT”
;*
;*說(shuō)明:
;*  本子程序用于USART異步通信數(shù)據(jù)寄存器空中斷發(fā)送處理。
;*
;*注意:
;*  發(fā)送作業(yè)全部結(jié)束后,將禁止USART數(shù)據(jù)寄存器空中斷操作。
;*
;*SRAM中標(biāo)志字節(jié)用法:
;*  入口標(biāo)志:本子程序?qū)z查這些標(biāo)志,依據(jù)這些標(biāo)志置值來(lái)控制不同發(fā)送作業(yè)。
;*r6---發(fā)送作業(yè)次數(shù)(USARTAI_TXNum)
;*  出口標(biāo)志:發(fā)送作業(yè)全部正確發(fā)送完成后,將對(duì)下面這兩個(gè)標(biāo)志置值。
;*發(fā)送作業(yè)全部結(jié)束(USARTAI_TXEnd)=$f0(USARTAI_TEndI)
;*r6---發(fā)送作業(yè)次數(shù)(USARTAI_TXNum)=$00
;*
;*******************************************************************************

USART_TXDREINT:
pushUSARTAI_TEMP;壓入寄存器中的數(shù)值到堆棧
pushZL
pushZH
inUSARTAI_TEMP,SREG;壓狀態(tài)寄存器中的標(biāo)志值到堆棧
pushUSARTAI_TEMP
ldsZL,USARTAI_TXAPL;置發(fā)送作業(yè)地址指針
ldsZH,USARTAI_TXAPH
ldUSARTAI_TEMP,Z;從SRAM中取出發(fā)送字節(jié),
outUDR,USARTAI_TEMP;送入U(xiǎn)SART數(shù)據(jù)寄存器
adiwZL,$01;發(fā)送作業(yè)地址指針+1
stsUSARTAI_TXAPL,ZL;存儲(chǔ)回SRAM中
stsUSARTAI_TXAPH,ZH
decUSARTAI_TXNum;發(fā)送作業(yè)全部完畢否?
brneUSART_TXDREINT1;否,轉(zhuǎn)到中斷返回
ldiUSARTAI_TEMP,USARTAI_TEndI;置發(fā)送作業(yè)全部結(jié)束標(biāo)志值
stsUSARTAI_TXEnd,USARTAI_TEMP
cbiUCSRB,UDRIE;禁止USART數(shù)據(jù)寄存器空中斷
USART_TXDREINT1:
popUSARTAI_TEMP;彈出堆棧中的標(biāo)志值到狀態(tài)寄存器
outSREG,USARTAI_TEMP
popZH;彈出堆棧中的數(shù)值到寄存器
popZL
popUSARTAI_TEMP
reti;中斷返回


;*******************************************************************************
;*
;*USART異步通信數(shù)據(jù)寄存器空中斷發(fā)送處理初始化子程序?。 癠SART_AINT_TXINI”
;*
;*說(shuō)明:
;*  本子程序用于初始化USART異步通信數(shù)據(jù)寄存器空中斷發(fā)送處理。
;*
;*注意:
;*  1.在運(yùn)行本程序前必須先運(yùn)行“USART_AINT_INI”子程序。
;*  2.在運(yùn)行本程序前必須先將要發(fā)送的數(shù)據(jù)塊復(fù)制到SRAM相應(yīng)的存儲(chǔ)區(qū)中。
;*  3.本子程序運(yùn)行后,將立即啟動(dòng)數(shù)據(jù)寄存器空中斷,進(jìn)行發(fā)送作業(yè)。
;*
;*SRAM中標(biāo)志字節(jié)用法:
;*  入口標(biāo)志:本子程序?qū)z查這些標(biāo)志,依據(jù)這些標(biāo)志置值來(lái)控制不同發(fā)送作業(yè)。
;*發(fā)送命令作業(yè)(USARTAI_TXCOM)=$e0(USARTAI_TCOMI)
;*  出口標(biāo)志:本子程序運(yùn)行后,將對(duì)下面這兩個(gè)標(biāo)志置值。
;*發(fā)送作業(yè)全部結(jié)束(USARTAI_TXEnd)=$00
;*r6---發(fā)送作業(yè)次數(shù)(USARTAI_TXNum)=發(fā)送的首個(gè)字節(jié)
;*
;*******************************************************************************

USART_AINT_TXINI:
clrZL;清除全部數(shù)據(jù)發(fā)送結(jié)束標(biāo)志
stsUSARTAI_TXEnd,ZL
ldsZL,USARTAI_TXCOM;發(fā)送任務(wù)是否為發(fā)送命令
cpiZL,USARTAI_TCOMI;否,則為發(fā)送數(shù)據(jù)
breqUSART_AINT_TXINI1;是,就轉(zhuǎn)至發(fā)送命令處理
ldiZL,Low(USARTAI_TXDAA);置首個(gè)發(fā)送地址指針為發(fā)送數(shù)據(jù)初值
ldiZH,High(USARTAI_TXDAA);發(fā)送的首個(gè)數(shù)據(jù)為本次發(fā)送作業(yè)次數(shù)
stsUSARTAI_TXAPL,ZL
stsUSARTAI_TXAPH,ZH
ldUSARTAI_TXNum,Z;置發(fā)送作業(yè)次數(shù)計(jì)數(shù)器初值
rjmpUSART_AINT_TXINI2
USART_AINT_TXINI1:
ldiZL,Low(USARTAI_TXCOA);置首個(gè)發(fā)送地址指針為發(fā)送命令初值
ldiZH,High(USARTAI_TXCOA);發(fā)送的首個(gè)命令為本次發(fā)送作業(yè)次數(shù)
stsUSARTAI_TXAPL,ZL
stsUSARTAI_TXAPH,ZH
ldiUSARTAI_TEMP,USARTAI_CMATNI;置發(fā)送作業(yè)次數(shù)計(jì)數(shù)器初值
MOV USARTAI_TXNum,USARTAI_TEMP;注:發(fā)送命令作業(yè)為固定次數(shù)
USART_AINT_TXINI2:
ldiZL,(1<outUCSRB,ZL;接收器與發(fā)送器使能和接收結(jié)束中斷、
;與USART數(shù)據(jù)寄存器空中斷使能
ret;子程序返回


;*******************************************************************************
;*
;*向USART端口發(fā)送通信協(xié)議命令子程序清單
;*
;*說(shuō)明:
;*  本子程序用于向USART端口發(fā)送通信協(xié)議命令。調(diào)用這些子程序后,將立即
;*啟動(dòng)該命令的發(fā)送作業(yè)。共包括下列這些獨(dú)立的子程序。
;*
;*  向端口發(fā)送[向?qū)Ψ秸?qǐng)求發(fā)送]命令---------“USART_TX_COMM_AskTX”
;*  向端口發(fā)送[允許對(duì)方發(fā)送]命令-----------“USART_TX_COMM_OKRX”
;*  向端口發(fā)送[要求對(duì)方重新發(fā)送]命令-------“USART_TX_COMM_REPTX”
;*  向端口發(fā)送[接收數(shù)據(jù)正確]命令-----------“USART_TX_COMM_DataOK”
;*  向端口發(fā)送[要求對(duì)方發(fā)送指定數(shù)據(jù)]命令---“USART_TX_COMM_DCOMTX”
;*  向端口發(fā)送[要求對(duì)方重新初始化]命令-----“USART_TX_COMM_REPINI”
;*  向端口發(fā)送[重新初始化完成]命令---------“USART_TX_COMM_RINIOK”
;*
;*******************************************************************************


;***此段程序用于發(fā)送[重新初始化完成]命令 - “USART_TX_COMM_RINIOK”
USART_TX_COMM_RINIOK:
rcallUSART_TXD_COMM_Head;將開(kāi)頭字符串和端口編號(hào)復(fù)制到SRAM中
ldiZL,Low(USART_RINIOK*2);置Z指針為重新初始化完成命令字符串,
ldiZH,High(USART_RINIOK*2);在FLASH中的存儲(chǔ)地址
rcallUSART_TXD_COMM_COM;將命令字符串復(fù)制到SRAM的發(fā)送地址中,
;并置發(fā)送命令作業(yè)標(biāo)志值
rcallUSART_AINT_TXINI;發(fā)送本命令字符串
ret;子程序返回

;***此段程序用于發(fā)送[要求對(duì)方重新初始化]命令?。 癠SART_TX_COMM_REPINI”
USART_TX_COMM_REPINI:
rcallUSART_TXD_COMM_Head;將開(kāi)頭字符串和端口編號(hào)復(fù)制到SRAM中
ldiZL,Low(USART_REPINI*2);置Z指針為要求對(duì)方重新初始化命令字符串,
ldiZH,High(USART_REPINI*2);在FLASH中的存儲(chǔ)地址
rcallUSART_TXD_COMM_COM;將命令字符串復(fù)制到SRAM的發(fā)送地址中,
;并置發(fā)送命令作業(yè)標(biāo)志值
rcallUSART_AINT_TXINI;發(fā)送本命令字符串
ret;子程序返回

;***此段程序用于發(fā)送[向?qū)Ψ秸?qǐng)求發(fā)送]命令?。 癠SART_TX_COMM_AskTX”
USART_TX_COMM_AskTX:
rcallUSART_TXD_COMM_Head;將開(kāi)頭字符串和端口編號(hào)復(fù)制到SRAM中
ldiZL,Low(USART_AskTX*2);置Z指針為向?qū)Ψ秸?qǐng)求發(fā)送命令字符串,
ldiZH,High(USART_AskTX*2);在FLASH中的存儲(chǔ)地址
rcallUSART_TXD_COMM_COM;將命令字符串復(fù)制到SRAM的發(fā)送地址中,
;并置發(fā)送命令作業(yè)標(biāo)志值
rcallUSART_AINT_TXINI;發(fā)送本命令字符串
ret;子程序返回

;***此段程序用于發(fā)送[允許對(duì)方發(fā)送]命令?。 癠SART_TX_COMM_OKRX”
USART_TX_COMM_OKRX:
rcallUSART_TXD_COMM_Head;將開(kāi)頭字符串和端口編號(hào)復(fù)制到SRAM中
ldiZL,Low(USART_OKRX*2);置Z指針為向?qū)Ψ秸?qǐng)求發(fā)送命令字符串,
ldiZH,High(USART_OKRX*2);在FLASH中的存儲(chǔ)地址

rcallUSART_TXD_COMM_COM;將命令字符串復(fù)制到SRAM的發(fā)送地址中,
;并置發(fā)送命令作業(yè)標(biāo)志值
rcallUSART_AINT_TXINI;發(fā)送本命令字符串
ret;子程序返回

;***此段程序用于發(fā)送[要求對(duì)方重新發(fā)送]命令 - “USART_TX_COMM_REPTX”
USART_TX_COMM_REPTX:
rcallUSART_TXD_COMM_Head;將開(kāi)頭字符串和端口編號(hào)復(fù)制到SRAM中
ldiZL,Low(USART_REPTX*2);置Z指針為向?qū)Ψ秸?qǐng)求發(fā)送命令字符串,
ldiZH,High(USART_REPTX*2);在FLASH中的存儲(chǔ)地址
rcallUSART_TXD_COMM_COM;將命令字符串復(fù)制到SRAM的發(fā)送地址中,
;并置發(fā)送命令作業(yè)標(biāo)志值
rcallUSART_AINT_TXINI;發(fā)送本命令字符串
ret;子程序返回

;***此段程序用于發(fā)送[接收數(shù)據(jù)正確]命令?。 癠SART_TX_COMM_DataOK”
USART_TX_COMM_DataOK:
rcallUSART_TXD_COMM_Head;將開(kāi)頭字符串和端口編號(hào)復(fù)制到SRAM中
ldiZL,Low(USART_DataOK*2);置Z指針為向?qū)Ψ秸?qǐng)求發(fā)送命令字符串,
ldiZH,High(USART_DataOK*2);在FLASH中的存儲(chǔ)地址
rcallUSART_TXD_COMM_COM;將命令字符串復(fù)制到SRAM的發(fā)送地址中,
;并置發(fā)送命令作業(yè)標(biāo)志值
rcallUSART_AINT_TXINI;發(fā)送本命令字符串
ret;子程序返回

;***此段程序用于發(fā)送[要求對(duì)方發(fā)送指定數(shù)據(jù)]命令?。 癠SART_TX_COMM_DCOMTX”
USART_TX_COMM_DCOMTX:
rcallUSART_TXD_COMM_Head;將開(kāi)頭字符串和端口編號(hào)復(fù)制到SRAM中
ldiZL,Low(USART_DCOMTX*2);置Z指針為向?qū)Ψ秸?qǐng)求發(fā)送命令字符串,
ldiZH,High(USART_DCOMTX*2);在FLASH中的存儲(chǔ)地址
rcallUSART_TXD_COMM_COM;將命令字符串復(fù)制到SRAM的發(fā)送地址中,
;并置發(fā)送命令作業(yè)標(biāo)志值
rcallUSART_AINT_TXINI;發(fā)送本命令字符串
ret;子程序返回

;***此段程序用于發(fā)送命令開(kāi)頭字符串和端口編號(hào) - “USART_TXD_COMM_Head”
USART_TXD_COMM_Head:
ldiYL,Low(USARTAI_TXCOA);置Y指針為發(fā)送命令SRAM中的地址
ldiYH,High(USARTAI_TXCOA)
ldiZL,Low(COMAgreement_Head*2);置Z指針為向發(fā)送命令開(kāi)頭字符串,
ldiZH,High(COMAgreement_Head*2);在FLASH中的存儲(chǔ)地址
lpmUSARTAI_TEMP3,Z+;置循環(huán)計(jì)數(shù)器初值=開(kāi)頭命令字長(zhǎng)度數(shù)值
USART_TXD_COMM_Head1:
lpmUSARTAI_TEMP,Z+;從FLASH中取出發(fā)送命令開(kāi)頭字符串
stY+,USARTAI_TEMP;裝入SRAM的發(fā)送命令地址中
decUSARTAI_TEMP3;命令字長(zhǎng)度數(shù)值—1
brneUSART_TXD_COMM_Head1;裝入完成否?
USART_TXD_COMM_HeadDN:
ldiEEPROM_AddrL,Low(CC_EEPROM_DNAr)
ldiEEPROM_AddrH,High(CC_EEPROM_DNAr)
;置在EEPROM中的本端口編號(hào)地址指針
ldiUSARTAI_TEMP3,CTRLCDN_CharNI;置循環(huán)計(jì)數(shù)器初值=本端口編號(hào)長(zhǎng)度數(shù)值
USART_TXD_COMM_HeadDN1:
callEEPROM_ReadSingle;讀取EEPROM中的本USART端口編號(hào)
MOV USARTAI_TEMP2,EEPROM_Data
stY+,USARTAI_TEMP2;裝入SRAM的發(fā)送命令地址中
adiwEEPROM_AddrL,$01;EEPROM中的端口編號(hào)地址指針+1
decUSARTAI_TEMP3;端口編號(hào)字符串長(zhǎng)度數(shù)值長(zhǎng)度數(shù)值—1
brneUSART_TXD_COMM_HeadDN1;端口編號(hào)裝入完否?未完,則繼續(xù)裝入
ret;子程序返回

;***此段程序用于發(fā)送命令字符串公共子程序?。 癠SART_TXD_COMM_COM”
USART_TXD_COMM_COM:
lpmUSARTAI_TEMP,Z+;從FLASH中取出首個(gè)發(fā)送命令字符
stY+,USARTAI_TEMP;裝入SRAM的發(fā)送命令地址中
lpmUSARTAI_TEMP,Z+;從FLASH中取出下一個(gè)發(fā)送命令字符
stY+,USARTAI_TEMP;裝入SRAM的發(fā)送命令地址中
lpmUSARTAI_TEMP,Z+;從FLASH中取出下一個(gè)發(fā)送命令字符
stY+,USARTAI_TEMP;裝入SRAM的發(fā)送命令地址中
ldiUSARTAI_TEMP,USARTAI_TCOMI;置發(fā)送命令作業(yè)標(biāo)志值
stsUSARTAI_TXCOM,USARTAI_TEMP
ret;子程序返回


;*******************************************************************************
;*
;*從USART端口上接收到的通信協(xié)議命令處理子程序?。 癠SART_RXD_COMM”
;*
;*說(shuō)明:
;*  本子程序用于從USART端口上接收到的通信協(xié)議命令處理。
;*  本子程序要在主程序中不間斷循環(huán)查詢運(yùn)行。
;*
;*******************************************************************************

USART_RXD_COMM:
ldsZL,USARTAI_RXUPD;檢查接收作業(yè)是否己更新?
cpiZL,USARTAI_RUPDI;否,直接返回
breqUSART_RXD_COMMTO1;是,則繼續(xù)
rjmpUSART_RXD_COMM_RET
USART_RXD_COMMTO1:
ldsZL,USARTAI_RXCOM;檢查接收作業(yè)是否為接收命令?
cpiZL,USARTAI_RCOMI;否,直接返回
breqUSART_RXD_COMMTO2;是,則繼續(xù)
rjmpUSART_RXD_COMM_RET
USART_RXD_COMMTO2:
ldsZL,USARTAI_RXEnd;檢查接收作業(yè)是否全部結(jié)束?
cpiZL,USARTAI_REndI;否,轉(zhuǎn)至接收錯(cuò)誤處理
breqUSART_RXD_COM_CAHead;是,則繼續(xù)
rjmpUSART_RXD_COMM_Error
USART_RXD_COM_CAHead:
ldiYL,Low(USARTAI_RXCOA);置首個(gè)接收命令字符地址指針
ldiYH,High(USARTAI_RXCOA)
ldiZL,Low(COMAgreement_Head*2);置通信協(xié)議命令開(kāi)頭標(biāo)識(shí)字符串地址指針
ldiZH,High(COMAgreement_Head*2)
lpmUSARTAI_TEMP,Z+;置循環(huán)計(jì)數(shù)器初值=開(kāi)頭命令字長(zhǎng)度數(shù)值
MOV CTRLCOM_CNT,USARTAI_TEMP
rcallCTRLCOMM_IdentifyCOM;識(shí)別通信協(xié)議命令開(kāi)頭標(biāo)識(shí)字符串
MOV USARTAI_TEMP,CCTSSDV_Right
cpiUSARTAI_TEMP,CCTSSDV_RightI;檢查接收字節(jié)是否為命令開(kāi)頭標(biāo)識(shí)字符?
breqUSART_RXD_COM_EAddr;是,則繼續(xù)
rjmpUSART_RXD_COMM_Error;否,轉(zhuǎn)至接收錯(cuò)誤處理
USART_RXD_COM_EAddr:
ldiZL,Low(COMAgreement_Head*2);置通信協(xié)議命令開(kāi)頭標(biāo)識(shí)字符串地址指針
ldiZH,High(COMAgreement_Head*2)
lpmUSARTAI_TEMP2,Z+;讀取開(kāi)頭命令字長(zhǎng)度數(shù)值
clrUSARTAI_TEMP
addYL,USARTAI_TEMP2;置Y指針為本端口編號(hào)字符串的地址指針
adcYH,USARTAI_TEMP
ldiUSARTAI_TEMP3,CTRLCDN_CharNI;置循環(huán)計(jì)數(shù)器初值=本端口編號(hào)長(zhǎng)度數(shù)值
ldiEEPROM_AddrL,Low(CC_EEPROM_DNAr)
ldiEEPROM_AddrH,High(CC_EEPROM_DNAr)
;置在EEPROM中的本端口編號(hào)地址指針
USART_RXD_COM_EAddr1:
callEEPROM_ReadSingle;讀取EEPROM中的本USART端口編號(hào)
MOV USARTAI_TEMP2,EEPROM_Data
ldUSARTAI_TEMP,Y+
cpUSARTAI_TEMP,USARTAI_TEMP2;檢查是否為本USART端口編號(hào)?
brneUSART_RXD_COM_EAddr2;否,轉(zhuǎn)至非本USART端口編號(hào)處理
adiwEEPROM_AddrL,$01;EEPROM中的端口編號(hào)地址指針+1
decUSARTAI_TEMP3;端口編號(hào)字符串長(zhǎng)度數(shù)值長(zhǎng)度數(shù)值—1
brneUSART_RXD_COM_EAddr1;端口編號(hào)識(shí)別完否?未完,則繼續(xù)識(shí)別
rjmpUSART_RXD_COMM1
USART_RXD_COM_EAddr2:
rjmpUSART_RXD_COMM_NOADDR
USART_RXD_COMM1:
ldiZL,Low(USART_AskTX*2);置“向我方請(qǐng)求發(fā)送數(shù)據(jù)”命令地址指針
ldiZH,High(USART_AskTX*2)
ldiCTRLCOM_CNT,USARTAI_CMANI;置計(jì)數(shù)器初值=有效命令字長(zhǎng)度數(shù)值
rcallCTRLCOMM_IdentifyCOM;對(duì)此條命令進(jìn)行識(shí)別
cpiCCTSSDV_Right,CCTSSDV_RightI;命令是否為“向我方請(qǐng)求發(fā)送數(shù)據(jù)”?
brneUSART_RXD_COMM2;否,則繼續(xù)
rcallUSART_RX_COMM_AskTX;是,調(diào)用處理此條命令處理程序
rjmpUSART_RXD_COMM_RET
USART_RXD_COMM2:
ldiZL,Low(USART_DataOK*2);置“對(duì)方接收數(shù)據(jù)正確”命令地址指針
ldiZH,High(USART_DataOK*2)
ldiCTRLCOM_CNT,USARTAI_CMANI;置計(jì)數(shù)器初值=有效命令字長(zhǎng)度數(shù)值
rcallCTRLCOMM_IdentifyCOM;對(duì)此條命令進(jìn)行識(shí)別
cpiCCTSSDV_Right,CCTSSDV_RightI;命令是否為“對(duì)方接收數(shù)據(jù)正確”?
brneUSART_RXD_COMM3;否,則繼續(xù)
rcallUSART_RX_COMM_DataOK;是,調(diào)用處理此條命令處理程序
rjmpUSART_RXD_COMM_RET
USART_RXD_COMM3:
ldiZL,Low(USART_REPTX*2);置“要求我方重新發(fā)送”命令地址指針
ldiZH,High(USART_REPTX*2)
ldiCTRLCOM_CNT,USARTAI_CMANI;置計(jì)數(shù)器初值=有效命令字長(zhǎng)度數(shù)值
rcallCTRLCOMM_IdentifyCOM;對(duì)此條命令進(jìn)行識(shí)別
cpiCCTSSDV_Right,CCTSSDV_RightI;命令是否為“要求我方重新發(fā)送”?
brneUSART_RXD_COMM4;否,則繼續(xù)
rcallUSART_RX_COMM_REPTX;是,調(diào)用處理此條命令處理程序
rjmpUSART_RXD_COMM_RET
USART_RXD_COMM4:
ldiZL,Low(USART_DCOMTX*2);置“要求我方發(fā)送指定數(shù)據(jù)”命令地址指針
ldiZH,High(USART_DCOMTX*2)
ldiCTRLCOM_CNT,USARTAI_CMANI;置計(jì)數(shù)器初值=有效命令字長(zhǎng)度數(shù)值
rcallCTRLCOMM_IdentifyCOM;對(duì)此條命令進(jìn)行識(shí)別
cpiCCTSSDV_Right,CCTSSDV_RightI;命令是否為“要求我方發(fā)送指定數(shù)據(jù)”?
brneUSART_RXD_COMM5;否,則繼續(xù)
rcallUSART_RX_COMM_DCOMTX;是,調(diào)用處理此條命令處理程序
rjmpUSART_RXD_COMM_RET
USART_RXD_COMM5:
ldiZL,Low(USART_OKRX*2);置“允許我方發(fā)送數(shù)據(jù)”命令地址指針
ldiZH,High(USART_OKRX*2)
ldiCTRLCOM_CNT,USARTAI_CMANI;置計(jì)數(shù)器初值=有效命令字長(zhǎng)度數(shù)值
rcallCTRLCOMM_IdentifyCOM;對(duì)此條命令進(jìn)行識(shí)別
cpiCCTSSDV_Right,CCTSSDV_RightI;命令是否為“允許我方發(fā)送數(shù)據(jù)”?
brneUSART_RXD_COMM6;否,則繼續(xù)
rcallUSART_RX_COMM_OKRX;是,調(diào)用處理此條命令處理程序
rjmpUSART_RXD_COMM_RET
USART_RXD_COMM6:
ldiZL,Low(USART_REPINI*2);置“要求我方重新初始化”命令地址指針
ldiZH,High(USART_REPINI*2)
ldiCTRLCOM_CNT,USARTAI_CMANI;置計(jì)數(shù)器初值=有效命令字長(zhǎng)度數(shù)值
rcallCTRLCOMM_IdentifyCOM;對(duì)此條命令進(jìn)行識(shí)別
cpiCCTSSDV_Right,CCTSSDV_RightI;命令是否為“要求我方重新初始化”?
brneUSART_RXD_COMM7;否,則繼續(xù)
rcallUSART_RX_COMM_REPINI;是,調(diào)用處理此條命令處理程序
rjmpUSART_RXD_COMM_RET
USART_RXD_COMM7:
ldiZL,Low(USART_RINIOK*2);置“對(duì)方重新初始化完成”命令地址指針
ldiZH,High(USART_RINIOK*2)
ldiCTRLCOM_CNT,USARTAI_CMANI;置計(jì)數(shù)器初值=有效命令字長(zhǎng)度數(shù)值
rcallCTRLCOMM_IdentifyCOM;對(duì)此條命令進(jìn)行識(shí)別
cpiCCTSSDV_Right,CCTSSDV_RightI;命令是否為“對(duì)方重新初始化完成”?
brneUSART_RXD_COMM8;否,則繼續(xù)
rcallUSART_RX_COMM_RINIOK;是,調(diào)用處理此條命令處理程序
rjmpUSART_RXD_COMM_RET
USART_RXD_COMM8:
ldiZL,Low(USART_CTRLCOM*2);置“傳送控制操作指令”命令地址指針
ldiZH,High(USART_CTRLCOM*2)
ldiCTRLCOM_CNT,USARTAI_CMANI;置計(jì)數(shù)器初值=有效命令字長(zhǎng)度數(shù)值
rcallCTRLCOMM_IdentifyCOM;對(duì)此條命令進(jìn)行識(shí)別
cpiCCTSSDV_Right,CCTSSDV_RightI;命令是否為“傳送控制操作指令”?
brneUSART_RXD_COMM_Error;否,轉(zhuǎn)至接收錯(cuò)誤處理
rcallUSART_RX_COMM_CTRLCOM;是,調(diào)用處理此條命令處理程序
rjmpUSART_RXD_COMM_RET
USART_RXD_COMM_Error:
rcallUSART_RXD_Error;調(diào)用接收錯(cuò)誤處理子程序
rjmpUSART_RXD_COMM_RET
USART_RXD_COMM_NOADDR:
clrZL;清除接收作業(yè)己更新標(biāo)志
stsUSARTAI_RXUPD,ZL
USART_RXD_COMM_RET:
ret;子程序返回


;***此段程序用于接收到[傳送控制操作指令]命令處理
USART_RX_COMM_CTRLCOM:
ldsZL,DataUPD_RXALW;接收數(shù)據(jù)是否己處理?
cpiZL,DataUPD_RALWI;是,繼續(xù)
breqUSART_RX_COMM_CTRLCOM_RET;否,返回,等待處理接收數(shù)據(jù)
ldsZL,USARTAI_TXEnd;發(fā)送作業(yè)是否全部結(jié)束?
cpiZL,USARTAI_TEndI;是,繼續(xù)
brneUSART_RX_COMM_CTRLCOM_RET;否,返回,等待發(fā)送作業(yè)結(jié)束
ldsZL,CTRLCOM_MALWS;是否有正在處理控制操作指令?
cpiZL,CTRLCOM_MALWSI;否,繼續(xù)
breqUSART_RX_COMM_CTRLCOM_RET;是,返回,等待處理控制操作指令結(jié)束
rcallUSART_TX_COMM_OKRX;向?qū)Ψ桨l(fā)送“允許對(duì)方發(fā)送”命令
clrZL;清除接收命令作業(yè)標(biāo)志
stsUSARTAI_RXCOM,ZL
ldiZL,CTRLCOM_MALWSI;置允許處理控制操作指令標(biāo)志值
stsCTRLCOM_MALWS,ZL
ldiZL,CCTSSDV_USARTI;置控制操作指令發(fā)送者標(biāo)志值
stsCCOM_TSourceS,ZL;為USART端口送來(lái)控制操作指令
clrZL;清除接收作業(yè)己更新標(biāo)志
stsUSARTAI_RXUPD,ZL
USART_RX_COMM_CTRLCOM_RET:
ret;子程序返回

;***此段程序用于接收到[重新初始化完成]命令處理
USART_RX_COMM_RINIOK:
clrZL;清除接收作業(yè)己更新標(biāo)志
stsUSARTAI_RXUPD,ZL
ret;子程序返回

;***此段程序用于接收到[要求對(duì)方重新初始化]命令處理
USART_RX_COMM_REPINI:
ldiZH,(1<comZH;禁止接收器和發(fā)送器,禁止USART
inZL,UCSRB;接收結(jié)束中斷和數(shù)據(jù)寄存器空中斷
andZL,ZH
outUCSRB,ZL


;此處插入從頭開(kāi)始重新進(jìn)行數(shù)據(jù)處理操作程序


ldiZH,(1<comZH;清除幀錯(cuò)誤(FE)、數(shù)據(jù)溢出(DOR)
inZL,UCSRA;及奇偶校驗(yàn)錯(cuò)誤(UPE)標(biāo)志
andZL,ZH
outUCSRA,ZL
ldiZH,(1<inZL,UCSRA;置數(shù)據(jù)寄存器空(UDRE)標(biāo)志
orZL,ZH
outUCSRA,ZL
rcallUSART_AINT_INI;重新初始化USART異步中斷接收和發(fā)送
rcallUSART_TX_COMM_RINIOK;向?qū)Ψ桨l(fā)送“重新初始化完成”命令
ret;子程序返回

;***此段程序用于接收到[向?qū)Ψ秸?qǐng)求發(fā)送]命令處理
USART_RX_COMM_AskTX:
ldsZL,DataUPD_RXALW;接收數(shù)據(jù)是否己處理?
cpiZL,DataUPD_RALWI;是,繼續(xù)
breqUSART_RX_COMM_AskTX_RET;否,返回,等待處理接收數(shù)據(jù)
ldsZL,USARTAI_TXEnd;發(fā)送作業(yè)是否全部結(jié)束?
cpiZL,USARTAI_TEndI;是,繼續(xù)
brneUSART_RX_COMM_AskTX_RET;否,返回,等待發(fā)送作業(yè)結(jié)束
rcallUSART_TX_COMM_OKRX;向?qū)Ψ桨l(fā)送“允許對(duì)方發(fā)送”命令
clrZL;清除接收命令作業(yè)標(biāo)志
stsUSARTAI_RXCOM,ZL
ldiZL,DataUPD_RALWI;置允許處理接收數(shù)據(jù)標(biāo)志值
stsDataUPD_RXALW,ZL
clrZL;清除接收作業(yè)己更新標(biāo)志
stsUSARTAI_RXUPD,ZL
USART_RX_COMM_AskTX_RET:
ret;子程序返回

;***此段程序用于接收到[允許對(duì)方發(fā)送]命令處理
USART_RX_COMM_OKRX:
ldsZL,DataUPD_TXALW;發(fā)送數(shù)據(jù)是否己更新?
cpiZL,DataUPD_TALWI;是,繼續(xù)
breqUSART_RX_COMM_OKRX_RET;否,返回,等待更新發(fā)送數(shù)據(jù)
ldsZL,USARTAI_TXEnd;發(fā)送作業(yè)是否全部結(jié)束?
cpiZL,USARTAI_TEndI;是,繼續(xù)
brneUSART_RX_COMM_OKRX_RET;否,返回,等待發(fā)送作業(yè)結(jié)束
clrZL;清除發(fā)送命令作業(yè)標(biāo)志
stsUSARTAI_TXCOM,ZL
rcallUSART_AINT_TXINI;啟動(dòng)發(fā)送數(shù)據(jù)
clrZL;清除接收作業(yè)己更新標(biāo)志
stsUSARTAI_RXUPD,ZL
USART_RX_COMM_OKRX_RET:
ret;子程序返回

;***此段程序用于接收到[要求對(duì)方重新發(fā)送]命令處理
USART_RX_COMM_REPTX:
ldsZL,USARTAI_ERRNum;USART發(fā)生收發(fā)錯(cuò)誤次數(shù)是否超過(guò)允許次數(shù)?
cpiZL,USARTAI_ENALWI;是,轉(zhuǎn)至USART通信發(fā)生錯(cuò)誤處理
brloUSART_RX_COMM_REPTX1;否,繼續(xù)
rcallUSART_Error;調(diào)用USART通信發(fā)生錯(cuò)誤處理程序
rjmpUSART_RX_COMM_REPTX_RET;返回
USART_RX_COMM_REPTX1:
ldsZL,USARTAI_TXEnd;發(fā)送作業(yè)是否全部結(jié)束?
cpiZL,USARTAI_TEndI;是,繼續(xù)
brneUSART_RX_COMM_REPTX_RET;否,返回,等待發(fā)送作業(yè)結(jié)束
rcallUSART_AINT_TXINI;重新啟動(dòng)原發(fā)送作業(yè)
clrZL;清除接收作業(yè)己更新標(biāo)志
stsUSARTAI_RXUPD,ZL
ldsZL,USARTAI_ERRNum;USART發(fā)生收發(fā)錯(cuò)誤次數(shù)+1
incZL
stsUSARTAI_ERRNum,ZL
USART_RX_COMM_REPTX_RET:
ret;子程序返回

;***此段程序用于接收到[接收數(shù)據(jù)正確]命令處理
USART_RX_COMM_DataOK:
ldiZL,USARTAI_TCOMI;置發(fā)送命令作業(yè)標(biāo)志值
stsUSARTAI_TXCOM,ZL
ldiZL,DataUPD_TALWI;置允許更新發(fā)送數(shù)據(jù)標(biāo)志值
stsDataUPD_TXALW,ZL
clrZL;清除接收作業(yè)己更新標(biāo)志
stsUSARTAI_RXUPD,ZL
ret;子程序返回

;***此段程序用于接收到[要求對(duì)方發(fā)送指定數(shù)據(jù)]命令處理
USART_RX_COMM_DCOMTX:
ldiZL,DataUPD_TALWI;置允許更新發(fā)送數(shù)據(jù)標(biāo)志值
stsDataUPD_TXALW,ZL
clrZL;清除接收作業(yè)己更新標(biāo)志
stsUSARTAI_RXUPD,ZL
USART_RX_COMM_DCOMTX_RET:
ret;子程序返回

;***此段程序用于“USART接收器錯(cuò)誤”和“接收命令或數(shù)據(jù)錯(cuò)誤”處理
USART_RXD_Error:
ldsZL,USARTAI_ERRNum;USART發(fā)生收發(fā)錯(cuò)誤次數(shù)是否超過(guò)允許次數(shù)?
cpiZL,USARTAI_ENALWI;是,轉(zhuǎn)至USART通信發(fā)生錯(cuò)誤處理
brloUSART_RXD_Error1;否,繼續(xù)
rcallUSART_Error;調(diào)用USART通信發(fā)生錯(cuò)誤處理程序
rjmpUSART_RXD_Error_RET;返回
USART_RXD_Error1:
ldsZL,USARTAI_TXEnd;發(fā)送作業(yè)是否全部結(jié)束?
cpiZL,USARTAI_TEndI;是,繼續(xù)
brneUSART_RXD_Error_RET;否,返回,等待發(fā)送作業(yè)結(jié)束
rcallUSART_TX_COMM_REPTX;向?qū)Ψ桨l(fā)送“要求重新發(fā)送”命令
ldiZH,(1<comZH;清除幀錯(cuò)誤(FE)、數(shù)據(jù)溢出(DOR)
inZL,UCSRA;及奇偶校驗(yàn)錯(cuò)誤(UPE)標(biāo)志
andZL,ZH
outUCSRA,ZL
ldiZL,USARTAI_REndI;置接收作業(yè)全部結(jié)束標(biāo)志值
stsUSARTAI_RXEnd,ZL
clrZL;清除接收作業(yè)己更新標(biāo)志
stsUSARTAI_RXUPD,ZL
ldsZL,USARTAI_ERRNum;USART發(fā)生收發(fā)錯(cuò)誤次數(shù)+1
incZL
stsUSARTAI_ERRNum,ZL
USART_RXD_Error_RET:
ret;子程序返回


;*******************************************************************************
;*
;*從USART端口上接收到的數(shù)據(jù)處理子程序?。 癠SART_RXD_Data”
;*
;*說(shuō)明:
;*  本子程序用于處理從USART端口上接收到的數(shù)據(jù),本子程序中包含有數(shù)據(jù)循環(huán)
;*冗余檢測(cè)校驗(yàn)子程序。
;*  本子程序要在主程序中不間斷循環(huán)查詢運(yùn)行。
;*
;*SRAM中標(biāo)志字節(jié)用法:
;*  入口標(biāo)志:本子程序?qū)z查這三個(gè)標(biāo)志,只有這三個(gè)標(biāo)志置值后才允許處理數(shù)據(jù)。
;*允許處理接收數(shù)據(jù)(DataUPD_RXALW)=$03(DataUPD_RDALWI)
;*接收作業(yè)己更新(USARTAI_RXUPD)=$0a(USARTAI_RUPDI)
;*接收作業(yè)全部結(jié)束(USARTAI_RXEnd)=$0f(USARTAI_REndI)
;*  出口標(biāo)志:接收數(shù)據(jù)處理操作得到執(zhí)行后,將對(duì)下面這兩個(gè)標(biāo)志置值。
;*允許處理接收數(shù)據(jù)(DataUPD_RXALW)=$00
;*接收作業(yè)己更新(USARTAI_RXUPD)=$00
;*
;*******************************************************************************
USART_RXD_Data:
ldsZL,DataUPD_RXALW;檢查是否允許處理接收數(shù)據(jù)?
cpiZL,DataUPD_RALWI;是,則繼續(xù)
brneUSART_RXD_Data_RET;否,直接返回
ldsZL,USARTAI_RXUPD;檢查接收作業(yè)是否己更新?
cpiZL,USARTAI_RUPDI;是,則繼續(xù)
brneUSART_RXD_Data_RET;否,直接返回
ldsZL,USARTAI_TXEnd;發(fā)送作業(yè)是否全部結(jié)束?
cpiZL,USARTAI_TEndI;是,繼續(xù)
brneUSART_RXD_Data_RET;否,返回,等待發(fā)送作業(yè)結(jié)束
ldsZL,USARTAI_RXEnd;檢查接收作業(yè)是否全部結(jié)束?
cpiZL,USARTAI_REndI;是,則繼續(xù)
brneUSART_RXD_Data_Error;否,轉(zhuǎn)至接收錯(cuò)誤處理
USART_RXD_Data_Check:
ldiZL,Low(USARTAI_RXDAA);Z指針指向接收數(shù)據(jù)的首字節(jié)
ldiZH,High(USARTAI_RXDAA)
ldsDCRC2B_DLength,USARTAI_RXDAA;置校驗(yàn)的數(shù)據(jù)長(zhǎng)度初值
callDataCheck_CRC2B;校驗(yàn)接收的數(shù)據(jù)是否正確?
orYL,YH;是,繼續(xù)
brneUSART_RXD_Data_Error;否,轉(zhuǎn)至接收錯(cuò)誤處理
rcallUSART_TX_COMM_DataOK;向?qū)Ψ桨l(fā)送“接收數(shù)據(jù)正確”命令
ldiZL,USARTAI_RCOMI;置接收命令作業(yè)標(biāo)志值
stsUSARTAI_RXCOM,ZL
rcallUSART_RXData_Process;調(diào)用接收數(shù)據(jù)處理子程序
clrZL;清除接收作業(yè)己更新標(biāo)志
stsUSARTAI_RXUPD,ZL
clrZL;清除允許處理接收數(shù)據(jù)標(biāo)志
stsDataUPD_RXALW,ZL
rjmpUSART_RXD_Data_RET;返回
USART_RXD_Data_Error:
rcallUSART_RXD_Error;調(diào)用接收錯(cuò)誤處理子程序
USART_RXD_Data_RET:
ret;子程序返回

;***此段程序用于對(duì)從USART端口上接收到的數(shù)據(jù)進(jìn)行處理操作
USART_RXData_Process:


;此處插入接收數(shù)據(jù)處理程序


ret;子程序返回


;*******************************************************************************
;*
;*向USART端口上發(fā)送數(shù)據(jù)更新子程序?。 癠SART_TXD_Data”
;*
;*說(shuō)明:
;*  本子程序用于更新向USART端口上上發(fā)送數(shù)據(jù),本子程序中包含有數(shù)據(jù)循環(huán)
;*冗余檢測(cè)校驗(yàn)子程序。
;*  本子程序要在主程序中不間斷循環(huán)查詢運(yùn)行。
;*
;*SRAM中標(biāo)志字節(jié)用法:
;*  入口標(biāo)志:本子程序?qū)z查這個(gè)標(biāo)志,只有這個(gè)標(biāo)志置值后才允許更新數(shù)據(jù)。
;*允許更新發(fā)送數(shù)據(jù)(DataUPD_TXALW)=$c0(DataUPD_TALWI)
;*  出口標(biāo)志:更新發(fā)送數(shù)據(jù)操作得到執(zhí)行后,將對(duì)下面這個(gè)標(biāo)志置值。
;*允許更新發(fā)送數(shù)據(jù)(DataUPD_TXALW)=$00
;*
;*******************************************************************************
USART_TXD_Data:
ldsZL,DataUPD_TXALW;檢查是否允許更新發(fā)送數(shù)據(jù)?
cpiZL,DataUPD_TALWI;是,則繼續(xù)
brneUSART_TXD_Data_RET;否,直接返回
ldsZL,USARTAI_TXEnd;發(fā)送作業(yè)是否全部結(jié)束?
cpiZL,USARTAI_TEndI;是,繼續(xù)
brneUSART_TXD_Data_RET;否,返回,等待發(fā)送作業(yè)結(jié)束
rcallUSART_TX_COMM_AskTX;發(fā)送“向?qū)Ψ秸?qǐng)求發(fā)送”命令
rcallUSART_TXData_Process;調(diào)用更新發(fā)送數(shù)據(jù)子程序
USART_TXD_Data_Check:
ldsZL,USARTAI_TXDAA;取發(fā)送的數(shù)據(jù)長(zhǎng)度值
adiwZL,$03;發(fā)送的總長(zhǎng)度=發(fā)送的數(shù)據(jù)長(zhǎng)度值+
stsUSARTAI_TXDAA,ZL;1個(gè)長(zhǎng)度字符字節(jié)+2個(gè)校驗(yàn)字節(jié)
MOV USARTAI_TEMP2,ZL
ldiZL,Low(USARTAI_TXDAA-2);發(fā)送數(shù)據(jù)的校驗(yàn)字節(jié)在發(fā)送數(shù)據(jù)序列
ldiZH,High(USARTAI_TXDAA-2);尾部后兩個(gè)字節(jié)
clrUSARTAI_TEMP
addZL,USARTAI_TEMP2;Z指針指向發(fā)送數(shù)據(jù)的校驗(yàn)字節(jié)
adcZH,USARTAI_TEMP
clrUSARTAI_TEMP
stZ+,USARTAI_TEMP;清除發(fā)送數(shù)據(jù)的尾部后兩個(gè)字節(jié)
stZ+,USARTAI_TEMP;的校驗(yàn)字節(jié)值
ldiZL,Low(USARTAI_TXDAA);Z指針指向發(fā)送數(shù)據(jù)首個(gè)字節(jié)
ldiZH,High(USARTAI_TXDAA)
ldsDCRC2B_DLength,USARTAI_TXDAA;置校驗(yàn)的數(shù)據(jù)長(zhǎng)度初值
callDataCheck_CRC2B;生成發(fā)送數(shù)據(jù)序列的CRC碼
clrZL;清除允許更新發(fā)送數(shù)據(jù)標(biāo)志
stsDataUPD_TXALW,ZL
USART_TXD_Data_RET:
ret;子程序返回

;***此段程序用于向USART端口上發(fā)送數(shù)據(jù)的更新操作
USART_TXData_Process:


;此處插入更新發(fā)送數(shù)據(jù)程序


;此段程序?yàn)槭纠龜?shù)據(jù)的更新操作
MOV USARTAI_TEMP,r3
ldiUSARTAI_TEMP2,$fc
stsUSARTAI_TXDAA,USARTAI_TEMP2
ldiYL,Low(USARTAI_TXDAA+1);置接收作業(yè)地址指針為
ldiYH,High(USARTAI_TXDAA+1);首個(gè)接收數(shù)據(jù)地址指針
USART_TXData_Process1:
stY+,USARTAI_TEMP
incUSARTAI_TEMP
decUSARTAI_TEMP2
brneUSART_TXData_Process1
incr3
;示例程序結(jié)束

ret;子程序返回


;*******************************************************************************
;*
;*USART通信發(fā)生錯(cuò)誤處理子程序 - “USART_Error”
;*
;*說(shuō)明:
;*  本子程序用于當(dāng)USART通信發(fā)生錯(cuò)誤時(shí)的處理。
;*
;*******************************************************************************
USART_Error:
pushZL;壓入寄存器中的數(shù)值到堆棧
pushZH
inZL,SREG;壓狀態(tài)寄存器中的標(biāo)志值到堆棧
pushZL
ldiZH,(1<comZH;禁止接收器和發(fā)送器,禁止USART
inZL,UCSRB;接收結(jié)束中斷和數(shù)據(jù)寄存器空中斷
andZL,ZH
outUCSRB,ZL


;此處插入錯(cuò)誤處理程序
;此處插入從頭開(kāi)始重新進(jìn)行數(shù)據(jù)處理操作程序


ldiZH,(1<comZH;清除幀錯(cuò)誤(FE)、數(shù)據(jù)溢出(DOR)
inZL,UCSRA;及奇偶校驗(yàn)錯(cuò)誤(UPE)標(biāo)志
andZL,ZH
outUCSRA,ZL
ldiZH,(1<inZL,UCSRA;置數(shù)據(jù)寄存器空(UDRE)標(biāo)志
orZL,ZH
outUCSRA,ZL
callUSART_AINT_INI;重新初始化USART異步中斷接收和發(fā)送
callUSART_TX_COMM_REPINI;向?qū)Ψ桨l(fā)送“要求其重新初始化”命令
USART_Error_RET:
popZL
outSREG,ZL;彈出堆棧中的標(biāo)志值到狀態(tài)寄存器
popZH;彈出堆棧中的數(shù)值到寄存器
popZL
ret;子程序返回


;*******************************************************************************
;*
;*所有通信協(xié)議命令開(kāi)頭標(biāo)識(shí)字符串?。 癈OMAgreement_Head”
;*
;*******************************************************************************
COMAgreement_Head:
.DB$03,"COM";通信協(xié)議命令開(kāi)頭標(biāo)識(shí)字符(COM)
;││
;│通信協(xié)議命令開(kāi)頭標(biāo)識(shí)字符(COM)
;本指令字符串字符長(zhǎng)度數(shù)值(不包括自已在內(nèi)共3個(gè)字符)


;*******************************************************************************
;*
;*向?qū)Ψ秸?qǐng)求發(fā)送命令字符串?。 癠SART_AskTX”
;*
;*******************************************************************************
USART_AskTX:
.DB"ATX";向?qū)Ψ秸?qǐng)求發(fā)送命令字符串(ATX)

;*******************************************************************************
;*
;*允許對(duì)方發(fā)送命令字符串?。 癠SART_OKRX”
;*
;*******************************************************************************
USART_OKRX:
.DB"YET";允許對(duì)方發(fā)送命令字符串(YET)

;*******************************************************************************
;*
;*要求對(duì)方重新發(fā)送命令字符串?。 癠SART_REPTX”
;*
;*******************************************************************************
USART_REPTX:
.DB"RPT";要求對(duì)方重新發(fā)送命令字符串(RPT)

;*******************************************************************************
;*
;*接收數(shù)據(jù)正確命令字符串?。 癠SART_DataOK”
;*
;*******************************************************************************
USART_DataOK:
.DB"OKD";接收數(shù)據(jù)正確命令字符串(OKD)

;*******************************************************************************
;*
;*要求對(duì)方發(fā)送指定數(shù)據(jù)的命令字符串?。 癠SART_DCOMTX”
;*
;*******************************************************************************
USART_DCOMTX:
.DB"STD";要求對(duì)方發(fā)送指定數(shù)據(jù)的命令字符串(STD)

;*******************************************************************************
;*
;*要求對(duì)方重新初始化USART端口狀態(tài)命令字符串?。 癠SART_REPINI”
;*
;*******************************************************************************
USART_REPINI:
.DB"RII";要求對(duì)方重新初始化狀態(tài)命令字符串(RII)

;*******************************************************************************
;*
;*重新初始化USART端口狀態(tài)完成命令字符串 - “USART_RINIOK”
;*
;*******************************************************************************
USART_RINIOK:
.DB"YRI";重新初始化狀態(tài)完成命令字符串(YRI)

;*******************************************************************************
;*
;*從USART端口傳送控制操作指令命令字符串?。 癠SART_CTRLCOM”
;*
;*******************************************************************************
USART_CTRLCOM:
.DB"CIT";從端口傳送控制操作指令命令字符串(CIT)


;*******************************************************************************
;*
;*USART異步通信中斷接收與發(fā)送協(xié)議命令和數(shù)據(jù)處理子程序?。 癠SART_INT_ACOM”
;*
;*說(shuō)明:
;*  本子程序用于USART異步通信中斷接收與發(fā)送協(xié)議命令和數(shù)據(jù)處理。
;*  本子程序要在主程序中不間斷地循環(huán)運(yùn)行。
;*
;*******************************************************************************
USART_INT_ACOM:
inZL,SREG;壓狀態(tài)寄存器中的標(biāo)志值到堆棧
pushZL
callUSART_RXD_COMM;接收通信協(xié)議命令處理程序
callUSART_RXD_Data;調(diào)用接收數(shù)據(jù)處理程序
callUSART_TXD_Data;調(diào)用更新發(fā)送數(shù)據(jù)程序
popZL;彈出堆棧中的標(biāo)志值到狀態(tài)寄存器
outSREG,ZL
ret;子程序返回


;*******************************************************************************
;*
;*定時(shí)器/計(jì)數(shù)器0溢出中斷處理子程序?。 癟C0_Timer_OVFINT”
;*
;*說(shuō)明:
;*  本子程序用于約束接收作業(yè)全部完成(指從接收第一個(gè)數(shù)據(jù)到最后一個(gè)數(shù)據(jù)之間)
;*的時(shí)間范圍,如果在規(guī)定的時(shí)間內(nèi)沒(méi)有接收作業(yè)全部完成,則強(qiáng)制結(jié)束此次接收作業(yè),
;*以便下次接收作業(yè)正確操作。此程序主要用于檢查第一個(gè)的數(shù)據(jù)長(zhǎng)度字節(jié)的數(shù)值與所接
;*收到的數(shù)據(jù)幀數(shù)是否匹配,避免由于不匹配而產(chǎn)生的錯(cuò)誤死循環(huán)。也用于接收端受干擾
;*后能夠及時(shí)恢復(fù)正確操作接收作業(yè)標(biāo)志值。
;*
;*注意:
;*  本子程序在多次執(zhí)行到T/C0計(jì)數(shù)溢出次數(shù)超出設(shè)置數(shù)值后,將禁止定時(shí)器/計(jì)
;*數(shù)器0溢出中斷。
;*
;*SRAM中標(biāo)志字節(jié)用法:
;*  出口標(biāo)志:
;*  接收作業(yè)己更新(USARTAI_RXUPD)=$0a(USARTAI_RUPDI)
;*
;*******************************************************************************
TC0_Timer_OVFINT:
pushZL;壓入寄存器中的數(shù)值到堆棧
pushZH
inZL,SREG;壓狀態(tài)寄存器中的標(biāo)志值到堆棧
pushZL
ldiZL,USARTAI_T0CNTI;置T/C0定時(shí)參數(shù)的預(yù)定計(jì)數(shù)比例值
outTCNT0,ZL
ldsZL,USARTAI_T0VNum;檢查T/C0計(jì)數(shù)溢出次數(shù)是否超出設(shè)置值?
cpiZL,USARTAI_T0NumI;是,執(zhí)行超出次數(shù)處理操作
brloTC0_Timer_OVFINT1;否,轉(zhuǎn)至繼續(xù)
ldiZL,USARTAI_RUPDI;置接收作業(yè)己更新標(biāo)志值
stsUSARTAI_RXUPD,ZL
ldiZH,(1<comZH;注:僅只改變T/C中斷屏蔽寄存
inZL,TIMSK;器中的此項(xiàng)設(shè)置,對(duì)于其他T/C
andZL,ZH;中斷狀態(tài)保留原來(lái)設(shè)置
outTIMSK,ZL
rjmpTC0_Timer_OVFINT_RET;返回
TC0_Timer_OVFINT1:
incZL;T/C0計(jì)數(shù)溢出次數(shù)+1
stsUSARTAI_T0VNum,ZL
TC0_Timer_OVFINT_RET:
popZL
outSREG,ZL;彈出堆棧中的標(biāo)志值到狀態(tài)寄存器
popZH;彈出堆棧中的數(shù)值到寄存器
popZL
reti;中斷返回

本站聲明: 本文章由作者或相關(guān)機(jī)構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點(diǎn),本站亦不保證或承諾內(nèi)容真實(shí)性等。需要轉(zhuǎn)載請(qǐng)聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請(qǐng)及時(shí)聯(lián)系本站刪除。
換一批
延伸閱讀

在這篇文章中,小編將對(duì)PLC的相關(guān)內(nèi)容和情況加以介紹以幫助大家增進(jìn)對(duì)它的了解程度,和小編一起來(lái)閱讀以下內(nèi)容吧。

關(guān)鍵字: PLC 模塊化 程序

在這篇文章中,小編將為大家?guī)?lái)單片機(jī)的相關(guān)報(bào)道。如果你對(duì)本文即將要講解的內(nèi)容存在一定興趣,不妨繼續(xù)往下閱讀哦。

關(guān)鍵字: 單片機(jī) AVR PIC

在現(xiàn)代工業(yè)和汽車(chē)領(lǐng)域,控制器局域網(wǎng)(CAN)總線作為一種可靠且高效的通信方式,廣泛應(yīng)用于各種電子設(shè)備之間的數(shù)據(jù)傳輸。在 CAN 總線系統(tǒng)中,有一個(gè)看似毫不起眼卻至關(guān)重要的元件 ——120Ω 終端電阻。這個(gè)小小的電阻,對(duì)于...

關(guān)鍵字: 控制器局域網(wǎng) 總線 通信

8月14日消息,今天,國(guó)務(wù)院新聞辦公室舉行“高質(zhì)量完成‘十四五’規(guī)劃”系列主題新聞發(fā)布會(huì),國(guó)家數(shù)據(jù)局介紹“十四五”時(shí)期數(shù)字中國(guó)建設(shè)發(fā)展成就。

關(guān)鍵字: 算力 通信

北京2025年8月8日 /美通社/ -- 8月7日,浪潮信息發(fā)布面向萬(wàn)億參數(shù)大模型的超節(jié)點(diǎn)AI服務(wù)器"元腦SD200"。該產(chǎn)品基于浪潮信息創(chuàng)新研發(fā)的多主機(jī)低延遲內(nèi)存語(yǔ)義通信架構(gòu),以開(kāi)放系統(tǒng)設(shè)計(jì)向上擴(kuò)展...

關(guān)鍵字: 模型 節(jié)點(diǎn) SD 通信

在現(xiàn)代通信技術(shù)的復(fù)雜網(wǎng)絡(luò)中,射頻(RF)濾波器猶如一位幕后英雄,雖鮮少被大眾提及,卻發(fā)揮著舉足輕重的作用。從我們?nèi)粘J褂玫闹悄苁謾C(jī),到構(gòu)建通信基礎(chǔ)設(shè)施的基站,再到新興的物聯(lián)網(wǎng)設(shè)備,RF 濾波器無(wú)處不在,默默保障著信號(hào)的順...

關(guān)鍵字: 射頻 濾波器 通信

在當(dāng)今數(shù)字化時(shí)代,5G 通信技術(shù)以前所未有的速度改變著我們的生活,從高速的數(shù)據(jù)傳輸?shù)綄?shí)時(shí)的物聯(lián)網(wǎng)應(yīng)用,5G 的影響力無(wú)處不在。然而,在這一系列令人矚目的技術(shù)背后,有一個(gè)常常被忽視卻至關(guān)重要的角色 —— 晶振。它如同幕后的...

關(guān)鍵字: 通信 數(shù)據(jù)傳輸 晶振

德國(guó)斯圖加特 2025年7月2日 /美通社/ -- 國(guó)際關(guān)鍵通信協(xié)會(huì)The Critical Communications Association (以下簡(jiǎn)稱TCCA)宣布...

關(guān)鍵字: 通信 TETRA TC 測(cè)試流程

近日,歐洲統(tǒng)一專利法院曼海姆分庭更新的一則訴訟信息,引發(fā)了全球科技界震動(dòng)——聯(lián)發(fā)科子公司HFI Innovation起訴了華為旗下五家子公司侵犯其LTE專利EP2689624。這場(chǎng)訴訟標(biāo)志著兩家科技巨頭持續(xù)兩年的專利糾紛...

關(guān)鍵字: 通信

為了進(jìn)一步推動(dòng)電子通信半導(dǎo)體產(chǎn)業(yè)創(chuàng)新發(fā)展,“EIS 2025 中國(guó)電子通信半導(dǎo)體數(shù)智創(chuàng)新峰會(huì)", 以 “智聯(lián)萬(wàn)物·芯創(chuàng)未來(lái) ”為主題, 將于 2025 年 10月 24日在上海隆重舉辦。

關(guān)鍵字: 通信 半導(dǎo)體
關(guān)閉