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

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

点击数:7303 次   录入时间:03-04 11:59:32   整理:http://www.55dianzi.com   AVR单片机
;*
;* 从 USART 端口上接收到的通信协议命令处理子程序 - “USART_RXD_COMM”
;*
;* 说明:
;*   本子程序用于从 USART 端口上接收到的通信协议命令处理。
;*   本子程序要在主程序中不间断循环查询运行。
;*
;*******************************************************************************

USART_RXD_COMM:
    lds ZL,USARTAI_RXUPD            ;检查接收作业是否己更新?
    cpi ZL,USARTAI_RUPDI              ;否,直接返回
    breq USART_RXD_COMMTO1            ;是,则继续
    rjmp USART_RXD_COMM_RET
USART_RXD_COMMTO1:
    lds ZL,USARTAI_RXCOM            ;检查接收作业是否为接收命令?
    cpi ZL,USARTAI_RCOMI              ;否,直接返回
    breq USART_RXD_COMMTO2            ;是,则继续
    rjmp USART_RXD_COMM_RET
USART_RXD_COMMTO2:
    lds ZL,USARTAI_RXEnd            ;检查接收作业是否全部结束?
    cpi ZL,USARTAI_REndI              ;否,转至接收错误处理
    breq USART_RXD_COM_CAHead         ;是,则继续
    rjmp USART_RXD_COMM_Error
USART_RXD_COM_CAHead:
    ldi YL,Low(USARTAI_RXCOA)       ;置首个接收命令字符地址指针
    ldi YH,High(USARTAI_RXCOA)
    ldi ZL,Low(COMAgreement_Head*2) ;置通信协议命令开头标识字符串地址指针
    ldi ZH,High(COMAgreement_Head*2)
    lpm USARTAI_TEMP,Z+             ;置循环计数器初值=开头命令字长度数值
     MOV  CTRLCOM_CNT,USARTAI_TEMP
    rcall CTRLCOMM_IdentifyCOM      ;识别通信协议命令开头标识字符串
     MOV  USARTAI_TEMP,CCTSSDV_Right 
    cpi USARTAI_TEMP,CCTSSDV_RightI ;检查接收字节是否为命令开头标识字符?
    breq USART_RXD_COM_EAddr          ;是,则继续
    rjmp USART_RXD_COMM_Error         ;否,转至接收错误处理
USART_RXD_COM_EAddr:
    ldi ZL,Low(COMAgreement_Head*2) ;置通信协议命令开头标识字符串地址指针
    ldi ZH,High(COMAgreement_Head*2)
    lpm USARTAI_TEMP2,Z+            ;读取开头命令字长度数值
    clr USARTAI_TEMP
    add YL,USARTAI_TEMP2            ;置 Y 指针为本端口编号字符串的地址指针
    adc YH,USARTAI_TEMP
    ldi USARTAI_TEMP3,CTRLCDN_CharNI;置循环计数器初值=本端口编号长度数值
    ldi EEPROM_AddrL,Low(CC_EEPROM_DNAr)
    ldi EEPROM_AddrH,High(CC_EEPROM_DNAr)
                                    ;置在 EEPROM 中的本端口编号地址指针
USART_RXD_COM_EAddr1:
    call EEPROM_ReadSingle          ;读取 EEPROM 中的本 USART 端口编号
     MOV  USARTAI_TEMP2,EEPROM_Data
    ld USARTAI_TEMP,Y+
    cp USARTAI_TEMP,USARTAI_TEMP2   ;检查是否为本 USART 端口编号?
    brne USART_RXD_COM_EAddr2         ;否,转至非本 USART 端口编号处理
    adiw EEPROM_AddrL,$01           ; EEPROM 中的端口编号地址指针 + 1
    dec USARTAI_TEMP3               ;端口编号字符串长度数值长度数值 — 1
    brne USART_RXD_COM_EAddr1       ;端口编号识别完否?未完,则继续识别
    rjmp USART_RXD_COMM1
USART_RXD_COM_EAddr2:
    rjmp USART_RXD_COMM_NOADDR
USART_RXD_COMM1:
    ldi ZL,Low(USART_AskTX*2)       ;置“向我方请求发送数据”命令地址指针
    ldi ZH,High(USART_AskTX*2)
    ldi CTRLCOM_CNT,USARTAI_CMANI   ;置计数器初值=有效命令字长度数值
    rcall CTRLCOMM_IdentifyCOM      ;对此条命令进行识别
    cpi CCTSSDV_Right,CCTSSDV_RightI;命令是否为“向我方请求发送数据”?
    brne USART_RXD_COMM2              ;否,则继续
    rcall USART_RX_COMM_AskTX         ;是,调用处理此条命令处理程序
    rjmp USART_RXD_COMM_RET
USART_RXD_COMM2:
    ldi ZL,Low(USART_DataOK*2)      ;置“对方接收数据正确”命令地址指针
    ldi ZH,High(USART_DataOK*2)
    ldi CTRLCOM_CNT,USARTAI_CMANI   ;置计数器初值=有效命令字长度数值
    rcall CTRLCOMM_IdentifyCOM      ;对此条命令进行识别
    cpi CCTSSDV_Right,CCTSSDV_RightI;命令是否为“对方接收数据正确”?
    brne USART_RXD_COMM3              ;否,则继续
    rcall USART_RX_COMM_DataOK        ;是,调用处理此条命令处理程序
    rjmp USART_RXD_COMM_RET
USART_RXD_COMM3:
    ldi ZL,Low(USART_REPTX*2)       ;置“要求我方重新发送”命令地址指针
    ldi ZH,High(USART_REPTX*2)
    ldi CTRLCOM_CNT,USARTAI_CMANI   ;置计数器初值=有效命令字长度数值
    rcall CTRLCOMM_IdentifyCOM      ;对此条命令进行识别
    cpi CCTSSDV_Right,CCTSSDV_RightI;命令是否为“要求我方重新发送”?
    brne USART_RXD_COMM4              ;否,则继续

上一页  [1] [2] [3] [4] [5] [6] [7] [8] [9] [10] [11] [12] [13] [14] [15] [16]  下一页


本文关键字:通信  程序  AVR单片机单片机-工控设备 - AVR单片机

上一篇:makefile文件讲解

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