sei ;打开全局中断
pop ZL
out SREG,ZL ;弹出堆栈中的标志值到状态寄存器
pop ZH ;弹出堆栈中的数值到寄存器
pop ZL
ret ;子程序返回
;*******************************************************************************
;*
;* USART 异步通信接收结束中断处理子程序 - “USART_RXCINT”
;*
;* 说明:
;* 本子程序用于 USART 异步通信接收结束中断处理。
;*
;* SRAM 中标志字节用法:
;* 入口标志:本子程序将检查这些标志,依据这些标志置值来控制不同接收作业。
;* 接收作业全部结束(USARTAI_RXEnd)= $07(USARTAI_REndI)
;* ≠ $07(USARTAI_REndI)
;* r5 --- 接收作业次数(USARTAI_RXNum)
;* 出口标志:①.接收作业全部正确接收完成后,将对下面这两个标志置值。
;* 接收作业全部结束(USARTAI_RXEnd)= $0f(USARTAI_REndI)
;* 接收作业己更新(USARTAI_RXUPD) = $0a(USARTAI_RUPDI)
;* r5 --- 接收作业次数(USARTAI_RXNum) = $00
;* ②.接收作业开始后(正在进行中),将对下面这两个标志置值。
;* 接收作业全部结束(USARTAI_RXEnd)= $00
;* 接收作业己更新(USARTAI_RXUPD) = $00
;* ③.接收作业发生错误时,将对下面这两个标志置值。
;* 接收作业全部结束(USARTAI_RXEnd)= $00
;* 接收作业己更新(USARTAI_RXUPD) = $0a(USARTAI_RUPDI)
;*
;*******************************************************************************
USART_RXCINT:
push USARTAI_TEMP ;压入寄存器中的数值到堆栈
push ZL
push ZH
in USARTAI_TEMP,SREG ;压状态寄存器中的标志值到堆栈
push USARTAI_TEMP
lds USARTAI_TEMP,USARTAI_RXEnd ;检查接收作业是否己全部结束?
cpi USARTAI_TEMP,USARTAI_REndI ;否,则继续
breq USART_RXCINT_First ;是,就转至接收第一个字节处理
ldi ZH,(1<<FE)|(1<<DOR)|(1<<PE) ;检查 USART 接收器是否有帧错误(FE)、
in USARTAI_TEMP,UCSRA ;数据溢出(DOR)及奇偶校验错误(UPE)
and USARTAI_TEMP,ZH ;否,则继续
brne USART_RXCINT_Error ;是,就转至接收错误处理
lds ZL,USARTAI_RXAPL ;置接收作业地址指针
lds ZH,USARTAI_RXAPH
in USARTAI_TEMP,UDR ;从 USART 数据寄存器取出接收数据
st Z,USARTAI_TEMP ;存储进 SRAM 中
adiw ZL,$01 ;接收作业地址指针 + 1
sts USARTAI_RXAPL,ZL ;存储回 SRAM 中
sts USARTAI_RXAPH,ZH
dec USARTAI_RXNum ;全部接收作业完毕否?
breq USART_RXCINT_End ;是,就转至结束处理
rjmp USART_RXCINT_RET ;否,转到中断返回
USART_RXCINT_End:
ldi ZL,USARTAI_REndI ;置接收作业全部结束标志值
sts USARTAI_RXEnd,ZL
ldi ZL,USARTAI_RUPDI ;置接收作业己更新标志值
sts USARTAI_RXUPD,ZL
ldi ZH,(1<<TOIE0) ;禁止T/C0计数溢出中断
com ZH ;注:仅只改变T/C中断屏蔽寄存
in ZL,TIMSK ;器中的此项设置,对于其他T/C
and ZL,ZH ;中断状态保留原来设置
out TIMSK,ZL
rjmp USART_RXCINT_RET ;转到中断返回
USART_RXCINT_Error:
ldi ZH,(1<<TOIE0) ;禁止T/C0计数溢出中断
上一页 [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16] 下一页
本文关键字:通信 程序 AVR单片机,单片机-工控设备 - AVR单片机