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

📄 scon2.s

📁 M8制作的舵机控制器
💻 S
📖 第 1 页 / 共 2 页
字号:
	.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 + -