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

📄 dtm48-td.s

📁 航模用AVR M48开发的无刷电调驱动
💻 S
字号:
	.module dtm48-td.C
	.area data(ram, con, rel)
_mark::
	.blkb 2
	.area idata
	.word 1500
	.area data(ram, con, rel)
	.dbfile H:\ele\AVR\ICC\diantiao\dtm48-td\dtm48-td.C
	.dbsym e mark _mark I
	.area text(rom, con, rel)
	.dbfile H:\ele\AVR\ICC\diantiao\dtm48-td\dtm48-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 <iom48v.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 0x5,R24
	.dbline 34
;  DDRB  = 0x58;
	ldi R24,88
	out 0x4,R24
	.dbline 35
;  PORTC = 0x04; //m103 output only
	ldi R24,4
	out 0x8,R24
	.dbline 36
;  DDRC  = 0x38;
	ldi R24,56
	out 0x7,R24
	.dbline 37
;  PORTD = 0x00;
	clr R2
	out 0xb,R2
	.dbline 38
;  DDRD  = 0x52;
	ldi R24,82
	out 0xa,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
	sts 129,R2
	.dbline 44
;  TCNT1H = 0x00 /*INVALID SETTING*/; //setup
	sts 133,R2
	.dbline 45
;  TCNT1L = 0x00 /*INVALID SETTING*/;
	sts 132,R2
	.dbline 46
;  OCR1AH = 0x00 /*INVALID SETTING*/;
	sts 137,R2
	.dbline 47
;  OCR1AL = 0x00 /*INVALID SETTING*/;
	sts 136,R2
	.dbline 48
;  OCR1BH = 0x00 /*INVALID SETTING*/;
	sts 139,R2
	.dbline 49
;  OCR1BL = 0x00 /*INVALID SETTING*/;
	sts 138,R2
	.dbline 50
;  ICR1H  = 0x00 /*INVALID SETTING*/;
	sts 135,R2
	.dbline 51
;  ICR1L  = 0x00 /*INVALID SETTING*/;
	sts 134,R2
	.dbline 52
;  TCCR1A = 0x00;
	sts 128,R2
	.dbline 53
;  TCCR1B = 0x02; //start Timer
	ldi R24,2
	sts 129,R24
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e timer2_init _timer2_init fV
	.even
_timer2_init::
	.dbline -1
	.dbline 61
; }
; 
; //TIMER2 initialize - prescale:8
; // WGM: Normal
; // desired value: 255uSec
; // actual value: 255.000uSec (0.0%)
; void timer2_init(void)
; {
	.dbline 62
;  TCCR2B = 0x00; //stop
	clr R2
	sts 177,R2
	.dbline 63
;  ASSR  = 0x00; //set async mode
	sts 182,R2
	.dbline 64
;  TCNT2 = 0x01; //setup
	ldi R24,1
	sts 178,R24
	.dbline 65
;  OCR2A = 0;
	sts 179,R2
	.dbline 66
;  OCR2B = 0x00;
	sts 180,R2
	.dbline 67
;  TCCR2A = 0x00; 
	sts 176,R2
	.dbline 68
;  TCCR2B = 0x02; //start
	ldi R24,2
	sts 177,R24
	.dbline -2
L3:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e watchdog_init _watchdog_init fV
	.even
_watchdog_init::
	.dbline -1
	.dbline 71
; }
; void watchdog_init(void)
; {
	.dbline 72
;  WDR(); //this prevents a timout on enabling
	wdr
	.dbline 73
;  WDTCSR = 0x08; //WATCHDOG ENABLED - dont forget to issue WDRs
	ldi R24,8
	sts 96,R24
	.dbline -2
L4:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline -1
	.dbline 79
; }
; 
; 
; //call this routine to initialize all peripherals
; void init_devices(void)
; {
	.dbline 81
;  //stop errant interrupts until set up
;  CLI(); //disable all interrupts
	cli
	.dbline 82
;  port_init();
	rcall _port_init
	.dbline 83
;  timer1_init();
	rcall _timer1_init
	.dbline 84
;  timer2_init();
	rcall _timer2_init
	.dbline 85
;  watchdog_init();
	rcall _watchdog_init
	.dbline 87
; 
;  MCUCR = 0x00;
	clr R2
	out 0x35,R2
	.dbline 88
;  EICRA = 0x00; //extended ext ints
	sts 105,R2
	.dbline 89
;  EIMSK = 0x00;
	out 0x1d,R2
	.dbline 91
;  
;  TIMSK0 = 0x00; //timer 0 interrupt sources
	sts 110,R2
	.dbline 92
;  TIMSK1 = 0x00; //timer 1 interrupt sources
	sts 111,R2
	.dbline 93
;  TIMSK2 = 0x03; //timer 2 interrupt sources 
	ldi R24,3
	sts 112,R24
	.dbline 95
; 
;  PCMSK0 = 0x00; //pin change mask 0 
	sts 107,R2
	.dbline 96
;  PCMSK1 = 0x00; //pin change mask 1 
	sts 108,R2
	.dbline 97
;  PCMSK2 = 0x00; //pin change mask 2
	sts 109,R2
	.dbline 98
;  PCICR = 0x00; //pin change enable 
	sts 104,R2
	.dbline 99
;  PRR = 0x00; //power controller
	sts 100,R2
	.dbline 100
;  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 107
;  //all peripherals are now initialized
; }
; 
; 
; /*		微秒级延时程序	*/	
; void del(int time)
; 	 {     
L7:
	.dbline 109
;   	  do
; 	  	{
	.dbline 110
; 		 time--;
	subi R16,1
	sbci R17,0
	.dbline 111
; 		}	
L8:
	.dbline 112
;   	  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 117
; 	 }
; 	 
; /*	   毫秒级延时程序   	*/	 
; void delay_1ms(void)
; { unsigned int i1;
	.dbline 118
;  for(i1=1;i1<(unsigned int)(xtal*143-2);i1++)
	ldi R16,1
	ldi R17,0
	rjmp L14
L11:
	.dbline 119
L12:
	.dbline 118
	subi R16,255  ; offset = 1
	sbci R17,255
L14:
	.dbline 118
	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 123
;     ;
; }
; 
; void delay(unsigned int n)
; {
	.dbline 124
;  unsigned int i2=0;
	clr R20
	clr R21
	rjmp L17
L16:
	.dbline 126
	.dbline 126
	rcall _delay_1ms
	.dbline 127
	subi R20,255  ; offset = 1
	sbci R21,255
	.dbline 127
	wdr
	.dbline 128
L17:
	.dbline 125
;    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 14
	rjmp _timer2_compa_isr
	.area text(rom, con, rel)
	.dbfile H:\ele\AVR\ICC\diantiao\dtm48-td\dtm48-td.C
	.dbfunc e timer2_compa_isr _timer2_compa_isr fV
	.even
_timer2_compa_isr::
	st -y,R24
	in R24,0x3f
	st -y,R24
	.dbline -1
	.dbline 133
	.dbline 135
	lds R24,_zb
	cpi R24,255
	brsh L20
	.dbline 136
	.dbline 136
	cbi 0xb,1
	.dbline 136
	cbi 0xb,4
	.dbline 136
	cbi 0x5,6
	.dbline 136
	cbi 0xb,6
	.dbline 136
L20:
	.dbline -2
L19:
	ld R24,y+
	out 0x3f,R24
	ld R24,y+
	.dbline 0 ; func end
	reti
	.dbend
	.area vector(rom, abs)
	.org 18
	rjmp _timer2_ovf_isr
	.area text(rom, con, rel)
	.dbfile H:\ele\AVR\ICC\diantiao\dtm48-td\dtm48-td.C
	.dbfunc e timer2_ovf_isr _timer2_ovf_isr fV
	.even
_timer2_ovf_isr::
	st -y,R2
	st -y,R3
	st -y,R24
	in R2,0x3f
	st -y,R2
	.dbline -1
	.dbline 141
;    {delay_1ms();
;     i2++; WDR();
;    }
; }
; 
; #pragma interrupt_handler timer2_compa_isr:8
; void timer2_compa_isr(void)
; {
;  //compare occured TCNT2=OCR2a
;  if(zb<255)
;   {j10;j20; j30;j40;} 
; }
; 
; #pragma interrupt_handler timer2_ovf_isr:10
; void timer2_ovf_isr(void)
; {
	.dbline 142
;   if(zb>0)
	clr R2
	lds R3,_zb
	cp R2,R3
	brsh L23
	.dbline 143
;   {
	.dbline 144
;   if(flag==1)
	lds R24,_flag
	cpi R24,1
	brne L25
	.dbline 145
;    {j11;j31;}
	.dbline 145
	sbi 0xb,1
	.dbline 145
	sbi 0x5,6
	.dbline 145
	rjmp L26
L25:
	.dbline 147
;    else
;   if(flag==0)
	lds R2,_flag
	tst R2
	brne L27
	.dbline 148
;    {j21;j41;}  
	.dbline 148
	sbi 0xb,4
	.dbline 148
	sbi 0xb,6
	.dbline 148
L27:
L26:
	.dbline 149
;   }
L23:
	.dbline 150
;  TCNT2 = 0x0; //reload counter value
	clr R2
	sts 178,R2
	.dbline 151
;  OCR2A=zb;
	lds R2,_zb
	sts 179,R2
	.dbline -2
L22:
	ld R2,y+
	out 0x3f,R2
	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 156
; }
; 
; 
; unit fenc(int bb)             
; {
	.dbline 158
	lds R24,_mark
	lds R25,_mark+1
	subi R24,188
	sbci R25,2
	cp R16,R24
	cpc R17,R25
	brlt L32
	lds R24,_mark
	lds R25,_mark+1
	subi R24,68  ; offset = 700
	sbci R25,253
	cp R24,R16
	cpc R25,R17
	brge L30
L32:
	.dbline 158
;  int bc;        
;  if((bb<mark-700)||(bb>(mark+700))) return(0);              
	clr R16
	clr R17
	rjmp L29
L30:
	.dbline 159
;  if(mark<bb)  
	lds R2,_mark
	lds R3,_mark+1
	cp R2,R16
	cpc R3,R17
	brge L33
	.dbline 160
;   {
	.dbline 161
;   flag=1;
	ldi R24,1
	sts _flag,R24
	.dbline 162
;   bc=bb-mark;
	movw R20,R16
	sub R20,R2
	sbc R21,R3
	.dbline 163
;   }
L33:
	.dbline 164
;  if(mark>bb)
	lds R2,_mark
	lds R3,_mark+1
	cp R16,R2
	cpc R17,R3
	brge L35
	.dbline 165
;   {
	.dbline 166
;   flag=0;
	clr R2
	sts _flag,R2
	.dbline 167
;   bc=mark-bb;
	lds R20,_mark
	lds R21,_mark+1
	sub R20,R16
	sbc R21,R17
	.dbline 168
;   }    
L35:
	.dbline 169
	ldi R24,25
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L37
	.dbline 169
	.dbline 169
	sbi 0x5,3
	.dbline 169
	.dbline 169
	rjmp L38
L37:
	.dbline 169
;  if(bc<=25) { LED1; }  else { LED0; }   
	.dbline 169
	cbi 0x5,3
	.dbline 169
	.dbline 169
L38:
	.dbline 170
;  if(bc<=50)  return(0);
	ldi R24,50
	ldi R25,0
	cp R24,R20
	cpc R25,R21
	brlt L39
	.dbline 170
	clr R16
	clr R17
	rjmp L29
L39:
	.dbline 171
;  if(bc>=305)  return(255);
	cpi R20,49
	ldi R30,1
	cpc R21,R30
	brlt L41
	.dbline 171
	ldi R16,255
	ldi R17,0
	rjmp L29
L41:
	.dbline 172
;  else return(bc-50);
	movw R16,R20
	subi R16,50
	sbci R17,0
	.dbline -2
L29:
	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 176
; }
; 
; void cy(void)
; {
	.dbline 177
;  if(!(PINC&0x04))
	sbic 0x6,2
	rjmp L44
	.dbline 178
;    { 
	.dbline 179
;    TCNT1=0; 
	clr R2
	clr R3
	sts 132+1,R3
	sts 132,R2
	rjmp L47
L46:
	.dbline 180
	wdr
L47:
	.dbline 180
	sbis 0x6,2
	rjmp L46
	.dbline 181
	lds R2,132
	lds R3,132+1
	sts _aa+1,R3
	sts _aa,R2
	.dbline 182
	movw R16,R2
	rcall _fenc
	sts _zb,R16
	.dbline 183
L44:
	.dbline -2
L43:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
;             tr -> <dead>
	.even
_main::
	sbiw R28,2
	.dbline -1
	.dbline 187
;    while(!(PINC&0x04)) WDR();
;    aa=TCNT1;
;    zb=fenc(aa);
;    }
; }
; 
; void main(void)
; {
	.dbline 189
; unit tr;
; 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_extIO
	.dbline 190
; OSCCAL=ai;
	lds R2,_ai
	lds R3,_ai+1
	sts 102,R2
	.dbline 191
; init_devices();
	rcall _init_devices
	.dbline 193
; 
; 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_extIO
	.dbline 196
; 
; 
; if(ai==0xFFFF)
	lds R24,_ai
	lds R25,_ai+1
	cpi R24,255
	ldi R30,255
	cpc R25,R30
	brne L50
	.dbline 197
; {
	.dbline 198
; mark=1500;   //0xD805
	ldi R24,1500
	ldi R25,5
	sts _mark+1,R25
	sts _mark,R24
	.dbline 199
; 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_extIO
	.dbline 200
; aa=0;
	clr R2
	clr R3
	sts _aa+1,R3
	sts _aa,R2
	.dbline 201
; 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_extIO
	.dbline 202
; }
L50:
	.dbline 203
; 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_extIO
	rjmp L53
L52:
	.dbline 207
; 
; 
; while(1)
; {
	.dbline 211
; 
; //cy();
; 
;  if(!(PINC&0x04))
	sbic 0x6,2
	rjmp L55
	.dbline 212
;    { 
	.dbline 213
;    TCNT1=0; 
	clr R2
	clr R3
	sts 132+1,R3
	sts 132,R2
L57:
	.dbline 214
L58:
	.dbline 214
;    while(!(PINC&0x04)) ;
	sbis 0x6,2
	rjmp L57
	.dbline 215
;    aa=TCNT1;
	lds R2,132
	lds R3,132+1
	sts _aa+1,R3
	sts _aa,R2
	.dbline 216
;    zb=fenc(aa);
	movw R16,R2
	rcall _fenc
	sts _zb,R16
	.dbline 217
;    }
L55:
	.dbline 219
; 
; WDR();
	wdr
	.dbline 221
; 
; if(!(PINB&0x20))
	sbic 0x3,5
	rjmp L60
	.dbline 222
;  { 
	.dbline 223
;  delay(300);
	ldi R16,300
	ldi R17,1
	rcall _delay
	.dbline 224
;  if(!(PINB&0x20))
	sbic 0x3,5
	rjmp L62
	.dbline 225
;   { 
	.dbline 226
;   cy();
	rcall _cy
	.dbline 227
;   WDR();
	wdr
	.dbline 228
;   LED1;
	sbi 0x5,3
	.dbline 228
	.dbline 229
;   delay(10);
	ldi R16,10
	ldi R17,0
	rcall _delay
	.dbline 230
;   mark=aa;  EEPROM_WRITE(0x110,mark);
	lds R2,_aa
	lds R3,_aa+1
	sts _mark+1,R3
	sts _mark,R2
	.dbline 230
	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_extIO
	.dbline 231
;   j10;j20;j30;j40;
	cbi 0xb,1
	.dbline 231
	cbi 0xb,4
	.dbline 231
	cbi 0x5,6
	.dbline 231
	cbi 0xb,6
	.dbline 232
;   CLI();
	cli
	.dbline 233
;   delay(500);
	ldi R16,500
	ldi R17,1
	rcall _delay
	.dbline 234
;   SEI();
	sei
	.dbline 235
;   }
L62:
	.dbline 236
;  }
L60:
	.dbline 238
L53:
	.dbline 206
	rjmp L52
X0:
	.dbline -2
L49:
	adiw R28,2
	.dbline 0 ; func end
	ret
	.dbsym l tr 3 i
	.dbend
	.area bss(ram, con, rel)
	.dbfile H:\ele\AVR\ICC\diantiao\dtm48-td\dtm48-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 + -