📄 can-18b20.lst
字号:
__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 + -