📄 128can.lst
字号:
0398 358A CPI R24,0x5A
0399 F009 BEQ 0x039B
039A C06A RJMP 0x0405
(0299) {
(0300) CLI();
039B 94F8 BCLR 7
(0301)
(0302) WDR();
039C 95A8 WDR
(0303) TIMSK0 = 0x00;
039D 2422 CLR R2
039E 9220006E STS 0x6E,R2
(0304) if(LED)
(0305) {
(0306) PORTB &= 0X3F; //灭网络灯
03A0 B185 IN R24,0x05
03A1 738F ANDI R24,0x3F
03A2 B985 OUT 0x05,R24
(0307) }
03A3 C003 RJMP 0x03A7
(0308) else
(0309)
(0310) PORTB |= 0Xc0;
03A4 B185 IN R24,0x05
03A5 6C80 ORI R24,0xC0
03A6 B985 OUT 0x05,R24
(0311)
(0312) DI_handle(); //读取开关状态
03A7 940E0914 CALL _DI_handle
(0313)
(0314) for(i=0;i<12;i++)
03A9 24AA CLR R10
03AA C04A RJMP 0x03F5
(0315) {
(0316) if(DI_data_pre[i] == DI_data_cur[i]) //去抖处理
03AB E683 LDI R24,0x63
03AC E092 LDI R25,2
03AD 2DEA MOV R30,R10
03AE 27FF CLR R31
03AF 0FE8 ADD R30,R24
03B0 1FF9 ADC R31,R25
03B1 8020 LDD R2,Z+0
03B2 E48B LDI R24,0x4B
03B3 E092 LDI R25,2
03B4 2DEA MOV R30,R10
03B5 27FF CLR R31
03B6 0FE8 ADD R30,R24
03B7 1FF9 ADC R31,R25
03B8 8030 LDD R3,Z+0
03B9 1432 CP R3,R2
03BA F479 BNE 0x03CA
(0317) {
(0318) DI_data[i] = DI_data_cur[i];
03BB E683 LDI R24,0x63
03BC E092 LDI R25,2
03BD 2DEA MOV R30,R10
03BE 27FF CLR R31
03BF 0FE8 ADD R30,R24
03C0 1FF9 ADC R31,R25
03C1 8020 LDD R2,Z+0
03C2 E587 LDI R24,0x57
03C3 E092 LDI R25,2
03C4 2DEA MOV R30,R10
03C5 27FF CLR R31
03C6 0FE8 ADD R30,R24
03C7 1FF9 ADC R31,R25
03C8 8220 STD Z+0,R2
(0319) }
03C9 C01C RJMP 0x03E6
(0320) else if (DI_data_pre[i] != DI_data_cur[i])
03CA E683 LDI R24,0x63
03CB E092 LDI R25,2
03CC 2DEA MOV R30,R10
03CD 27FF CLR R31
03CE 0FE8 ADD R30,R24
03CF 1FF9 ADC R31,R25
03D0 8020 LDD R2,Z+0
03D1 E48B LDI R24,0x4B
03D2 E092 LDI R25,2
03D3 2DEA MOV R30,R10
03D4 27FF CLR R31
03D5 0FE8 ADD R30,R24
03D6 1FF9 ADC R31,R25
03D7 8030 LDD R3,Z+0
03D8 1432 CP R3,R2
03D9 F061 BEQ 0x03E6
(0321) {
(0322) DI_data[i] = DI_data_pre[i];
03DA 2DEA MOV R30,R10
03DB 27FF CLR R31
03DC 0FE8 ADD R30,R24
03DD 1FF9 ADC R31,R25
03DE 8020 LDD R2,Z+0
03DF E587 LDI R24,0x57
03E0 E092 LDI R25,2
03E1 2DEA MOV R30,R10
03E2 27FF CLR R31
03E3 0FE8 ADD R30,R24
03E4 1FF9 ADC R31,R25
03E5 8220 STD Z+0,R2
(0323) }
(0324) DI_data_pre[i] = DI_data_cur[i]; //新旧值更新
03E6 E683 LDI R24,0x63
03E7 E092 LDI R25,2
03E8 2DEA MOV R30,R10
03E9 27FF CLR R31
03EA 0FE8 ADD R30,R24
03EB 1FF9 ADC R31,R25
03EC 8020 LDD R2,Z+0
03ED E48B LDI R24,0x4B
03EE E092 LDI R25,2
03EF 2DEA MOV R30,R10
03F0 27FF CLR R31
03F1 0FE8 ADD R30,R24
03F2 1FF9 ADC R31,R25
03F3 8220 STD Z+0,R2
03F4 94A3 INC R10
03F5 2D8A MOV R24,R10
03F6 308C CPI R24,0xC
03F7 F408 BCC 0x03F9
03F8 CFB2 RJMP 0x03AB
(0325) }
(0326) Temp_Flag = 0x00; //清除定时标志
03F9 2422 CLR R2
03FA 922001F3 STS Temp_Flag,R2
(0327)
(0328) Time = 0;
03FC 922001F2 STS Time,R2
(0329)
(0330) timer0_init();
03FE 940E0AFC CALL _timer0_init
(0331)
(0332) TIMSK0 = 0x01; //timer interrupt sources
0400 E081 LDI R24,1
0401 9380006E STS 0x6E,R24
(0333)
(0334) WDR();
0403 95A8 WDR
(0335) SEI();
0404 9478 BSET 7
(0336) }
(0337)
(0338) if(Send_Flag == 0x5a)
0405 918001F4 LDS R24,Send_Flag
0407 358A CPI R24,0x5A
0408 F009 BEQ 0x040A
0409 C088 RJMP 0x0492
(0339) {
(0340) WDR();
040A 95A8 WDR
(0341) msg[0].ID = id1; //前八个通道数据发送
040B 9040020A LDS R4,id1+2
040D 9050020B LDS R5,id1+3
040F 90200208 LDS R2,id1
0411 90300209 LDS R3,id1+1
0413 92300231 STS msg+1,R3
0415 92200230 STS msg,R2
0417 92500233 STS msg+3,R5
0419 92400232 STS msg+2,R4
(0342) for(i=0;i<8;i++)
041B 24AA CLR R10
041C C00F RJMP 0x042C
(0343) {
(0344) msg[0].Data[i] = DI_data[i];
041D E587 LDI R24,0x57
041E E092 LDI R25,2
041F 2DEA MOV R30,R10
0420 27FF CLR R31
0421 0FE8 ADD R30,R24
0422 1FF9 ADC R31,R25
0423 8020 LDD R2,Z+0
0424 E384 LDI R24,0x34
0425 E092 LDI R25,2
0426 2DEA MOV R30,R10
0427 27FF CLR R31
0428 0FE8 ADD R30,R24
0429 1FF9 ADC R31,R25
042A 8220 STD Z+0,R2
042B 94A3 INC R10
042C 2D8A MOV R24,R10
042D 3088 CPI R24,0x8
042E F370 BCS 0x041D
(0345) }
(0346) can_tx (msg[0]);
042F E380 LDI R24,0x30
0430 E092 LDI R25,2
0431 01FE MOVW R30,R28
0432 9634 ADIW R30,4
0433 E00C LDI R16,0xC
0434 E010 LDI R17,0
0435 93FA ST R31,-Y
0436 93EA ST R30,-Y
0437 939A ST R25,-Y
0438 938A ST R24,-Y
0439 940E0C69 CALL asgnblk
043B 018E MOVW R16,R28
043C 5F0C SUBI R16,0xFC
043D 4F1F SBCI R17,0xFF
043E 940E068C CALL _can_tx
(0347) send_count++;
0440 91800248 LDS R24,send_count
0442 5F8F SUBI R24,0xFF
0443 93800248 STS send_count,R24
(0348) msg[1].ID = id2;
0445 90400206 LDS R4,id2+2
0447 90500207 LDS R5,id2+3
0449 90200204 LDS R2,id2
044B 90300205 LDS R3,id2+1
044D 9230023D STS 0x23D,R3
044F 9220023C STS 0x23C,R2
0451 9250023F STS 0x23F,R5
0453 9240023E STS 0x23E,R4
(0349) for(i=0;i<4;i++) //后四个通道数据发送
0455 24AA CLR R10
0456 C00F RJMP 0x0466
(0350) {
(0351) msg[1].Data[i] = DI_data[i+8];
0457 E58F LDI R24,0x5F
0458 E092 LDI R25,2
0459 2DEA MOV R30,R10
045A 27FF CLR R31
045B 0FE8 ADD R30,R24
045C 1FF9 ADC R31,R25
045D 8020 LDD R2,Z+0
045E E480 LDI R24,0x40
045F E092 LDI R25,2
0460 2DEA MOV R30,R10
0461 27FF CLR R31
0462 0FE8 ADD R30,R24
0463 1FF9 ADC R31,R25
0464 8220 STD Z+0,R2
0465 94A3 INC R10
0466 2D8A MOV R24,R10
0467 3084 CPI R24,4
0468 F370 BCS 0x0457
(0352) }
(0353) for(i=4;i<8;i++)
0469 E084 LDI R24,4
046A 2EA8 MOV R10,R24
046B C009 RJMP 0x0475
(0354) {
(0355) msg[1].Data[i]=0x00;
046C E480 LDI R24,0x40
046D E092 LDI R25,2
046E 2DEA MOV R30,R10
046F 27FF CLR R31
0470 0FE8 ADD R30,R24
0471 1FF9 ADC R31,R25
0472 2422 CLR R2
0473 8220 STD Z+0,R2
0474 94A3 INC R10
0475 2D8A MOV R24,R10
0476 3088 CPI R24,0x8
0477 F3A0 BCS 0x046C
(0356) }
(0357) can_tx (msg[1]);
0478 E38C LDI R24,0x3C
0479 E092 LDI R25,2
047A 01FE MOVW R30,R28
047B 9670 ADIW R30,0x10
047C E00C LDI R16,0xC
047D E010 LDI R17,0
047E 93FA ST R31,-Y
047F 93EA ST R30,-Y
0480 939A ST R25,-Y
0481 938A ST R24,-Y
0482 940E0C69 CALL asgnblk
0484 018E MOVW R16,R28
0485 5F00 SUBI R16,0xF0
0486 4F1F SBCI R17,0xFF
0487 940E068C CALL _can_tx
(0358) send_count++;
0489 91800248 LDS R24,send_count
048B 5F8F SUBI R24,0xFF
048C 93800248 STS send_count,R24
(0359) Send_Flag = 0x00;
048E 2422 CLR R2
048F 922001F4 STS Send_Flag,R2
(0360) WDR();
0491 95A8 WDR
0492 CDD0 RJMP 0x0263
0493 966C ADIW R28,0x1C
0494 9508 RET
FILE: D:\报警系统设计资料\报警系统软件\测量模块基于CAN的系统网程序\开关量CAN网\can.c
(0001) #include "main.h"
(0002)
(0003) //#pragma interrupt_handler can_ReceiveData:19
(0004)
(0005) /*******************************************************************
(0006) CAN initialization:
(0007) Mailbox 0: Receive --> interrupt
(0008) Mailbox 1: Transmit --> polling
(0009) *******************************************************************/
(0010) #define TYP_RESET 5
(0011) #define TYP_BAUD 10
(0012)
(0013) #define SELFID 2
(0014)
(0015) extern unsigned char sysrst,Pass_Flag;
(0016) unsigned char canbaud;
(0017) extern VCI_CAN_OBJ rece_data[3];
(0018)
(0019) const Uchar CanBaud[6][3]={{0x02,0x04,0x13},{0x06,0x04,0x13},{0x0E,0x04,0x13},{0x12,0x04,0x13},{0x1E,0x04,0x13},{0x26,0x04,0x13}};
(0020) //波特率数组
(0021)
(0022) //15个MOB的ID和MID
(0023) unsigned long CANMOBID[15]={0x10000000,0x20000000,0x30000000,0x40000000,0x50000000,0x60000000,0x01000000,0x01000001,0x0200ff00,0x12000001,0x01000002,0x01000003,0x01000004,0x01000005,0x1300ff01};
(0024) unsigned long CANMOBMD[15]={0x0000ffff,0x0000ffff,0x0000ffff,0x00ff00ff,0x00ff00ff,0x00ff00ff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff,0x1fffffff};
(0025) unsigned char CANIDT[15][4]={0};
(0026) unsigned char CANIDM[15][4]={0};
(0027) Uchar counterTemp,send_count;
(0028)
(0029) void can_init (void) //CAN初始化函数
(0030) {
(0031) canMob_init();
_can_init:
0495 D001 RCALL _canMob_init
0496 9508 RET
_canMob_init:
temp2 --> R10
temp1 --> R22
temp --> Y,+0
j --> R22
i --> R20
0497 940E0BD9 CALL push_gset3
0499 9724 SBIW R28,4
(0032) }
(0033)
(0034)
(0035) void canMob_init (void) //MOB初始化函数
(0036) {
(0037) unsigned char i,j;
(0038) unsigned long temp;
(0039) unsigned int temp1,temp2;
(0040)
(0041) CLI(); //关中断
049A 94F8 BCLR 7
(0042) //DDRD=(1<<PD5)|(0<<PD6); //TXCAN, RXCNA
(0043) DDRD|=0x20; //CAN管脚初始化
049B 9A55 SBI 0x0A,5
(0044) DDRD&=0xBF;
049C B18A IN R24,0x0A
049D 7B8F ANDI R24,0xBF
049E B98A OUT 0x0A,R24
(0045) CANGCON |= (1<<SWRES); //reset CAN interface
049F 918000D8 LDS R24,0xD8
04A1 6081 ORI R24,1
04A2 938000D8 STS 0xD8,R24
(0046)
(0047) Pass_Flag = 0x00;
04A4 2422 CLR R2
04A5 922001F5 STS Pass_Flag,R2
(0048) //CANMOBID[2]=(unsigned long)(SELFID<<8)|CANMOBID[2];
(0049) for(i=0;i<6;i++) //15个邮箱初始化
04A7 2744 CLR R20
04A8 C048 RJMP 0x04F1
(0050) {
(0051) temp=CANMOBID[i]<<3; //ID初始化
04A9 E084 LDI R24,4
04AA 9F84 MUL R24,R20
04AB 01F0 MOVW R30,R0
04AC E080 LDI R24,0
04AD E091 LDI R25,1
04AE 0FE8 ADD R30,R24
04AF 1FF9 ADC R31,R25
04B0 8100 LDD R16,Z+0
04B1 8111 LDD R17,Z+1
04B2 8122 LDD R18,Z+2
04B3 8133 LDD R19,Z+3
04B4 E083 LDI R24,3
04B5 E090 LDI R25,0
04B6 938A ST R24,-Y
04B7 940E0C57 CALL lsl32
04B9 8308 STD Y+0,R16
04BA 8319 STD Y+1,R17
04BB 832A STD Y+2,R18
04BC 833B STD Y+3,R19
(0052) temp1=(unsigned int)temp;
04BD 8168 LDD R22,Y+0
04BE 8179 LDD R23,Y+1
(0053) temp2=(unsigned int)(temp/0x00010000);
04BF 8028 LDD R2,Y+0
04C0 8039 LDD R3,Y+1
04C1 804A LDD R4,Y+2
04C2 805B LDD R5,Y+3
04C3 0152 MOVW R10,R4
(0054) CANIDT[i][3]=(Uchar)temp1;
04C4 E084 LDI R24,4
04C5 9F84 MUL R24,R20
04C6 01F0 MOVW R30,R0
04C7 E78B LDI R24,0x7B
04C8 E091 LDI R25,1
04C9 0FE8 ADD R30,R24
04CA 1FF9 ADC R31,R25
04CB 8360 STD Z+0,R22
(0055) CANIDT[i][2]=(Uchar)(temp1>>8);
04CC E084 LDI R24,4
04CD 9F84 MUL R24,R20
04CE 01F0 MOVW R30,R0
04CF E78A LDI R24,0x7A
04D0 E091 LDI R25,1
04D1 0FE8 ADD R30,R24
04D2 1FF9 ADC R31,R25
04D3 011B MOVW R2,R22
04D4 2C23 MOV R2,R3
04D5 2433 CLR R3
04D6 8220 STD Z+0,R2
(0056) CANIDT[i][1]=(Uchar)temp2;
04D7 E084 LDI R24,4
04D8 9F84 MUL R24,R20
04D9 01F0 MOVW R30,R0
04DA E789 LDI R24,0x79
04DB E091 LDI R25,1
04DC 0FE8 ADD R30,R24
04DD 1FF9 ADC R31,R25
04DE 82A0 STD Z+0,R10
(0057) CANIDT[i][0]=(Uchar)(temp2>>8);
04DF E084 LDI R24,4
04E0 9F84 MUL R24,R20
04E1 01F0 MOVW R30,R0
04E2 E788 LDI R24,0x78
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -