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

📄 main.s

📁 一个6缸发动机的ECU控制程序
💻 S
📖 第 1 页 / 共 3 页
字号:
; 	  if((PPump1Num>0)||(Pump1Num==0))
; 	  { 
; 	    PORTB |= (1 << PB4); //开启油泵1
; 		if (Pump1Num>0)
; 		PPump1Num--;
; 	    OCR0B = TCNT0 + CPump1On;//定时油泵关闭
; 	    Pump1Flag = 0;
; 	    On1H = CPump1OnH;
; 	  }
; 	  
; 	}
; 	else                        //动作应该为关闭油泵1
; 	  Cyc1H--;
;    }
; 	  
;  else
;    {
; 	  if(On1H == 0)
;      {
; 	  PORTB &= ~(1 << PB4); //关闭油泵1
; 	  OCR0B = TCNT0 + CPump1Cyc - CPump1On;
; 	  Pump1Flag = 1;
; 	  Cyc1H = CPump1CycH - CPump1OnH;
; 	 }
; 	 else                        //动作应该为关闭油泵1
; 	  On1H--;
;     }
;  }
; */
; /*#pragma interrupt_handler timer0_compa_isr:iv_TIM0_COMPB
; void timer0_compa_isr(void)
; {
;  //compare TCNT0=OCR0B
;     if(Pump2Flag == 1)           //动作应该为开启油泵2
; 	{
; 	 if(Cyc2H== 0)
; 	{ 
; 	if((PPump2Num>0)||(Pump2Num==0))
; 	  { 
; 	  PORTD |= (1 << PD4);   //开启油泵2      
; 	 if(Pump2Num>0)        
; 	 PPump2Num--;
; 	  //定时油泵关闭
; 	  OCR0A = TCNT0 + CPump2On;
; 	  Pump2Flag = 0;
; 	   On2H = CPump2OnH;
; 	  }
; 	}
; 	 else                        
; 	  Cyc2H--;
;     }
; 
; 	else                        //动作应该为关闭油泵
; 	{
; 	  if(On2H == 0)
;      {
; 	  PORTD &= ~(1 << PD4);//关闭油泵
;       //OCR0A = TCNT0 + 100; 
; 	  OCR0A = TCNT0 + CPump2Cyc - CPump2On; 
; 	  Pump2Flag = 1;
; 	  Cyc2H = CPump2CycH - CPump2OnH; 
; 	 }
; 	 else                      
; 	  On2H--;
;     }
;  }*/
; 
; #pragma interrupt_handler timer1_compa_isr:iv_TIM1_COMPA
; void timer1_compa_isr(void)
; {
	.dbline 117
;  //compare occured TCNT1=OCR1A
;  switch(ActFlag1)
	lds R16,_ActFlag1
	clr R17
	cpi R16,0
	cpc R16,R17
	breq L58
X23:
	cpi R16,1
	ldi R30,0
	cpc R17,R30
	brne X30
	rjmp L68
X30:
X24:
	rjmp L56
L58:
	.dbline 120
;  {
;    case 0:
;      {
	.dbline 121
; 	 if(HighByte1 == 0)	
	lds R2,_HighByte1
	tst R2
	breq X31
	rjmp L59
X31:
X25:
	.dbline 122
; 	  {
	.dbline 123
; 	   if((SSpray1Num>0)||(Spray1Num==0))
	ldi R24,0
	ldi R25,0
	ldi R26,0
	ldi R27,0
	lds R4,_SSpray1Num+2
	lds R5,_SSpray1Num+2+1
	lds R2,_SSpray1Num
	lds R3,_SSpray1Num+1
	cp R2,R24
	cpc R3,R25
	cpc R4,R26
	cpc R5,R27
	brne L63
X26:
	ldi R24,0
	ldi R25,0
	ldi R26,0
	ldi R27,0
	lds R4,_Spray1Num+2
	lds R5,_Spray1Num+2+1
	lds R2,_Spray1Num
	lds R3,_Spray1Num+1
	cp R2,R24
	cpc R3,R25
	cpc R4,R26
	cpc R5,R27
	breq X32
	rjmp L56
X32:
X27:
L63:
	.dbline 126
; 	     //喷油器控制引脚置高
; 		 //Spray1Num--;
; 		{ 
	.dbline 127
; 		  PORTB = PORTB |(1<<PB2);
	sbi 0x5,2
	.dbline 128
; 		  PORTB = PORTB |(1<<PB3);
	sbi 0x5,3
	.dbline 129
; 		  PORTB = PORTB |(1<<PB4);
	sbi 0x5,4
	.dbline 130
; 		  PORTB = PORTB |(1<<PB1);
	sbi 0x5,1
	.dbline 131
; 		  PORTD = PORTD |(1<<PD4);
	sbi 0xb,4
	.dbline 132
; 		  PORTD = PORTD |(1<<PD5);
	sbi 0xb,5
	.dbline 134
; 	
; 		 OCR1A = TCNT1 + CSpray1On;    //喷油器关定时
	lds R2,_CSpray1On
	lds R3,_CSpray1On+1
	lds R4,132
	lds R5,132+1
	add R4,R2
	adc R5,R3
	sts 136+1,R5
	sts 136,R4
	.dbline 135
; 		 if (Spray1Num>0)
	ldi R24,0
	ldi R25,0
	ldi R26,0
	ldi R27,0
	lds R4,_Spray1Num+2
	lds R5,_Spray1Num+2+1
	lds R2,_Spray1Num
	lds R3,_Spray1Num+1
	cp R2,R24
	cpc R3,R25
	cpc R4,R26
	cpc R5,R27
	breq L64
X28:
	.dbline 136
; 		 SSpray1Num--;
	ldi R24,1
	ldi R25,0
	ldi R26,0
	ldi R27,0
	lds R4,_SSpray1Num+2
	lds R5,_SSpray1Num+2+1
	lds R2,_SSpray1Num
	lds R3,_SSpray1Num+1
	sub R2,R24
	sbc R3,R25
	sbc R4,R26
	sbc R5,R27
	sts _SSpray1Num+1,R3
	sts _SSpray1Num,R2
	sts _SSpray1Num+2+1,R5
	sts _SSpray1Num+2,R4
L64:
	.dbline 137
; 		 if(Spray1Num <= 0)
	ldi R24,0
	ldi R25,0
	ldi R26,0
	ldi R27,0
	lds R4,_Spray1Num+2
	lds R5,_Spray1Num+2+1
	lds R2,_Spray1Num
	lds R3,_Spray1Num+1
	cp R2,R24
	cpc R3,R25
	cpc R4,R26
	cpc R5,R27
	brne L66
X29:
	.dbline 138
; 	       Spray1Num = 0;
	ldi R24,0
	ldi R25,0
	ldi R26,0
	ldi R27,0
	sts _Spray1Num+1,R25
	sts _Spray1Num,R24
	sts _Spray1Num+2+1,R27
	sts _Spray1Num+2,R26
L66:
	.dbline 140
; 	   //T1COMPA = OCR1A;
; 	     ActFlag1 = 1;   //转换到下一动作
	ldi R24,1
	sts _ActFlag1,R24
	.dbline 141
; 		}
	.dbline 142
; 	  }
	rjmp L56
L59:
	.dbline 144
; 	 else
; 	   {
	.dbline 145
; 	     HighByte1 --;
	lds R24,_HighByte1
	subi R24,1
	sts _HighByte1,R24
	.dbline 146
; 	     ActFlag1= 0;   //转换到下一动作
	clr R2
	sts _ActFlag1,R2
	.dbline 147
; 	   }
	.dbline 148
;        break;
	rjmp L56
L68:
	.dbline 151
; 	 }
;    case 1:
;      {
	.dbline 153
; 	      
; 		  PORTB = PORTB &~(1<<PB2);
	cbi 0x5,2
	.dbline 154
; 		  PORTB = PORTB &~(1<<PB3);
	cbi 0x5,3
	.dbline 155
; 		  PORTB = PORTB &~(1<<PB4);
	cbi 0x5,4
	.dbline 156
; 		  PORTB = PORTB &~(1<<PB1);
	cbi 0x5,1
	.dbline 157
; 		  PORTD = PORTD &~(1<<PD4);
	cbi 0xb,4
	.dbline 158
; 		  PORTD = PORTD &~(1<<PD5);
	cbi 0xb,5
	.dbline 160
; 	    //if(HighByte1 == 0)	
; 	   { 
	.dbline 161
; 	     OCR1A = TCNT1 + ( unsigned int )CSpray1Cyc - CSpray1On ;
	lds R2,_CSpray1Cyc
	lds R3,_CSpray1Cyc+1
	lds R4,132
	lds R5,132+1
	add R4,R2
	adc R5,R3
	lds R2,_CSpray1On
	lds R3,_CSpray1On+1
	sub R4,R2
	sbc R5,R3
	sts 136+1,R5
	sts 136,R4
	.dbline 162
; 	     ActFlag1= 0;   //转换到下一动作
	clr R2
	sts _ActFlag1,R2
	.dbline 163
; 	   }
	.dbline 169
; 	  // else
; 	  // {
; 	  //   HighByte1 --;
; 	  //  ActFlag1= 1;   //转换到下一动作
; 	  // }
; 	   break;	 
	.dbline 172
; 	 }
;    default:
; 	   break;	
L56:
	.dbline -2
L54:
	.dbline 0 ; func end
	ld R11,y+
	ld R10,y+
	ld R0,y+
	out 0x3f,R0
	ld R30,y+
	ld R27,y+
	ld R26,y+
	ld R25,y+
	ld R24,y+
	ld R19,y+
	ld R18,y+
	ld R17,y+
	ld R16,y+
	ld R9,y+
	ld R8,y+
	ld R5,y+
	ld R4,y+
	ld R3,y+
	ld R2,y+
	ld R1,y+
	ld R0,y+
	reti
	.dbend
	.dbfile C:\DOCUME~1\Administrator\桌面\程序\油泵油嘴实验台\可用\油泵油~2\main.c
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 65
; //ICC-AVR application builder : 2007-4-24 9:11:17
; // Target : M88
; // Crystal: 8.0000Mhz
; 
; #include <iom88v.h>
; #include <macros.h>
; #include <uart.c>
; #include <timer1.c>
; //#include <stdlib.h>
; 
; //extern char _bss_end;
; //ADC initialize
; // Conversion time:128 prescale 208uS,free running,AVCC
; //unsigned char AdcIntrCnt = 0;
; 
; /*void adc_init(void)
; {
;  ADCSRA = 0x00; //disable adc
;  ADMUX = 0x42;  //select adc input 2,REF = AVCC
;  ACSR  = 0x80;
;  ADCSRB = 0x00;
;  DIDR0 = 0x04;   //禁用ADC2数字输入缓冲
;  ADCSRA = 0xEF;
; 
; }*/
; 
; /*#pragma interrupt_handler adc_isr:iv_ADC
; void adc_isr(void)
; {
;  //conversion complete, read value (int) using...
; 
;    int value;
;    int pressure;
;    char *ptr;
;    float cal;
; 
;    value=ADCL;            //Read 8 low bits first (important)
;    value|=(int)ADCH << 8; //read 2 high bits and shift into top byte
; 
;  if(++AdcIntrCnt > 100)
;  {
; //   PORTB = PORTB ^( 1<<PB3);  //debug
;    AdcIntrCnt = 0;
;    
; //   putchar(ADCL);   //debug
; //   putchar(ADCH);   //debug
; 
;    // 进行相应转换,并发送
; //   if(value > 204)        //电压应该大于1v
;    {
;      cal = value * 20/ 1023;   //Ima,R = 250ohm
;      cal = (cal - 4) / 16 * 350 ;   //pressure/bar
;      pressure = (int)cal;
;      ptr = (char*)&pressure;
;      putchar(*ptr);        //传送压力低字节
;      putchar(*(ptr + 1));    //传送压力高字节
;    }
; 
;  }
; }*/
; 
; 
; 
; void port_init(void)
; {
	.dbline 66
;  PORTB = 0x00;
	clr R2
	out 0x5,R2
	.dbline 67
;  DDRB  = 0x1E;
	ldi R24,30
	out 0x4,R24
	.dbline 68
;  PORTC = 0x00; //m103 output only
	out 0x8,R2
	.dbline 69
;  DDRC  = 0x00;
	out 0x7,R2
	.dbline 70
;  PORTD = 0x08;
	ldi R24,8
	out 0xb,R24
	.dbline 71
;  DDRD  = 0x38;
	ldi R24,56
	out 0xa,R24
	.dbline -2
L69:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline -1
	.dbline 76
; }
; 
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
	.dbline 78
;  //stop errant interrupts until set up
;  CLI(); //disable all interrupts
	cli
	.dbline 79
;  port_init();
	rcall _port_init
	.dbline 80
;  timer1_init();
	rcall _timer1_init
	.dbline 81
;  uart0_init();
	rcall _uart0_init
	.dbline 85
;  //timer0_init();
;  //adc_init();
; 
;  MCUCR = 0x00;
	clr R2
	out 0x35,R2
	.dbline 86
;  EICRA = 0x00; //extended ext ints
	sts 105,R2
	.dbline 87
;  EIMSK = 0x00;
	out 0x1d,R2
	.dbline 89
; 
;  TIMSK0 = 0x06; //timer 0 interrupt sources
	ldi R24,6
	sts 110,R24
	.dbline 90
;  TIMSK1 = 0x07; //timer 1 interrupt sources
	ldi R24,7
	sts 111,R24
	.dbline 91
;  TIMSK2 = 0x00; //timer 2 interrupt sources
	sts 112,R2
	.dbline 93
; 
;  PCMSK0 = 0x00; //pin change mask 0
	sts 107,R2
	.dbline 94
;  PCMSK1 = 0x00; //pin change mask 1
	sts 108,R2
	.dbline 95
;  PCMSK2 = 0x00; //pin change mask 2
	sts 109,R2
	.dbline 96
;  PCICR = 0x00; //pin change enable
	sts 104,R2
	.dbline 97
;  PRR = 0x00; //power controller
	sts 100,R2
	.dbline 98
;  SEI(); //re-enable interrupts
	sei
	.dbline -2
L70:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;    frameLength -> R22
;       waitFlag -> R20,R21
;              i -> R10
	.even
_main::
	.dbline -1
	.dbline 105
;  //all peripherals are now initialized
; }
; 
; 
; 
; void main(void)
; {
	.dbline 106
;  unsigned int waitFlag = 0;      //串口通讯等待时间计数
	clr R20
	clr R21
	.dbline 107
;  unsigned char frameLength = 12;  //帧长度
	ldi R22,12
	.dbline 108
;  char i = 0;
	clr R10
	.dbline 112
;  
; // _NewHeap(&_bss_end + 1,&_bss_end+40);
;  //初始化外围器件
;  init_devices();
	rcall _init_devices
	rjmp L73
L72:
	.dbline 115
; 
;  while(1)
;  {
	.dbline 116
;    if(FrameHead0 > 0)      //帧接收中
	ldi R24,0
	lds R2,_FrameHead0
	cp R24,R2
	brsh L75
X33:
	.dbline 117
;     {
	.dbline 118
; 		 TCCR1B = 0x00;        //关定时器1,准备接收数据
	clr R2
	sts 129,R2
	.dbline 120
; 		 //ADCSRA = ADCSRA & ~(1<<ADIE);        //disable adc interrupt
; 	     putchar(IDLE);       //为和数据区分开,采用两字节的控制命令
	ldi R16,253
	rcall _putchar
	.dbline 121
; 		 putchar(IDLE);
	ldi R16,253
	rcall _putchar
	.dbline 122
; 		 i = 1;
	clr R10
	inc R10
	rjmp L78
L77:
	.dbline 124
;      while(i)
; 	 {	
	.dbline 125
; 	  if(rx_counter0 == frameLength)   //缓冲区收到规定字符数
	lds R2,_rx_counter0
	cp R2,R22
	brne L80
X34:
	.dbline 126
; 	   {
	.dbline 128
; 	     //处理缓冲区数据
; 		 DisposeBufDatas();
	rcall _DisposeBufDatas
	.dbline 130
; //		 FlashRxBuf();     //debug
; 		 waitFlag = 0;
	clr R20
	clr R21
	.dbline 131
; 		 timer1_init();    //开定时器
	rcall _timer1_init
	.dbline 133
; 		 //ADCSRA = ADCSRA | (1<<ADIE);        //enable adc interrupt
; 		 i = 0;
	clr R10
	.dbline 135
; 		
; 	   }
	rjmp L81
L80:
	.dbline 137
;       else
; 	   {
	.dbline 138
; 	     waitFlag++;
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 139
; 		 if(waitFlag == 0xFFFF)     //等待超时,刷新缓冲区
	cpi R20,255
	ldi R30,255
	cpc R21,R30
	brne L82
X35:
	.dbline 140
; 		  {
	.dbline 141
; 		    waitFlag = 0;
	clr R20
	clr R21
	.dbline 142
; 			FlashRxBuf();
	rcall _FlashRxBuf
	.dbline 143
; 	        putchar(250);  //回传超时标志 debug
	ldi R16,250
	rcall _putchar
	.dbline 144
;             putchar(250);  //回传chongfa曛

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -