⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 charger.lst

📁 a good program for battery charge,only for reference
💻 LST
📖 第 1 页 / 共 5 页
字号:
__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 + -