|
发表于 2008-1-22 19:44:58
|
显示全部楼层
用2片512K X8 的SRAM做缓存,现在做下来,数据和VB做的有出入,不知道什么问题,大家帮我看看是什么原因:
$regfile = "m128def.dat" ' specify the used micro
$crystal = 16000000
$baud = 9600
$baud1 = 9600
Config Portd = Output
Config Porte.6 = Output
'Config Watchdog = 2048
Config Adc = Single , Prescaler = Auto
Config Timer0 = Timer , Prescale = 256
Config Timer1 = Timer , Prescale = 1024
On Ovf0 Tim1_isr
On Ovf1 Tim1_isr1
Stop Timer0
Stop Timer1
Dim I As Word , Ii As Word , L As Word , J As Word , Jj As Word , K As Word , P As Word , P2 As Word
Dim Tr As Long , Ti As Long , Sin_tab As Long , Cos_tab As Long
Dim B As Word , F As Double , F2 As Double , I1 As Long , I2 As Long , I3 As Long , I4 As Long
Dim Pp(16384) As Xram Integer At &H1100 Overlay
Dim Ad As Integer , Ad_ok As Byte , Ad_num As Word
Dim Pg As Byte , Pg_1 As Byte , Pg_2 As Byte , Pg_0 As Byte
Declare Sub Page(byval Pn As Byte)
Declare Sub Fft()
Open "com2:" For Binary As #2
'Start Watchdog
Print #2 , "init..."
'calc sin_tab,inv_tab
Portd.0 = 0
Portd.1 = 1
F = 0
Page 0
For I = 1 To 16384
F2 = Sin(f)
F2 = F2 * 8192
Tr = F2
Pp(i) = Tr
F = F + 0.000383494873
Next
Page 1
For I = 1 To 16384
P = 0
For J = 0 To 13
K = 2 ^ J
Ii = I - 1
K = Ii And K
If K > 0 Then
L = 13 - J
L = 2 ^ L
P = P + L
End If
Next
Pp(i) = P
Next
Pg = 0
Pg_1 = 2
Pg_2 = 3
Ad_ok = 0
Ad_num = 1
Enable Adc
Enable Interrupts
Enable Ovf0
Enable Ovf1
Load Timer0 , 100
Start Timer0
'Load Timer1 , 20000
'Start Timer1
Print #2 , "done."
Do
If Ad_ok = 1 Then
If Pg = 0 Then
Pg_1 = 2
Pg_2 = 3
Else
Pg_1 = 4
Pg_2 = 5
End If
Ad_ok = 0
Fft
End If
Waitms 100
Loop
End
Tim1_isr:
'Stop Timer0
Ad = Getadc(0)
If Pg = 0 Then
Portd.5 = 1
Portd.6 = 0
Portd.7 = 1
Else
Portd.5 = 1
Portd.6 = 1
Portd.7 = 0
End If
Jj = Ad_num Mod 4
If Jj = 1 Then Ad = 1000 Else Ad = 0
Pp(ad_num) = Ad
Ad_num = Ad_num + 1
If Ad_num >= 16385 Then
If Pg = 0 Then Pg = 1 Else Pg = 0
Ad_num = 1
Ad_ok = 1
Print #2 , "pg=" ; Pg
End If
Portd.5 = Pg_0.0
Portd.6 = Pg_0.1
Portd.7 = Pg_0.2
Load Timer0 , 100
'Start Timer0
Return
Tim1_isr1:
'Print #2 , Ad_num ; "," ; Pg
'Load Timer1 , 20000
Return
Sub Fft()
Set Porte.6
Print #2 , "Invert Sequence."
Page 0
Print #2 , Pp(10)
For I = 1 To 16384
Page 1
J = Pp(i)
If I = 10 Then Print #2 , J
J = J + 1
Page Pg_2
J = Pp(j)
Page Pg_1
Pp(i) = J
Next
Page Pg_2
For I = 1 To 16384
Pp(i) = 0
Next
Print #2 , "FFT."
For L = 1 To 14
J = L - 1
B = 2 ^ J
I = B - 1
For J = 0 To I
K = 14 - L
P = 2 ^ K
P = P * J
P2 = P + 4097
If P2 > 16384 Then P2 = P2 - 16384
Ii = B * 2
B = B + 1
For K = J To 16383 Step Ii
Page 0
Sin_tab = Pp(p + 1)
Cos_tab = Pp(p2)
Page Pg_2
Ti = Pp(k + 1)
Page Pg_1
Tr = Pp(k + 1)
'dr(k + b) * cos_tab(p)/32768
I1 = Pp(k + B)
I1 = I1 * Cos_tab
I1 = I1 / 8192
'Shift I1 , Right , 13
'dr(k + b) * sin_tab(p)/32768
I3 = Pp(k + B)
I3 = I3 * Sin_tab
I3 = I3 / 8192
'Shift I3 , Right , 13
'di(k + b) * sin_tab(p)/32768
Page Pg_2
I2 = Pp(k + B)
I2 = I2 * Sin_tab
I2 = I2 / 8192
'Shift I2 , Right , 13
'di(k + b) * cos_tab(p)/32768
I4 = Pp(k + B)
I4 = I4 * Cos_tab
I4 = I4 / 8192
'Shift I4 , Right , 13
'dr(k) = dr(k) + i1 + i2
'di(k) = di(k) - i3 + i4
'dr(k + b) = tr - i1 - i2
'Di(k + B) = Ti + I3 - I4
'If L = 4 And J = 0 And K = 2640 Then Print #2 , "i1=" ; I1 ; "i2=" ; I2 ; "i3=" ; I3 ; "i4=" ; I4 ; "TR=" ; Tr ; "ti=" ; Ti
Page Pg_1
Sin_tab = Tr
Sin_tab = Sin_tab + I1
Sin_tab = Sin_tab + I2
'Shift Sin_tab , Right , 4
Pp(k + 1) = Sin_tab
Sin_tab = Tr
Sin_tab = Sin_tab - I1
Sin_tab = Sin_tab - I2
'Shift Sin_tab , Right , 4
Pp(k + B) = Sin_tab
Page Pg_2
Cos_tab = Ti
Cos_tab = Cos_tab - I3
Cos_tab = Cos_tab + I4
'Shift Cos_tab , Right , 4
Pp(k + 1) = Cos_tab
Cos_tab = Ti
Cos_tab = Cos_tab + I3
Cos_tab = Cos_tab - I4
'Shift Cos_tab , Right , 4
Pp(k + B) = Cos_tab
Next
Next
Next
Print #2 , "calc sqr"
For I = 1 To 16384
Page Pg_2
Cos_tab = Pp(i)
Cos_tab = Cos_tab ^ 2
Page Pg_1
Sin_tab = Pp(i)
Sin_tab = Sin_tab ^ 2
F = Sin_tab + Cos_tab
'If Sin_tab > 0 Then Print #2 , I ; "=" ; Sin_tab
'Pp(i) = Sqr(f)
Next
'Print #2 , "calc max"
'B = 0
'P = 0
'For I = 0 To 127
' L = 0
' Page Pg_1
' For J = 0 To 63
' K = I * 64
' K = K + J
' L = L + Pp(k + 1)
' Next
' L = L / 64
' Page Pg_2
' Pp(i + 1) = L
'
' If L > B Then B = L : P = I
'Next
'Print #2 , "max=" ; B ; ",index=" ; P
Reset Porte.6
End Sub
Sub Page(byval Pn As Byte)
Pg_0 = Pn
Portd.5 = Pn.0
Portd.6 = Pn.1
Portd.7 = Pn.2
'If Pn.3 = 0 Then
' Portd.0 = 0
' Portd.1 = 1
'Else
' Portd.0 = 1
' Portd.1 = 0
'End If
End Sub |
|