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

📄 acceleration.s

📁 加速度采集器。基于ATMega16L.AVRSTUIDIO4
💻 S
字号:
	.module Acceleration.c
	.area data(ram, con, rel)
_mainState::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile G:\Acceleratoion\Acceleration\Acceleration.c
	.dbsym e mainState _mainState c
_mute::
	.blkb 1
	.area idata
	.byte 0
	.area data(ram, con, rel)
	.dbfile G:\Acceleratoion\Acceleration\Acceleration.c
	.dbsym e mute _mute c
_currentTime::
	.blkb 4
	.area idata
	.word 0,0
	.area data(ram, con, rel)
	.dbfile G:\Acceleratoion\Acceleration\Acceleration.c
	.dbsym e currentTime _currentTime l
_idleTime::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile G:\Acceleratoion\Acceleration\Acceleration.c
	.dbsym e idleTime _idleTime s
_currentImpact::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile G:\Acceleratoion\Acceleration\Acceleration.c
	.dbsym e currentImpact _currentImpact s
_currentImpactUpdated::
	.blkb 1
	.area idata
	.byte 1
	.area data(ram, con, rel)
	.dbfile G:\Acceleratoion\Acceleration\Acceleration.c
	.dbsym e currentImpactUpdated _currentImpactUpdated c
_impactCounter::
	.blkb 2
	.area idata
	.word 0
	.area data(ram, con, rel)
	.dbfile G:\Acceleratoion\Acceleration\Acceleration.c
	.dbsym e impactCounter _impactCounter s
	.area text(rom, con, rel)
	.dbfile G:\Acceleratoion\Acceleration\Acceleration.c
	.dbfunc e port_init _port_init fV
	.even
_port_init::
	.dbline -1
	.dbline 41
; //ICC-AVR application builder : 2009-3-26 18:32:14
; // Target : M16
; // Crystal: 4.0000Mhz
; 
; #include <iom16v.h>
; #include <macros.h>
; 
; //Drivers
; #include "lcd.h"
; 
; //Tasks
; #include "keyboard.h"
; #include "lcdtask.h"
; 
; //======================Parameters=================
; #define AUTOPOWEROFF 1000	//0..65535, 0s-655s
; #define WEIGHT 100	 		//0..2E15
; 
; 
; //=======================Globals====================
; //---------States-------
; char mainState = 0; //IDLE=0, Sampling=1;
; char mute = 0;
; //--------Time----*0.01s-------
; unsigned long currentTime = 0;
; unsigned short idleTime = 0;
; //------LCD & ISD interface-----When Read, CLI!!!----
; unsigned short currentImpact = 0;
; char currentImpactUpdated = 0x01; //bit 0 = LCD; bit 1 = ISD; 
; unsigned short impactCounter = 0;
; 
; 
; 
; 
; 
; void dataAnalysis(char voltX, char voltY);
; 
; 
; //==========Initialization Code===============
; void port_init(void)
; {
	.dbline 42
;  PORTA = 0x20;
	ldi R24,32
	out 0x1b,R24
	.dbline 43
;  DDRA  = 0xFC;
	ldi R24,252
	out 0x1a,R24
	.dbline 44
;  PORTB = 0x0F;
	ldi R24,15
	out 0x18,R24
	.dbline 45
;  DDRB  = 0x00;
	clr R2
	out 0x17,R2
	.dbline 46
;  PORTC = 0xC3; //m103 output only
	ldi R24,195
	out 0x15,R24
	.dbline 47
;  DDRC  = 0x43;
	ldi R24,67
	out 0x14,R24
	.dbline 48
;  PORTD = 0x00;
	out 0x12,R2
	.dbline 49
;  DDRD  = 0x00;
	out 0x11,R2
	.dbline -2
L1:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e timer1_init _timer1_init fV
	.even
_timer1_init::
	.dbline -1
	.dbline 57
; }
; 
; //TIMER1 initialize - prescale:64
; // WGM: 4) CTC, TOP=OCRnA
; // desired value: 100Hz
; // actual value: 100.000Hz (0.0%)
; void timer1_init(void)
; {
	.dbline 58
;  TCCR1B = 0x00; //stop
	clr R2
	out 0x2e,R2
	.dbline 59
;  TCNT1H = 0xFD; //setup
	ldi R24,253
	out 0x2d,R24
	.dbline 60
;  TCNT1L = 0x90;
	ldi R24,144
	out 0x2c,R24
	.dbline 61
;  OCR1AH = 0x02;
	ldi R24,2
	out 0x2b,R24
	.dbline 62
;  OCR1AL = 0x70;
	ldi R24,112
	out 0x2a,R24
	.dbline 63
;  OCR1BH = 0x02;
	ldi R24,2
	out 0x29,R24
	.dbline 64
;  OCR1BL = 0x70;
	ldi R24,112
	out 0x28,R24
	.dbline 65
;  ICR1H  = 0x02;
	ldi R24,2
	out 0x27,R24
	.dbline 66
;  ICR1L  = 0x70;
	ldi R24,112
	out 0x26,R24
	.dbline 67
;  TCCR1A = 0x00;
	out 0x2f,R2
	.dbline 68
;  TCCR1B = 0x0B; //start Timer
	ldi R24,11
	out 0x2e,R24
	.dbline -2
L2:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 32
	jmp _timer1_ovf_isr
	.area text(rom, con, rel)
	.dbfile G:\Acceleratoion\Acceleration\Acceleration.c
	.dbfunc e timer1_ovf_isr _timer1_ovf_isr fV
	.even
_timer1_ovf_isr::
	xcall push_lset
	xcall push_gset2
	.dbline -1
	.dbline 73
; }
; 
; #pragma interrupt_handler timer1_ovf_isr:9
; void timer1_ovf_isr(void)
; {
	.dbline 75
;  //TIMER1 has overflowed
;  TCNT1H = 0xFD; //reload counter high value
	ldi R24,253
	out 0x2d,R24
	.dbline 76
;  TCNT1L = 0x90; //reload counter low value
	ldi R24,144
	out 0x2c,R24
	.dbline 79
;  
;  //Keyboard check
;  keyboardRead();
	xcall _keyboardRead
	.dbline 80
;  if(mainState)
	lds R2,_mainState
	tst R2
	breq L4
	.dbline 81
;    currentTime++;
	ldi R20,1
	ldi R21,0
	ldi R22,0
	ldi R23,0
	lds R4,_currentTime+2
	lds R5,_currentTime+2+1
	lds R2,_currentTime
	lds R3,_currentTime+1
	add R2,R20
	adc R3,R21
	adc R4,R22
	adc R5,R23
	sts _currentTime+1,R3
	sts _currentTime,R2
	sts _currentTime+2+1,R5
	sts _currentTime+2,R4
	xjmp L5
L4:
	.dbline 83
;  else
;  {
	.dbline 84
;    idleTime++;
	lds R24,_idleTime
	lds R25,_idleTime+1
	adiw R24,1
	sts _idleTime+1,R25
	sts _idleTime,R24
	.dbline 85
;    if (idleTime>AUTOPOWEROFF)
	ldi R24,1000
	ldi R25,3
	lds R2,_idleTime
	lds R3,_idleTime+1
	cp R24,R2
	cpc R25,R3
	brsh L6
	.dbline 86
;      powerOff();
	xcall _powerOff
L6:
	.dbline 87
;  }// if keyboard check
L5:
	.dbline 90
	lds R2,_mainState
	tst R2
	breq L8
	.dbline 91
	.dbline 92
	in R24,0x7
	andi R24,224
	out 0x7,R24
	.dbline 93
	sbi 0x6,6
	.dbline 94
L8:
	.dbline -2
L3:
	xcall pop_gset2
	xcall pop_lset
	.dbline 0 ; func end
	reti
	.dbend
	.dbfunc e spi_init _spi_init fV
	.even
_spi_init::
	.dbline -1
	.dbline 101
;  
;  //ADC Start
;  if(mainState)	 //Sampling
;  {
;   ADMUX &= 0xe0; //Choose Channel 0
;   ADCSRA |=0x40;	//Start Conversion
;  }
; }
; 
; 
; //SPI initialize
; // clock rate: 1000000hz
; void spi_init(void)
; {
	.dbline 102
;  SPCR = 0x50; //setup SPI
	ldi R24,80
	out 0xd,R24
	.dbline 103
;  SPSR = 0x00; //setup SPI
	clr R2
	out 0xe,R2
	.dbline -2
L10:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e adc_init _adc_init fV
	.even
_adc_init::
	.dbline -1
	.dbline 109
; }
; 
; //ADC initialize
; // Conversion time: 104uS
; void adc_init(void)
; {
	.dbline 110
;  ADCSR = 0x00; //disable adc
	clr R2
	out 0x6,R2
	.dbline 111
;  ADMUX = 0x40; //select adc input 0
	ldi R24,64
	out 0x7,R24
	.dbline 112
;  ACSR  = 0x80;
	ldi R24,128
	out 0x8,R24
	.dbline 113
;  ADCSR = 0x8D;
	ldi R24,141
	out 0x6,R24
	.dbline -2
L11:
	.dbline 0 ; func end
	ret
	.dbend
	.area vector(rom, abs)
	.org 56
	jmp _adc_isr
	.area text(rom, con, rel)
	.dbfile G:\Acceleratoion\Acceleration\Acceleration.c
	.area bss(ram, con, rel)
	.dbfile G:\Acceleratoion\Acceleration\Acceleration.c
L13:
	.blkb 1
L14:
	.blkb 1
	.area text(rom, con, rel)
	.dbfile G:\Acceleratoion\Acceleration\Acceleration.c
	.dbfunc e adc_isr _adc_isr fV
	.dbsym s valueChannel1 L14 c
	.dbsym s valueChannel0 L13 c
;      valueTemp -> R20,R21
	.even
_adc_isr::
	xcall push_lset
	xcall push_gset1
	.dbline -1
	.dbline 118
; }
; 
; #pragma interrupt_handler adc_isr:15
; void adc_isr(void)
; {
	.dbline 122
;  	 static char valueChannel0, valueChannel1;
; 	 unsigned short valueTemp;
;  //conversion complete, read value (int) using...
;  	 valueTemp=ADCL;            //Read 8 low bits first (important)
	in R20,0x4
	clr R21
	.dbline 123
;      valueTemp|=(int)ADCH << 8; //read 2 high bits and shift into top byte
	in R2,0x5
	clr R3
	mov R3,R2
	clr R2
	or R20,R2
	or R21,R3
	.dbline 126
; 
; 	 //Calculate ABS
; 	 if (valueTemp>=512)
	cpi R20,0
	ldi R30,2
	cpc R21,R30
	brlo L15
	.dbline 127
; 	   valueTemp -=512;
	subi R20,0
	sbci R21,2
	xjmp L16
L15:
	.dbline 129
; 	 else
; 	   valueTemp = 512-valueTemp;
	ldi R24,512
	ldi R25,2
	sub R24,R20
	sbc R25,R21
	movw R20,R24
L16:
	.dbline 130
; 	 if(ADMUX&0x01)
	sbis 0x7,0
	rjmp L17
	.dbline 131
; 	 {
	.dbline 132
; 	   valueChannel1 = valueTemp>>1; //discard 1 bit
	movw R2,R20
	lsr R3
	ror R2
	sts L14,R2
	.dbline 133
; 	   dataAnalysis(valueChannel0,valueChannel1);
	mov R18,R2
	lds R16,L13
	xcall _dataAnalysis
	.dbline 134
; 	 }
	xjmp L18
L17:
	.dbline 136
	.dbline 137
	movw R2,R20
	lsr R3
	ror R2
	sts L13,R2
	.dbline 138
	sbi 0x7,0
	.dbline 139
	sbi 0x6,6
	.dbline 140
L18:
	.dbline -2
L12:
	xcall pop_gset1
	xcall pop_lset
	.dbline 0 ; func end
	reti
	.dbsym r valueTemp 20 s
	.dbend
	.dbfunc e init_devices _init_devices fV
	.even
_init_devices::
	.dbline -1
	.dbline 146
; 	 else
; 	 {//Channel 0
; 	   valueChannel0 = valueTemp>>1; //discard 1 bit
; 	   ADMUX |= 0x01;
; 	   ADCSRA |=0x40; //Start Channel 1
; 	 }
;    
; }//adc_isr
; 
; //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();
	xcall _port_init
	.dbline 150
;  spi_init();
	xcall _spi_init
	.dbline 151
;  adc_init();
	xcall _adc_init
	.dbline 153
; 
;  MCUCR = 0x00;
	clr R2
	out 0x35,R2
	.dbline 154
;  GICR  = 0x00;
	out 0x3b,R2
	.dbline 155
;  TIMSK = 0x04; //timer interrupt sources
	ldi R24,4
	out 0x39,R24
	.dbline 156
;  SEI(); //re-enable interrupts
	sei
	.dbline -2
L19:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e main _main fV
	.even
_main::
	.dbline -1
	.dbline 162
;  //all peripherals are now initialized
; }
; 
; //
; void main(void)
; {
	.dbline 163
;  init_devices();
	xcall _init_devices
	.dbline 166
;  //insert your functional code here...
;  //=====Initialization===========
;  lcdInit();
	xcall _lcdInit
	.dbline 167
;  timer1_init();//Open Timer
	xcall _timer1_init
	xjmp L22
L21:
	.dbline 171
	.dbline 172
	xcall _lcdTask
	.dbline 173
L22:
	.dbline 170
	xjmp L21
X0:
	.dbline -2
L20:
	.dbline 0 ; func end
	ret
	.dbend
	.dbfunc e dataAnalysis _dataAnalysis fV
;           test -> y+0
;         valueY -> R10
;         valueX -> R12
	.even
_dataAnalysis::
	xcall push_gset4
	mov R10,R18
	mov R12,R16
	sbiw R28,4
	.dbline -1
	.dbline 181
;  
;  //=====Background tasks=========
;  while(1)
;  {
;    lcdTask();
;  }
; }
; 
; 
; unsigned short calculateImpact(char valueX, char valueY);
; unsigned short sqrt(unsigned long M);  
; //=========Data analysis subroutine===============
; void dataAnalysis(char valueX, char valueY)
; {
	.dbline 183
;  //test
;  unsigned long test= 0xA0000000;
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,160
	movw R30,R28
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	.dbline 184
;  currentImpact = sqrt(test);//valueChannel0;
	movw R30,R28
	ldd R16,z+0
	ldd R17,z+1
	ldd R18,z+2
	ldd R19,z+3
	xcall _sqrt
	sts _currentImpact+1,R17
	sts _currentImpact,R16
	.dbline 185
;  currentImpact = currentImpact>>8;
	movw R2,R16
	mov R2,R3
	clr R3
	sts _currentImpact+1,R3
	sts _currentImpact,R2
	.dbline 186
;  currentImpactUpdated = 0x03;
	ldi R24,3
	sts _currentImpactUpdated,R24
	.dbline -2
L24:
	adiw R28,4
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym l test 0 l
	.dbsym r valueY 10 c
	.dbsym r valueX 12 c
	.dbend
	.dbfunc e sqrt _sqrt fs
;              i -> R10
;       MResidue -> y+0
;              N -> R12,R13
;              M -> y+12
	.even
_sqrt::
	xcall push_arg4
	xcall push_gset4
	sbiw R28,4
	.dbline -1
	.dbline 192
; 
; //  calculateImpact(valueX,valueY);
; }
; 
; unsigned short sqrt(unsigned long M)
; {
	.dbline 193
;  unsigned short N = 0;
	clr R12
	clr R13
	.dbline 195
;  char i;
;  unsigned long MResidue = 0; // /=pow(2,i)
	ldi R20,0
	ldi R21,0
	ldi R22,0
	ldi R23,0
	movw R30,R28
	std z+0,R20
	std z+1,R21
	std z+2,R22
	std z+3,R23
	.dbline 197
;  
;  for(i=16;i;i--)
	ldi R24,16
	mov R10,R24
	xjmp L29
L26:
	.dbline 198
;  {
	.dbline 199
;    MResidue = (MResidue<<2) + (M>>30); //fetch first to bit from M
	ldi R24,30
	ldi R25,0
	movw R30,R28
	ldd R2,z+12
	ldd R3,z+13
	ldd R4,z+14
	ldd R5,z+15
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsr32
	movw R2,R16
	movw R4,R18
	ldi R24,2
	ldi R25,0
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	st -y,R24
	movw R16,R6
	movw R18,R8
	xcall lsl32
	movw R6,R16
	movw R8,R18
	add R6,R2
	adc R7,R3
	adc R8,R4
	adc R9,R5
	movw R30,R28
	std z+0,R6
	std z+1,R7
	std z+2,R8
	std z+3,R9
	.dbline 200
;    M = M<<2;//prepare next 2 bits
	ldi R24,2
	ldi R25,0
	movw R30,R28
	ldd R2,z+12
	ldd R3,z+13
	ldd R4,z+14
	ldd R5,z+15
	st -y,R24
	movw R16,R2
	movw R18,R4
	xcall lsl32
	movw R30,R28
	std z+12,R16
	std z+13,R17
	std z+14,R18
	std z+15,R19
	.dbline 201
;    N = N<<1;
	lsl R12
	rol R13
	.dbline 202
;    if(MResidue>=N+1)
	movw R24,R12
	adiw R24,1
	movw R2,R24
	clr R4
	clr R5
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	cp R6,R2
	cpc R7,R3
	cpc R8,R4
	cpc R9,R5
	brlo L30
	.dbline 203
;      MResidue -= ++N;
	movw R24,R12
	adiw R24,1
	movw R12,R24
	movw R2,R24
	clr R4
	clr R5
	movw R30,R28
	ldd R6,z+0
	ldd R7,z+1
	ldd R8,z+2
	ldd R9,z+3
	sub R6,R2
	sbc R7,R3
	sbc R8,R4
	sbc R9,R5
	movw R30,R28
	std z+0,R6
	std z+1,R7
	std z+2,R8
	std z+3,R9
L30:
	.dbline 204
L27:
	.dbline 197
	dec R10
L29:
	.dbline 197
	tst R10
	breq X1
	xjmp L26
X1:
	.dbline 205
;  }
;  return N;
	movw R16,R12
	.dbline -2
L25:
	adiw R28,4
	xcall pop_gset4
	adiw R28,4
	.dbline 0 ; func end
	ret
	.dbsym r i 10 c
	.dbsym l MResidue 0 l
	.dbsym r N 12 s
	.dbsym l M 12 l
	.dbend
	.dbfunc e calculateImpact _calculateImpact fs
; impactTransient -> <dead>
;      valueX2Y2 -> y+0
;         valueY -> R12
;         valueX -> R10
	.even
_calculateImpact::
	xcall push_gset4
	mov R12,R18
	mov R10,R16
	sbiw R28,4
	.dbline -1
	.dbline 209
; }
; 	
; unsigned short calculateImpact(char valueX, char valueY)
; {
	.dbline 213
;  unsigned long valueX2Y2;
;  unsigned short impactTransient;
;  
;  valueX2Y2 = valueX*valueX+valueY*valueY;
	mul R12,R12
	movw R2,R0
	mul R10,R10
	movw R4,R0
	add R4,R2
	adc R5,R3
	movw R2,R4
	clr R4
	sbrc R3,7
	com R4
	clr R5
	sbrc R4,7
	com R5
	movw R30,R28
	std z+0,R2
	std z+1,R3
	std z+2,R4
	std z+3,R5
	.dbline 214
;  valueX2Y2 *=WEIGHT;
	movw R30,R28
	ldd R2,z+0
	ldd R3,z+1
	ldd R4,z+2
	ldd R5,z+3
	ldi R20,100
	ldi R21,0
	ldi R22,0
	ldi R23,0
	st -y,R5
	st -y,R4
	st -y,R3
	st -y,R2
	movw R16,R20
	movw R18,R22
	xcall empy32u
	movw R30,R28
	std z+0,R16
	std z+1,R17
	std z+2,R18
	std z+3,R19
	.dbline -2
L32:
	adiw R28,4
	xcall pop_gset4
	.dbline 0 ; func end
	ret
	.dbsym l impactTransient 1 s
	.dbsym l valueX2Y2 0 l
	.dbsym r valueY 12 c
	.dbsym r valueX 10 c
	.dbend

⌨️ 快捷键说明

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