⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 128can.lst

📁 工业开关量检测模块的原代码,带断线检测功能
💻 LST
📖 第 1 页 / 共 5 页
字号:
    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 + -