?? acceleration.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 + -