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

📄 dtm8-td.s

📁 航模用AVR M48开发的无刷电调驱动
💻 S
字号:
	.module dtm8-td.C
	.area data(ram, con, rel)
_mark::
	.blkb 2
	.area idata
	.word 1500
	.area data(ram, con, rel)
	.dbfile D:\ele\AVR\ICC\diantiao\dtm8-td\dtm8-td.C
	.dbsym e mark _mark I
	.area text(rom, con, rel)
	.dbfile D:\ele\AVR\ICC\diantiao\dtm8-td\dtm8-td.C
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 32
; /******************************************/
; /*         燕山大学无线电爱好者协会       */
; /*                电子调速器              */
; /*     作者:张翃鹏     2005-2-27 9:04:40  */
; /*     目标MCU:MEGA8    晶振:INT RC 8MHZ  */
; /******************************************/
; 
; #include <iom8v.h>
; #include <macros.h>
; #include <eeprom.h>
; #define uchar unsigned char
; #define unit unsigned int
; #define ulong unsigned long
; #define xtal 8 
; #define j11 PORTD|=0x02
; #define j10 PORTD&=~0x02
; #define j21 PORTD|=0x10
; #define j20 PORTD&=~0x10
; #define j31 PORTB|=0x40
; #define j30 PORTB&=~0x40
; #define j41 PORTD|=0x40
; #define j40 PORTD&=~0x40
; #define LED1 PORTB|=0x08;
; #define LED0 PORTB&=~0x08;
; 
; 
; int mark=1500;
; unit ai,aa;
; uchar i,j,az,flag,flagh,zb,mid,pwm;
; 
; void port_init(void)
; {
	.dbline 33
;  PORTB = 0x23;
	ldi R24,35
	out 0x18,R24
	.dbline 34
;  DDRB  = 0x58;
	ldi R24,88
	out 0x17,R24
	.dbline 35
;  PORTC = 0x04; //m103 output only
	ldi R24,4
	out 0x15,R24
	.dbline 36
;  DDRC  = 0x38;
	ldi R24,56
	out 0x14,R24
	.dbline 37
;  PORTD = 0x00;
	clr R2
	out 0x12,R2
	.dbline 38
;  DDRD  = 0x52;
	ldi R24,82
	out 0x11,R24
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e timer1_init _timer1_init fV
	.even
_timer1_init::
	.dbline -1
	.dbline 42
; }
; 
; void timer1_init(void)
; {
	.dbline 43
;  TCCR1B = 0x00; //stop
	clr R2
	out 0x2e,R2
	.dbline 44
;  TCNT1H = 0x00 /*INVALID SETTING*/; //setup
	out 0x2d,R2
	.dbline 45
;  TCNT1L = 0x00 /*INVALID SETTING*/;
	out 0x2c,R2
	.dbline 46
;  OCR1AH = 0x00 /*INVALID SETTING*/;
	out 0x2b,R2
	.dbline 47
;  OCR1AL = 0x00 /*INVALID SETTING*/;
	out 0x2a,R2
	.dbline 48
;  OCR1BH = 0x00 /*INVALID SETTING*/;
	out 0x29,R2
	.dbline 49
;  OCR1BL = 0x00 /*INVALID SETTING*/;
	out 0x28,R2
	.dbline 50
;  ICR1H  = 0x00 /*INVALID SETTING*/;
	out 0x27,R2
	.dbline 51
;  ICR1L  = 0x00 /*INVALID SETTING*/;
	out 0x26,R2
	.dbline 52
;  TCCR1A = 0x00;
	out 0x2f,R2
	.dbline 53
;  TCCR1B = 0x02; //start Timer
	ldi R24,2
	out 0x2e,R24
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e timer2_init _timer2_init fV
	.even
_timer2_init::
	.dbline -1
	.dbline 57
; }
; 
; void timer2_init(void)
; {
	.dbline 58
;  TCCR2 = 0x00; //stop
	clr R2
	out 0x25,R2
	.dbline 59
;  ASSR  = 0x00; //set async mode
	out 0x22,R2
	.dbline 60
;  TCNT2 = 0x00 /*INVALID SETTING*/; //setup
	out 0x24,R2
	.dbline 61
;  OCR2  = 0x00 /*INVALID SETTING*/;
	out 0x23,R2
	.dbline 62
;  TCCR2 = 0x02; //start
	ldi R24,2
	out 0x25,R24
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e watchdog_init _watchdog_init fV
	.even
_watchdog_init::
	.dbline -1
	.dbline 66
; }
; 
; void watchdog_init(void)
; {
	.dbline 67
;  WDR(); //this prevents a timout on enabling
	wdr
	.dbline 68
;  WDTCR = 0x08; //WATCHDOG ENABLED - dont forget to issue WDRs
	ldi R24,8
	out 0x21,R24
	.dbline -2
L4:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline -1
	.dbline 72
; }
; 
; void init_devices(void)
; {
	.dbline 73
;  CLI(); //disable all interrupts
	cli
	.dbline 74
;  port_init();
	rcall _port_init
	.dbline 75
;  timer1_init();
	rcall _timer1_init
	.dbline 76
;  timer2_init();
	rcall _timer2_init
	.dbline 77
;  watchdog_init();
	rcall _watchdog_init
	.dbline 78
;  MCUCR = 0x00;
	clr R2
	out 0x35,R2
	.dbline 79
;  GICR  = 0x00;
	out 0x3b,R2
	.dbline 80
;  TIMSK = 0x40; //timer interrupt sources
	ldi R24,64
	out 0x39,R24
	.dbline 81
;  SEI(); //re-enable interrupts
	sei
	.dbline -2
L5:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e del _del fV
;           time -> R16,R17
	.even
_del::
	.dbline -1
	.dbline 86
; }
; 
; /*		微秒级延时程序	*/	
; void del(int time)
; 	 {     
L7:
	.dbline 88
;   	  do
; 	  	{
	.dbline 89
; 		 time--;
	subi R16,1
	sbci R17,0
	.dbline 90
; 		}	
L8:
	.dbline 91
;   	  while (time>1);
	ldi R24,1
	ldi R25,0
	cp R24,R16
	cpc R25,R17
	brlt L7
	.dbline -2
L6:
	.dbline 0 ; func end
	ret
	.dbsym r time 16 I
	.dbend
	.dbfunc e delay_1ms _delay_1ms fV
;             i1 -> R16,R17
	.even
_delay_1ms::
	.dbline -1
	.dbline 96
; 	 }
; 	 
; /*	   毫秒级延时程序   	*/	 
; void delay_1ms(void)
; { unsigned int i1;
	.dbline 97
;  for(i1=1;i1<(unsigned int)(xtal*143-2);i1++)
	ldi R16,1
	ldi R17,0
	rjmp L14
L11:
	.dbline 98
L12:
	.dbline 97
	subi R16,255  ; offset = 1
	sbci R17,255
L14:
	.dbline 97
	cpi R16,118
	ldi R30,4
	cpc R17,R30
	brlo L11
	.dbline -2
L10:
	.dbline 0 ; func end
	ret
	.dbsym r i1 16 i
	.dbend
	.dbfunc e delay _delay fV
;             i2 -> R20,R21
;              n -> R22,R23
	.even
_delay::
	rcall push_gset2
	movw R22,R16
	.dbline -1
	.dbline 102
;     ;
; }
; 
; void delay(unsigned int n)
; {
	.dbline 103
;  unsigned int i2=0;
	clr R20
	clr R21
	rjmp L17
L16:
	.dbline 105
	.dbline 105
	rcall _delay_1ms
	.dbline 106
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 106
	wdr
	.dbline 107
L17:
	.dbline 104
;    while(i2<n)
	cp R20,R22
	cpc R21,R23
	brlo L16
	.dbline -2
L15:
	rcall pop_gset2
	.dbline 0 ; func end
	ret
	.dbsym r i2 20 i
	.dbsym r n 22 i
	.dbend
	.area vector(rom, abs)
	.org 8
	rjmp _timer2_ovf_isr
	.area text(rom, con, rel)
	.dbfile D:\ele\AVR\ICC\diantiao\dtm8-td\dtm8-td.C
	.dbfunc e timer2_ovf_isr _timer2_ovf_isr fV
	.even
_timer2_ovf_isr::
	st -y,R2
	st -y,R3
	st -y,R24
	st -y,R25
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 113
;    {delay_1ms();
;     i2++; WDR();
;    }
; }
; 
; 
; #pragma interrupt_handler timer2_ovf_isr:5
; void timer2_ovf_isr(void)
; {
	.dbline 114
; WDR();
	wdr
	.dbline 115
; pwm++;
	lds R24,_pwm
	subi R24,255    ; addi 1
	sts _pwm,R24
	.dbline 116
; if(pwm==250) 
	cpi R24,250
	brne L20
	.dbline 117
;  {
	.dbline 118
;  pwm=0;
	clr R2
	sts _pwm,R2
	.dbline 119
;  if(zb>0)
	lds R3,_zb
	cp R2,R3
	brsh L22
	.dbline 120
;   {
	.dbline 121
;   if(flag==1)
	lds R24,_flag
	cpi R24,1
	brne L24
	.dbline 122
;   {j11; j31;}
	.dbline 122
	sbi 0x12,1
	.dbline 122
	sbi 0x18,6
	.dbline 122
L24:
	.dbline 123
;   if(flag==0)
	lds R2,_flag
	tst R2
	brne L26
	.dbline 124
;   {j21; j41;}  
	.dbline 124
	sbi 0x12,4
	.dbline 124
	sbi 0x12,6
	.dbline 124
L26:
	.dbline 125
;   }
L22:
	.dbline 126
;  }
L20:
	.dbline 127
; if(pwm==zb) 
	lds R2,_zb
	lds R3,_pwm
	cp R3,R2
	brne L28
	.dbline 128
;  {j10;j20;j30;j40;}
	.dbline 128
	cbi 0x12,1
	.dbline 128
	cbi 0x12,4
	.dbline 128
	cbi 0x18,6
	.dbline 128
	cbi 0x12,6
	.dbline 128
L28:
	.dbline 130
; 
; TCNT2 = 0xF0;	//reload counter value
	ldi R24,240
	out 0x24,R24
	.dbline -2
L19:
	ld R2,y+
	out 0x3f,R2
	ld R25,y+
	ld R24,y+
	ld R3,y+
	ld R2,y+
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e fenc _fenc fi
;             bc -> R20,R21
;             bb -> R16,R17
	.even
_fenc::
	rcall push_gset1
	.dbline -1
	.dbline 136
; 
; }
; 
; 
; unit fenc(int bb)             
; {
	.dbline 138
	lds R24,_mark
	lds R25,_mark+1
	subi R24,188
	sbci R25,2
	cp R16,R24
	cpc R17,R25
	brlt L33
	lds R24,_mark
	lds R25,_mark+1
	subi R24,68  ; offset = 700
	sbci R25,253
	cp R24,R16
	cpc R25,R17
	brge L31
L33:
	.dbline 138
;  int bc;        
;  if((bb<mark-700)||(bb>(mark+700))) return(0);              
	clr R16
	clr R17
	rjmp L30
L31:
	.dbline 139
;  if((mark-bb)<0)  
	lds R24,_mark
	lds R25,_mark+1
	sub R24,R16
	sbc R25,R17
	cpi R24,0
	ldi R30,0
	cpc R25,R30
	brge L34
	.dbline 140
;   {
	.dbline 141
;   flag=1;
	ldi R24,1
	sts _flag,R24
	.dbline 142
;   bc=bb-mark;
	lds R2,_mark
	lds R3,_mark+1
	movw R20,R16
	sub R20,R2
	sbc R21,R3
	.dbline 143
;   }
L34:
	.dbline 144
;  if((mark-bb)>0)
	lds R2,_mark
	lds R3,_mark+1
	sub R2,R16
	sbc R3,R17
	clr R4
	clr R5
	cp R4,R2
	cpc R5,R3
	brge L36
	.dbline 145
;   {
	.dbline 146
;   flag=0;
	clr R2
	sts _flag,R2
	.dbline 147
;   bc=mark-bb;
	lds R20,_mark
	lds R21,_mark+1
	sub R20,R16
	sbc R21,R17
	.dbline 148
;   }    
L36:
	.dbline 149
	ldi R24,25
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L38
	.dbline 149
	.dbline 149
	sbi 0x18,3
	.dbline 149
	.dbline 149
	rjmp L39
L38:
	.dbline 149
;  if(bc<=25) { LED1; }  else { LED0; }   
	.dbline 149
	cbi 0x18,3
	.dbline 149
	.dbline 149
L39:
	.dbline 150
;  if(bc<=50)  return(0);
	ldi R24,50
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L40
	.dbline 150
	clr R16
	clr R17
	rjmp L30
L40:
	.dbline 151
;  if(bc>=300)  return(250);
	cpi R20,44
	ldi R30,1
	cpc R21,R30
	brlt L42
	.dbline 151
	ldi R16,250
	ldi R17,0
	rjmp L30
L42:
	.dbline 152
;  return(bc-50);
	movw R16,R20
	subi R16,50
	sbci R17,0
	.dbline -2
L30:
	rcall pop_gset1
	.dbline 0 ; func end
	ret
	.dbsym r bc 20 I
	.dbsym r bb 16 I
	.dbend
	.dbfunc e cy _cy fV
	.even
_cy::
	.dbline -1
	.dbline 156
; }
; 
; void cy(void)
; {
	.dbline 157
;  if(!(PINC&0x04))
	sbic 0x13,2
	rjmp L45
	.dbline 158
;    { 
	.dbline 159
;    TCNT1=0; 
	clr R2
	clr R3
	out 0x2d,R3
	out 0x2c,R2
	rjmp L48
L47:
	.dbline 160
	wdr
L48:
	.dbline 160
	sbis 0x13,2
	rjmp L47
	.dbline 161
	in R2,0x2c
	in R3,0x2d
	sts _aa+1,R3
	sts _aa,R2
	.dbline 162
	movw R16,R2
	rcall _fenc
	sts _zb,R16
	.dbline 163
L45:
	.dbline -2
L44:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
	.even
_main::
	sbiw R28,2
	.dbline -1
	.dbline 167
;    while(!(PINC&0x04)) WDR();
;    aa=TCNT1;
;    zb=fenc(aa);
;    }
; }
; 
; void main()
; {
	.dbline 168
; EEPROM_READ(0x10,ai);//校正振荡频率
	ldi R24,2
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,<_ai
	ldi R19,>_ai
	ldi R16,16
	ldi R17,0
	rcall _EEPROMReadBytes
	.dbline 169
; OSCCAL=ai;
	lds R2,_ai
	lds R3,_ai+1
	out 0x31,R2
	.dbline 170
; init_devices();
	rcall _init_devices
	.dbline 172
; 
; EEPROM_READ(0x112,ai);   
	ldi R24,2
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,<_ai
	ldi R19,>_ai
	ldi R16,274
	ldi R17,1
	rcall _EEPROMReadBytes
	.dbline 175
; 
; 
; if(ai==0xFFFF)
	lds R24,_ai
	lds R25,_ai+1
	cpi R24,255
	ldi R30,255
	cpc R25,R30
	brne L51
	.dbline 176
; {
	.dbline 177
; mark=1500;   //0xD805
	ldi R24,1500
	ldi R25,5
	sts _mark+1,R25
	sts _mark,R24
	.dbline 178
; EEPROM_WRITE(0x110,mark);    
	ldi R24,2
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,<_mark
	ldi R19,>_mark
	ldi R16,272
	ldi R17,1
	rcall _EEPROMWriteBytes
	.dbline 179
; aa=0;
	clr R2
	clr R3
	sts _aa+1,R3
	sts _aa,R2
	.dbline 180
; EEPROM_WRITE(0x112,aa);
	ldi R24,2
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,<_aa
	ldi R19,>_aa
	ldi R16,274
	ldi R17,1
	rcall _EEPROMWriteBytes
	.dbline 181
; }
L51:
	.dbline 182
; EEPROM_READ(0x110,mark);
	ldi R24,2
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,<_mark
	ldi R19,>_mark
	ldi R16,272
	ldi R17,1
	rcall _EEPROMReadBytes
	rjmp L54
L53:
	.dbline 186
; 
; 
; while(1)
; {
	.dbline 188
; 
; cy();
	rcall _cy
	.dbline 189
; WDR();
	wdr
	.dbline 192
; 
; 
; if(!(PINB&0x20))
	sbic 0x16,5
	rjmp L56
	.dbline 193
;  { 
	.dbline 194
;  delay(10);
	ldi R16,10
	ldi R17,0
	rcall _delay
	.dbline 195
;  if(!(PINB&0x20))
	sbic 0x16,5
	rjmp L58
	.dbline 196
;   { 
	.dbline 197
;   cy();
	rcall _cy
	.dbline 198
;   WDR();
	wdr
	.dbline 199
;   LED1;
	sbi 0x18,3
	.dbline 199
	.dbline 200
;   delay(10);
	ldi R16,10
	ldi R17,0
	rcall _delay
	.dbline 201
;   mark=aa;  EEPROM_WRITE(0x110,mark);
	lds R2,_aa
	lds R3,_aa+1
	sts _mark+1,R3
	sts _mark,R2
	.dbline 201
	ldi R24,2
	ldi R25,0
	std y+1,R25
	std y+0,R24
	ldi R18,<_mark
	ldi R19,>_mark
	ldi R16,272
	ldi R17,1
	rcall _EEPROMWriteBytes
	.dbline 202
;   CLI();
	cli
	.dbline 203
;   delay(500);
	ldi R16,500
	ldi R17,1
	rcall _delay
	.dbline 204
;   SEI();
	sei
	.dbline 205
;   }
L58:
	.dbline 206
;  }
L56:
	.dbline 208
L54:
	.dbline 185
	rjmp L53
X0:
	.dbline -2
L50:
	adiw R28,2
	.dbline 0 ; func end
	ret
	.dbend
	.area bss(ram, con, rel)
	.dbfile D:\ele\AVR\ICC\diantiao\dtm8-td\dtm8-td.C
_pwm::
	.blkb 1
	.dbsym e pwm _pwm c
_mid::
	.blkb 1
	.dbsym e mid _mid c
_zb::
	.blkb 1
	.dbsym e zb _zb c
_flagh::
	.blkb 1
	.dbsym e flagh _flagh c
_flag::
	.blkb 1
	.dbsym e flag _flag c
_az::
	.blkb 1
	.dbsym e az _az c
_j::
	.blkb 1
	.dbsym e j _j c
_i::
	.blkb 1
	.dbsym e i _i c
_aa::
	.blkb 2
	.dbsym e aa _aa i
_ai::
	.blkb 2
	.dbsym e ai _ai i

⌨️ 快捷键说明

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