proton+ DWORD den büyük sayılar nasıl işlenir

Başlatan mikro29, 29 Eylül 2012, 18:58:16

mikro29

s.a.
Proton+ da Dword den büyük sayıları nasıl işleyebiliriz. 32 bitten büyük sayılar.




muhittin_kaplan

o kadar büyük sayıyla hiç işim olmadı ama eğer lazım olsaydı 2x32bit lik işlem yapmaya çalışırdım. yani
dim LowDouble as double
dim HighDouble as double
gibi yapardım
buna neden ihtiyaç duyuyorsunuz?

mikro29

#2
AD9851 keypadli sinyal generatoru yapmaya çalışıyorum.  Veriyi seri gönderiyorum.
sonuc = ( frek / 4294967296 ) * 180000000
frek 100kHz den büyük olunca "sonuc" değişkenine sığmıyor

bunu denedim,
sonuc = frek /0.006984919311
yine olmadı, float hiç tutmuyor

Gönderdiğim hex burdakini tam tutmuyor http://designtools.analog.com/dt/dds/ad9851.html#troubleshooting

düşük frekanslarda problem yok gibi ama kHz lerde Hz sapma oluyor
yardımlarınızı bekliyorum

komut bu şekildemi kullanılacak
Dim frek As Dword
Dim sonuc As Dword
Dim LowDouble As sonuc
Dim HighDouble As sonuc

frek =123456
sonuc = frek /0.006984919311
Print At 2,0,Dec HighDouble
Print At 3,0,Dec LowDouble



mikro29

s.a.
130 gösterim var cevap yok çok zor bir soru sordum herhalde. Muhittin hocam konuyla alakalı basit bir örnek verebilirmisiniz.

muhittin_kaplan

doğru yerde doğru değişken

Device 16F877A
Xtal 4

Dim frek As Dword
Dim temp As Float
Dim Sonuc As Float

frek =123456
temp = frek /6.984919311   ;verdiğinin sayıyı sağacak bir şekilde uyarladım 1000 ile çarptım
Sonuc=temp/1000               ;gerçek sonuç için 1000 e böldüm

Stop


ama ne yapmak istediğini anladım.

ayrıca help de alıntıyı kontrol ediniz.

Alıntı YapDECLARE FLOAT_DISPLAY_TYPE = LARGE or STANDARD
By default, the compiler uses a relatively small routine for converting floating point values to decimal, ready for RSOUT, PRINT, STR$ etc. However, because of its size, it does not perform any rounding of the value first, and is only capable of converting relatively small values. i.e. approx 6 digits of accuracy. In order to produce a more accurate result, the compiler needs to use a larger routine. This is implemented by using the above DECLARE. Using the LARGE model for the above DECLARE will trigger the compiler into using the more accurate floating point to decimal routine. Note that even though the routine is larger than the standard converter, it actually operates much faster. The compiler defaults to STANDARD if the DECLARE is not issued in the BASIC program.


mikro29

#5
Sizin verdiğiniz kodu denemedim
amacım genliği ayarlanabilir 0-125MHz sinyal jeneratörü yapmak. Easypic5 deniyorum simulasyon yok. Denemek için önceden yazdığım tam kod,
frekans 12345678 Hz olunca hata veriyor.


Device = 18F452
Declare Xtal = 10
'Declare PLL_Req = On    '40Mhz
'Config HS_OSC,WDT_OFF,PWRTE_ON,BODEN_OFF,LVP_OFF,DEBUG_OFF,CP_ALL
Warnings = OFF
Config_Start
   OSC = HSPLL; HS
   'OSC = HS; HS
   OSCS = OFF ; Disabled
   PWRT = On ; Enabled
   BOR = OFF ; Disabled
   WDT = OFF ; Disabled
   STVR = OFF ; Disabled
   LVP = OFF ; Disabled
   CP0 = OFF ; Disabled
   CP1 = OFF ; Disabled
   CP2 = OFF ; Disabled
   CP3 = OFF ; Disabled
   CPB = OFF ; Disabled
   CPD = OFF ; Disabled
   WRT0 = OFF ; Disabled
   WRT1 = OFF ; Disabled
   WRT2 = OFF ; Disabled
   WRT3 = OFF ; Disabled
   WRTB = OFF ; Disabled
   WRTC = OFF ; Disabled
   WRTD = OFF ; Disabled
   EBTR0 = OFF ; Disabled
   EBTR1 = OFF ; Disabled
   EBTR2 = OFF ; Disabled
   EBTR3 = OFF ; Disabled
   EBTRB = OFF ; Disabled
Config_End
'        76543210
TRISA = %00000001
TRISB = %01110000
TRISC = %00000000
TRISD = %00000000
TRISE = %00000000

PORTA = %00000000
PORTB = %00000000
PORTC = %00000000
PORTD = %00000000
PORTE = %00000000


'ADC AYARLARI
ADCON1=%10000100   ' A0,A1 VE A3 ANALOG
Declare Adin_Res   10
Declare Adin_Tad   FRC
Declare Adin_Stime   50

'Declare All_Digital= TRUE                  'ADC PORTLARININ TAMAMI DİJİTAL GİRİŞ VEYA ÇIKIŞ
Declare LCD_DTPort = PORTD                
Declare LCD_RSPin = PORTC.5               
'Declare LCD_RSTPin = PORTC.5
Declare LCD_ENPin = PORTC.3               
Declare LCD_RWPin = PORTC.4                
Declare LCD_CS1Pin = PORTC.6            
Declare LCD_CS2Pin = PORTC.7               
Declare LCD_Type =  graphic                
Declare Internal_Font = On
Declare Font_Addr = 0
Declare Warnings = On
Declare GLCD_STROBE_DELAY 100
PortB_Pullups = Off 

Declare Float_Display_Type = LARGE

'Declare GLCD_CS_INVERT On
'Declare Float_Display_Type = Fast		
Cls                                 'GLCD EKRANINI TEMİZLE
'AD9851 DEĞİŞKENLERİ
Dim frek As Dword
Dim sonuc As Dword
Dim tbin As Dword
Dim coz As Float
Dim z[4] As Word
Dim TUS As Byte

Dim LowDouble As sonuc
Dim HighDouble As sonuc

'ANALOG DEĞİŞKENLERİ
Dim HAM1 As Word
Dim HAM2 As Float

'AD9851 AYARLARI
Dim DDS_CLK As PORTE.2
Dim DDS_SI  As PORTE.1
Dim DDS_CS  As PORTE.0

'MCP41010 AYARLARI
Dim MCP_CLK As PORTC.0
Dim MCP_SI  As PORTC.1
Dim MCP_CS  As PORTC.2
Dim MCP_SAYI As Byte

'TUŞ TAKIMI DEĞİŞKENLERİ
Dim SAYI As Dword
Dim TEMP As Byte

'TUŞ TAKIMI
Dim YTY1 As PORTB.0
Dim YTY2 As PORTB.1
Dim YTY3 As PORTB.2
Dim YTY4 As PORTB.3
Dim DKY1 As PORTB.4
Dim DKY2 As PORTB.5
Dim DKY3 As PORTB.6

'Dim X As Word
'Dim Y As Word

coz=0.006984919311
'MCP_SAYI = 0
TEMP     = 0
frek     = 0
TUS      = 0
SAYI     = 0
sonuc    = 0
z[0] = 0
z[1] = 0
z[2] = 0
z[3] = 0
'Clear
DelayMS 500
Cls 
' glcd resim basma
Dim  Xpos    As Byte
Dim  Ypos    As Byte
Dim  Addr    As Word
Dim  char    As Byte 

         For Ypos = 0 To 7
          For Xpos = 0 To 127
             Addr = (Ypos*128)+Xpos
             char = CRead deneme+Addr
             LCDWrite Ypos,Xpos,[char]
         Next
     Next

     DelayMS 6000
     Cls
BASLA: '*********************** PROGRAM BAŞLANGICI  ***************************
ADCIN 0,HAM1 ' 0. KANALDAN ANALOG
HAM2=HAM1
HAM2=HAM2 + 1
HAM2=HAM2 * 5 /1024

MCP_SAYI = MCP_SAYI + 1 ' DENEMEK İÇİN MCP SAYISI ARTIR
If MCP_SAYI = 255 Then
MCP_SAYI = 0
Cls
EndIf
'****************************     TUŞ TARAMA  *******************************
High YTY1
If DKY1 = 1 Then TUS = 1  : GoSub hesapla : While DKY1 = 1 : Wend
If DKY2 = 1 Then TUS = 2  : GoSub hesapla : While DKY2 = 1 : Wend
If DKY3 = 1 Then TUS = 3  : GoSub hesapla : While DKY3 = 1 : Wend
DelayMS 10
Low YTY1

High YTY2
If DKY1 = 1 Then TUS = 4 : GoSub hesapla  : While DKY1 = 1 : Wend
If DKY2 = 1 Then TUS = 5 : GoSub hesapla  : While DKY2 = 1 : Wend
If DKY3 = 1 Then TUS = 6 : GoSub hesapla  : While DKY3 = 1 : Wend
DelayMS 10
Low YTY2

High YTY3
If DKY1 = 1 Then TUS = 7 : GoSub hesapla  : While DKY1 = 1 : Wend
If DKY2 = 1 Then TUS = 8 : GoSub hesapla  : While DKY2 = 1 : Wend
If DKY3 = 1 Then TUS = 9 : GoSub hesapla  : While DKY3 = 1 : Wend
DelayMS 10
Low YTY3

High YTY4
If DKY2 = 1 Then TUS = 0 : GoSub hesapla : While DKY2 = 1 : Wend
If DKY1 = 1 Then GoSub yildiz :While DKY1 = 1 : Wend '* tuşu
If DKY3 = 1 Then GoSub diyez : While DKY3 = 1 :  Wend'# tuşu
DelayMS 10
Low YTY4

'MCP41010 VERİ GÖNDERME
SHOut MCP_SI,MCP_CLK,1,[%00010001,MCP_SAYI]
PulsOut MCP_CS,3

'EKRAN_YAZ:
Print At 0,0,"frk.  :",Dec frek
Print At 0,15,"Hz"
Print At 1,0,"sonuc :",Dec sonuc',"sonuc = frek /coz"
Print At 2,0,"hex   :",Inverse 1,Hex2 z[0],Hex2 z[1],Hex2 z[2],Hex2 z[3],Inverse 0
Print At 3,0,"SAYI  :",# SAYI
Print At 4,0,"MCP   :",Dec MCP_SAYI
Print At 6,1,Dec2 HAM2 ," Volt"
Print At 7,1,Dec8 coz
'RETURN
 
DelayMS 100
GoTo BASLA

hesapla:
TEMP=TUS
SAYI = (SAYI * 10) + TEMP
TEMP=0
'tus = 0
Return

DDS_GONDER: ' AD9851 HESAPLAMA VERİ GÖNDERME
frek = SAYI  
'sonuc = ( frek / 4294967296 ) * 180000000 
  
sonuc = frek /coz
z[0] = (sonuc.0*128)+(sonuc.1*64)+(sonuc.2*32)+(sonuc.3*16)+(sonuc.4*8)+(sonuc.5*4)+(sonuc.6*2)+(sonuc.7*0)
z[1] = (sonuc.8*128)+(sonuc.9*64)+(sonuc.10*32)+(sonuc.11*16)+(sonuc.12*8)+(sonuc.13*4)+(sonuc.14*2)+(sonuc.15*0)
z[2] = (sonuc.16*128)+(sonuc.17*64)+(sonuc.18*32)+(sonuc.19*16)+(sonuc.20*8)+(sonuc.21*4)+(sonuc.22*2)+(sonuc.23*0)
z[3] = (sonuc.24*128)+(sonuc.25*64)+(sonuc.26*32)+(sonuc.27*16)+(sonuc.28*8)+(sonuc.29*4)+(sonuc.30*2)+(sonuc.31*0)

''AD9851 VERİ GÖNDER
'SHOut DDS_SI,DDS_CLK,1,[z[0],z[1],z[2],z[3],0]
PulsOut DDS_CS,3
SAYI = 0
Cls
Return
'CWrite 10,[frek] 
diyez:
GoSub DDS_GONDER
SAYI = 0 : TEMP = 0
Return

yildiz:
SAYI = 0 : TEMP = 0
Cls
Return

End  ' ************************* PROGRAM SONU **********************************
Stop
Include "font.inc"
Include "deneme.inc"

muhittin_kaplan


mikro29

Hocam düşük frekanslarda (örnek : 100Hz de 5-10Hz sapma oluyor) frekans 10KHz de 100-500Hz arası sapma oluyor, yani frekans yükseldikçe iyice sapıyor. MHz  kademesinde çalışmıyor. sonuc değişkenine dword yetmiyor


mikro29


Maxim


mikro29

yok hocam halen araştırıyorum, uğraşıyorum

muhittin_kaplan

mikro sorun hesaplamada mı yoksa bu hesplama sonucunda çıkan değerein gönderilmesi   vs mi ?

mikro29


muhittin_kaplan

DDS_GONDER: ' AD9851 HESAPLAMA VERİ GÖNDERME
frek = SAYI  
'sonuc = ( frek / 4294967296 ) * 180000000 
  
sonuc = frek /coz
z[0] = (sonuc.0*128)+(sonuc.1*64)+(sonuc.2*32)+(sonuc.3*16)+(sonuc.4*8)+(sonuc.5*4)+(sonuc.6*2)+(sonuc.7*0)
z[1] = (sonuc.8*128)+(sonuc.9*64)+(sonuc.10*32)+(sonuc.11*16)+(sonuc.12*8)+(sonuc.13*4)+(sonuc.14*2)+(sonuc.15*0)
z[2] = (sonuc.16*128)+(sonuc.17*64)+(sonuc.18*32)+(sonuc.19*16)+(sonuc.20*8)+(sonuc.21*4)+(sonuc.22*2)+(sonuc.23*0)
z[3] = (sonuc.24*128)+(sonuc.25*64)+(sonuc.26*32)+(sonuc.27*16)+(sonuc.28*8)+(sonuc.29*4)+(sonuc.30*2)+(sonuc.31*0)


burada mı ?
eğer buradaysa sanki bir terslik var gibi. neden her byte ın en düşük değerlikli birini 128 le en yüksek değerlikli bitini 0 la çarpıyorsun (0 neden çarpıyorsun orayıda anlatırsan sevinirim.)