📄 scon2.s
字号:
.module scon2.c
.area data(ram, con, rel)
_time1::
.blkb 2
.area idata
.word 127
.area data(ram, con, rel)
.dbfile D:\AVR程序\舵机控制2\scon2.c
.dbsym e time1 _time1 i
_time2::
.blkb 2
.area idata
.word 127
.area data(ram, con, rel)
.dbfile D:\AVR程序\舵机控制2\scon2.c
.dbsym e time2 _time2 i
.area text(rom, con, rel)
.dbfile D:\AVR程序\舵机控制2\scon2.c
.dbfunc e Delay _Delay fV
; time -> R16,R17
.even
_Delay::
.dbline -1
.dbline 40
; #include <iom8v.h>
; #include <macros.h>
;
; #define Uchar unsigned char
; #define Uint unsigned int
;
;
; #define nop() asm("nop")
; #define _nop_() asm("nop")
;
;
;
; #define PB PORTB
; #define PC PORTC
; #define PD PORTD
;
;
;
; #define Forward0 PB|=0x01; PB&=~0x02;
; #define Backward0 PB|=0x02; PB&=~0x01;
; #define Stop0 PB|=0x03;
;
; #define Forward1 PC|=0x10; PC&=~0x20;
; #define Backward1 PC|=0x20; PC&=~0x10;
; #define Stop1 PC|=0x30;
;
;
; #define IN0 PIND&0x04
; #define IN1 PIND&0x08
; #define OF2 TIFR&0x40
; #define COF2 TIFR|=0x40
;
; //原理;外部上升中断-定时器开-0。4毫秒后比较中断-清零定时器-外部下降中断-读出计数器-PWM输出
;
; Uint time1=127,time2=127;//定时器数据
;
;
;
; void Delay (Uint time)
; {
rjmp L3
L2:
.dbline 42
.dbline 43
subi R16,1
sbci R17,0
.dbline 44
L3:
.dbline 41
; while(time)
cpi R16,0
cpc R16,R17
brne L2
X0:
.dbline -2
L1:
.dbline 0 ; func end
ret
.dbsym r time 16 i
.dbend
.dbfunc e port_init _port_init fV
.even
_port_init::
.dbline -1
.dbline 50
; {
; time--;
; }
; }
;
;
;
; void port_init(void)
; {
.dbline 51
; PORTB = 0x00;
clr R2
out 0x18,R2
.dbline 52
; DDRB = 0x0F;
ldi R24,15
out 0x17,R24
.dbline 53
; PORTC = 0x00; //m103 output only
out 0x15,R2
.dbline 54
; DDRC = 0x30;
ldi R24,48
out 0x14,R24
.dbline 55
; PORTD = 0x00;
out 0x12,R2
.dbline 56
; DDRD = 0x00;
out 0x11,R2
.dbline -2
L5:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer1_init _timer1_init fV
.even
_timer1_init::
.dbline -1
.dbline 67
; }
;
;
;
;
; //TIMER1 initialize - prescale:8
; // WGM: 0) Normal, TOP=0xFFFF
; // desired value: 1Hz
; // actual value: Out of range
; void timer1_init(void)
; {
.dbline 68
; TCCR1B = 0x00; //stop
clr R2
out 0x2e,R2
.dbline 69
; TCNT1 = 0x00 /*INVALID SETTING*/; //setup
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline 70
; OCR1A = 100;
ldi R24,100
ldi R25,0
out 0x2b,R25
out 0x2a,R24
.dbline 71
; OCR1B = 0x00 /*INVALID SETTING*/;
out 0x29,R3
out 0x28,R2
.dbline 72
; ICR1 = 0x00 /*INVALID SETTING*/;
out 0x27,R3
out 0x26,R2
.dbline 73
; TCCR1A = 0x00;
out 0x2f,R2
.dbline -2
L6:
.dbline 0 ; func end
ret
.dbend
.dbfunc e timer2_init _timer2_init fV
.even
_timer2_init::
.dbline -1
.dbline 84
; // TCCR1B = 0x03; //start Timer
; }
;
;
;
; //TIMER2 initialize - prescale:8
; // WGM: Normal
; // desired value: 1Hz
; // actual value: Out of range
; void timer2_init(void)
; {
.dbline 85
; TCCR2 = 0x00; //stop
clr R2
out 0x25,R2
.dbline 86
; ASSR = 0x00; //set async mode
out 0x22,R2
.dbline 87
; TCNT2 = 0x00 /*INVALID SETTING*/; //setup
out 0x24,R2
.dbline 88
; OCR2 = 100;
ldi R24,100
out 0x23,R24
.dbline -2
L7:
.dbline 0 ; func end
ret
.dbend
.dbfunc e adc_init _adc_init fV
.even
_adc_init::
.dbline -1
.dbline 97
; //TCCR2 = 0x03; //start
; }
;
;
;
; //ADC initialize
; // Conversion time: 104uS
; void adc_init(void)
; {
.dbline 98
; ADCSR = 0x00; //disable adc
clr R2
out 0x6,R2
.dbline 99
; ADMUX = 0x00; //select adc input 0
out 0x7,R2
.dbline 100
; ACSR = 0x80;
ldi R24,128
out 0x8,R24
.dbline 101
; ADCSR = 0x86;
ldi R24,134
out 0x6,R24
.dbline -2
L8:
.dbline 0 ; func end
ret
.dbend
.area vector(rom, abs)
.org 2
rjmp _int0_isr
.area text(rom, con, rel)
.dbfile D:\AVR程序\舵机控制2\scon2.c
.dbfunc e int0_isr _int0_isr fV
.even
_int0_isr::
st -y,R2
st -y,R3
st -y,R16
st -y,R17
st -y,R24
st -y,R25
st -y,R30
in R2,0x3f
st -y,R2
.dbline -1
.dbline 106
; }
;
; #pragma interrupt_handler int0_isr:2
; void int0_isr(void)
; {
.dbline 108
; //external interupt on INT0
; switch(IN0)
in R16,0x10
clr R17
andi R16,4
andi R17,0
cpi R16,0
cpc R16,R17
breq L13
X1:
cpi R16,0
ldi R30,0
cpc R17,R30
brlt L10
L17:
cpi R16,4
ldi R30,0
cpc R17,R30
breq L16
rjmp L10
X2:
.dbline 109
; {
L13:
.dbline 111
; case 0://下降触发
; TCCR1B = 0x00; //stop
clr R2
out 0x2e,R2
.dbline 112
; time1=TCNT1&0x01ff;
in R24,0x2c
in R25,0x2d
andi R25,1
sts _time1+1,R25
sts _time1,R24
.dbline 113
; time1-=40;
sbiw R24,40
sts _time1+1,R25
sts _time1,R24
.dbline 114
; if(time1>250)time1=250;
ldi R24,250
ldi R25,0
lds R2,_time1
lds R3,_time1+1
cp R24,R2
cpc R25,R3
brsh L14
.dbline 114
sts _time1+1,R25
sts _time1,R24
L14:
.dbline 115
; TCNT1=0;
clr R2
clr R3
out 0x2d,R3
out 0x2c,R2
.dbline 116
; break;
rjmp L11
L16:
.dbline 118
; case 0x04://上升触发
; TCCR1B = 0x03; //start Timer
ldi R24,3
out 0x2e,R24
.dbline 119
; }
L10:
L11:
.dbline -2
L9:
ld R2,y+
out 0x3f,R2
ld R30,y+
ld R25,y+
ld R24,y+
ld R17,y+
ld R16,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.area vector(rom, abs)
.org 4
rjmp _int1_isr
.area text(rom, con, rel)
.dbfile D:\AVR程序\舵机控制2\scon2.c
.dbfunc e int1_isr _int1_isr fV
.even
_int1_isr::
st -y,R2
st -y,R3
st -y,R16
st -y,R17
st -y,R24
st -y,R25
st -y,R30
in R2,0x3f
st -y,R2
.dbline -1
.dbline 124
; }
;
; #pragma interrupt_handler int1_isr:3
; void int1_isr(void)
; {
.dbline 126
; //external interupt on INT1
; switch(IN1)
in R16,0x10
clr R17
andi R16,8
andi R17,0
cpi R16,0
cpc R16,R17
breq L22
X3:
cpi R16,0
ldi R30,0
cpc R17,R30
brlt L19
L28:
cpi R16,8
ldi R30,0
cpc R17,R30
breq L27
rjmp L19
X4:
.dbline 127
; {
L22:
.dbline 129
; case 0://下降触发
; TCCR2 = 0x00; //stop
clr R2
out 0x25,R2
.dbline 130
; if(OF2){time2=TCNT2+0xff;COF2;}//定时器2扩展使用
in R2,0x38
sbrs R2,6
rjmp L23
.dbline 130
.dbline 130
in R24,0x24
clr R25
subi R24,1 ; offset = 255
sbci R25,255
sts _time2+1,R25
sts _time2,R24
.dbline 130
in R24,0x38
ori R24,64
out 0x38,R24
.dbline 130
rjmp L24
L23:
.dbline 132
; else
; time2=TCNT2;
in R2,0x24
clr R3
sts _time2+1,R3
sts _time2,R2
L24:
.dbline 133
; time2-=100;
lds R24,_time2
lds R25,_time2+1
subi R24,100
sbci R25,0
sts _time2+1,R25
sts _time2,R24
.dbline 134
; if(time2>250)time2=250;
ldi R24,250
ldi R25,0
lds R2,_time2
lds R3,_time2+1
cp R24,R2
cpc R25,R3
brsh L25
.dbline 134
sts _time2+1,R25
sts _time2,R24
L25:
.dbline 135
; TCNT2=0;
clr R2
out 0x24,R2
.dbline 137
;
; break;
rjmp L20
L27:
.dbline 139
; case 0x08://上升触发
; TCCR2 = 0x03; //start
ldi R24,3
out 0x25,R24
.dbline 140
; }
L19:
L20:
.dbline -2
L18:
ld R2,y+
out 0x3f,R2
ld R30,y+
ld R25,y+
ld R24,y+
ld R17,y+
ld R16,y+
ld R3,y+
ld R2,y+
.dbline 0 ; func end
reti
.dbend
.dbfunc e init_devices _init_devices fV
.even
_init_devices::
.dbline -1
.dbline 146
;
; }
;
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
.dbline 148
; //stop errant interrupts until set up
; CLI(); //disable all interrupts
cli
.dbline 149
; port_init();
rcall _port_init
.dbline 150
; timer1_init();
rcall _timer1_init
.dbline 151
; timer2_init();
rcall _timer2_init
.dbline 152
; adc_init();
rcall _adc_init
.dbline 154
;
; MCUCR = 0x05;
ldi R24,5
out 0x35,R24
.dbline 155
; GICR = 0xC0;
ldi R24,192
out 0x3b,R24
.dbline 156
; TIMSK = 0x00; //timer interrupt sources
clr R2
out 0x39,R2
.dbline 157
; SEI(); //re-enable interrupts
sei
.dbline -2
L29:
.dbline 0 ; func end
ret
.dbend
.dbfunc e ReadADC _ReadADC fi
; int2 -> R20,R21
; int1 -> R22,R23
; channel -> R16
.even
_ReadADC::
rcall push_gset2
.dbline -1
.dbline 166
; //all peripherals are now initialized
; }
;
;
;
;
;
; Uint ReadADC (Uchar channel)
; {
.dbline 168
; Uint int1,int2;
; ADMUX&=~0x1F;
in R24,0x7
andi R24,224
out 0x7,R24
.dbline 169
; ADMUX|=channel;
in R2,0x7
or R2,R16
out 0x7,R2
.dbline 170
; ADCSRA|=0x40;
sbi 0x6,6
L31:
.dbline 171
.dbline 171
L32:
.dbline 171
; while(~ADCSRA&0x10){}
in R2,0x6
clr R3
com R2
com R3
sbrc R2,4
rjmp L31
.dbline 172
; ADCSRA|=0x10;
sbi 0x6,4
.dbline 173
; int2=ADCL;
in R20,0x4
clr R21
.dbline 174
; int1=ADCH;
in R22,0x5
clr R23
.dbline 175
; int1<<=8;
mov R23,R22
clr R22
.dbline 176
; return (int1+int2);
movw R16,R22
add R16,R20
adc R17,R21
.dbline -2
L30:
rcall pop_gset2
.dbline 0 ; func end
ret
.dbsym r int2 20 i
.dbsym r int1 22 i
.dbsym r channel 16 c
.dbend
.dbfunc e main _main fI
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -