📄 charger.lst
字号:
01D5 0000 NOP
(0160) _nop_();
01D6 0000 NOP
(0161) _nop_();
01D7 0000 NOP
(0162) _nop_();
01D8 0000 NOP
(0163) _nop_();
01D9 0000 NOP
(0164) PORTC &= ~(1<<SCL);
01DA 9845 CBI 0x08,5
(0165) _nop_();
01DB 0000 NOP
(0166) _nop_();
01DC 0000 NOP
01DD 9508 RET
(0167) }
(0168) /*******************************************************************
(0169) 结束总线函数
(0170) 函数原型: void Stop_I2c();
(0171) 功能: 结束I2C总线,即发送I2C结束条件.
(0172)
(0173) ********************************************************************/
(0174) void Stop_I2c()
(0175) {
(0176) PORTC &= ~(1<<SDA); /*发送结束条件的数据信号*/
_Stop_I2c:
01DE 9844 CBI 0x08,4
(0177) _nop_(); /*发送结束条件的时钟信号*/
01DF 0000 NOP
(0178) PORTC |= (1<<SCL); /*结束条件建立时间大于4μs*/
01E0 9A45 SBI 0x08,5
(0179) _nop_();
01E1 0000 NOP
(0180) _nop_();
01E2 0000 NOP
(0181) _nop_();
01E3 0000 NOP
(0182) _nop_();
01E4 0000 NOP
(0183) _nop_();
01E5 0000 NOP
(0184) PORTC |= (1<<SDA); /*发送I2C总线结束信号*/
01E6 9A44 SBI 0x08,4
(0185) _nop_();
01E7 0000 NOP
(0186) _nop_();
01E8 0000 NOP
(0187) _nop_();
01E9 0000 NOP
(0188) _nop_();
01EA 0000 NOP
01EB 9508 RET
_SendByte:
BitCnt --> R20
c --> R22
01EC D5CD RCALL push_gset2
01ED 2F60 MOV R22,R16
(0189) }
(0190) /*******************************************************************
(0191) 字节数据传送函数
(0192) 函数原型: void SendByte(unsigned char c);
(0193) 功能: 将数据c发送出去,可以是地址,也可以是数据,发完后等待应答,并对
(0194) 此状态位进行操作.(不应答或非应答都使ack=0 假)
(0195) 发送数据正常,ack=1; ack=0表示被控器无应答或损坏。
(0196) ********************************************************************/
(0197) void SendByte(unsigned char c)
(0198) {
(0199) unsigned char BitCnt;
(0200) for(BitCnt=0;BitCnt<8;BitCnt++) /*要传送的数据长度为8位*/
01EE 2744 CLR R20
01EF C013 RJMP 0x0203
(0201) {
(0202) if((c<<BitCnt)&0x80){PORTC |= (1<<SDA);} /*判断发送位*/
01F0 2F06 MOV R16,R22
01F1 2F14 MOV R17,R20
01F2 D5E0 RCALL lsl8
01F3 2F80 MOV R24,R16
01F4 7880 ANDI R24,0x80
01F5 F011 BEQ 0x01F8
01F6 9A44 SBI 0x08,4
01F7 C001 RJMP 0x01F9
(0203) else {PORTC &= ~(1<<SDA);}
01F8 9844 CBI 0x08,4
(0204) _nop_();
01F9 0000 NOP
(0205) PORTC |= (1<<SCL); /*置时钟线为高,通知被控器开始接收数据位*/
01FA 9A45 SBI 0x08,5
(0206) _nop_();
01FB 0000 NOP
(0207) _nop_(); /*保证时钟高电平周期大于4μs*/
01FC 0000 NOP
(0208) _nop_();
01FD 0000 NOP
(0209) _nop_();
01FE 0000 NOP
(0210) _nop_();
01FF 0000 NOP
(0211) _nop_();
0200 0000 NOP
(0212) PORTC &= ~(1<<SCL);
0201 9845 CBI 0x08,5
0202 9543 INC R20
0203 3048 CPI R20,0x8
0204 F358 BCS 0x01F0
(0213) }
(0214)
(0215) _nop_();
0205 0000 NOP
(0216) _nop_();
0206 0000 NOP
(0217) _nop_();
0207 0000 NOP
(0218) PORTC |= (1<<SDA); /*8位发送完后释放数据线,准备接收应答位*/
0208 9A44 SBI 0x08,4
(0219) _nop_();
0209 0000 NOP
(0220) _nop_();
020A 0000 NOP
(0221) _nop_();
020B 0000 NOP
(0222) PORTC |= (1<<SCL);
020C 9A45 SBI 0x08,5
(0223) _nop_();
020D 0000 NOP
(0224) _nop_();
020E 0000 NOP
(0225) _nop_();
020F 0000 NOP
(0226) _nop_();
0210 0000 NOP
(0227) _nop_();
0211 0000 NOP
(0228) if((PINC&(1<<SDA))==1){temp &= ~(1<<ack);}
0212 B186 IN R24,0x06
0213 7180 ANDI R24,0x10
0214 3081 CPI R24,1
0215 F431 BNE 0x021C
0216 91800116 LDS R24,temp
0218 7F8E ANDI R24,0xFE
0219 93800116 STS temp,R24
021B C005 RJMP 0x0221
(0229) else {temp |= (1<<ack);} /*判断是否接收到应答信号*/
021C 91800116 LDS R24,temp
021E 6081 ORI R24,1
021F 93800116 STS temp,R24
(0230) PORTC &= ~(1<<SCL);
0221 9845 CBI 0x08,5
(0231) _nop_();
0222 0000 NOP
(0232) _nop_();
0223 0000 NOP
(0233) _nop_();
0224 0000 NOP
(0234) _nop_();
0225 0000 NOP
0226 D58B RCALL pop_gset2
0227 9508 RET
_TC1321_SET:
tem --> Y+0
i --> R20
DA_SET --> R20
0228 D593 RCALL push_gset1
0229 01A8 MOVW R20,R16
022A 9724 SBIW R28,4
(0235) }
(0236) /*******************************************************************
(0237) 向有子地址器件发送多字节数据函数
(0238) 函数原型: bit TC1321_SET(unsigned int DA_SET);
(0239) 功能: 设定TC1321的DATA寄存器,从而控制输出所设定的电压值:(DA_SET/1024)*VREF.
(0240) 注意:
(0241) ****************************14.3V时候的D/A输出值*******************************/
(0242) TC1321_SET(unsigned int DA_SET)
(0243) {
(0244) unsigned char i;
(0245) unsigned char tem[4];
(0246) temp_det();
022B D0E0 RCALL _temp_det
(0247) _nop_();
022C 0000 NOP
(0248) temp_det();
022D D0DE RCALL _temp_det
(0249) _nop_();
022E 0000 NOP
(0250) xxyy=now_temp-5;
022F 91800107 LDS R24,now_temp
0231 91900108 LDS R25,now_temp+1
0233 9705 SBIW R24,5
0234 9390011C STS xxyy+1,R25
0236 9380011B STS xxyy,R24
(0251) DA_SET=ABC[xxyy];
0238 019C MOVW R18,R24
0239 E002 LDI R16,2
023A E010 LDI R17,0
023B D566 RCALL empy16s
023C 01F8 MOVW R30,R16
023D E384 LDI R24,0x34
023E E090 LDI R25,0
023F 0FE8 ADD R30,R24
0240 1FF9 ADC R31,R25
0241 9145 LPM R20,Z+
0242 9154 LPM R21,0(Z)
(0252)
(0253) if(now_temp <6)
0243 91800107 LDS R24,now_temp
0245 91900108 LDS R25,now_temp+1
0247 3086 CPI R24,6
0248 E0E0 LDI R30,0
0249 079E CPC R25,R30
024A F414 BGE 0x024D
(0254) {
(0255) DA_SET=735;
024B ED4F LDI R20,0xDF
024C E052 LDI R21,2
(0256) }
(0257)
(0258) tem[0]=0x90;
024D E980 LDI R24,0x90
024E 8388 STD Y+0,R24
(0259) tem[1]=0x00;
024F 2422 CLR R2
0250 8229 STD Y+1,R2
(0260) tem[2]=DA_SET/4;
0251 011A MOVW R2,R20
0252 9436 LSR R3
0253 9427 ROR R2
0254 9436 LSR R3
0255 9427 ROR R2
0256 822A STD Y+2,R2
(0261) tem[3]=DA_SET%4;
0257 01CA MOVW R24,R20
0258 7083 ANDI R24,3
0259 7090 ANDI R25,0
025A 838B STD Y+3,R24
(0262) tem[3]=tem[3]<<6;
025B 2E28 MOV R2,R24
025C 0C22 LSL R2
025D 0C22 LSL R2
025E 0C22 LSL R2
025F 0C22 LSL R2
0260 0C22 LSL R2
0261 0C22 LSL R2
0262 822B STD Y+3,R2
(0263)
(0264) Start_I2c();
0263 DF68 RCALL _Start_I2c
(0265) for(i=0;i<4;i++)
0264 2744 CLR R20
0265 C00F RJMP 0x0275
(0266) {
(0267) SendByte(tem[i]);
0266 01CE MOVW R24,R28
0267 2FE4 MOV R30,R20
0268 27FF CLR R31
0269 0FE8 ADD R30,R24
026A 1FF9 ADC R31,R25
026B 8100 LDD R16,Z+0
026C DF7F RCALL _SendByte
(0268) if((temp&(1<<ack))==0)return(0);
026D 90200116 LDS R2,temp
026F FC20 SBRC R2,0
0270 C003 RJMP 0x0274
0271 2700 CLR R16
0272 2711 CLR R17
0273 C006 RJMP 0x027A
0274 9543 INC R20
0275 3044 CPI R20,4
0276 F378 BCS 0x0266
(0269) }
(0270) Stop_I2c();
0277 DF66 RCALL _Stop_I2c
(0271) return(1);
0278 E001 LDI R16,1
0279 E010 LDI R17,0
027A 9624 ADIW R28,4
027B D543 RCALL pop_gset1
027C 9508 RET
_TC1321_SET_138:
tem --> Y+0
i --> R20
DA_SET --> R20
027D D53E RCALL push_gset1
027E 01A8 MOVW R20,R16
027F 9724 SBIW R28,4
(0272) }
(0273) /**********************13.8V时候的D/A输出值 ***************************/
(0274) TC1321_SET_138(unsigned int DA_SET)
(0275) {
(0276) unsigned char i;
(0277) unsigned char tem[4];
(0278) temp_det();
0280 D08B RCALL _temp_det
(0279) _nop_();
0281 0000 NOP
(0280) temp_det();
0282 D089 RCALL _temp_det
(0281) _nop_();
0283 0000 NOP
(0282)
(0283) xxyy=now_temp+5;
0284 91800107 LDS R24,now_temp
0286 91900108 LDS R25,now_temp+1
0288 9605 ADIW R24,5
0289 9390011C STS xxyy+1,R25
028B 9380011B STS xxyy,R24
(0284) DA_SET=ABC_2[xxyy];
028D 019C MOVW R18,R24
028E E002 LDI R16,2
028F E010 LDI R17,0
0290 D511 RCALL empy16s
0291 01F8 MOVW R30,R16
0292 ED86 LDI R24,0xD6
0293 E090 LDI R25,0
0294 0FE8 ADD R30,R24
0295 1FF9 ADC R31,R25
0296 9145 LPM R20,Z+
0297 9154 LPM R21,0(Z)
(0285)
(0286) if(now_temp <-4 ) //温度小于-30°时候输出15.3V
0298 91800107 LDS R24,now_temp
029A 91900108 LDS R25,now_temp+1
029C 3F8C CPI R24,0xFC
029D EFEF LDI R30,0xFF
029E 079E CPC R25,R30
029F F414 BGE 0x02A2
(0287) {
(0288) DA_SET=752;
02A0 EF40 LDI R20,0xF0
02A1 E052 LDI R21,2
(0289) }
(0290)
(0291) tem[0]=0x90;
02A2 E980 LDI R24,0x90
02A3 8388 STD Y+0,R24
(0292) tem[1]=0x00;
02A4 2422 CLR R2
02A5 8229 STD Y+1,R2
(0293) tem[2]=DA_SET/4;
02A6 011A MOVW R2,R20
02A7 9436 LSR R3
02A8 9427 ROR R2
02A9 9436 LSR R3
02AA 9427 ROR R2
02AB 822A STD Y+2,R2
(0294) tem[3]=DA_SET%4;
02AC 01CA MOVW R24,R20
02AD 7083 ANDI R24,3
02AE 7090 ANDI R25,0
02AF 838B STD Y+3,R24
(0295) tem[3]=tem[3]<<6;
02B0 2E28 MOV R2,R24
02B1 0C22 LSL R2
02B2 0C22 LSL R2
02B3 0C22 LSL R2
02B4 0C22 LSL R2
02B5 0C22 LSL R2
02B6 0C22 LSL R2
02B7 822B STD Y+3,R2
(0296)
(0297) Start_I2c();
02B8 DF13 RCALL _Start_I2c
(0298) for(i=0;i<4;i++)
02B9 2744 CLR R20
02BA C00F RJMP 0x02CA
(0299) {
(0300) SendByte(tem[i]);
02BB 01CE MOVW R24,R28
02BC 2FE4 MOV R30,R20
02BD 27FF CLR R31
02BE 0FE8 ADD R30,R24
02BF 1FF9 ADC R31,R25
02C0 8100 LDD R16,Z+0
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -