📄 can-18b20.lst
字号:
(0162) {//str[0] = read_MCP (0x61);
(0163) //str[1] = read_MCP (0x62);
(0164) //str[2] = read_MCP (0x65);
(0165) //str[3] = read_MCP (0x66);
(0166) bit_modify(CANINTF, 0x01,0x00); //清除RX0IF标志
00EB 2422 CLR R2
00EC 8228 STD Y+0,R2
00ED E021 LDI R18,1
00EE E20C LDI R16,0x2C
00EF DF93 RCALL _bit_modify
(0167)
(0168) }
00F0 9621 ADIW R28,1
00F1 D27E RCALL pop_gset1
00F2 D2A8 RCALL pop_lset
00F3 9518 RETI
_crccheck:
j --> R20
r --> R14
cbit --> Y+0
bit0 --> R8
byte --> R10
i --> R12
temp --> R22
len --> R6
p --> R4
00F4 D270 RCALL push_gset5
00F5 2E62 MOV R6,R18
00F6 0128 MOVW R4,R16
00F7 9721 SBIW R28,1
(0169)
(0170) }
(0171)
(0172) /*===================================================================
(0173) // 函数功能: DS18B20数据校验函数
(0174) // 形参: void
(0175) // 返回: unsigned char 校验结果
(0176) // 编写: 2004/8/25
(0177) // 备注: CRC公式为:CRC = X^8 + X^5 + X^4 + 1
(0178) ===================================================================*/
(0179) unsigned char crccheck(unsigned char *p,unsigned char len)
(0180) {
(0181) unsigned char bit0,cbit,r,temp,i,j,byte;
(0182) temp = 0;
00F8 2766 CLR R22
(0183) for(j = 0; j < len; j++)
00F9 2744 CLR R20
00FA C020 RJMP 0x011B
(0184) {
(0185) byte = p[j];
00FB 2FE4 MOV R30,R20
00FC 27FF CLR R31
00FD 0DE4 ADD R30,R4
00FE 1DF5 ADC R31,R5
00FF 80A0 LDD R10,Z+0
(0186) for(i = 0; i < 8; i++)
0100 24CC CLR R12
0101 C015 RJMP 0x0117
(0187) {
(0188) cbit = temp & 0x01;
0102 2F86 MOV R24,R22
0103 7081 ANDI R24,1
0104 8388 STD Y+0,R24
(0189) bit0 = byte&0x01;
0105 2D8A MOV R24,R10
0106 7081 ANDI R24,1
0107 2E88 MOV R8,R24
(0190) temp >>= 1;
0108 9566 LSR R22
(0191) r = cbit ^ bit0;
0109 80E8 LDD R14,Y+0
010A 26E8 EOR R14,R24
(0192) if(r == 1)
010B 2D8E MOV R24,R14
010C 3081 CPI R24,1
010D F439 BNE 0x0115
(0193) temp ^= 0x8c;
010E E88C LDI R24,0x8C
010F E090 LDI R25,0
0110 2E26 MOV R2,R22
0111 2433 CLR R3
0112 2628 EOR R2,R24
0113 2639 EOR R3,R25
0114 2D62 MOV R22,R2
(0194) byte >>= 1;
0115 94A6 LSR R10
0116 94C3 INC R12
0117 2D8C MOV R24,R12
0118 3088 CPI R24,0x8
0119 F340 BCS 0x0102
011A 9543 INC R20
011B 1546 CP R20,R6
011C F2F0 BCS 0x00FB
(0195) }
(0196) }
(0197) return temp;
011D 2F06 MOV R16,R22
011E 9621 ADIW R28,1
011F D243 RCALL pop_gset5
0120 9508 RET
(0198) }
(0199)
(0200) /*===================================================================
(0201) // 函数功能: us延时函数
(0202) // 形参: void
(0203) // 返回: void
(0204) // 编写: 2004/8/25
(0205) ===================================================================*/
(0206) void delay_us(unsigned int time)
(0207) {
(0208) do
(0209) { //delay_1us();
(0210) time--;
_delay_us:
time --> R16
0121 5001 SUBI R16,1
0122 4010 SBCI R17,0
(0211) }
(0212) while (time>1);
0123 E081 LDI R24,1
0124 E090 LDI R25,0
0125 1780 CP R24,R16
0126 0791 CPC R25,R17
0127 F3C8 BCS 0x0121
0128 9508 RET
_ds1820_ack:
ack --> R20
0129 D243 RCALL push_gset1
(0213) }
(0214)
(0215) /*===================================================================
(0216) // 函数功能: 判断总线应答
(0217) // 形参: void
(0218) // 返回: unsigned char true为应答
(0219) // 编写: 2004/8/25
(0220) ===================================================================*/
(0221) unsigned char ds1820_ack(void)
(0222) {
(0223) unsigned char ack;
(0224) DDRC |= DQ;
012A 9AA5 SBI 0x14,5
(0225) PORTC &= ~DQ;
012B 98AD CBI 0x15,5
(0226) delay_us(450); // reset
012C EC02 LDI R16,0xC2
012D E011 LDI R17,1
012E DFF2 RCALL _delay_us
(0227) PORTC |= DQ;
012F 9AAD SBI 0x15,5
(0228) DDRC &= ~DQ;
0130 98A5 CBI 0x14,5
(0229) delay_us(45);
0131 E20D LDI R16,0x2D
0132 E010 LDI R17,0
0133 DFED RCALL _delay_us
(0230) ack = DQ & PIND;
0134 B340 IN R20,0x10
0135 7240 ANDI R20,0x20
(0231) delay_us(450); // host receive
0136 EC02 LDI R16,0xC2
0137 E011 LDI R17,1
0138 DFE8 RCALL _delay_us
(0232) if(ack)
0139 2344 TST R20
013A F011 BEQ 0x013D
(0233) return 1;
013B E001 LDI R16,1
013C C001 RJMP 0x013E
(0234) else
(0235) return 0;
013D 2700 CLR R16
013E D231 RCALL pop_gset1
013F 9508 RET
_read_byte:
value --> R20
i --> R22
0140 D22A RCALL push_gset2
(0236) }
(0237)
(0238) /*===================================================================
(0239) // 函数功能: 从 1-wire 总线上读取一个字节
(0240) // 形参: void
(0241) // 返回: unsigned char 读到的值
(0242) // 编写: 2004/8/25
(0243) ===================================================================*/
(0244) unsigned char read_byte(void)
(0245) {
(0246) unsigned char i;
(0247) unsigned char value = 0;
0141 2744 CLR R20
(0248) for(i = 8; i > 0; i--)
0142 E068 LDI R22,0x8
0143 C016 RJMP 0x015A
(0249) {
(0250) value >>= 1; // low bit first
0144 9546 LSR R20
(0251) DDRC |= DQ;
0145 9AA5 SBI 0x14,5
(0252) PORTC &= ~DQ; // pull DQ low to start timeslot
0146 98AD CBI 0x15,5
(0253) delay_us(3);
0147 E003 LDI R16,3
0148 E010 LDI R17,0
0149 DFD7 RCALL _delay_us
(0254) PORTC |= DQ;
014A 9AAD SBI 0x15,5
(0255) DDRC &= ~DQ; // release bus
014B 98A5 CBI 0x14,5
(0256) delay_us(10);
014C E00A LDI R16,0xA
014D E010 LDI R17,0
014E DFD2 RCALL _delay_us
(0257) if(DQ & PINC)
014F 9B9D SBIS 0x13,5
0150 C001 RJMP 0x0152
(0258) value|=0x80;
0151 6840 ORI R20,0x80
(0259) delay_us(100);
0152 E604 LDI R16,0x64
0153 E010 LDI R17,0
0154 DFCC RCALL _delay_us
(0260) DDRC |= DQ;
0155 9AA5 SBI 0x14,5
(0261) delay_us(5); // time interval
0156 E005 LDI R16,5
0157 E010 LDI R17,0
0158 DFC8 RCALL _delay_us
0159 956A DEC R22
015A 2422 CLR R2
015B 1626 CP R2,R22
015C F338 BCS 0x0144
(0262) }
(0263) return(value);
015D 2F04 MOV R16,R20
015E D202 RCALL pop_gset2
015F 9508 RET
_write_byte:
i --> R20
value --> R22
0160 D20A RCALL push_gset2
0161 2F60 MOV R22,R16
(0264) }
(0265)
(0266) /*===================================================================
(0267) // 函数功能: 向 1-WIRE 总线上写一个字节
(0268) // 形参: value 写到总线上的值
(0269) // 返回: void
(0270) // 编写: 2004/8/25
(0271) ===================================================================*/
(0272) void write_byte(unsigned char value)
(0273) {
(0274) unsigned char i;
(0275) DDRC |= DQ;
0162 9AA5 SBI 0x14,5
(0276) for(i = 8; i > 0; i--)
0163 E048 LDI R20,0x8
0164 C015 RJMP 0x017A
(0277) {
(0278) if(value & 0x01)
0165 FF60 SBRS R22,0
0166 C009 RJMP 0x0170
(0279) {
(0280) PORTC &= ~DQ; // pull DQ low to start timeslot
0167 98AD CBI 0x15,5
(0281) delay_us(10);
0168 E00A LDI R16,0xA
0169 E010 LDI R17,0
016A DFB6 RCALL _delay_us
(0282) PORTC |= DQ;
016B 9AAD SBI 0x15,5
(0283) delay_us(100);
016C E604 LDI R16,0x64
016D E010 LDI R17,0
016E DFB2 RCALL _delay_us
(0284) }
016F C008 RJMP 0x0178
(0285) else
(0286) {
(0287) PORTC &= ~DQ; // pull DQ low to start timeslot
0170 98AD CBI 0x15,5
(0288) delay_us(100);
0171 E604 LDI R16,0x64
0172 E010 LDI R17,0
0173 DFAD RCALL _delay_us
(0289) PORTC |= DQ;
0174 9AAD SBI 0x15,5
(0290) delay_us(10);
0175 E00A LDI R16,0xA
0176 E010 LDI R17,0
0177 DFA9 RCALL _delay_us
(0291) }
(0292) value >>= 1;
0178 9566 LSR R22
0179 954A DEC R20
017A 2422 CLR R2
017B 1624 CP R2,R20
017C F340 BCS 0x0165
017D D1E3 RCALL pop_gset2
017E 9508 RET
_wait:
i --> R20
n --> R22
017F D1EB RCALL push_gset2
0180 01B8 MOVW R22,R16
(0293) }
(0294) }
(0295)
(0296) /*===================================================================
(0297) // 函数功能: 读取温度
(0298) // 形参: *temperature 温度存储空间
(0299) // 返回: unsigned char true为有效
(0300) // 编写: 2004/8/25
(0301) ===================================================================*/
(0302) /*unsigned char Read_Temperature(unsigned int *temperature)
(0303) {
(0304) unsigned char i;
(0305) union{
(0306) unsigned char c[2];
(0307) unsigned int x;
(0308) }temp;
(0309) unsigned char temporary[9];
(0310)
(0311) while(!ds1820_ack());
(0312) write_byte(0xCC); // Skip ROM
(0313) write_byte(0x44); // Start Conversion
(0314) //for(i = 0; i < 16; i++)
(0315) //delay_us(50000);
(0316) delay(20);
(0317) while(!ds1820_ack());
(0318) write_byte(0xCC); // Skip ROM
(0319) write_byte(0xBE); // Read Scratch Pad
(0320) for(i = 0; i < 9; i++)
(0321) temporary[i] = read_byte();
(0322) temp.c[0] = temporary[0];
(0323) temp.c[1] = temporary[1];
(0324)
(0325) if(crccheck(temporary,9))
(0326) return 0;
(0327) else
(0328) {
(0329) *temperature = temp.x;
(0330) return 1;
(0331) }
(0332) }
(0333) */
(0334) /*===================================================================
(0335) // 函数功能: 读取Rom Code
(0336) // 形参: *temp DS18B20的Rom Code存储空间
(0337) // 返回: unsigned char true为有效
(0338) // 编写: 2004/8/25
(0339) ===================================================================*/
(0340) /*unsigned char Read_RomCode(unsigned char *temp)
(0341) {
(0342) ds1820_ack();
(0343) write_byte(0x33);
(0344) temp[0] = read_byte();
(0345) temp[1] = read_byte();
(0346) temp[2] = read_byte();
(0347) temp[3] = read_byte();
(0348) temp[4] = read_byte();
(0349) temp[5] = read_byte();
(0350) temp[6] = read_byte();
(0351) temp[7] = read_byte();
(0352) if(crccheck(temp,8))
(0353) return 0;
(0354) else
(0355) return 1;
(0356) }
(0357) */
(0358) /*===================================================================
(0359) // 函数功能: 匹配DS18B20
(0360) // 形参: *p DS18B20的Rom Code
(0361) // 返回: void
(0362) // 编写: 2004/8/25
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -