AI_Disable писал(а): А если серьёзно, то пока в теме не появится исходик, наврятли вам сможет кто-либо помочь.
Измирения:
.include "m8def.inc"
.def temp=r17
.def al=r0
.def ah=r1
.def ADSL=r2
.def ADST=r3
.def ADSH=r4
.def ACT=r5
.def rzl=r6
.def rzt=r7
.def rzh=r8
.macro outi
ldi r16,@1
out @0,r16
.endmacro
.org 0
rjmp reset
.org OC1Aaddr
rjmp T1_comp
.org ADCCaddr
rjmp Result
reset:
ldi temp,32
mov ACT,temp
outi ddrd,0xff
outi SPH,High(RamEnd)
outi SPL,Low(RamEnd)
outi ADMUX,0b11000000
outi ADCSR,0b10011110
outi TIMSK,0x10; // 0001 0000
outi OCR1AH,High(5000)
outi OCR1AL,Low(5000)
outi TCCR1B,0x9; // 0000 1001
outi TCNT1H,0x0; // 0000 0000
outi TCNT1L,0x0; // 0000 0000
sei
loop:rjmp loop
T1_comp:
sbi ADCSR,ADSC
reti
Result:
in aL,ADCL ;r0
in aH,ADCH ;r1
; відкидання двох молодших біт із 10 розядів (-> 8 резул.)
clc
ror ah
ror al
clc
ror ah
ror al ; результат залишиться в r18 (r19=0)
;математика
;;****(квадрат і сумування квадратів)
mul al,al ; піднесення в квадрат al (r1;r0 рез)
clr temp
smcvd: ;нагромадження суми квадратів за 32 вимірювання
add ADSL,r0 ;дадаваня мол знач квад.(r0)
adc ADST,r1 ;додавання ст знач квад.(r1)
adc ADSH,temp ;додаваня значення нуль (для врах. переносу)
dec ACT
brne exit
movw rzt:rzl,ADST:ADSL
mov rzh,ADSH
clr ADSL
clr ADST
clr ADSH
ldi temp,32
mov ACT,temp
clr temp
div32:
lsr rzH
ror rzT
ror rzL
inc temp
cpi temp,5
brne div32
movw r3:r2,rzT:rzL ;пересилка суми квадратів за
; 32 виборки до r3:r2
;для добування квадратного кореня
;добування квадратн. кореня, результат в r16 (r17=0)
Sqrt16:
ldi R17,0xc0 ; Rotation mask register
ldi R16,0x40 ; Developing sqrt
clc ; Enter loop with C=0
_sq16_1:
brcs _sq16_2 ; C --> Bit is always 1
cp R3,R16 ; Does value fit?
brcs _sq16_3 ; C --> bit is 0
_sq16_2:
sub R3,R16 ; Adjust argument for next bit
or R16,R17 ; Set bit to 1
_sq16_3:
lsr R17 ; Shift right rotation mask
lsl R2
rol R3 ; Shift left argument, C --> Next sub is MUST
eor R16,R17 ; Shift right test bit in developing sqrt
andi R17,0xfe ; Becomes 0 for last bit
brne _sq16_1 ; Develop 7 bits
brcs _sq16_4 ; C--> Last bit always 1
lsl R2 ; Need bit 7 in C for cpc
cpc R16,R3 ; After this C is last bit
_sq16_4:
adc R16,R17 ; Set last bit if C (R17=0)
;результат знаходиться
;mov r16,r2 ;в end_dat (r16)
out PortD,r16
clr r3
clr r2
exit:
out sreg,r9
reti