📄 128can.lst
字号:
0665 938001F5 STS Pass_Flag,R24
0667 9543 INC R20
0668 3046 CPI R20,6
0669 F408 BCC 0x066B
066A CF9E RJMP 0x0609
(0150) }
(0151) if(Pass_Flag!=0x03)
066B 918001F5 LDS R24,Pass_Flag
066D 3083 CPI R24,3
066E F011 BEQ 0x0671
(0152) RESET;
066F 940C0000 JMP 0x0
(0153)
(0154) CANGCON = (1<<ENASTB); //start CAN interface, enable mod
0671 E082 LDI R24,2
0672 938000D8 STS 0xD8,R24
(0155)
(0156) CANGIE = (1<<ENIT)| (1<<ENRX)|(1<<ENTX); //enable receive interrupt and transmitte interrupt
0674 EB80 LDI R24,0xB0
0675 938000DB STS 0xDB,R24
(0157) CANIE1 = 0x00;
0677 2422 CLR R2
0678 922000DF STS 0xDF,R2
(0158) CANIE2 = 0x3f; //enable ALL MObs interrupt
067A E38F LDI R24,0x3F
067B 938000DE STS 0xDE,R24
(0159)
(0160) WDR();
067D 95A8 WDR
(0161) while (!(CANGSTA & (1<<ENFG))); //wait until module ready
067E 918000D9 LDS R24,0xD9
0680 7084 ANDI R24,4
0681 F3E1 BEQ 0x067E
(0162)
(0163) CANGCON |= (1<<ENA); //enable CAN controller
0682 918000D8 LDS R24,0xD8
0684 6082 ORI R24,2
0685 938000D8 STS 0xD8,R24
(0164)
(0165) SEI();
0687 9478 BSET 7
0688 9624 ADIW R28,4
0689 940E0BCF CALL pop_gset3
068B 9508 RET
_can_tx:
index --> R14
pass_Flag --> R12
i --> R12
msg --> R10
068C 940E0BD5 CALL push_gset5
068E 0158 MOVW R10,R16
(0166) }
(0167)
(0168)
(0169)
(0170) /*******************************************************************
(0171) CAN transmission via mailbox 1 (polling)
(0172) *******************************************************************/
(0173) void can_tx (VCI_CAN_OBJ msg)
(0174) {
(0175) unsigned char i,index,pass_Flag;
(0176) pass_Flag = 0x01;
068F 24CC CLR R12
0690 94C3 INC R12
(0177) CLI();
0691 94F8 BCLR 7
(0178) index =(unsigned char) (msg.ID%256);
0692 E040 LDI R20,0
0693 E051 LDI R21,1
0694 E060 LDI R22,0
0695 E070 LDI R23,0
0696 01F5 MOVW R30,R10
0697 8100 LDD R16,Z+0
0698 8111 LDD R17,Z+1
0699 8122 LDD R18,Z+2
069A 8133 LDD R19,Z+3
069B 937A ST R23,-Y
069C 936A ST R22,-Y
069D 935A ST R21,-Y
069E 934A ST R20,-Y
069F 940E0B26 CALL mod32s
06A1 2EE0 MOV R14,R16
(0179) pass_Flag <<= 1;
06A2 0CCC LSL R12
(0180) msg.ID <<= 3;
06A3 E083 LDI R24,3
06A4 E090 LDI R25,0
06A5 01F5 MOVW R30,R10
06A6 8100 LDD R16,Z+0
06A7 8111 LDD R17,Z+1
06A8 8122 LDD R18,Z+2
06A9 8133 LDD R19,Z+3
06AA 938A ST R24,-Y
06AB 940E0C57 CALL lsl32
06AD 01F5 MOVW R30,R10
06AE 8300 STD Z+0,R16
06AF 8311 STD Z+1,R17
06B0 8322 STD Z+2,R18
06B1 8333 STD Z+3,R19
(0181) CANPAGE = (index<<4);
06B2 2D8E MOV R24,R14
06B3 708F ANDI R24,0xF
06B4 9582 SWAP R24
06B5 938000ED STS 0xED,R24
(0182) CANCDMOB = (1<<IDE) |(8<<DLC0);
06B7 E188 LDI R24,0x18
06B8 938000EF STS 0xEF,R24
(0183) pass_Flag <<= 1;
06BA 0CCC LSL R12
(0184) CANIDT4 = (unsigned char) (msg.ID&0xF8);
06BB EF48 LDI R20,0xF8
06BC E050 LDI R21,0
06BD E060 LDI R22,0
06BE E070 LDI R23,0
06BF 8020 LDD R2,Z+0
06C0 8031 LDD R3,Z+1
06C1 8042 LDD R4,Z+2
06C2 8053 LDD R5,Z+3
06C3 2224 AND R2,R20
06C4 2235 AND R3,R21
06C5 2246 AND R4,R22
06C6 2257 AND R5,R23
06C7 922000F0 STS 0xF0,R2
(0185) CANIDT3 = (unsigned char) (msg.ID>>8);
06C9 E088 LDI R24,0x8
06CA E090 LDI R25,0
06CB 938A ST R24,-Y
06CC 940E0B12 CALL asr32
06CE 930000F1 STS 0xF1,R16
(0186) CANIDT2 = (unsigned char) (msg.ID>>16);
06D0 01F5 MOVW R30,R10
06D1 8020 LDD R2,Z+0
06D2 8031 LDD R3,Z+1
06D3 8042 LDD R4,Z+2
06D4 8053 LDD R5,Z+3
06D5 0112 MOVW R2,R4
06D6 922000F2 STS 0xF2,R2
(0187) pass_Flag <<= 1;
06D8 0CCC LSL R12
(0188) CANIDT1 = (unsigned char) (msg.ID>>24);
06D9 E188 LDI R24,0x18
06DA E090 LDI R25,0
06DB 8100 LDD R16,Z+0
06DC 8111 LDD R17,Z+1
06DD 8122 LDD R18,Z+2
06DE 8133 LDD R19,Z+3
06DF 938A ST R24,-Y
06E0 940E0B12 CALL asr32
06E2 930000F3 STS 0xF3,R16
(0189) if(pass_Flag!=0x08)
06E4 2D8C MOV R24,R12
06E5 3088 CPI R24,0x8
06E6 F011 BEQ 0x06E9
(0190) RESET;
06E7 940C0000 JMP 0x0
(0191) for(i=0;i<8;i++)
06E9 24CC CLR R12
06EA C00A RJMP 0x06F5
(0192) {
(0193)
(0194) CANMSG = msg.Data[i];
06EB 01C5 MOVW R24,R10
06EC 9604 ADIW R24,4
06ED 2DEC MOV R30,R12
06EE 27FF CLR R31
06EF 0FE8 ADD R30,R24
06F0 1FF9 ADC R31,R25
06F1 8020 LDD R2,Z+0
06F2 922000FA STS 0xFA,R2
06F4 94C3 INC R12
06F5 2D8C MOV R24,R12
06F6 3088 CPI R24,0x8
06F7 F398 BCS 0x06EB
(0195) }
(0196) CANCDMOB |= (1<<CONMOB0); //enable transmission
06F8 918000EF LDS R24,0xEF
06FA 6480 ORI R24,0x40
06FB 938000EF STS 0xEF,R24
(0197) SEI();
06FD 9478 BSET 7
06FE 940E0BD2 CALL pop_gset5
0700 9508 RET
_can_ReceiveData:
msg --> Y,+0
RC_CANSI --> Y,+1
nn --> Y,+1
err_temp --> R10
sta_temp --> R14
RCtemp2 --> Y,+37
RCF --> R10
tempp --> R12
nb_data --> R14
i --> Y,+36
0701 920A ST R0,-Y
0702 921A ST R1,-Y
0703 922A ST R2,-Y
0704 923A ST R3,-Y
0705 924A ST R4,-Y
0706 925A ST R5,-Y
0707 926A ST R6,-Y
0708 927A ST R7,-Y
0709 930A ST R16,-Y
070A 931A ST R17,-Y
070B 932A ST R18,-Y
070C 933A ST R19,-Y
070D 938A ST R24,-Y
070E 939A ST R25,-Y
070F 93EA ST R30,-Y
0710 93FA ST R31,-Y
0711 B60F IN R0,0x3F
0712 920A ST R0,-Y
0713 940E0BD5 CALL push_gset5
0715 97A7 SBIW R28,0x27
(0198) }
(0199)
(0200)
(0201) #pragma interrupt_handler can_ReceiveData:19
(0202) void can_ReceiveData (void) //receive interrupt
(0203) {
(0204) unsigned char nb_data;
(0205) unsigned char i,nn,err_temp,sta_temp;
(0206) unsigned int RC_CANSI,RCtemp2,tempp,RCF;
(0207) VCI_CAN_OBJ msg[3];
(0208)
(0209) WDR();
0716 95A8 WDR
(0210) CANGIE &= ~((1<<ENRX)|(1<<ENTX)); //关接收中断
0717 918000DB LDS R24,0xDB
0719 7C8F ANDI R24,0xCF
071A 938000DB STS 0xDB,R24
(0211) RCtemp2=CANSIT2; //读取中断信息
071C 902000E0 LDS R2,0xE0
071E 2433 CLR R3
071F A23E STD Y+38,R3
0720 A22D STD Y+37,R2
(0212) err_temp = CANTEC; //读取发送错误计数器
0721 90A000EA LDS R10,0xEA
(0213)
(0214) if(err_temp>96)
0723 E680 LDI R24,0x60
0724 158A CP R24,R10
0725 F410 BCC 0x0728
(0215) RESET;
0726 940C0000 JMP 0x0
(0216)
(0217) err_temp = CANREC; //读取接收错误计数器
0728 90A000EB LDS R10,0xEB
(0218) if(err_temp>128)
072A E880 LDI R24,0x80
072B 158A CP R24,R10
072C F410 BCC 0x072F
(0219) RESET;
072D 940C0000 JMP 0x0
(0220)
(0221) if(RCtemp2&(0x07))
072F A18D LDD R24,Y+37
0730 A19E LDD R25,Y+38
0731 7087 ANDI R24,7
0732 7090 ANDI R25,0
0733 3080 CPI R24,0
0734 0789 CPC R24,R25
0735 F1A1 BEQ 0x076A
(0222) {
(0223) for(i=0;i<3;i++) //查询前三个邮箱中断状态
0736 2400 CLR R0
0737 A20C STD Y+36,R0
0738 C02D RJMP 0x0766
(0224) {
(0225) tempp=(1<<i);
0739 A12C LDD R18,Y+36
073A 2733 CLR R19
073B E001 LDI R16,1
073C E010 LDI R17,0
073D 940E0C50 CALL lsl16
073F 0168 MOVW R12,R16
(0226) RCF=(RCtemp2&tempp);
0740 A0AD LDD R10,Y+37
0741 A0BE LDD R11,Y+38
0742 22A0 AND R10,R16
0743 22B1 AND R11,R17
(0227) if(RCF!=0)
0744 20AA TST R10
0745 F411 BNE 0x0748
0746 20BB TST R11
0747 F0D9 BEQ 0x0763
(0228) {
(0229) CANPAGE = i<<4;
0748 A18C LDD R24,Y+36
0749 708F ANDI R24,0xF
074A 9582 SWAP R24
074B 938000ED STS 0xED,R24
(0230) sta_temp = CANSTMOB;
074D 90E000EE LDS R14,0xEE
(0231) CANSTMOB &= ~(1<<TXOK);
074F 918000EE LDS R24,0xEE
0751 7B8F ANDI R24,0xBF
0752 938000EE STS 0xEE,R24
(0232) CANCDMOB = 0x18;
0754 E188 LDI R24,0x18
0755 938000EF STS 0xEF,R24
(0233) if(sta_temp&0x40) //是发送完成中断
0757 2D8E MOV R24,R14
0758 7480 ANDI R24,0x40
0759 F049 BEQ 0x0763
(0234) {
(0235) send_count = 0; //清发送计数器
075A 2422 CLR R2
075B 92200248 STS send_count,R2
(0236) if(LED)
(0237)
(0238) PORTB |= 0x40;
075D 9A2E SBI 0x05,6
075E C003 RJMP 0x0762
(0239) else
(0240)
(0241) PORTB &= 0xbf;
075F B185 IN R24,0x05
0760 7B8F ANDI R24,0xBF
0761 B985 OUT 0x05,R24
(0242)
(0243) WDR();
0762 95A8 WDR
0763 A00C LDD R0,Y+36
0764 9403 INC R0
0765 A20C STD Y+36,R0
0766 A18C LDD R24,Y+36
0767 3083 CPI R24,3
0768 F280 BCS 0x0739
(0244) }
(0245) }
(0246) }
(0247) }
0769 C0ED RJMP 0x0857
(0248) else if(RCtemp2&(0x38))
076A A18D LDD R24,Y+37
076B A19E LDD R25,Y+38
076C 7388 ANDI R24,0x38
076D 7090 ANDI R25,0
076E 3080 CPI R24,0
076F 0789 CPC R24,R25
0770 F409 BNE 0x0772
0771 C0E5 RJMP 0x0857
(0249) {
(0250) for(i=3;i<6;i++) //判断哪个邮箱产生接收中断
0772 E083 LDI R24,3
0773 A38C STD Y+36,R24
0774 C0DE RJMP 0x0853
(0251) {
(0252) tempp=(1<<i);
0775 A12C LDD R18,Y+36
0776 2733 CLR R19
0777 E001 LDI R16,1
0778 E010 LDI R17,0
0779 940E0C50 CALL lsl16
077B 0168 MOVW R12,R16
(0253) RCF=(RCtemp2&tempp);
077C A0AD LDD R10,Y+37
077D A0BE LDD R11,Y+38
077E 22A0 AND R10,R16
077F 22B1 AND R11,R17
(0254) if(RCF!=0)
0780 20AA TST R10
0781 F419 BNE 0x0785
0782 20BB TST R11
0783 F409 BNE 0x0785
0784 C0CB RJMP 0x0850
(0255) {
(0256) if(LED)
(0257) PORTB |= 0X80;
0785 9A2F SBI 0x05,7
0786 C003 RJMP 0x078A
(0258) else
(0259) PORTB &= 0X7f;
0787 B185 IN R24,0x05
0788 778F ANDI R24,0x7F
0789 B985 OUT 0x05,R24
(0260) CANPAGE = i<<4;
078A A18C LDD R24,Y+36
078B 708F ANDI R24,0xF
078C 9582 SWAP R24
078D 938000ED STS 0xED,R24
(0261) WDR();
078F 95A8 WDR
(0262) for (nb_data = 0; nb_data <8; nb_data++)
0790 24EE CLR R14
0791 C010 RJMP 0x07A2
(0263) {
(0264) rece_data[i-3].Data[nb_data]=CANMSG;
0792 E08C LDI R24,0xC
0793 A00C LDD R0,Y+36
0794 9D80 MUL R24,R0
0795 0110 MOVW R2,R0
0796 EE8C LDI R24,0xEC
0797 E091 LDI R25,1
0798 0E28 ADD R2,R24
0799 1E39 ADC R3,R25
079A 2DEE MOV R30,R14
079B 27FF CLR R31
079C 0DE2 ADD R30,R2
079D 1DF3 ADC R31,R3
079E 902000FA LDS R2,0xFA
07A0 8220 STD Z+0,R2
07A1 94E3 INC R14
07A2 2D8E MOV R24,R14
07A3 3088 CPI R24,0x8
07A4 F368 BCS 0x0792
(0265) }
(0266) rece_data[i-3].ID = 0;
07A5 E08C LDI R24,0xC
07A6 A00C LDD R0,Y+36
07A7 9D80 MUL R24,R0
07A8 01F0 MOVW R30,R0
07A9 EE88 LDI R24,0xE8
07AA E091 LDI R25,1
07AB 0FE8 ADD R30,R24
07AC 1FF9 ADC R31,R25
07AD E040 LDI R20,0
07AE E050 LDI R21,0
07AF E060 LDI R22,
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -