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 + -
显示快捷键?