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

📄 can-18b20.lst

📁 基于CAN总线的 温度采集方法。选用DS18B20温度传感器。
💻 LST
📖 第 1 页 / 共 4 页
字号:
__text_start:
__start:
    002A E5CF      LDI	R28,0x5F
    002B E0D4      LDI	R29,4
    002C BFCD      OUT	0x3D,R28
    002D BFDE      OUT	0x3E,R29
    002E 51C0      SUBI	R28,0x10
    002F 40D0      SBCI	R29,0
    0030 EA0A      LDI	R16,0xAA
    0031 8308      STD	Y+0,R16
    0032 2400      CLR	R0
    0033 E6EB      LDI	R30,0x6B
    0034 E0F0      LDI	R31,0
    0035 E010      LDI	R17,0
    0036 37E2      CPI	R30,0x72
    0037 07F1      CPC	R31,R17
    0038 F011      BEQ	0x003B
    0039 9201      ST	R0,Z+
    003A CFFB      RJMP	0x0036
    003B 8300      STD	Z+0,R16
    003C E4E8      LDI	R30,0x48
    003D E0F0      LDI	R31,0
    003E E6A0      LDI	R26,0x60
    003F E0B0      LDI	R27,0
    0040 E010      LDI	R17,0
    0041 35E3      CPI	R30,0x53
    0042 07F1      CPC	R31,R17
    0043 F021      BEQ	0x0048
    0044 95C8      LPM
    0045 9631      ADIW	R30,1
    0046 920D      ST	R0,X+
    0047 CFF9      RJMP	0x0041
    0048 D1AC      RCALL	_main
_exit:
    0049 CFFF      RJMP	_exit
FILE: F:\can-18b20(无浮点再调试)\can18b20.c
(0001) #include <iom8v.h>
(0002) #include <macros.h>
(0003) #include "mcp2515.h"
(0004) 
(0005) #define fosc 7372800  //晶振7.3728MHZ
(0006) 
(0007) #define DQ (1<<5)  //DQ接PC5
(0008) 
(0009) #define S_CS PORTC|=0x02   //PC1片选线
(0010) #define C_CS PORTC&=(~0x02)
(0011) 
(0012) #define S_CLK PORTC|=0x01  //PC0时钟线
(0013) #define C_CLK PORTC&=(~0x01)
(0014) 
(0015) #define S_DATA PORTC|=0x04  //PC2数据
(0016) #define C_DATA PORTC&=(~0x04)
(0017) /**************************** Definitionen ***********************************/
(0018) void init_SPI (void);
(0019) void reset_MCP (void);
(0020) void write_MCP (unsigned char adress, unsigned char value);
(0021) unsigned char read_MCP(unsigned char adress);
(0022) void fill_msg_box_0(void);
(0023) void send_box_0 (void);
(0024) void wait(unsigned int n);
(0025) void init_can(void);
(0026) void bit_modify(unsigned char adress,unsigned char cc, unsigned char value);
(0027) void delay_1ms(void);
(0028) void HC595_SENDDAT(char dat);
(0029) void delay(unsigned int n);
(0030) unsigned char crccheck(unsigned char *p,unsigned char len);
(0031) void	delay_us(unsigned int time);
(0032) unsigned char ds1820_ack(void);
(0033) unsigned char	read_byte(void);
(0034) void	write_byte(unsigned char value);
(0035) //unsigned char	Read_Temperature(unsigned int *temperature);
(0036) //unsigned char	Read_RomCode(unsigned char *temp);
(0037) //void ds1820_match(unsigned char *p);
(0038) unsigned int	count; //CAN发送间隔
(0039) unsigned char	wendu,shi,ge;  
(0040) unsigned char	dot1; 
(0041) unsigned char	minus_flag;
(0042) unsigned char	flag=0; //初始化,个位显示    
(0043) //0-9
(0044) unsigned char table[10]={0x3F,0X06,0X5B,0X4F,0X66,0X6D,0X7D,0X07,0X7F,0X6F};
(0045) /**************************** Hauptprogramm **********************************/
(0046) /*SPI初始化*/
(0047) void init_SPI (void)
(0048) {
(0049) 	//HW_SPI=0x00;		//	PortB ist HW_SPI
(0050) 	DDR_SPI|=0x2D;		//	CS\MOSI\SCK output MISO input
_init_SPI:
    004A B387      IN	R24,0x17
    004B 628D      ORI	R24,0x2D
    004C BB87      OUT	0x17,R24
(0051) 	SPCR=0x51;		//	SPI Controll Register set,Fosc/16
    004D E581      LDI	R24,0x51
    004E B98D      OUT	0x0D,R24
    004F 9508      RET
(0052) }
(0053) /*MCP2515复位*/
(0054) void reset_MCP (void)
(0055) {   unsigned char i;
(0056) 	PORTB&=~(1<<CS_CAN);					//	CS  Low -> MCP enable
_reset_MCP:
  i                    --> Y+1
    0050 98C2      CBI	0x18,2
(0057) 	SPDR=RESET_MCP;				       //	sende Reset Kommando
    0051 EC80      LDI	R24,0xC0
    0052 B98F      OUT	0x0F,R24
(0058) 	while(!(SPSR & (1<<SPIF))); 	//	warten bis das Byte gesendet wurde
    0053 9B77      SBIS	0x0E,7
    0054 CFFE      RJMP	0x0053
(0059) 	PORTB|=(1<<CS_CAN);				//	CS  High -> MCP disable
    0055 9AC2      SBI	0x18,2
(0060) 	wait(1000);		//	waiting?
    0056 EE08      LDI	R16,0xE8
    0057 E013      LDI	R17,3
    0058 D126      RCALL	_wait
    0059 9508      RET
(0061) }
(0062) /*CAN发送请求*/
(0063) void send_box_0 (void)
(0064) {
(0065) 	write_MCP (TXB0CTRL, 0x0B);			//	sende Telegramm mit h鯿hster Priorit鋞
_send_box_0:
    005A E02B      LDI	R18,0xB
    005B E300      LDI	R16,0x30
    005C D007      RCALL	_write_MCP
(0066) 	PORTB&=~(1<<CS_CAN);				//	CS  Low -> MCP enable
    005D 98C2      CBI	0x18,2
(0067) 	SPDR=(RTS | 0x01);			//	sende Mailbox Nummer 0
    005E E881      LDI	R24,0x81
    005F B98F      OUT	0x0F,R24
(0068) 	while(!(SPSR & (1<<SPIF)));	//	warten bis das Byte gesendet wurde
    0060 9B77      SBIS	0x0E,7
    0061 CFFE      RJMP	0x0060
(0069) 	PORTB|=(1<<CS_CAN);					//	CS  High -> MCP disable
    0062 9AC2      SBI	0x18,2
    0063 9508      RET
(0070) }
(0071) /*MCP2515写操作*/
(0072) void write_MCP (unsigned char adress, unsigned char value)
(0073) {
(0074) 	PORTB&=~(1<<CS_CAN);				//	CS  Low -> MCP enable
_write_MCP:
  value                --> R18
  adress               --> R16
    0064 98C2      CBI	0x18,2
(0075) 	SPDR=0x02;					//	sende Write Kommando
    0065 E082      LDI	R24,2
    0066 B98F      OUT	0x0F,R24
(0076) 	while(!(SPSR & (1<<SPIF)));	//	warten bis das Byte gesendet wurde
    0067 9B77      SBIS	0x0E,7
    0068 CFFE      RJMP	0x0067
(0077) 	SPDR=adress;					//	Addresse senden
    0069 B90F      OUT	0x0F,R16
(0078) 	while(!(SPSR & (1<<SPIF)));	//	warten bis das Byte gesendet wurde
    006A 9B77      SBIS	0x0E,7
    006B CFFE      RJMP	0x006A
(0079) 	SPDR=value;					//	Wert senden
    006C B92F      OUT	0x0F,R18
(0080) 	while(!(SPSR & (1<<SPIF)));	//	warten bis das Byte gesendet wurde
    006D 9B77      SBIS	0x0E,7
    006E CFFE      RJMP	0x006D
(0081) 	PORTB|=(1<<CS_CAN);					//	CS  High -> MCP disable
    006F 9AC2      SBI	0x18,2
    0070 9508      RET
_read_MCP:
  spidata              --> R20
  adress               --> R16
    0071 D2FB      RCALL	push_gset1
(0082) }
(0083) /*MCP2515读操作*/
(0084) unsigned char read_MCP(unsigned char adress)
(0085) {
(0086) 	unsigned char spidata;
(0087) 
(0088) 	PORTB&=~(1<<CS_CAN);				//	CS  Low -> MCP enable
    0072 98C2      CBI	0x18,2
(0089) 	SPDR=0x03;					//	sende Read Kommando
    0073 E083      LDI	R24,3
    0074 B98F      OUT	0x0F,R24
(0090) 	while(!(SPSR & (1<<SPIF)));	//	warten bis das Byte gesendet wurde
    0075 9B77      SBIS	0x0E,7
    0076 CFFE      RJMP	0x0075
(0091) 	SPDR=adress;					//	Adresse von der gelesen werden soll
    0077 B90F      OUT	0x0F,R16
(0092) 	while(!(SPSR & (1<<SPIF)));	//	warten bis das Byte gesendet wurde
    0078 9B77      SBIS	0x0E,7
    0079 CFFE      RJMP	0x0078
(0093) 	SPDR=0xAA;					//	Dummy-Byte senden
    007A EA8A      LDI	R24,0xAA
    007B B98F      OUT	0x0F,R24
(0094) 	while(!(SPSR & (1<<SPIF)));	//	warten bis das Byte gesendet wurde
    007C 9B77      SBIS	0x0E,7
    007D CFFE      RJMP	0x007C
(0095) 	spidata = SPDR;				//	Daten aus SPI abholen
    007E B14F      IN	R20,0x0F
(0096) 	PORTB|=(1<<CS_CAN);				//	CS  High -> MCP disable
    007F 9AC2      SBI	0x18,2
(0097) 	return (spidata);
    0080 2F04      MOV	R16,R20
    0081 D2EE      RCALL	pop_gset1
    0082 9508      RET
_bit_modify:
  value                --> R20
  cc                   --> R18
  adress               --> R16
    0083 D2E9      RCALL	push_gset1
    0084 814A      LDD	R20,Y+2
(0098) }
(0099) /*位修改*/
(0100) void bit_modify(unsigned char adress,unsigned char cc, unsigned char value)
(0101) { PORTB&=~(1<<CS_CAN);				//	CS  Low -> MCP enable
    0085 98C2      CBI	0x18,2
(0102) 
(0103)     SPDR=0x05;					//	bit modify Write Kommando
    0086 E085      LDI	R24,5
    0087 B98F      OUT	0x0F,R24
(0104) 	while(!(SPSR & (1<<SPIF)));	//	warten bis das Byte gesendet wurde
    0088 9B77      SBIS	0x0E,7
    0089 CFFE      RJMP	0x0088
(0105) 	SPDR=adress;					//	sende Write Kommando
    008A B90F      OUT	0x0F,R16
(0106) 	while(!(SPSR & (1<<SPIF)));	//	warten bis das Byte gesendet wurde
    008B 9B77      SBIS	0x0E,7
    008C CFFE      RJMP	0x008B
(0107) 	SPDR=cc;					//	sende Write Kommando
    008D B92F      OUT	0x0F,R18
(0108) 	while(!(SPSR & (1<<SPIF)));	//	warten bis das Byte gesendet wurde
    008E 9B77      SBIS	0x0E,7
    008F CFFE      RJMP	0x008E
(0109) 	SPDR=value;					//	sende Write Kommando
    0090 B94F      OUT	0x0F,R20
(0110) 	while(!(SPSR & (1<<SPIF)));	//	warten bis das Byte gesendet wurde
    0091 9B77      SBIS	0x0E,7
    0092 CFFE      RJMP	0x0091
(0111) 
(0112)   PORTB|=(1<<CS_CAN);					//	CS  High -> MCP disable
    0093 9AC2      SBI	0x18,2
    0094 D2DB      RCALL	pop_gset1
    0095 9508      RET
(0113) }
(0114) /*填充CAN信息*/
(0115) void fill_msg_box_0(void)
(0116) {
(0117) 	write_MCP(TXB0SIDH, (unsigned char) (0x261 >> 3));	//	ID = 0x26a
_fill_msg_box_0:
    0096 E42C      LDI	R18,0x4C
    0097 E301      LDI	R16,0x31
    0098 DFCB      RCALL	_write_MCP
(0118) 	write_MCP(TXB0SIDL, (unsigned char) (0x261 << 5));  ////需要修改
    0099 E220      LDI	R18,0x20
    009A E302      LDI	R16,0x32
    009B DFC8      RCALL	_write_MCP
(0119) 	write_MCP (TXB0DLC, 0x02);		//	1 Bytes
    009C E022      LDI	R18,2
    009D E305      LDI	R16,0x35
    009E DFC5      RCALL	_write_MCP
(0120) 	write_MCP (TXB0D0, wendu);		
    009F 9120006F  LDS	R18,wendu
    00A1 E306      LDI	R16,0x36
    00A2 DFC1      RCALL	_write_MCP
(0121) 	write_MCP (TXB0D1, dot1);
    00A3 9120006C  LDS	R18,dot1
    00A5 E307      LDI	R16,0x37
    00A6 DFBD      RCALL	_write_MCP
    00A7 9508      RET
(0122)   
(0123) }
(0124) /*CAN初始化*/
(0125) void init_can(void)
(0126) {   write_MCP (CANCTRL, 0x80);  //0x80, set mode
_init_can:
    00A8 E820      LDI	R18,0x80
    00A9 E00F      LDI	R16,0xF
    00AA DFB9      RCALL	_write_MCP
(0127) 	//TX
(0128) 	write_MCP (CNF1, 0x03);		//	Set CAN-Baudrate  125 kBaud
    00AB E023      LDI	R18,3
    00AC E20A      LDI	R16,0x2A
    00AD DFB6      RCALL	_write_MCP
(0129) 	write_MCP (CNF2, 0xB8);		//	 16MHz
    00AE EB28      LDI	R18,0xB8
    00AF E209      LDI	R16,0x29
    00B0 DFB3      RCALL	_write_MCP
(0130) 	write_MCP (CNF3, 0x05);		//	des MCP2510 bzw. MCP2515
    00B1 E025      LDI	R18,5
    00B2 E208      LDI	R16,0x28
    00B3 DFB0      RCALL	_write_MCP
(0131) 	
(0132) 	//RX
(0133) 	write_MCP (RXB0CTRL, 0x20); // receive stand message
    00B4 E220      LDI	R18,0x20
    00B5 E600      LDI	R16,0x60
    00B6 DFAD      RCALL	_write_MCP
(0134) 	write_MCP (RXM0SIDH, 0xFF); // 屏蔽寄存器高8位,11位都要校验
    00B7 EF2F      LDI	R18,0xFF
    00B8 E200      LDI	R16,0x20
    00B9 DFAA      RCALL	_write_MCP
(0135) 	write_MCP (RXM0SIDL, 0xE0); // 屏蔽寄存器低3位
    00BA EE20      LDI	R18,0xE0
    00BB E201      LDI	R16,0x21
    00BC DFA7      RCALL	_write_MCP
(0136) 	write_MCP (RXF0SIDH, 0x4C); //接收报文ID为:0x260的报文(上位机 cansap)
    00BD E42C      LDI	R18,0x4C
    00BE 2700      CLR	R16
    00BF DFA4      RCALL	_write_MCP
(0137) 	write_MCP (RXF0SIDL, 0x00);
    00C0 2722      CLR	R18
    00C1 E001      LDI	R16,1
    00C2 DFA1      RCALL	_write_MCP
(0138) 	
(0139) 	write_MCP (CANINTE, 0x25);   //enable interrupt
    00C3 E225      LDI	R18,0x25
    00C4 E20B      LDI	R16,0x2B
    00C5 DF9E      RCALL	_write_MCP
(0140) 	write_MCP (CANCTRL, 0x00);	//	Set CLK-Out disable,0x80 set mode,0x40 shou fa ,0x00 normal mode,
    00C6 2722      CLR	R18
    00C7 E00F      LDI	R16,0xF
    00C8 DF9B      RCALL	_write_MCP
(0141)      asm("nop");     
    00C9 0000      NOP
    00CA 9508      RET
_int0_isr:
  err                  --> Y+2
  i                    --> R20
    00CB D2B8      RCALL	push_lset
    00CC D2A0      RCALL	push_gset1
    00CD 9721      SBIW	R28,1
(0142) }
(0143) /*CAN中断*/
(0144) #pragma interrupt_handler int0_isr:2
(0145) void int0_isr(void)
(0146) {   unsigned char i,err; 
(0147)     //unsigned int canid; 
(0148)       i = read_MCP (CANINTF);
    00CE E20C      LDI	R16,0x2C
    00CF DFA1      RCALL	_read_MCP
    00D0 2F40      MOV	R20,R16
(0149) 	      if((i&0x04)==0x04)  //TX0 空
    00D1 2F84      MOV	R24,R20
    00D2 7084      ANDI	R24,4
    00D3 3084      CPI	R24,4
    00D4 F439      BNE	0x00DC
(0150) 			   { minus_flag=0;  //负温度标志清0 
    00D5 2422      CLR	R2
    00D6 9220006B  STS	minus_flag,R2
(0151) 			     
(0152) 			     bit_modify(CANINTF, 0x04,0x00); //清除TX0IF标志
    00D8 8228      STD	Y+0,R2
    00D9 E024      LDI	R18,4
    00DA E20C      LDI	R16,0x2C
    00DB DFA7      RCALL	_bit_modify
(0153) 				}
(0154) 	      if((i&0x20)==0x20) // 出错
    00DC 2F84      MOV	R24,R20
    00DD 7280      ANDI	R24,0x20
    00DE 3280      CPI	R24,0x20
    00DF F439      BNE	0x00E7
(0155) 			   {//err = read_MCP (EFLG);
(0156) 			    reset_MCP();
    00E0 DF6F      RCALL	_reset_MCP
(0157) 				init_can();
    00E1 DFC6      RCALL	_init_can
(0158) 				//fill_msg_box_0();
(0159) 				bit_modify(CANINTF, 0x20,0x00); //清除ERRIF标志
    00E2 2422      CLR	R2
    00E3 8228      STD	Y+0,R2
    00E4 E220      LDI	R18,0x20
    00E5 E20C      LDI	R16,0x2C
    00E6 DF9C      RCALL	_bit_modify
(0160) 				}
(0161) 	      if((i&0x01)==0x01) //RX0接收满
    00E7 2F84      MOV	R24,R20
    00E8 7081      ANDI	R24,1
    00E9 3081      CPI	R24,1
    00EA F429      BNE	0x00F0

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -