您当前的位置:五五电子网电子知识单片机-工控设备AVR单片机avr异步中断接收和发送通信程序 正文
avr异步中断接收和发送通信程序

avr异步中断接收和发送通信程序

点击数:7303 次   录入时间:03-04 11:59:32   整理:http://www.55dianzi.com   AVR单片机
    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单片机

上一篇:makefile文件讲解

《avr异步中断接收和发送通信程序》相关文章>>>