📄 charger.lst
字号:
__text_start:
__start:
00C6 EFCF LDI R28,0xFF
00C7 E0D2 LDI R29,2
00C8 BFCD OUT 0x3D,R28
00C9 BFDE OUT 0x3E,R29
00CA 51C0 SUBI R28,0x10
00CB 40D0 SBCI R29,0
00CC EA0A LDI R16,0xAA
00CD 8308 STD Y+0,R16
00CE 2400 CLR R0
00CF E0E0 LDI R30,0
00D0 E0F1 LDI R31,1
00D1 E011 LDI R17,1
00D2 31EF CPI R30,0x1F
00D3 07F1 CPC R31,R17
00D4 F011 BEQ 0x00D7
00D5 9201 ST R0,Z+
00D6 CFFB RJMP 0x00D2
00D7 8300 STD Z+0,R16
00D8 E8EC LDI R30,0x8C
00D9 E0F1 LDI R31,1
00DA E0A0 LDI R26,0
00DB E0B1 LDI R27,1
00DC E011 LDI R17,1
00DD 38EC CPI R30,0x8C
00DE 07F1 CPC R31,R17
00DF F021 BEQ 0x00E4
00E0 95C8 LPM
00E1 9631 ADIW R30,1
00E2 920D ST R0,X+
00E3 CFF9 RJMP 0x00DD
00E4 D450 RCALL _main
_exit:
00E5 CFFF RJMP _exit
FILE: E:\MYDATA~1\DIFAMO~1\soft_Difa\test.c
(0001) //使用内部RC振荡,PB6-G,PB7-DP短路块连接
(0002) //使用INT0/INT1按键切换ADC通道
(0003) #include <iom48v.h>
(0004) #include <macros.h>
(0005) #define osccal 0x9A //内部RC校正常数
(0006) #define Vref 500 //参考电压值
(0007) #define Red PD2 //红色指示灯
(0008) #define Green PD3 //绿色指示灯
(0009) #define P0 PB1 //第0路电流控制
(0010) #define P1 PD5 //第1路电流控制
(0011) #define P2 PB7 //第2路电流控制
(0012) #define P3 PB6 //第3路电流控制
(0013) #define SDA 4
(0014) #define SCL 5
(0015) #define ack 0
(0016) #define a 1
(0017) #define LED_Indi 2
(0018) #define LED_Indi_2 7
(0019) #define LED_yes 3 //允许红灯闪烁
(0020) #define plus_charge 4 //允许进行14.4V/0.8A(1HZ)脉冲充电标志位
(0021) #define anther 5
(0022) #define Charge_Sel 6 //Charge_Sel=1 home_charger Charge_Sel=0; warmup_charger
(0023) #define _nop_() asm("nop")
(0024) //ABC[124] 针对14.3V查表 -40 ~ 84
(0025) const signed int ABC[81]={735,735,735,735,735,735,736,737,738,740,742,744,746,748,749,750,752,753,755,757,758,760,762,764,766,766,768,769,770,772,773,775,777,779,780,782,784,786,787,789,790,792,794,796,797,798,799,800,802,804,805,807,809,810,812,813,814,815,817,819,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820,820};
(0026) //ABC[124] 针对13.8V查表 005 006 007 8 9 10 11 12 13 14 15 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085
(0027) const signed int ABC_2[91]={752,753,754,756,758,760,762,764,766,767,768,770,772,774,775,776,778,780,782,783,784,786,788,790,792,793,795,797,798,799,800,802,804,806,807,808,810,812,813,814,815,817,819,821,822,823,824,826,828,829,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831,831};
(0028) //ABC[124] 针对13.8V查表 -05 -04 -03 -02 -01 000 001 002 003 004 005 006 007 008 009 010 011 012 013 014 015 016 017 018 019 020 021 022 023 024 025 026 027 028 029 030 031 032 033 034 035 036 037 038 039 040 041 042 043 044 045 046 047 048 049 050 051 052 053 054 055 056 057 058 059 060 061 062 063 064 065 066 067 068 069 070 071 072 073 074 075 076 077 078 079 080 081 082 083 084 085
(0029) unsigned int adc_old;
(0030) unsigned int xxyy;
(0031) unsigned int temp_start;
(0032) signed char temp_step;
(0033) unsigned char temp_dange;
(0034) unsigned char temp;
(0035) unsigned char cycle; //存放从第五步到第一步之间的循环次数
(0036) extern void delay_ms(unsigned int time);
(0037) unsigned int adc_rel; //AD转换结果
(0038) unsigned int Second_count_1; //秒计数1
(0039) unsigned int Second_count_2; //秒计数2
(0040) unsigned int Second_count_3; //秒计数1
(0041) unsigned int Second_count_4; //秒计数2
(0042) unsigned char adc_mux; //AD通道
(0043) unsigned char DA_result; //将需要转换的D/A数据写入其中再进行调用D/A子程序
(0044)
(0045) signed int now_temp;
(0046) signed temp_rep;
(0047) unsigned int abc;
(0048) unsigned int xyz;
(0049) //TIMER1 initialize - prescale:1024
(0050) // WGM: 0) Normal, TOP=0xFFFF
(0051) // desired value: 1Sec
(0052) // actual value: 1.000Sec (0.0%)
(0053) void timer1_init(void)
(0054) {
(0055) TCCR1B = 0x00; //stop
_timer1_init:
00E6 2422 CLR R2
00E7 92200081 STS 0x81,R2
(0056) TCNT1H = 0xE1; //setup
00E9 EE81 LDI R24,0xE1
00EA 93800085 STS 0x85,R24
(0057) TCNT1L = 0x7C;
00EC E78C LDI R24,0x7C
00ED 93800084 STS 0x84,R24
(0058) OCR1AH = 0x1E;
00EF E18E LDI R24,0x1E
00F0 93800089 STS 0x89,R24
(0059) OCR1AL = 0x84;
00F2 E884 LDI R24,0x84
00F3 93800088 STS 0x88,R24
(0060) OCR1BH = 0x1E;
00F5 E18E LDI R24,0x1E
00F6 9380008B STS 0x8B,R24
(0061) OCR1BL = 0x84;
00F8 E884 LDI R24,0x84
00F9 9380008A STS 0x8A,R24
(0062) ICR1H = 0x1E;
00FB E18E LDI R24,0x1E
00FC 93800087 STS 0x87,R24
(0063) ICR1L = 0x84;
00FE E884 LDI R24,0x84
00FF 93800086 STS 0x86,R24
(0064) TCCR1A = 0x00;
0101 92200080 STS 0x80,R2
(0065) TCCR1B = 0x05; //start Timer
0103 E085 LDI R24,5
0104 93800081 STS 0x81,R24
0106 9508 RET
(0066) }
(0067) unsigned char temp1;
(0068) #pragma interrupt_handler timer1_compa_isr:12
(0069) void timer1_compa_isr(void)
(0070) {
_timer1_compa_isr:
0107 9518 RETI
_timer1_ovf_isr:
0108 922A ST R2,-Y
0109 923A ST R3,-Y
010A 938A ST R24,-Y
010B 939A ST R25,-Y
010C 93EA ST R30,-Y
010D B62F IN R2,0x3F
010E 922A ST R2,-Y
(0071) //compare occured TCNT1=OCR1A
(0072) }
(0073)
(0074) #pragma interrupt_handler timer1_ovf_isr:14
(0075) void timer1_ovf_isr(void)
(0076) {
(0077) TCNT1H = 0xF0; //reload counter high value
010F EF80 LDI R24,0xF0
0110 93800085 STS 0x85,R24
(0078) TCNT1L = 0xBE; //reload counter low value
0112 EB8E LDI R24,0xBE
0113 93800084 STS 0x84,R24
(0079)
(0080) if((temp&(1<<plus_charge))==0x10) //为第一步脉冲充电做准备
0115 91800116 LDS R24,temp
0117 7180 ANDI R24,0x10
0118 3180 CPI R24,0x10
0119 F431 BNE 0x0120
(0081) {temp &= ~(1<<plus_charge);}
011A 91800116 LDS R24,temp
011C 7E8F ANDI R24,0xEF
011D 93800116 STS temp,R24
011F C005 RJMP 0x0125
(0082) else{temp |= (1<<plus_charge);}
0120 91800116 LDS R24,temp
0122 6180 ORI R24,0x10
0123 93800116 STS temp,R24
(0083)
(0084)
(0085) Second_count_1++;
0125 91800111 LDS R24,Second_count_1
0127 91900112 LDS R25,Second_count_1+1
0129 9601 ADIW R24,1
012A 93900112 STS Second_count_1+1,R25
012C 93800111 STS Second_count_1,R24
(0086) if(Second_count_1==120) //如果有改动,请改回原来值60
012E 3788 CPI R24,0x78
012F E0E0 LDI R30,0
0130 079E CPC R25,R30
0131 F479 BNE 0x0141
(0087) {
(0088) Second_count_2++;
0132 9180010F LDS R24,Second_count_2
0134 91900110 LDS R25,Second_count_2+1
0136 9601 ADIW R24,1
0137 93900110 STS Second_count_2+1,R25
0139 9380010F STS Second_count_2,R24
(0089) Second_count_1=0;
013B 2422 CLR R2
013C 2433 CLR R3
013D 92300112 STS Second_count_1+1,R3
013F 92200111 STS Second_count_1,R2
(0090) }
(0091)
(0092) Second_count_3++;
0141 9180010D LDS R24,Second_count_3
0143 9190010E LDS R25,Second_count_3+1
0145 9601 ADIW R24,1
0146 9390010E STS Second_count_3+1,R25
0148 9380010D STS Second_count_3,R24
(0093) if(Second_count_3==120) //如果有改动,请改回原来值60
014A 3788 CPI R24,0x78
014B E0E0 LDI R30,0
014C 079E CPC R25,R30
014D F479 BNE 0x015D
(0094) {
(0095) Second_count_4++;
014E 9180010B LDS R24,Second_count_4
0150 9190010C LDS R25,Second_count_4+1
0152 9601 ADIW R24,1
0153 9390010C STS Second_count_4+1,R25
0155 9380010B STS Second_count_4,R24
(0096) Second_count_3=0;
0157 2422 CLR R2
0158 2433 CLR R3
0159 9230010E STS Second_count_3+1,R3
015B 9220010D STS Second_count_3,R2
(0097) }
(0098)
(0099) if((temp&(1<<LED_yes))==0x08)
015D 91800116 LDS R24,temp
015F 7088 ANDI R24,0x8
0160 3088 CPI R24,0x8
0161 F4A1 BNE 0x0176
(0100) {
(0101) _nop_();
0162 0000 NOP
(0102) if((temp&(1<<LED_Indi))==0)
0163 90200116 LDS R2,temp
0165 FC22 SBRC R2,2
0166 C007 RJMP 0x016E
(0103) {PORTD &= ~(1<<Red);
0167 985A CBI 0x0B,2
(0104) PORTD &= ~(1<<Green); //绿色指示灯灭
0168 985B CBI 0x0B,3
(0105) temp |= (1<<LED_Indi);}
0169 2D82 MOV R24,R2
016A 6084 ORI R24,4
016B 93800116 STS temp,R24
016D C009 RJMP 0x0177
(0106) else
(0107) {PORTD |= (1<<Red);
016E 9A5A SBI 0x0B,2
(0108) PORTD &= ~(1<<Green); //绿色指示灯灭
016F 985B CBI 0x0B,3
(0109) temp &= ~(1<<LED_Indi);
0170 91800116 LDS R24,temp
0172 7F8B ANDI R24,0xFB
0173 93800116 STS temp,R24
(0110) };
(0111) }
0175 C001 RJMP 0x0177
(0112) else
(0113) _nop_();
0176 0000 NOP
0177 9029 LD R2,Y+
0178 BE2F OUT 0x3F,R2
0179 91E9 LD R30,Y+
017A 9199 LD R25,Y+
017B 9189 LD R24,Y+
017C 9039 LD R3,Y+
017D 9029 LD R2,Y+
017E 9518 RETI
(0114) }
(0115) //ADC初始化
(0116) void adc_init(void)
(0117) {
(0118) ADCSRA = 0x00; //设置前,先关闭ADC
_adc_init:
017F 2422 CLR R2
0180 9220007A STS 0x7A,R2
(0119) //ADMUX =(1<<REFS0); //选择内部AVCC为基准,单端输入口为ADC0
(0120) ADMUX &= ~(1<<REFS0);
0182 9180007C LDS R24,0x7C
0184 7B8F ANDI R24,0xBF
0185 9380007C STS 0x7C,R24
(0121) ADMUX &= ~(1<<REFS1);
0187 9180007C LDS R24,0x7C
0189 778F ANDI R24,0x7F
018A 9380007C STS 0x7C,R24
(0122) ACSR =(1<<ACD); //关闭模拟比较器,禁止位P148
018C E880 LDI R24,0x80
018D BF80 OUT 0x30,R24
(0123) //ADCSRA=(1<<ADEN)|(1<<ADSC)|(1<<ADIE)|(1<<ADPS2)|(1<<ADPS1) ;//ADC时钟64分频
(0124) ADCSRA |= (1<<ADEN);
018E 9180007A LDS R24,0x7A
0190 6880 ORI R24,0x80
0191 9380007A STS 0x7A,R24
(0125) ADCSRA |= (1<<ADIE);
0193 9180007A LDS R24,0x7A
0195 6088 ORI R24,0x8
0196 9380007A STS 0x7A,R24
(0126) ADCSRA |= (1<<ADPS2);
0198 9180007A LDS R24,0x7A
019A 6084 ORI R24,4
019B 9380007A STS 0x7A,R24
(0127) ADCSRA |= (1<<ADPS1);
019D 9180007A LDS R24,0x7A
019F 6082 ORI R24,2
01A0 9380007A STS 0x7A,R24
(0128) ADCSRA |= (1<<ADSC);
01A2 9180007A LDS R24,0x7A
01A4 6480 ORI R24,0x40
01A5 9380007A STS 0x7A,R24
01A7 9508 RET
_adc_isr:
01A8 922A ST R2,-Y
01A9 938A ST R24,-Y
01AA 939A ST R25,-Y
01AB B62F IN R2,0x3F
01AC 922A ST R2,-Y
(0129) }
(0130) //ADC完成中断
(0131) #pragma interrupt_handler adc_isr:22
(0132) void adc_isr(void)
(0133) {
(0134) adc_rel=ADC&0x3ff;
01AD 91800078 LDS R24,0x78
01AF 91900079 LDS R25,0x79
01B1 7093 ANDI R25,3
01B2 93900114 STS adc_rel+1,R25
01B4 93800113 STS adc_rel,R24
(0135) //ADMUX=(1<<REFS0)|(adc_mux&0x0f);//选择内部AVCC为基准
(0136) //ADMUX=ADMUX |(adc_mux&0x0f);
(0137) //ADMUX |=(adc_mux&0x0f);
(0138) ADMUX=0;
01B6 2422 CLR R2
01B7 9220007C STS 0x7C,R2
(0139) ADMUX |=(adc_mux&0x0f);
01B9 9180010A LDS R24,adc_mux
01BB 708F ANDI R24,0xF
01BC 9020007C LDS R2,0x7C
01BE 2A28 OR R2,R24
01BF 9220007C STS 0x7C,R2
(0140) ADCSRA|=(1<<ADSC); //启动AD转换
01C1 9180007A LDS R24,0x7A
01C3 6480 ORI R24,0x40
01C4 9380007A STS 0x7A,R24
01C6 9029 LD R2,Y+
01C7 BE2F OUT 0x3F,R2
01C8 9199 LD R25,Y+
01C9 9189 LD R24,Y+
01CA 9029 LD R2,Y+
01CB 9518 RETI
(0141) }
(0142) /*******************************************************************
(0143) 起动总线函数
(0144) 函数原型: void Start_I2c();
(0145) 功能: 启动I2C总线,即发送I2C起始条件.
(0146)
(0147) ********************************************************************/
(0148) void Start_I2c()
(0149) {
(0150) PORTC |= (1<<SDA);
_Start_I2c:
01CC 9A44 SBI 0x08,4
(0151) _nop_();
01CD 0000 NOP
(0152) PORTC |= (1<<SCL);
01CE 9A45 SBI 0x08,5
(0153) _nop_();
01CF 0000 NOP
(0154) _nop_();
01D0 0000 NOP
(0155) _nop_();
01D1 0000 NOP
(0156) _nop_();
01D2 0000 NOP
(0157) _nop_();
01D3 0000 NOP
(0158) PORTC &= ~(1<<SDA);
01D4 9844 CBI 0x08,4
(0159) _nop_();
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -