📄 main.s
字号:
; 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 + -