📄 main.lss
字号:
68c: 8a df rcall .-236 ; 0x5a2 <CLOSE_WaitResponsionClk>
OPEN_USART1_ReINTERRUPT(); //关接收中断
68e: 80 df rcall .-256 ; 0x590 <OPEN_USART1_ReINTERRUPT>
690: 01 c0 rjmp .+2 ; 0x694 <__vector_9+0x38>
}
else
TCNT0 = 0x00; //重新装入计数器初值
692: 12 be out 0x32, r1 ; 50
694: ff 91 pop r31
696: ef 91 pop r30
698: bf 91 pop r27
69a: af 91 pop r26
69c: 9f 91 pop r25
69e: 8f 91 pop r24
6a0: 7f 91 pop r23
6a2: 6f 91 pop r22
6a4: 5f 91 pop r21
6a6: 4f 91 pop r20
6a8: 3f 91 pop r19
6aa: 2f 91 pop r18
6ac: 0f 90 pop r0
6ae: 0f be out 0x3f, r0 ; 63
6b0: 0f 90 pop r0
6b2: 1f 90 pop r1
6b4: 18 95 reti
000006b6 <__vector_11>:
}
//==========================================================================
// USART接收中断函数
//==========================================================================
ISR(SIG_UART_RECV) //串口接受中断
{
6b6: 1f 92 push r1
6b8: 0f 92 push r0
6ba: 0f b6 in r0, 0x3f ; 63
6bc: 0f 92 push r0
6be: 11 24 eor r1, r1
6c0: 2f 93 push r18
6c2: 3f 93 push r19
6c4: 4f 93 push r20
6c6: 5f 93 push r21
6c8: 6f 93 push r22
6ca: 7f 93 push r23
6cc: 8f 93 push r24
6ce: 9f 93 push r25
6d0: af 93 push r26
6d2: bf 93 push r27
6d4: ef 93 push r30
6d6: ff 93 push r31
BYTE Rdata;
Rdata = UDR;
6d8: 2c b1 in r18, 0x0c ; 12
if(Rdata == EQUIPMENT_PARAMETER_TABLE[mb_infor.EQUIPMENT_NOW].EQU_ADDR) //是当前等待帧
6da: 80 91 98 00 lds r24, 0x0098
6de: 99 27 eor r25, r25
6e0: fc 01 movw r30, r24
6e2: ee 0f add r30, r30
6e4: ff 1f adc r31, r31
6e6: ee 0f add r30, r30
6e8: ff 1f adc r31, r31
6ea: e8 0f add r30, r24
6ec: f9 1f adc r31, r25
6ee: e0 5a subi r30, 0xA0 ; 160
6f0: ff 4f sbci r31, 0xFF ; 255
6f2: 80 81 ld r24, Z
6f4: 28 17 cp r18, r24
6f6: 99 f4 brne .+38 ; 0x71e <__vector_11+0x68>
{
WAIT_Responsion = 0; //结束超时判断
6f8: 10 92 a3 00 sts 0x00A3, r1
Receive_en = 1; //使能接收
6fc: 81 e0 ldi r24, 0x01 ; 1
6fe: 80 93 a4 00 sts 0x00A4, r24
adu.ADULength = 0;
702: 10 92 a1 00 sts 0x00A1, r1
*(adu.RxADUBuffPtr + adu.ADULength) = Rdata; //为了CRC计算方便,还是要在缓冲区存储整个PDU帧
706: e0 91 9d 00 lds r30, 0x009D
70a: f0 91 9e 00 lds r31, 0x009E
70e: 20 83 st Z, r18
adu.ADULength ++;
710: 80 91 a1 00 lds r24, 0x00A1
714: 8f 5f subi r24, 0xFF ; 255
716: 80 93 a1 00 sts 0x00A1, r24
CLOSE_USART1_ReINTERRUPT(); //关接收中断
71a: 38 df rcall .-400 ; 0x58c <CLOSE_USART1_ReINTERRUPT>
OPEN_TIMER1(); //开定时器T1
71c: 50 df rcall .-352 ; 0x5be <OPEN_TIMER1>
71e: ff 91 pop r31
720: ef 91 pop r30
722: bf 91 pop r27
724: af 91 pop r26
726: 9f 91 pop r25
728: 8f 91 pop r24
72a: 7f 91 pop r23
72c: 6f 91 pop r22
72e: 5f 91 pop r21
730: 4f 91 pop r20
732: 3f 91 pop r19
734: 2f 91 pop r18
736: 0f 90 pop r0
738: 0f be out 0x3f, r0 ; 63
73a: 0f 90 pop r0
73c: 1f 90 pop r1
73e: 18 95 reti
00000740 <MB_INFORMATION_Init>:
}
// delay_us(40); //退出时启动定时器
}
//===========================================================================
// 初始化函数
//===========================================================================
//modbus状态
void MB_INFORMATION_Init(MB_INFORMATION *MBi)
{
740: fc 01 movw r30, r24
MBi -> EQUIPMENT_NOW = 0; //初始化时,从第0台设备开始
742: 10 82 st Z, r1
// MBi -> MODBUS_STATE = (enum _MODBUS_STATE)0;
MBi -> T15_OUT = FALSE;
744: 11 82 std Z+1, r1 ; 0x01
MBi -> T35_OUT = FALSE;
746: 12 82 std Z+2, r1 ; 0x02
MBi -> TO_times = 0;
748: 13 82 std Z+3, r1 ; 0x03
74a: 08 95 ret
0000074c <ADU_CONTROL_Init>:
}
void ADU_CONTROL_Init(ADU_CONTROL *adu)
{
74c: fc 01 movw r30, r24
adu -> Address = 0;
74e: 10 82 st Z, r1
adu -> TxADUBuffptr = TxAdu_buf;
750: 8a ed ldi r24, 0xDA ; 218
752: 90 e0 ldi r25, 0x00 ; 0
754: 94 83 std Z+4, r25 ; 0x04
756: 83 83 std Z+3, r24 ; 0x03
adu -> RxADUBuffPtr = RxAdu_buf;
758: 85 ea ldi r24, 0xA5 ; 165
75a: 90 e0 ldi r25, 0x00 ; 0
75c: 92 83 std Z+2, r25 ; 0x02
75e: 81 83 std Z+1, r24 ; 0x01
adu -> ADULength = 0;
760: 15 82 std Z+5, r1 ; 0x05
adu -> FrameOK = FALSE;
762: 16 82 std Z+6, r1 ; 0x06
764: 08 95 ret
00000766 <message_process>:
}
//================================================================================
// 接收帧的处理;
// 参数: 1.要处理帧的指针 2.要处理帧的长度
//================================================================================
MESSAGE_ERR message_process(BYTE *Message,BYTE len)
{
766: 0f 93 push r16
768: 1f 93 push r17
unsigned int CRC_data,RX_crc;
RX_crc = *(adu.RxADUBuffPtr + adu.ADULength - 2)/*CRC高位*/*256 + *(adu.RxADUBuffPtr + adu.ADULength - 1)/*CRC低位*/;
76a: 20 91 a1 00 lds r18, 0x00A1
76e: 40 91 9d 00 lds r20, 0x009D
772: 50 91 9e 00 lds r21, 0x009E
776: fa 01 movw r30, r20
778: e2 0f add r30, r18
77a: f1 1d adc r31, r1
77c: 32 97 sbiw r30, 0x02 ; 2
77e: 81 91 ld r24, Z+
780: 99 27 eor r25, r25
782: 18 2f mov r17, r24
784: 00 27 eor r16, r16
786: 80 81 ld r24, Z
788: 08 0f add r16, r24
78a: 11 1d adc r17, r1
CRC_data = Get_CRC (adu.RxADUBuffPtr,adu.ADULength - 2); //计算CRC校验
78c: 22 50 subi r18, 0x02 ; 2
78e: 62 2f mov r22, r18
790: ca 01 movw r24, r20
792: 22 d0 rcall .+68 ; 0x7d8 <Get_CRC>
if(CRC_data == RX_crc) //CRC校验正确
794: 80 17 cp r24, r16
796: 91 07 cpc r25, r17
798: d1 f4 brne .+52 ; 0x7ce <message_process+0x68>
{
if(bit_is_clear(*(adu.RxADUBuffPtr + 1),7)) //功能码返回正确?
79a: e0 91 9d 00 lds r30, 0x009D
79e: f0 91 9e 00 lds r31, 0x009E
7a2: 81 81 ldd r24, Z+1 ; 0x01
7a4: 87 fd sbrc r24, 7
7a6: 10 c0 rjmp .+32 ; 0x7c8 <message_process+0x62>
{
if(*(adu.RxADUBuffPtr + 2) == adu.ADULength - 5) //
7a8: 82 81 ldd r24, Z+2 ; 0x02
7aa: 28 2f mov r18, r24
7ac: 33 27 eor r19, r19
7ae: 80 91 a1 00 lds r24, 0x00A1
7b2: 99 27 eor r25, r25
7b4: 05 97 sbiw r24, 0x05 ; 5
7b6: 28 17 cp r18, r24
7b8: 39 07 cpc r19, r25
7ba: 19 f4 brne .+6 ; 0x7c2 <message_process+0x5c>
{
return NO_ERR;
7bc: 83 e0 ldi r24, 0x03 ; 3
7be: 90 e0 ldi r25, 0x00 ; 0
7c0: 08 c0 rjmp .+16 ; 0x7d2 <message_process+0x6c>
}
else
return LEN_ERR;
7c2: 82 e0 ldi r24, 0x02 ; 2
7c4: 90 e0 ldi r25, 0x00 ; 0
7c6: 05 c0 rjmp .+10 ; 0x7d2 <message_process+0x6c>
}
else
return FUNC_ERR;
7c8: 81 e0 ldi r24, 0x01 ; 1
7ca: 90 e0 ldi r25, 0x00 ; 0
7cc: 02 c0 rjmp .+4 ; 0x7d2 <message_process+0x6c>
}
else
return CRC_ERR;
7ce: 80 e0 ldi r24, 0x00 ; 0
7d0: 90 e0 ldi r25, 0x00 ; 0
7d2: 1f 91 pop r17
7d4: 0f 91 pop r16
7d6: 08 95 ret
000007d8 <Get_CRC>:
} ;
/*============================================================================*/
// Procedure to check the checksum of the message
UINT16 Get_CRC ( BYTE *chkbuf, BYTE len ) //返回CRC校验结果,测试过了
{
7d8: cf 93 push r28
7da: df 93 push r29
7dc: ec 01 movw r28, r24
BYTE uchCRCHi = 0xff ;
7de: 2f ef ldi r18, 0xFF ; 255
BYTE uchCRCLo = 0xff ;
7e0: a2 2f mov r26, r18
UINT16 uIndex ;
UINT16 temp_code;
while ( len )
{
uIndex = (UINT16) ( uchCRCHi ^ *chkbuf++ ) ;
uchCRCHi = (BYTE) ( uchCRCLo ^ auchCRCHi_exp[uIndex] ) ;
uchCRCLo = auchCRCLo_exp[uIndex] ;
len-- ;
7e2: 66 23 and r22, r22
7e4: 71 f0 breq .+28 ; 0x802 <Get_CRC+0x2a>
7e6: 89 91 ld r24, Y+
7e8: a8 27 eor r26, r24
7ea: ea 2f mov r30, r26
7ec: ff 27 eor r31, r31
7ee: df 01 movw r26, r30
7f0: aa 5d subi r26, 0xDA ; 218
7f2: be 4f sbci r27, 0xFE ; 254
7f4: ac 91 ld r26, X
7f6: a2 27 eor r26, r18
7f8: ea 5d subi r30, 0xDA ; 218
7fa: ff 4f sbci r31, 0xFF ; 255
7fc: 20 81 ld r18, Z
7fe: 61 50 subi r22, 0x01 ; 1
800: f0 cf rjmp .-32 ; 0x7e2 <Get_CRC+0xa>
}
temp_code = (UINT16) uchCRCHi;
802: 8a 2f mov r24, r26
804: 99 27 eor r25, r25
temp_code = (UINT16) (temp_code << 8);
806: 98 2f mov r25, r24
808: 88 27 eor r24, r24
return(UINT16) ( temp_code | uchCRCLo ) ;
80a: 33 27 eor r19, r19
}
80c: 82 2b or r24, r18
80e: 93 2b or r25, r19
810: df 91 pop r29
812: cf 91 pop r28
814: 08 95 ret
00000816 <InitQueue>:
void InitQueue(BYTE EUQ_num)
//初始化循环队列
{
EQU_sto[EUQ_num].front = EQU_sto[EUQ_num].rear = 0;
816: 99 27 eor r25, r25
818: fc 01 movw r30, r24
81a: ee 0f add r30, r30
81c: ff 1f adc r31, r31
81e: ee 0f add r30, r30
820: ff 1f adc r31, r31
822: e8 0f add r30, r24
824: f9 1f adc r31, r25
826: e8 0f add r30, r24
828: f9 1f adc r31, r25
82a: e1 59 subi r30, 0x91 ; 145
82c: ff 4f sbci r31, 0xFF ; 255
82e: 11 82 std Z+1, r1 ; 0x01
830: 10 82 st Z, r1
832: 08 95 ret
00000834 <QueueLenth>:
}
BYTE QueueLenth(BYTE EUQ_num)
//当前队列报文的个数
{
return (EQU_sto[EUQ_num].rear -
834: 99 27 eor r25, r25
836: fc 01 movw r30, r24
838: ee 0f add r30, r30
83a: ff 1f adc r31, r31
83c: ee 0f add r30, r30
83e: ff 1f adc r31, r31
840: e8 0f add r30, r24
842: f9 1f adc r31, r25
844: e8 0f add r30, r24
846: f9 1f adc r31, r25
848: e1 59 subi r30, 0x91 ; 145
84a: ff 4f sbci r31, 0xFF ; 255
84c: 81 81 ldd r24, Z+1 ; 0x01
84e: 99 27 eor r25, r25
850: 20 81 ld r18, Z
852: 82 1b sub r24, r18
854: 91 09 sbc r25, r1
856: 24 81 ldd r18, Z+4 ; 0x04
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -