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

📄 50%wave.s

📁 利用Atmega16单片机的定时器T0设计的方波发生器
💻 S
字号:
	.module _50%Wave.c
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\hb\MYDOCU~1\喷吗机--2代\单片机程序\定时器(方波输出)\50%Wave.c
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 12
; //ICC-AVR application builder : 2006-12-9 10:11:46
; // Target : M8
; // Crystal: 4.0000Mhz
; 
; #include <iom8v.h>
; #include <macros.h>
; long Ddummy;
; char Settings_PerDotGroupNum,Settings_PrintPhase;
; char DAOutPutNow;
; 
; void port_init(void)
; {
	.dbline 13
;  PORTB = 0; //0xFF;
	clr R2
	out 0x18,R2
	.dbline 14
;  DDRB  = 0xFF; //0x08;
	ldi R24,255
	out 0x17,R24
	.dbline 15
;  PORTC = 0x7F; //m103 output only
	ldi R24,127
	out 0x15,R24
	.dbline 16
;  DDRC  = 0x00;
	out 0x14,R2
	.dbline 17
;  PORTD = 0xFF;
	ldi R24,255
	out 0x12,R24
	.dbline 18
;  DDRD  = 0x00;
	out 0x11,R2
	.dbline -2
	.dbline 19
; }
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e timer2_init _timer2_init fV
	.even
_timer2_init::
	.dbline -1
	.dbline 26
; 
; //TIMER2 initialisation - prescale:1
; // WGM: CTC
; // desired value: 62.5KHz
; // actual value:  63.39KHz (3.1%)
; void timer2_init(void)
; {
	.dbline 27
;  TCCR2 = 0x00; //stop
	clr R2
	out 0x25,R2
	.dbline 28
;  ASSR  = 0x00; //set async mode
	out 0x22,R2
	.dbline 29
;  TCNT2 = 0x00; //setup
	out 0x24,R2
	.dbline 30
;  OCR2  = 0x20; //计数上限值
	ldi R24,32
	out 0x23,R24
	.dbline 31
;  TCCR2 = 0x19; //0x11:一般模式, 0x19:比较模式,计数比较成功后PB3电平取反 
	ldi R24,25
	out 0x25,R24
	.dbline -2
	.dbline 32
; }
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 6
	rjmp _timer2_comp_isr
	.area text(rom, con, rel)
	.dbfile C:\DOCUME~1\hb\MYDOCU~1\喷吗机--2代\单片机程序\定时器(方波输出)\50%Wave.c
	.dbfunc e timer2_comp_isr _timer2_comp_isr fV
	.even
_timer2_comp_isr::
	st -y,R2
	st -y,R3
	st -y,R4
	st -y,R5
	st -y,R6
	st -y,R7
	st -y,R8
	st -y,R9
	st -y,R24
	st -y,R25
	st -y,R26
	st -y,R27
	st -y,R30
	in R2,0x3f
	st -y,R2
	rcall push_gset2
	.dbline -1
	.dbline 36
; 
; #pragma interrupt_handler timer2_comp_isr:4
; void timer2_comp_isr(void)  //compare occured TCNT2=OCR2
; {
	.dbline 37
;     Ddummy++;
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	lds R4,_Ddummy+2
	lds R5,_Ddummy+2+1
	lds R2,_Ddummy
	lds R3,_Ddummy+1
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	sts _Ddummy+1,R3
	sts _Ddummy,R2
	sts _Ddummy+2+1,R5
	sts _Ddummy+2,R4
	.dbline 38
;     if(Ddummy==1) PORTB = PORTB & (~1);   //PB0脚置低电平
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	cp R2,R20
	cpc R3,R21
	cpc R4,R22
	cpc R5,R23
	brne L4
	.dbline 38
	cbi 0x18,0
L4:
	.dbline 39
	lds R2,_Settings_PerDotGroupNum
	clr R3
	clr R4
	clr R5
	lds R8,_Ddummy+2
	lds R9,_Ddummy+2+1
	lds R6,_Ddummy
	lds R7,_Ddummy+1
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlt L6
	.dbline 39
	.dbline 40
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	sts _Ddummy+1,R21
	sts _Ddummy,R20
	sts _Ddummy+2+1,R23
	sts _Ddummy+2,R22
	.dbline 41
	in R24,0x18
	andi R24,254
	subi R24,255    ; addi 1
	out 0x18,R24
	.dbline 42
L6:
	.dbline -2
	.dbline 43
; 	if(Ddummy >=Settings_PerDotGroupNum){
; 	   Ddummy =0; //恢复计数初值
;        PORTB = (PORTB & (~1)) + 1;   //PB0脚置高电平
; 	}  
; }
L3:
	rcall pop_gset2
	ld R2,y+
	out 0x3f,R2
	ld R30,y+
	ld R27,y+
	ld R26,y+
	ld R25,y+
	ld R24,y+
	ld R9,y+
	ld R8,y+
	ld R7,y+
	ld R6,y+
	ld R5,y+
	ld R4,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 59
; 
; /*
; #pragma interrupt_handler timer2_ovf_isr:5
; void timer2_ovf_isr(void)   //在比较模式下计数溢出中断不会发生
; {
;   TCNT2 = 0xF0;    //计数初值
;   if(PORTB & 2){   //PB1脚是高电平,改变PB1脚的电平使其形成振荡
;      PORTB -= 2;   //则将PB1脚电平变低
;      return;
;   }
;   PORTB += 2;      //如果PB1脚电平是低,则加2使其变高
; }
; */
; 
; void init_devices(void)  //call this routine to initialise all peripherals
; {
	.dbline 61
;  //stop errant interrupts until set up
;  CLI(); //disable all interrupts
	cli
	.dbline 62
;  port_init();
	rcall _port_init
	.dbline 63
;  timer2_init();
	rcall _timer2_init
	.dbline 65
; 
;  MCUCR = 0x00;
	clr R2
	out 0x35,R2
	.dbline 66
;  GICR  = 0x00;
	out 0x3b,R2
	.dbline 67
;  TIMSK = 0x80; //timer interrupt sources
	ldi R24,128
	out 0x39,R24
	.dbline 68
;  SEI(); //re-enable interrupts
	sei
	.dbline -2
	.dbline 70
;  //all peripherals are now initialised
; }
L8:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 73
; 
; void main()
; {
	.dbline 74
;      init_devices();
	rcall _init_devices
	.dbline 75
; 	 DAOutPutNow = 0;
	clr R2
	sts _DAOutPutNow,R2
	.dbline 76
; 	 Ddummy = 0;                     //临时变量,赋初值
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	sts _Ddummy+1,R21
	sts _Ddummy,R20
	sts _Ddummy+2+1,R23
	sts _Ddummy+2,R22
	.dbline 77
; 	 Settings_PerDotGroupNum =10;    //每10个墨滴选一个进行打印
	ldi R24,10
	sts _Settings_PerDotGroupNum,R24
	.dbline 78
; 	 Settings_PrintPhase =10;	 
	sts _Settings_PrintPhase,R24
	.dbline -2
	.dbline 79
; }
L9:
	.dbline 0 ; func end
	ret
	.dbend
	.area bss(ram, con, rel)
	.dbfile C:\DOCUME~1\hb\MYDOCU~1\喷吗机--2代\单片机程序\定时器(方波输出)\50%Wave.c
_DAOutPutNow::
	.blkb 1
	.dbsym e DAOutPutNow _DAOutPutNow c
_Settings_PrintPhase::
	.blkb 1
	.dbsym e Settings_PrintPhase _Settings_PrintPhase c
_Settings_PerDotGroupNum::
	.blkb 1
	.dbsym e Settings_PerDotGroupNum _Settings_PerDotGroupNum c
_Ddummy::
	.blkb 4
	.dbsym e Ddummy _Ddummy L

⌨️ 快捷键说明

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