📄 main.s
字号:
.module main.c
.area text(rom, con, rel)
.dbfile E:\TWINTI~1\main.c
.dbfunc e timer0_init _timer0_init fV
.even
_timer0_init::
.dbline -1
.dbline 48
; /********************************************************************************/
; //
; // builder : 2007-04-10
; // Target : ATMEAG 48V
; // Crystal : 内部 8.00 MHz
; //
; //
;
; /********************************************************************************/
;
; #include <iom48v.h>
; #include <macros.h>
;
; #include "eeprom.h"
; #include "time2.h"
; #include "adc.h"
;
;
; #define uchar unsigned char
; #define uint unsigned int
;
; #define SET_LED PORTD |= (1<<PB4)
; #define CLR_LED PORTD &= ~(1<<PB4)
;
; uchar e2rom[7];
;
; uint PE1,PE2;
;
; uchar mode;
; uchar rxd_flag; // 油门接收OK标志
;
; uchar PWM;
; uint Timer;
; uint high,middle,low;
; uchar REV;
; uchar power;
; uchar heat;
; union
; { uint temp;
; uchar data[2];
; }time;
;
;
; /*---------------------------------------------------------------
; 初始化
; ----------------------------------------------------------------*/
; void timer0_init(void)
; {
.dbline 49
; TCCR0B = 0x00; //stop
clr R2
out 0x25,R2
.dbline 50
; TCNT0 = 0x01; //set count
ldi R24,1
out 0x26,R24
.dbline 51
; TCCR0A = 0x23;
ldi R24,35
out 0x24,R24
.dbline 52
; OCR0B = 0xA5;
ldi R24,165
out 0x28,R24
.dbline 53
; TCCR0B = 0x01; //start timer
ldi R24,1
out 0x25,R24
.dbline -2
L2:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 59
; }
;
;
;
; void timer1_init(void) // 20MS 中断
; {
.dbline 60
; TCCR1B = 0x00; // stop
clr R2
sts 129,R2
.dbline 61
; TCNT1H = 0xB1; // setup
ldi R24,177
sts 133,R24
.dbline 62
; TCNT1L = 0xE0;
ldi R24,224
sts 132,R24
.dbline 63
; OCR1AH = 0x4E;
ldi R24,78
sts 137,R24
.dbline 64
; OCR1AL = 0x20;
ldi R24,32
sts 136,R24
.dbline 65
; OCR1BH = 0x4E;
ldi R24,78
sts 139,R24
.dbline 66
; OCR1BL = 0x20;
ldi R24,32
sts 138,R24
.dbline 67
; ICR1H = 0x4E;
ldi R24,78
sts 135,R24
.dbline 68
; ICR1L = 0x20;
ldi R24,32
sts 134,R24
.dbline 69
; TCCR1A = 0x00;
sts 128,R2
.dbline -2
L3:
.dbline 0 ; func end
ret
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 74
; }
;
;
; void init_devices(void)
; {
.dbline 75
; CLI();
cli
.dbline 77
;
; DDRB = 0x7F;
ldi R24,127
out 0x4,R24
.dbline 78
; PORTB = 0xC0;
ldi R24,192
out 0x5,R24
.dbline 80
;
; DDRC = 0x00;
clr R2
out 0x7,R2
.dbline 81
; PORTC = 0x40; // m103 output only
ldi R24,64
out 0x8,R24
.dbline 83
;
; DDRD = 0xFB;
ldi R24,251
out 0xa,R24
.dbline 84
; PORTD = 0x40;
ldi R24,64
out 0xb,R24
.dbline 86
;
; MCUCR = 0x00;
out 0x35,R2
.dbline 87
; EICRA = 0x03; // INT0 上升沿触发
ldi R24,3
sts 105,R24
.dbline 88
; EIMSK = 0x01; // 使能 INT0 中断
ldi R24,1
out 0x1d,R24
.dbline 90
;
; timer0_init();
rcall _timer0_init
.dbline 91
; timer1_init();
rcall _timer1_init
.dbline 92
; timer2_init();
rcall _timer2_init
.dbline 93
; init_eeprom();
rcall _init_eeprom
.dbline 94
; adc_int();
rcall _adc_int
.dbline 96
;
; SEI();
sei
.dbline -2
L4:
.dbline 0 ; func end
ret
.dbend
.dbfunc e delay _delay fV
; i -> R20,R21
; j -> R22,R23
; k -> R10,R11
; t -> R16,R17
.even
_delay::
rcall push_gset3
.dbline -1
.dbline 104
; }
;
; /*---------------------------------------------------------------
; 延时
; ----------------------------------------------------------------*/
;
; void delay(uint t)
; {
.dbline 107
; uint i,j,k;
;
; for(i=0;i<t;i++)
clr R20
clr R21
rjmp L9
L6:
.dbline 108
; {
.dbline 109
; for(j=0;j<200;j++)
clr R22
clr R23
rjmp L13
L10:
.dbline 110
; {
.dbline 111
clr R10
clr R11
rjmp L17
L14:
.dbline 111
L15:
.dbline 111
movw R24,R10
adiw R24,1
movw R10,R24
L17:
.dbline 111
movw R24,R10
cpi R24,50
ldi R30,0
cpc R25,R30
brlo L14
.dbline 111
.dbline 112
L11:
.dbline 109
subi R22,255 ; offset = 1
sbci R23,255
L13:
.dbline 109
cpi R22,200
ldi R30,0
cpc R23,R30
brlo L10
.dbline 113
L7:
.dbline 107
subi R20,255 ; offset = 1
sbci R21,255
L9:
.dbline 107
cp R20,R16
cpc R21,R17
brlo L6
.dbline -2
L5:
rcall pop_gset3
.dbline 0 ; func end
ret
.dbsym r i 20 i
.dbsym r j 22 i
.dbsym r k 10 i
.dbsym r t 16 i
.dbend
.dbfunc e LED_set _LED_set fV
.even
_LED_set::
.dbline -1
.dbline 118
; for(k=0;k<50;k++);;
; }
; }
; }
;
;
; void LED_set(void)
; {
.dbline 119
; SET_LED ;
sbi 0xb,4
.dbline 120
; delay(10);
ldi R16,10
ldi R17,0
rcall _delay
.dbline 121
; CLR_LED ;
cbi 0xb,4
.dbline 122
; delay(8);
ldi R16,8
ldi R17,0
rcall _delay
.dbline -2
L18:
.dbline 0 ; func end
ret
.dbend
.dbfunc e egis _egis fV
; temp -> R20,R21
.even
_egis::
rcall push_gset1
.dbline -1
.dbline 126
; }
;
; void egis(void)
; {
.dbline 129
; uint temp;
;
; temp = adc_colect(1);
ldi R16,1
rcall _adc_colect
movw R20,R16
.dbline 130
; if(temp<0x1D0 && power<200) power ++;
cpi R16,208
ldi R30,1
cpc R17,R30
brsh L20
lds R24,_power
cpi R24,200
brsh L20
.dbline 130
subi R24,255 ; addi 1
sts _power,R24
rjmp L21
L20:
.dbline 131
; else if(temp>0x1DF)power = 0;
ldi R24,479
ldi R25,1
cp R24,R20
cpc R25,R21
brsh L22
.dbline 131
clr R2
sts _power,R2
L22:
L21:
.dbline 133
;
; if(power>3 && PWM<50)
ldi R24,3
lds R2,_power
cp R24,R2
brsh L24
lds R24,_PWM
cpi R24,50
brsh L24
.dbline 134
; {
.dbline 135
; PWM = 0;
clr R2
sts _PWM,R2
.dbline 136
; Pwm_set(0,0);
clr R18
clr R16
rcall _Pwm_set
.dbline 137
; delay(5);
ldi R16,5
ldi R17,0
rcall _delay
.dbline 138
; temp = 0;
clr R20
clr R21
rjmp L27
L26:
.dbline 140
.dbline 141
ldi R16,1
rcall _adc_colect
movw R20,R16
.dbline 142
rcall _LED_set
.dbline 143
rcall _Buz
.dbline 144
ldi R16,20
ldi R17,0
rcall _delay
.dbline 145
L27:
.dbline 139
; while(temp<0x1df)
cpi R20,223
ldi R30,1
cpc R21,R30
brlo L26
.dbline 146
; {
; temp = adc_colect(1);
; LED_set();
; Buz();
; delay(20);
; }
; }
L24:
.dbline 149
;
;
; temp = adc_colect(2);
ldi R16,2
rcall _adc_colect
movw R20,R16
.dbline 150
; if(temp>0x3BF && heat<200) heat ++; // >110度
ldi R24,959
ldi R25,3
cp R24,R16
cpc R25,R17
brsh L29
lds R24,_heat
cpi R24,200
brsh L29
.dbline 150
subi R24,255 ; addi 1
sts _heat,R24
rjmp L30
L29:
.dbline 151
; else if(temp<0x38E)heat = 0; // <80度
cpi R20,142
ldi R30,3
cpc R21,R30
brsh L31
.dbline 151
clr R2
sts _heat,R2
L31:
L30:
.dbline 153
;
; if(heat>3 && PWM<50)
ldi R24,3
lds R2,_heat
cp R24,R2
brsh L33
lds R24,_PWM
cpi R24,50
brsh L33
.dbline 154
; {
.dbline 155
; PWM = 0;
clr R2
sts _PWM,R2
.dbline 156
; Pwm_set(0,0);
clr R18
clr R16
rcall _Pwm_set
.dbline 157
; delay(5);
ldi R16,5
ldi R17,0
rcall _delay
.dbline 158
; temp = 0xfff;
ldi R20,4095
ldi R21,15
rjmp L36
L35:
.dbline 160
.dbline 161
ldi R16,2
rcall _adc_colect
movw R20,R16
.dbline 162
rcall _LED_set
.dbline 163
rcall _LED_set
.dbline 164
rcall _Buz
.dbline 165
rcall _Buz
.dbline 166
ldi R16,20
ldi R17,0
rcall _delay
.dbline 167
L36:
.dbline 159
ldi R24,910
ldi R25,3
cp R24,R20
cpc R25,R21
brlo L35
.dbline 168
L33:
.dbline -2
L19:
rcall pop_gset1
.dbline 0 ; func end
ret
.dbsym r temp 20 i
.dbend
.dbfunc e Gun_set _Gun_set fV
.even
_Gun_set::
.dbline -1
.dbline 176
; while(temp>0x38E)
; {
; temp = adc_colect(2);
; LED_set();
; LED_set();
; Buz();
; Buz();
; delay(20);
; }
; }
; }
;
; /*---------------------------------------------------------------
; 油门处理
; ----------------------------------------------------------------*/
;
; void Gun_set(void)
; {
.dbline 177
; if(rxd_flag) // 接收已完成
lds R2,_rxd_flag
tst R2
brne X0
rjmp L39
X0:
.dbline 178
; {
.dbline 179
; rxd_flag = 0;
clr R2
sts _rxd_flag,R2
.dbline 181
;
; if(Timer>high) Timer = high; // 确保接收到的数据在正常范围内
lds R2,_high
lds R3,_high+1
lds R4,_Timer
lds R5,_Timer+1
cp R2,R4
cpc R3,R5
brsh L41
.dbline 181
sts _Timer+1,R3
sts _Timer,R2
L41:
.dbline 182
; if(Timer<low) Timer = low;
lds R2,_low
lds R3,_low+1
lds R4,_Timer
lds R5,_Timer+1
cp R4,R2
cpc R5,R3
brsh L43
.dbline 182
sts _Timer+1,R3
sts _Timer,R2
L43:
.dbline 184
;
; if(Timer>(middle+50)) // 前进 1550us
lds R24,_middle
lds R25,_middle+1
adiw R24,50
lds R2,_Timer
lds R3,_Timer+1
cp R24,R2
cpc R25,R3
brsh L45
.dbline 185
; {
.dbline 186
; if(power>3 || heat>3)
ldi R24,3
lds R2,_power
cp R24,R2
brlo L49
lds R2,_heat
cp R24,R2
brsh L47
L49:
.dbline 187
; {
.dbline 188
; PWM --;
lds R24,_PWM
subi R24,1
sts _PWM,R24
.dbline 189
; }
rjmp L48
L47:
.dbline 191
; else
; {
.dbline 192
; PWM = ((Timer-middle)*10)/PE1; // 计算占空比
lds R2,_middle
lds R3,_middle+1
lds R18,_Timer
lds R19,_Timer+1
sub R18,R2
sbc R19,R3
ldi R16,10
ldi R17,0
rcall empy16s
lds R18,_PE1
lds R19,_PE1+1
rcall div16u
sts _PWM,R16
.dbline 193
; if(PWM>210) PWM = 255;
ldi R24,210
cp R24,R16
brsh L50
.dbline 193
ldi R24,255
sts _PWM,R24
L50:
.dbline 195
;
; }
L48:
.dbline 196
; Pwm_set(PWM,1); // 设置PWM占空比
ldi R18,1
lds R16,_PWM
rcall _Pwm_set
.dbline 197
; mode = 1;
ldi R24,1
sts _mode,R24
.dbline 198
; SET_LED;
sbi 0xb,4
.dbline 199
; }
rjmp L46
L45:
.dbline 200
; else if(Timer<(middle-50))
lds R24,_middle
lds R25,_middle+1
sbiw R24,50
lds R2,_Timer
lds R3,_Timer+1
cp R2,R24
cpc R3,R25
brlo X1
rjmp L52
X1:
.dbline 201
; {
.dbline 202
; if(!mode && REV) // 后退
lds R2,_mode
tst R2
brne L54
lds R2,_REV
tst R2
breq L54
.dbline 203
; {
.dbline 204
; if(power>3 || heat>3)
ldi R24,3
lds R2,_power
cp R24,R2
brlo L58
lds R2,_heat
cp R24,R2
brsh L56
L58:
.dbline 205
; {
.dbline 206
; PWM --;
lds R24,_PWM
subi R24,1
sts _PWM,R24
.dbline 207
; }
rjmp L57
L56:
.dbline 209
; else
; {
.dbline 210
; PWM = ((middle-Timer)*10)/PE2;
lds R2,_Timer
lds R3,_Timer+1
lds R18,_middle
lds R19,_middle+1
sub R18,R2
sbc R19,R3
ldi R16,10
ldi R17,0
rcall empy16s
lds R18,_PE2
lds R19,_PE2+1
rcall div16u
sts _PWM,R16
.dbline 211
; if(PWM>210) PWM = 255;
ldi R24,210
cp R24,R16
brsh L59
.dbline 211
ldi R24,255
sts _PWM,R24
L59:
.dbline 212
; }
L57:
.dbline 213
; Pwm_set(PWM,2);
ldi R18,2
lds R16,_PWM
rcall _Pwm_set
.dbline 214
; SET_LED;
sbi 0xb,4
.dbline 215
; delay(5);
ldi R16,5
ldi R17,0
rcall _delay
.dbline 216
; }
rjmp L53
L54:
.dbline 218
; else
; {
.dbline 219
; Pwm_set(255,3); // 刹车
ldi R18,3
ldi R16,255
rcall _Pwm_set
rjmp L62
L61:
.dbline 221
.dbline 222
rcall _LED_set
.dbline 223
L62:
.dbline 220
; while((Timer+50)<=middle)
lds R2,_middle
lds R3,_middle+1
lds R24,_Timer
lds R25,_Timer+1
adiw R24,50
cp R2,R24
cpc R3,R25
brsh L61
.dbline 224
; {
; LED_set();
; }
; mode = 0;
clr R2
sts _mode,R2
.dbline 225
; }
.dbline 226
; }
rjmp L53
L52:
.dbline 228
; else
; {
.dbline 229
; Pwm_set(0,0);
clr R18
clr R16
rcall _Pwm_set
.dbline 230
; CLR_LED;
cbi 0xb,4
.dbline 231
; }
L53:
L46:
.dbline 232
; }
L39:
.dbline 233
; egis();
rcall _egis
.dbline -2
L38:
.dbline 0 ; func end
ret
.dbend
.dbfunc e key _key fc
; k -> R20
; i -> R22
.even
_key::
rcall push_gset2
.dbline -1
.dbline 240
; }
;
;
;
;
; uchar key(void)
; {
.dbline 241
; uchar i,k=0;
clr R20
.dbline 243
;
; for(i=0;i<5;i++)
clr R22
rjmp L68
L65:
.dbline 244
; {
.dbline 245
; if(PINB & 0x80) k = 0;
sbis 0x3,7
rjmp L69
.dbline 245
clr R20
rjmp L70
L69:
.dbline 246
; else k ++;
inc R20
L70:
.dbline 247
ldi R16,3
ldi R17,0
rcall _delay
.dbline 248
L66:
.dbline 243
inc R22
L68:
.dbline 243
cpi R22,5
brlo L65
.dbline 250
; delay(3);
; }
;
; return k;
mov R16,R20
.dbline -2
L64:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r k 20 c
.dbsym r i 22 c
.dbend
.dbfunc e compute _compute fi
; temp -> R16,R17
; i -> R18
.even
_compute::
.dbline -1
.dbline 258
; }
;
; /*---------------------------------------------------------------
;
; ----------------------------------------------------------------*/
;
; uint compute(void)
; {
.dbline 260
; uchar i;
; uint temp = 0;
clr R16
clr R17
.dbline 262
;
; for(i=0;i<8;i++)
clr R18
rjmp L75
X2:
.dbline 263
; {
L76:
.dbline 264
L77:
.dbline 264
lds R2,_rxd_flag
tst R2
breq L76
.dbline 265
lds R2,_Timer
lds R3,_Timer+1
add R16,R2
adc R17,R3
.dbline 266
clr R2
sts _rxd_flag,R2
.dbline 267
clr R3
sts _Timer+1,R3
sts _Timer,R2
.dbline 268
L73:
.dbline 262
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -