Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

matematik işlemi

Başlatan MCansız, 12 Kasım 2013, 01:15:22

MCansız

arkadaşlar mpx4115 sensör ile okuduğum veriyi çevirmem gerekiyor bunun içinde aşağıdaki matematik işlemini yapacam

e=((bar + 5* 0.095)/(5 * 0.009))

ama proton bu işlemi bir anda yapamayıp hata veriyor bunu için ek değişkenler kullanmam gerekiyor kullandığım versiyon 3.2.5.5



c tabanlı dillerde bu işlem bir tek bir seferde yapılıyor üst versiyonda bu sıkıntı varmı yoksa artık protonu bırakma zamanı geldimi  :o

BASINC:

 HAM1=ADIn 0
 DelayMS 2
 bar= HAM1*0.0048828125
 e=((bar + 5* 0.095)/(5 * 0.009))
 
Return
       

OG

#1
3 ten fazla işlem yapma, işlemi böl.
a= 5* 0.095      işlemini yapıp bir değişkene yukle , degişkenler float,
b = 5 * 0.009
c = (bar + a) / b

C ile de yazsan senin parçaladığın işlemi derleyici yapacaktır, ürettiği kod çok farklı olacağını sanmıyorum.
Diye düşünüyorum.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

z

Eger derleyici akilli bir sey değilse

e=((bar + 5* 0.095)/(5 * 0.009))

yerine asagidaki ifadeyi yazmak

e=(bar*22.2222) + 10.55555  islemciyi daha az yorar.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

pwm.c

Proton 3.5.5.5 ile yapılmış işlemler ve test sonuçlarını hazırladım.

resimlerdeki gördüğünüz üsteki test edilen komut, ortadaki derleme sonucu kaplanan hafızalar, alttaki proteustaki lcd sonuçları, osiloskop ise test edilen işlem komutunun toplam işleme süresi.

   

en hesaplısı Z'nin işlemi gibi görünüyor.
_/\/\/\_ -[ı- -ı>|- -|ı|ı|ı- -ı< -||- -l[]l-

Tagli

z'nin dediği doğru ancak ben aptal bir derleyiciden bile "e=((bar + 5* 0.095)/(5 * 0.009))" ifadesindeki çarpma işlemlerini sabit (literal) çarpımı olarak değerlendirip derleme anında yapmasını beklerdim.
Gökçe Tağlıoğlu

Maxim

proton aynı anda (tek satırda) 3 matemetik işlemi yapmıyor

*çok eski versiyonlarında vardı, kaldırdılar.

OG

Alıntı Yap*çok eski versiyonlarında vardı, kaldırdılar.
Herkes yeni versiyonda daha iyisini yapar, Les geri geri gidiyor  ;) İhtiyarladı artık.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

MCansız

herkese teşekkürler

Alıntı yapılan: Tagli - 12 Kasım 2013, 10:20:31
z'nin dediği doğru ancak ben aptal bir derleyiciden bile "e=((bar + 5* 0.095)/(5 * 0.009))" ifadesindeki çarpma işlemlerini sabit (literal) çarpımı olarak değerlendirip derleme anında yapmasını beklerdim.

sana katılıyorum Tagli

neyse programı z hocanın dediği gibi yaptım basınç nem ve sıcaklık pic18f4550 ile ileride usb ye çeviricem

nem ölçümünde hata payı yüksek sebebinin matematik işleminden kaynaklandığını düşünüyorum ileride bakıcam şimdilik idare ediyorum

örnek proje



'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 08.11.2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device 18F4550
' CONFIG_START
'        FOSC = HSPLL_HS    ; HS Oscillator
'        FCMEN   = On      ; Failsafe Clock Monitor enbled
'        IESO   = On      ; Int/Ext Oscillator Switch Over enabled
'        PLLDIV = 5          ' Divide by 5 (20MHz input)
'        USBDIV = 2          ' Clock source from 96MHz PLL/2
'        CPUDIV = OSC1_PLL2 '  [OSC1/OSC2 Src: /1][96MHz PLL Src: /2]
'        PWRT   = On      ; Power Up Timer Enabled
'        BOR = OFF             ; Brownout Reset Disabled
'        WDT      = OFF      ; Watchdog Timer Disabled
'        WDTPS   = 1         ; Watchdog Postscaler: 1:1
'        MCLRE   = On      ; MCLR Enabled
'        LPT1OSC   = On      ; T1 Oscillator Disabled
'        PBADEN   = OFF      ; Port B A/D Enable Port B<4:0> digital on RESET
'        CCP2MX = OFF             ; CCP2 Mux Muxed with RC1
'        STVREN   = On      ; Stack Overflow Reset Enabled
'        LVP      = OFF      ; Low Voltage ICSP Disabled
'        XINST   = OFF      ; XINST Disabled
'        Debug   = OFF      ; Background Debugger Disabled
'        CP0      = OFF       ; Code Protection Block 0 Disabled
'        CP1      = OFF       ; Code Protection Block 1 Disabled
'        CP2      = OFF       ; Code Protection Block 2 Disabled
'        CP3      = OFF       ; Code Protection Block 3 Disabled
'        CPB      = OFF       ; Boot Block Code Protection Disabled
'        CPD      = OFF       ; Data EEPROM Code Protection Disabled
'        WRT0   = OFF       ; Write Protection Block 0 Disabled
'        WRT1   = OFF       ; Write Protection Block 1Disabled
'        WRT2   = OFF       ; Write Protection Block 2 Disabled
'        WRT3   = OFF       ; Write Protection Block 3 Disabled
'        WRTB   = OFF       ; Boot Block Write Protection Disabled
'        WRTC   = OFF       ; Configuration Register Write Protection Disabled
'        WRTD   = OFF       ; Data EEPROM Write Protection Disabled
'        EBTR0   = OFF       ; Table Read Protection Block 0 Disabled
'        EBTR1   = OFF       ; Table Read Protection Block 1 Disabled
'        EBTR2   = OFF       ; Table Read Protection Block 2 Disabled
'        EBTR3   = OFF       ; Table Read Protection Block 3 Disabled
'        EBTRB   = OFF       ; Boot Block Table Read Protection Disabled
' CONFIG_END

XTAL 4
ADCON1 = %11001110      ' D D D D D D D A   VDD VSS   1/0     sadece analog 0 giriş
ADCON2.7 =1                   'adc 10bit sağa dayalı
ADIN_RES 10                    'ADC ÇÖZÜNÜRLÜĞÜ 10 BİT 0...1023
ADIN_TAD FRC
ADIN_STIME 50
   
FLASH_CAPABLE = FALSE
LCD_DTPIN PORTB.4 
LCD_ENPIN PORTB.3
LCD_RSPIN PORTB.2
LCD_INTERFACE = 4
LCD_LINES = 4
LCD_COMMANDUS = 2000
LCD_DATAUS = 50



;TRISA = 255                              
 
;***************** değişkenler
  Dim  KONTROL As     Byte	   
  
  Dim  HAM		As	    DWord
  Dim  H0      As     HAM.LowByte
  Dim  H1      As     HAM.HighByte 
  Dim  W       As     Word
  Dim  CLK     As     PORTB.0
  Dim  DTA     As     PORTB.1  
  
 
  
  Dim XX       As     Float
  Dim NEM      As     DWord
  Dim a As     DWord
  Dim b As Float
  Dim c As Float
  Dim d As Float
  Dim HAM1 As Float
  Dim bar As Float
  Dim e As Float
  Dim f As Word
  
;****************************************************************  
Clear
DelayMS 200


GoSub RESETsen :GoSub T_START
main:
  
  KONTROL=%00000011:HAM=0   'SICAKLIK ÖLÇME
    GoSub OLCUMAL
    GoSub ISI_HESAP
    GoSub ekran
  
  KONTROL=%00000101:HAM=0   'NEM ÖLÇME
   GoSub OLCUMAL
   GoSub RUT_HESAP
   GoSub ekran
   GoSub BASINC
GoTo main

OLCUMAL: GoSub T_START
        SHOut DTA,CLK,1,[KONTROL]
        Input DTA
        PulsOut CLK,10
        
        For W=0 To 65500
           If DTA=0 Then EXIT
        Next W
       
EXIT:  
       SHIFTIN DTA,CLK,0,[H1]
       Output DTA
       Low DTA
       PulsOut CLK,10
       Input DTA
       SHIFTIN DTA,CLK,0,[H0]
       PulsOut CLK,10
       Return

ekran:

Print At 1,1,"DATA     : " ,Dec HAM
Print At 2,1,"SICAKLIK : " ,Dec XX ," C"
Print At 3,1,"NEM      : % " ,Dec NEM                            
Print At 4,1,"BASINC   : ",Dec bar ," kPa"

Return



T_START:
        Output DTA:Output CLK
        High DTA
        Low CLK
        DelayMS 1
        High CLK
        Low DTA
        DelayMS 1
        Low CLK
        DelayMS 1
        High CLK
        DelayMS 1
        High DTA
        Low CLK
        Return
        
RESETsen:  Output DTA:Output CLK':TRISA.0=0:TRISA.1=0'
        High DTA
        For W=0 To 9
        High CLK
        DelayMS 1
        Low CLK
        Next W
        Return
        
ISI_HESAP:
 
 XX = 0.01*HAM - 40.1       

Return

RUT_HESAP:
 NEM=0
 a = HAM * HAM
 b = 0.0367 * HAM
 c = 2.0468 + b  
 d = c + a*(-0.00000015955)
; NEM = 2.0468 + (0.0367 * ham)+( a )' * (0.00000015955) )
 NEM = d
Return




BASINC:

 HAM1=ADIn 0
 DelayMS 2
 e= HAM1*0.0048828125

 
 bar=(e*22.2222) + 10.55555
Return
                         


z

Displeyde değerleri noktadan sonra bir hane göstersen hem daha anlamlı hem de daha yakışıklı görünür.
Bana e^st de diyebilirsiniz.   www.cncdesigner.com

MCansız

Alıntı yapılan: z - 12 Kasım 2013, 16:20:09
Displeyde değerleri noktadan sonra bir hane göstersen hem daha anlamlı hem de daha yakışıklı görünür.

yeni düzenlemeler



'****************************************************************
'*  Name    : UNTITLED.BAS                                      *
'*  Author  : [select VIEW...EDITOR OPTIONS]                    *
'*  Notice  : Copyright (c) 2013 [select VIEW...EDITOR OPTIONS] *
'*          : All Rights Reserved                               *
'*  Date    : 08.11.2013                                        *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*          :                                                   *
'****************************************************************
Device 18F4550
' CONFIG_START
'        FOSC = HSPLL_HS    ; HS Oscillator
'        FCMEN   = On      ; Failsafe Clock Monitor enbled
'        IESO   = On      ; Int/Ext Oscillator Switch Over enabled
'        PLLDIV = 5          ' Divide by 5 (20MHz input)
'        USBDIV = 2          ' Clock source from 96MHz PLL/2
'        CPUDIV = OSC1_PLL2 '  [OSC1/OSC2 Src: /1][96MHz PLL Src: /2]
'        PWRT   = On      ; Power Up Timer Enabled
'        BOR = OFF             ; Brownout Reset Disabled
'        WDT      = OFF      ; Watchdog Timer Disabled
'        WDTPS   = 1         ; Watchdog Postscaler: 1:1
'        MCLRE   = On      ; MCLR Enabled
'        LPT1OSC   = On      ; T1 Oscillator Disabled
'        PBADEN   = OFF      ; Port B A/D Enable Port B<4:0> digital on RESET
'        CCP2MX = OFF             ; CCP2 Mux Muxed with RC1
'        STVREN   = On      ; Stack Overflow Reset Enabled
'        LVP      = OFF      ; Low Voltage ICSP Disabled
'        XINST   = OFF      ; XINST Disabled
'        Debug   = OFF      ; Background Debugger Disabled
'        CP0      = OFF       ; Code Protection Block 0 Disabled
'        CP1      = OFF       ; Code Protection Block 1 Disabled
'        CP2      = OFF       ; Code Protection Block 2 Disabled
'        CP3      = OFF       ; Code Protection Block 3 Disabled
'        CPB      = OFF       ; Boot Block Code Protection Disabled
'        CPD      = OFF       ; Data EEPROM Code Protection Disabled
'        WRT0   = OFF       ; Write Protection Block 0 Disabled
'        WRT1   = OFF       ; Write Protection Block 1Disabled
'        WRT2   = OFF       ; Write Protection Block 2 Disabled
'        WRT3   = OFF       ; Write Protection Block 3 Disabled
'        WRTB   = OFF       ; Boot Block Write Protection Disabled
'        WRTC   = OFF       ; Configuration Register Write Protection Disabled
'        WRTD   = OFF       ; Data EEPROM Write Protection Disabled
'        EBTR0   = OFF       ; Table Read Protection Block 0 Disabled
'        EBTR1   = OFF       ; Table Read Protection Block 1 Disabled
'        EBTR2   = OFF       ; Table Read Protection Block 2 Disabled
'        EBTR3   = OFF       ; Table Read Protection Block 3 Disabled
'        EBTRB   = OFF       ; Boot Block Table Read Protection Disabled
' CONFIG_END

XTAL 4
ADCON1 = %11001110      ' D D D D D D D A   VDD VSS   1/0     sadece analog 0 giriş
ADCON2.7 =1                   'adc 10bit sağa dayalı
ADIN_RES 10                    'ADC ÇÖZÜNÜRLÜĞÜ 10 BİT 0...1023
ADIN_TAD FRC
ADIN_STIME 50
   
FLASH_CAPABLE = FALSE
LCD_DTPIN PORTB.4 
LCD_ENPIN PORTB.3
LCD_RSPIN PORTB.2
LCD_INTERFACE = 4
LCD_LINES = 4
LCD_COMMANDUS = 2000
LCD_DATAUS = 50



;TRISA = 255                              
 
;***************** değişkenler
  Dim  KONTROL  As Byte	   
  Dim  HAM	    As DWord
  Dim  H0       As HAM.LowByte
  Dim  H1       As HAM.HighByte 
  Dim  W        As Word
  Dim  CLK      As PORTB.0
  Dim  DTA      As PORTB.1  
  Dim ISI       As Float
  Dim NEM       As DWord
  Dim a         As DWord
  Dim b         As Float
  Dim c         As Float
  Dim d         As Float
  Dim HAM1      As Float
  Dim bar       As Float
  Dim e         As Float
  Dim f         As Word
  
;****************************************************************  
Clear
DelayMS 200


GoSub RESETsen :GoSub T_START
main:
 
  KONTROL=%00000011:HAM=0   'SICAKLIK ÖLÇME
    GoSub OLCUMAL
    GoSub ISI_HESAP
    GoSub ekran
  
  KONTROL=%00000101:HAM=0:NEM=0   'NEM ÖLÇME
   GoSub OLCUMAL
   GoSub RUT_HESAP
   GoSub BASINC
   GoSub ekran

GoTo main

OLCUMAL: GoSub T_START
        SHOut DTA,CLK,1,[KONTROL]
        Input DTA
        PulsOut CLK,10
        
        For W=0 To 65500
           If DTA=0 Then EXIT
        Next W
       
EXIT:  
       SHIFTIN DTA,CLK,0,[H1]
       Output DTA
       Low DTA
       PulsOut CLK,10
       Input DTA
       SHIFTIN DTA,CLK,0,[H0]
       PulsOut CLK,10
       Return

ekran:

Print At 1,1,"SHT11DATA : " ,Dec HAM
Print At 2,1,"SICAKLIK  : " ,DEC1 ISI ," C"
Print At 3,1,"NEM       : % " ,Dec NEM                            
Print At 4,1,"BASINC    : ",DEC1 bar ," kPa"

Return



T_START:
        Output DTA:Output CLK
        High DTA
        Low CLK
        DelayMS 1
        High CLK
        Low DTA
        DelayMS 1
        Low CLK
        DelayMS 1
        High CLK
        DelayMS 1
        High DTA
        Low CLK
        Return
        
RESETsen:  
        Output DTA:Output CLK':TRISA.0=0:TRISA.1=0'
        High DTA
        For W=0 To 9
        High CLK
        DelayMS 1
        Low CLK
        Next W
        Return
        
ISI_HESAP:
 
 ISI = 0.01*HAM - 40.1       

Return

RUT_HESAP:
 ; NEM = 2.0468 + (0.0367 * ham)+( a ) * (0.00000015955) )
 
 a = HAM * HAM
 b = 0.0367 * HAM
 c = 2.0468 + b  
 NEM = c + a*(-0.00000015955)

 
Return


BASINC:

 HAM1=ADIn 0
 DelayMS 2
 e= HAM1*0.0048828125
 bar=(e*22.2222) + 10.55555

Return