?? 通用同步和異步串行接收器和轉發器(usart).txt
字號:
ldi ZL,USARTAI_RCOMI ;置接收命令作業標志值
sts USARTAI_RXCOM,ZL
rcall USART_RXData_Process ;調用接收數據處理子程序
clr ZL ;清除接收作業己更新標志
sts USARTAI_RXUPD,ZL
clr ZL ;清除允許處理接收數據標志
sts DataUPD_RXALW,ZL
rjmp USART_RXD_Data_RET ;返回
USART_RXD_Data_Error:
rcall USART_RXD_Error ;調用接收錯誤處理子程序
USART_RXD_Data_RET:
ret ;子程序返回
;*** 此段程序用于對從 USART 端口上接收到的數據進行處理操作
USART_RXData_Process:
;此處插入接收數據處理程序
ret ;子程序返回
;*******************************************************************************
;*
;* 向 USART 端口上發送數據更新子程序 - “USART_TXD_Data”
;*
;* 說明:
;* 本子程序用于更新向 USART 端口上上發送數據,本子程序中包含有數據循環
;* 冗余檢測校驗子程序。
;* 本子程序要在主程序中不間斷循環查詢運行。
;*
;* SRAM 中標志字節用法:
;* 入口標志:本子程序將檢查這個標志,只有這個標志置值后才允許更新數據。
;* 允許更新發送數據(DataUPD_TXALW)= $c0(DataUPD_TALWI)
;* 出口標志:更新發送數據操作得到執行后,將對下面這個標志置值。
;* 允許更新發送數據(DataUPD_TXALW)= $00
;*
;*******************************************************************************
USART_TXD_Data:
lds ZL,DataUPD_TXALW ;檢查是否允許更新發送數據?
cpi ZL,DataUPD_TALWI ;是,則繼續
brne USART_TXD_Data_RET ;否,直接返回
lds ZL,USARTAI_TXEnd ;發送作業是否全部結束?
cpi ZL,USARTAI_TEndI ;是,繼續
brne USART_TXD_Data_RET ;否,返回,等待發送作業結束
rcall USART_TX_COMM_AskTX ;發送“向對方請求發送”命令
rcall USART_TXData_Process ;調用更新發送數據子程序
USART_TXD_Data_Check:
lds ZL,USARTAI_TXDAA ;取發送的數據長度值
adiw ZL,$03 ;發送的總長度=發送的數據長度值+
sts USARTAI_TXDAA,ZL ;1 個長度字符字節+ 2 個校驗字節
mov USARTAI_TEMP2,ZL
ldi ZL,Low(USARTAI_TXDAA-2) ;發送數據的校驗字節在發送數據序列
ldi ZH,High(USARTAI_TXDAA-2) ;尾部后兩個字節
clr USARTAI_TEMP
add ZL,USARTAI_TEMP2 ;Z 指針指向發送數據的校驗字節
adc ZH,USARTAI_TEMP
clr USARTAI_TEMP
st Z+,USARTAI_TEMP ;清除發送數據的尾部后兩個字節
st Z+,USARTAI_TEMP ;的校驗字節值
ldi ZL,Low(USARTAI_TXDAA) ;Z 指針指向發送數據首個字節
ldi ZH,High(USARTAI_TXDAA)
lds DCRC2B_DLength,USARTAI_TXDAA;置校驗的數據長度初值
call DataCheck_CRC2B ;生成發送數據序列的 CRC 碼
clr ZL ;清除允許更新發送數據標志
sts DataUPD_TXALW,ZL
USART_TXD_Data_RET:
ret ;子程序返回
;*** 此段程序用于向 USART 端口上發送數據的更新操作
USART_TXData_Process:
;此處插入更新發送數據程序
; 此段程序為示例數據的更新操作
mov USARTAI_TEMP,r3
ldi USARTAI_TEMP2,$fc
sts USARTAI_TXDAA,USARTAI_TEMP2
ldi YL,Low(USARTAI_TXDAA+1) ;置接收作業地址指針為
ldi YH,High(USARTAI_TXDAA+1) ;首個接收數據地址指針
USART_TXData_Process1:
st Y+,USARTAI_TEMP
inc USARTAI_TEMP
dec USARTAI_TEMP2
brne USART_TXData_Process1
inc r3
; 示例程序結束
ret ;子程序返回
;*******************************************************************************
;*
;* USART 通信發生錯誤處理子程序 - “USART_Error”
;*
;* 說明:
;* 本子程序用于當 USART 通信發生錯誤時的處理。
;*
;*******************************************************************************
USART_Error:
push ZL ;壓入寄存器中的數值到堆棧
push ZH
in ZL,SREG ;壓狀態寄存器中的標志值到堆棧
push ZL
ldi ZH,(1<<RXCIE)|(1<<UDRIE)|(1<<RXEN)|(1<<TXEN)
com ZH ;禁止接收器和發送器,禁止 USART
in ZL,UCSRB ;接收結束中斷和數據寄存器空中斷
and ZL,ZH
out UCSRB,ZL
;此處插入錯誤處理程序
;此處插入從頭開始重新進行數據處理操作程序
ldi ZH,(1<<FE)|(1<<DOR)|(1<<PE)
com ZH ;清除幀錯誤(FE)、數據溢出(DOR)
in ZL,UCSRA ;及奇偶校驗錯誤(UPE)標志
and ZL,ZH
out UCSRA,ZL
ldi ZH,(1<<UDRE)
in ZL,UCSRA ;置數據寄存器空(UDRE)標志
or ZL,ZH
out UCSRA,ZL
call USART_AINT_INI ;重新初始化 USART 異步中斷接收和發送
call USART_TX_COMM_REPINI ;向對方發送“要求其重新初始化”命令
USART_Error_RET:
pop ZL
out SREG,ZL ;彈出堆棧中的標志值到狀態寄存器
pop ZH ;彈出堆棧中的數值到寄存器
pop ZL
ret ;子程序返回
;*******************************************************************************
;*
;* 所有通信協議命令開頭標識字符串 - “COMAgreement_Head”
;*
;*******************************************************************************
COMAgreement_Head:
.DB $03,"COM" ;通信協議命令開頭標識字符(COM)
; │ │
; │ 通信協議命令開頭標識字符(COM)
; 本指令字符串字符長度數值(不包括自已在內共 3 個字符)
;*******************************************************************************
;*
;* 向對方請求發送命令字符串 - “USART_AskTX”
;*
;*******************************************************************************
USART_AskTX:
.DB "ATX" ;向對方請求發送命令字符串(ATX)
;*******************************************************************************
;*
;* 允許對方發送命令字符串 - “USART_OKRX”
;*
;*******************************************************************************
USART_OKRX:
.DB "YET" ;允許對方發送命令字符串(YET)
;*******************************************************************************
;*
;* 要求對方重新發送命令字符串 - “USART_REPTX”
;*
;*******************************************************************************
USART_REPTX:
.DB "RPT" ;要求對方重新發送命令字符串(RPT)
;*******************************************************************************
;*
;* 接收數據正確命令字符串 - “USART_DataOK”
;*
;*******************************************************************************
USART_DataOK:
.DB "OKD" ;接收數據正確命令字符串(OKD)
;*******************************************************************************
;*
;* 要求對方發送指定數據的命令字符串 - “USART_DCOMTX”
;*
;*******************************************************************************
USART_DCOMTX:
.DB "STD" ;要求對方發送指定數據的命令字符串(STD)
;*******************************************************************************
;*
;* 要求對方重新初始化 USART 端口狀態命令字符串 - “USART_REPINI”
;*
;*******************************************************************************
USART_REPINI:
.DB "RII" ;要求對方重新初始化狀態命令字符串(RII)
;*******************************************************************************
;*
;* 重新初始化 USART 端口狀態完成命令字符串 - “USART_RINIOK”
;*
;*******************************************************************************
USART_RINIOK:
.DB "YRI" ;重新初始化狀態完成命令字符串(YRI)
;*******************************************************************************
;*
;* 從 USART 端口傳送控制操作指令命令字符串 - “USART_CTRLCOM”
;*
;*******************************************************************************
USART_CTRLCOM:
.DB "CIT" ;從端口傳送控制操作指令命令字符串(CIT)
;*******************************************************************************
;*
;* USART 異步通信中斷接收與發送協議命令和數據處理子程序 - “USART_INT_ACOM”
;*
;* 說明:
;* 本子程序用于 USART 異步通信中斷接收與發送協議命令和數據處理。
;* 本子程序要在主程序中不間斷地循環運行。
;*
;*******************************************************************************
USART_INT_ACOM:
in ZL,SREG ;壓狀態寄存器中的標志值到堆棧
push ZL
call USART_RXD_COMM ;接收通信協議命令處理程序
call USART_RXD_Data ;調用接收數據處理程序
call USART_TXD_Data ;調用更新發送數據程序
pop ZL ;彈出堆棧中的標志值到狀態寄存器
out SREG,ZL
ret
?? 快捷鍵說明
復制代碼
Ctrl + C
搜索代碼
Ctrl + F
全屏模式
F11
切換主題
Ctrl + Shift + D
顯示快捷鍵
?
增大字號
Ctrl + =
減小字號
Ctrl + -