can18b20.lis
来自「基于CAN总线的 温度采集方法。选用DS18B20温度传感器。」· LIS 代码 · 共 1,548 行 · 第 1/5 页
LIS
1,548 行
0076 .dbline 101
0076 ; }
0076 ; /*位修改*/
0076 ; void bit_modify(unsigned char adress,unsigned char cc, unsigned char value)
0076 ; { PORTB&=~(1<<CS_CAN); // CS Low -> MCP enable
0076 .dbline 101
0076 C298 cbi 0x18,2
0078 .dbline 103
0078 ;
0078 ; SPDR=0x05; // bit modify Write Kommando
0078 85E0 ldi R24,5
007A 8FB9 out 0xf,R24
007C L31:
007C .dbline 104
007C L32:
007C .dbline 104
007C ; while(!(SPSR & (1<<SPIF))); // warten bis das Byte gesendet wurde
007C 779B sbis 0xe,7
007E FECF rjmp L31
0080 .dbline 105
0080 ; SPDR=adress; // sende Write Kommando
0080 0FB9 out 0xf,R16
0082 L34:
0082 .dbline 106
0082 L35:
0082 .dbline 106
0082 ; while(!(SPSR & (1<<SPIF))); // warten bis das Byte gesendet wurde
0082 779B sbis 0xe,7
0084 FECF rjmp L34
0086 .dbline 107
0086 ; SPDR=cc; // sende Write Kommando
0086 2FB9 out 0xf,R18
0088 L37:
0088 .dbline 108
0088 L38:
0088 .dbline 108
0088 ; while(!(SPSR & (1<<SPIF))); // warten bis das Byte gesendet wurde
0088 779B sbis 0xe,7
008A FECF rjmp L37
008C .dbline 109
008C ; SPDR=value; // sende Write Kommando
008C 4FB9 out 0xf,R20
008E L40:
008E .dbline 110
008E L41:
008E .dbline 110
008E ; while(!(SPSR & (1<<SPIF))); // warten bis das Byte gesendet wurde
008E 779B sbis 0xe,7
0090 FECF rjmp L40
0092 .dbline 112
0092 ;
0092 ; PORTB|=(1<<CS_CAN); // CS High -> MCP disable
0092 C29A sbi 0x18,2
0094 .dbline -2
0094 L30:
0094 00D0 rcall pop_gset1
0096 .dbline 0 ; func end
0096 0895 ret
0098 .dbsym r value 20 c
0098 .dbsym r cc 18 c
0098 .dbsym r adress 16 c
0098 .dbend
0098 .dbfunc e fill_msg_box_0 _fill_msg_box_0 fV
.even
0098 _fill_msg_box_0::
0098 .dbline -1
0098 .dbline 116
0098 ; }
0098 ; /*填充CAN信息*/
0098 ; void fill_msg_box_0(void)
0098 ; {
0098 .dbline 117
0098 ; write_MCP(TXB0SIDH, (unsigned char) (0x261 >> 3)); // ID = 0x26a
0098 2CE4 ldi R18,76
009A 01E3 ldi R16,49
009C CBDF rcall _write_MCP
009E .dbline 118
009E ; write_MCP(TXB0SIDL, (unsigned char) (0x261 << 5)); ////需要修改
009E 20E2 ldi R18,32
00A0 02E3 ldi R16,50
00A2 C8DF rcall _write_MCP
00A4 .dbline 119
00A4 ; write_MCP (TXB0DLC, 0x02); // 1 Bytes
00A4 22E0 ldi R18,2
00A6 05E3 ldi R16,53
00A8 C5DF rcall _write_MCP
00AA .dbline 120
00AA ; write_MCP (TXB0D0, wendu);
00AA 20910400 lds R18,_wendu
00AE 06E3 ldi R16,54
00B0 C1DF rcall _write_MCP
00B2 .dbline 121
00B2 ; write_MCP (TXB0D1, dot1);
00B2 20910100 lds R18,_dot1
00B6 07E3 ldi R16,55
00B8 BDDF rcall _write_MCP
00BA .dbline -2
00BA L43:
00BA .dbline 0 ; func end
00BA 0895 ret
00BC .dbend
00BC .dbfunc e init_can _init_can fV
.even
00BC _init_can::
00BC .dbline -1
00BC .dbline 126
00BC ;
00BC ; }
00BC ; /*CAN初始化*/
00BC ; void init_can(void)
00BC ; { write_MCP (CANCTRL, 0x80); //0x80, set mode
00BC .dbline 126
00BC 20E8 ldi R18,128
00BE 0FE0 ldi R16,15
00C0 B9DF rcall _write_MCP
00C2 .dbline 128
00C2 ; //TX
00C2 ; write_MCP (CNF1, 0x03); // Set CAN-Baudrate 125 kBaud
00C2 23E0 ldi R18,3
00C4 0AE2 ldi R16,42
00C6 B6DF rcall _write_MCP
00C8 .dbline 129
00C8 ; write_MCP (CNF2, 0xB8); // 16MHz
00C8 28EB ldi R18,184
00CA 09E2 ldi R16,41
00CC B3DF rcall _write_MCP
00CE .dbline 130
00CE ; write_MCP (CNF3, 0x05); // des MCP2510 bzw. MCP2515
00CE 25E0 ldi R18,5
00D0 08E2 ldi R16,40
00D2 B0DF rcall _write_MCP
00D4 .dbline 133
00D4 ;
00D4 ; //RX
00D4 ; write_MCP (RXB0CTRL, 0x20); // receive stand message
00D4 20E2 ldi R18,32
00D6 00E6 ldi R16,96
00D8 ADDF rcall _write_MCP
00DA .dbline 134
00DA ; write_MCP (RXM0SIDH, 0xFF); // 屏蔽寄存器高8位,11位都要校验
00DA 2FEF ldi R18,255
00DC 00E2 ldi R16,32
00DE AADF rcall _write_MCP
00E0 .dbline 135
00E0 ; write_MCP (RXM0SIDL, 0xE0); // 屏蔽寄存器低3位
00E0 20EE ldi R18,224
00E2 01E2 ldi R16,33
00E4 A7DF rcall _write_MCP
00E6 .dbline 136
00E6 ; write_MCP (RXF0SIDH, 0x4C); //接收报文ID为:0x260的报文(上位机 cansap)
00E6 2CE4 ldi R18,76
00E8 0027 clr R16
00EA A4DF rcall _write_MCP
00EC .dbline 137
00EC ; write_MCP (RXF0SIDL, 0x00);
00EC 2227 clr R18
00EE 01E0 ldi R16,1
00F0 A1DF rcall _write_MCP
00F2 .dbline 139
00F2 ;
00F2 ; write_MCP (CANINTE, 0x25); //enable interrupt
00F2 25E2 ldi R18,37
00F4 0BE2 ldi R16,43
00F6 9EDF rcall _write_MCP
00F8 .dbline 140
00F8 ; write_MCP (CANCTRL, 0x00); // Set CLK-Out disable,0x80 set mode,0x40 shou fa ,0x00 normal mode,
00F8 2227 clr R18
00FA 0FE0 ldi R16,15
00FC 9BDF rcall _write_MCP
00FE .dbline 141
00FE ; asm("nop");
00FE 0000 nop
0100 .dbline -2
0100 L44:
0100 .dbline 0 ; func end
0100 0895 ret
0102 .dbend
.area vector(rom, abs)
.org 2
0002 81C0 rjmp _int0_isr
.area text(rom, con, rel)
0102 .dbfile F:\can-18b20(无浮点再调试)\can18b20.c
0102 .dbfunc e int0_isr _int0_isr fV
0102 ; err -> <dead>
0102 ; i -> R20
.even
0102 _int0_isr::
0102 00D0 rcall push_lset
0104 00D0 rcall push_gset1
0106 2197 sbiw R28,1
0108 .dbline -1
0108 .dbline 146
0108 ; }
0108 ; /*CAN中断*/
0108 ; #pragma interrupt_handler int0_isr:2
0108 ; void int0_isr(void)
0108 ; { unsigned char i,err;
0108 .dbline 148
0108 ; //unsigned int canid;
0108 ; i = read_MCP (CANINTF);
0108 0CE2 ldi R16,44
010A A1DF rcall _read_MCP
010C 402F mov R20,R16
010E .dbline 149
010E ; if((i&0x04)==0x04) //TX0 空
010E 842F mov R24,R20
0110 8470 andi R24,4
0112 8430 cpi R24,4
0114 39F4 brne L46
0116 .dbline 150
0116 ; { minus_flag=0; //负温度标志清0
0116 .dbline 150
0116 2224 clr R2
0118 20920000 sts _minus_flag,R2
011C .dbline 152
011C ;
011C ; bit_modify(CANINTF, 0x04,0x00); //清除TX0IF标志
011C 2882 std y+0,R2
011E 24E0 ldi R18,4
0120 0CE2 ldi R16,44
0122 A7DF rcall _bit_modify
0124 .dbline 153
0124 ; }
0124 L46:
0124 .dbline 154
0124 ; if((i&0x20)==0x20) // 出错
0124 842F mov R24,R20
0126 8072 andi R24,32
0128 8032 cpi R24,32
012A 39F4 brne L48
012C .dbline 155
012C ; {//err = read_MCP (EFLG);
012C .dbline 156
012C ; reset_MCP();
012C 6FDF rcall _reset_MCP
012E .dbline 157
012E ; init_can();
012E C6DF rcall _init_can
0130 .dbline 159
0130 ; //fill_msg_box_0();
0130 ; bit_modify(CANINTF, 0x20,0x00); //清除ERRIF标志
0130 2224 clr R2
0132 2882 std y+0,R2
0134 20E2 ldi R18,32
0136 0CE2 ldi R16,44
0138 9CDF rcall _bit_modify
013A .dbline 160
013A ; }
013A L48:
013A .dbline 161
013A 842F mov R24,R20
013C 8170 andi R24,1
013E 8130 cpi R24,1
0140 29F4 brne L50
0142 .dbline 162
0142 .dbline 166
0142 2224 clr R2
0144 2882 std y+0,R2
0146 21E0 ldi R18,1
0148 0CE2 ldi R16,44
014A 93DF rcall _bit_modify
014C .dbline 168
014C L50:
014C .dbline -2
014C L45:
014C 2196 adiw R28,1
014E 00D0 rcall pop_gset1
0150 00D0 rcall pop_lset
0152 .dbline 0 ; func end
0152 1895 reti
0154 .dbsym l err 2 c
0154 .dbsym r i 20 c
0154 .dbend
0154 .dbfunc e crccheck _crccheck fc
0154 ; j -> R20
0154 ; r -> R14
0154 ; cbit -> y+0
0154 ; bit0 -> R8
0154 ; byte -> R10
0154 ; i -> R12
0154 ; temp -> R22
0154 ; len -> R6
0154 ; p -> R4,R5
.even
0154 _crccheck::
0154 00D0 rcall push_gset5
0156 622E mov R6,R18
0158 2801 movw R4,R16
015A 2197 sbiw R28,1
015C .dbline -1
015C .dbline 180
015C ; if((i&0x01)==0x01) //RX0接收满
015C ; {//str[0] = read_MCP (0x61);
015C ; //str[1] = read_MCP (0x62);
015C ; //str[2] = read_MCP (0x65);
015C ; //str[3] = read_MCP (0x66);
015C ; bit_modify(CANINTF, 0x01,0x00); //清除RX0IF标志
015C ;
015C ; }
015C ;
015C ; }
015C ;
015C ; /*===================================================================
015C ; // 函数功能: DS18B20数据校验函数
015C ; // 形参: void
015C ; // 返回: unsigned char 校验结果
015C ; // 编写: 2004/8/25
015C ; // 备注: CRC公式为:CRC = X^8 + X^5 + X^4 + 1
015C ; ===================================================================*/
015C ; unsigned char crccheck(unsigned char *p,unsigned char len)
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?