Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

degisken atama

Başlatan , 17 Eylül 2003, 00:35:50

Selam;
pic basic plus 1.24 kullanıyorum G isimli DWORD degiskeni X isimli FLOAT bir baska degiskene gecirdigim zaman cok alakasız bir seyle karsılasıyorum ornegin G de 5005 olarak kayıtlı datayı X e aktartıgımda 5.92143e-039 olarak geciyor bunu hic bozmadan aynen X e nasıl aktara bilirim ondalıklı matematik islemi yapıcam mecburen floata gecmek zorundayım ben X=G olarak yapıyorum
sımdıden cok sagolun

mmengi

Include "PROTON_G4.INT"
     
     
       Dim X      as   float
       Dim   z      as   float
      Dim   d      as   dword
      d=5005
      x=d
      z=d/5.16
      

       Cls
     
      print at 0,0,dec4 d
      print at 1,0,dec7 x
      print at 2,0,dec7 z        
      end
       
      Include "FONT.INC"

dostum yukarıdaki işlemin sonuçları şunlar:

5005
5005.0000000
969.9612426

demek istediğin bu muydu bende böyle oluyor.

kolay gelsin

evet demek ıstedıgım bu yanlız neden bılmem d=x dedıgım zaman x oraya aynen gecmıyor tamam prınt esnasında ekrana dec olarak yazdırınca dogru yazıyor ama degısken aslında abuk subuk bır sey ıcerıyor

mmengi

dostum yukarıdaki örnekte 5005 rakamı normal okunabiliyor varsayalım öyle görünüyorda aslında abuk bir şey ama bu rakamı 5.16 ya böldüğünde sonuç düzgün çıkıyor peki aslında bu çıkan sonuçta ekranda düzgün ama aslında abuk bir sonuç peki bunun böyle olduğunu nasıl anlayacağız yani sen bu sacma değerleri nasıl okuyorsun elindeki örneği yazarsan ordan inceleyelim. rakamları ondalıklı olarak göstermek istiyorsan DEC olarak yazdırman gerekiyor.

kolay gelsin.

olay su sekılde ceyran edıyoz yazdıgım programın devresını proteusta tasarladım ve devreyı step step calıstırırken ramdekı degısken degerlerını gorebılıyorsun bu esnada dword olan degıskende dogru degerı goruyordun ama bunu floata aktardıgın zaman alakasız bır sey olarak gıdıyor ama asıl deger o olmadıgı ıcın matematık ıslemı yaptıgında sonuc yanlıs cıkıyor ama ılk degerı ekrana dec olarak yazdırırsan dogru yazıyor sonra matemeık ıslemı yapılmıs sekılde bastırırsan acayıp kusuratlı cıkıyor
sorun bu

mmengi

dostum seni anlamak istiyorum fakat zorlanıyorum. ben yukarıdakinde daha komplike işlemleri yaptırıyorum ama bahsettiğin gibi bir şey olmuyor. yaptığın şeyi örnek olarak burada yazarsan bende deneyip bakayım.float veya dword olsun bunlar tek bir adreste saklanmıyor dword ve float için 4 adet 1bytlık değişken kullanılıyor. sen bunları bir araya getiripte hesaplarken bir hata yapıyor olabilirmisin.

kolay gelsin

sıze yazdıgım tam kodu gonderıyorum

DEVICE = 16F877
      XTAL = 20

'SABIT VE DEGISKEN TANIMLARI
         DIM X  AS FLOAT                'GIDILECEK X DEGERI
      DIM Y  AS FLOAT               'GIDILECEK Y DEGERI
      DIM X1 AS FLOAT               'O ANDAKI X DEGERI
      DIM Y1 AS FLOAT               'O ANDAKI Y DEGERI
      DIM A  AS FLOAT               'EKSEN SABITI DEGISKENI
      DIM G  AS FLOAT              'SERI PORT GECICI DATASI
      SYMBOL XSW = PORTB.0         'X SIFIR SWITCH
      SYMBOL YSW = PORTB.1         'Y SIFIR SWITCH
      SYMBOL XYON = PORTB.2         'X YON SECICI
      SYMBOL YYON = PORTB.3         'Y YON SECICI
      SYMBOL XH = PORTB.4            'X HAREKET
      SYMBOL YH = PORTB.5            'Y HAREKET
      SYMBOL ZT = PORTB.6            'Z DONME
      SYMBOL ZD = PORTB.7            'Z DELME
      A =0.005                    'EKSEN HAREKET SABITI
      TRISB = %00000011            'STEP MOTOR VE SWITCH PORTLARI

'LCD TANIMLARI
       LCD_DTPORT = PORTD
      LCD_RSPIN = PORTC.0
      LCD_ENPIN = PORTC.1
      LCD_TYPE = 0
      LCD_LINES = 2
      LCD_INTERFACE = 8

'SERI PORT TANIMLARI   
         DECLARE SERIAL_DATA 8
      
ACILIS:   PRINT AT 1 , 1, "CREATED BY"
      PRINT AT 2 , 5 , "!*FITSUK*!"
      DELAYMS  200
      CLS
SIFIR:   IF XSW = 0 THEN
      XYON = 0
      PULSOUT XH , 10 , HIGH
      ENDIF
      IF YSW = 0 THEN
      YYON = 0
      PULSOUT YH , 10 , HIGH
      GOTO SIFIR
      ELSE
      GOTO SIFIR2
      ENDIF

SIFIR2:   IF XSW & YSW = 1 THEN
      CLEAR X1
      Y1 = 0
      
      ENDIF
      PRINT AT 1,1, "X=" ,DEC3 X1 , "th"
      PRINT AT 2,1, "Y=" ,DEC3 Y1 , "th"

SER_AL:   SERIN PORTC.7\PORTC.6 , 6 , [G]
      G=0
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      G=0
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      G=(G-48)*100000
      X=X+G
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      G=(G-48)*10000
      X=X+G
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      G=(G-48)*1000
      X=X+G
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      G=(G-48)*100
      X=X+G
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      G=(G-48)*10
      X=X+G
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      X=X+(G-48)
      X=X/10      
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      G=0
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      G=0
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      G=(G-48)*100000
      Y=Y+G
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      G=(G-48)*10000
      Y=Y+G
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      G=(G-48)*1000
      Y=Y+G
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      G=(G-48)*100
      Y=Y+G
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      G=(G-48)*10
      Y=Y+G
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      Y=Y+(G-48)
      Y=Y/10      
      SERIN PORTC.7\PORTC.6 , 6 , [G]
      ZD=1      
HESAP:   IF X>X1   THEN
      X1=X1+A
      XYON=1
      PULSOUT XH,1,HIGH
      ENDIF
      IF X<X1   THEN
      X1=X1-A
      XYON=0
      PULSOUT XH,1,HIGH
      ENDIF
      IF Y>Y1   THEN
      Y1=Y1+A
      YYON=1
      PULSOUT YH,1,HIGH
      ENDIF
      IF Y<Y1   THEN
      Y1=Y1-A
      YYON=0
      PULSOUT YH,1,HIGH
      ENDIF
      PRINT AT 1,1,"X=",DEC3 X1,"th"
      PRINT AT 2,1,"Y=",DEC3 Y1,"th"      
      IF X<>X1 THEN
      GOTO HESAP
      ENDIF
      IF Y<>Y1 THEN
      GOTO HESAP
      ENDIF
DELIK:   PULSOUT ZD,300,HIGH                      
      CLS
      PRINT AT 1,3,"DELIYOR"
      GOTO SER_AL