avatar_elektro77

lcd de ondalık yazma

Başlatan elektro77, 11 Nisan 2016, 18:51:51

elektro77

Merhaba arkadaşlar ve üstadlar;
A=37,2
B=30,5
C=156
D=13,5
E=98
F=?
FORMÜL     F=(A+B+C+D)/E
Yukarıdaki verileri formülde yerine koyup hesapladığımızda sonuç ondalıklı çıkıyor.Pic Basic proda, 16 bit çözünürlükte, bu sonucu "dec" komutları kullanarak LCD de, 2 hane tam sayı ve 3 hane onndalıklı olarak nasıl yazdırabilirim.  Örn: 01,325 gibi
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

İşin tek yolu sonucu 1000 ile çarpışmış olarak bulacaksın.
A B C D  (E hariç) Değerlerini 1000 ile çarpıp sonucu hesapladıktan sonra, ekrana yazdırırken şu şekilde bir yol takip edeceksin.
Lcdout $FE,$C0, dec (F/1000),",",dec (F//1000)

Ete

elektro77

#2
LCDOUT $FE,$D4,"KURULUK=",DEC (KURU/1000),",",DEC (KURU//1000)

RUZGARAL:
       ADCIN 0,HAM1
       LCDOUT $FE,$94, "RUZ=",DEC3 RUZGAR,",",DEC1 MRUZGAR,"KM PH=",DEC2 PH,",",DEC MPH               
       Ham1=ham1+1                   
       RUZGAR=(ham1 */2499)
       MRUZGAR=RUZGAR//10
       RUZGAR=RUZGAR/10
       GOSUB PHAL
RETURN               
'-----------------------------ADC 2---------------------------------------------
PHAL:       
        ADCIN 1,HAM2
        LCDOUT $FE,$94,"RUZ=",DEC3 RUZGAR,",",DEC1 MRUZGAR,"KM PH=",DEC2 PH,",",DEC MPH
        Ham2=ham2+1
        PH=(ham2 */35)
        MPH=PH//10
        PH=PH/10
LCDOUT $FE,$D4,"KURULUK=",DEC (KURU/1000),",",DEC (KURU//1000)

KURUAL:
KURU=(RUZGAR*1000)+(ISI*1000)+(ISI1*1000)+(PH*1000)/U1
GOSUB GONDER
RETURN


hocam yazılımın bazı kısımları yukardaki gibi.ısı ve ısı1 sht11 ve 18b20. u1 ise yine sht11.Söylediğiniz formülü kurual formülünde uyguladım. ondalık olarak alıyorum fakat hesaplama yanlış sonucu veriyor.
çarpma işlemlerini nerde yapacağız.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Sende hesapta kulandığın kuru değerini eski sistemde elde et ve kullan gösterirken benim önerdiğimi kullan.
Yani bir Kuru değişkeni daha tanımlaman gerekiyor.

Ete

Not. Bu kadarcık kod parçasından neyin yanlış olduğunu anlayamadım maalesef. Hangi hesap yanlış çıkıyor oda belli değil.
Biraz ip ucu vermek lazım değilmi?


elektro77

#4
 
 km       var    byte
     TERM     VAR    BYTE
     NEM      VAR    BYTE
     KONTROL  VAR    BYTE
     ISI1     VAR    BYTE
     ISI2     VAR    BYTE
     U1       VAR    BYTE
     U2       VAR    BYTE
     C0       VAR    BYTE
     H0       VAR    HAMISI.BYTE0
     H1       VAR    HAMISI.BYTE1
     HAMISI   VAR    WORD
     ISISHT   VAR    WORD
     RUT      VAR    WORD
     P1       VAR    WORD
     P2       VAR    WORD
     P3       VAR    WORD
     W        VAR    WORD
     KURU     VAR    WORD
     KURU1      VAR BYTE
     MKURU    VAR    WORD
     CLK      VAR    PORTA.5
     DTA      VAR    PORTA.2
     RUZGAR   VAR    word
     PH       VAR    word
     MPH      VAR    BYTE
     MRUZGAR  VAR    BYTE
     HAM1     VAR    WORD
     HAM2     VAR    WORD
     ISARETSHT VAR   BIT   'sensor değeri 0 ise artı, 1 ise eksi
     SIGN     VAR    BIT      'ısı isareti 0 ise artı 1 ise eksi
     HATA     var    BIT
'-------------------------------------------------------------------------------   
'     SYMBOL CIKIS=PORTb.0
     VERICI VAR BYTE
' VERICI=0
'-------------------------------------------------------------------------------
Busy        VAR BIT         ' Busy Status-Bit
HAM         VAR WORD        ' Sensör HAM okuma değeri
ISI         VAR WORD        ' Hesaplanmış ISI değeri
Float       VAR WORD        ' Holds remainder for + temp C display
X           VAR WORD
ISARET_BITI VAR HAM.Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
EKSI_ISI   CON 1           ' Sıfır altında isaret biti=1  oluyor kontrol için
DERECE     CON 223         ' ° işareti
ISARET     VAR BYTE        '  ISI değeri için  +/-  işaret
TEMP       VAR BYTE       ' Div32 bit hesap için geçici değişken
SYMBOL COMM_PIN=PORTB.1   ' One-wire Data-Pin "DQ" PortB.0 da

'-----------------------------B A Ş L A N G I Ç ------------------------------
     PAUSE 500:ISARET=0
         LCDOUT $FE,$40,$6,$9,$9,$6,$0,$0,$0,$0        'derece işareti dataları
         LCDOUT $FE,$48,$04,$0e,$0e,$0e,$1f,$04,$04,$0
         LCDOUT $FE,$50,10,0,17,17,17,17,14,0 'LCD 2. KARAKTER HAFIZASI Ü HARFİ
'-------------------------------------------------------------------------------
BASLANGIC:


BASLA: 
              KONTROL=%00000011:HAMISI=0   'SHT 11 SICAKLIK ÖLÇME
        GOSUB OLCUMAL
        Gosub ISIHESAP
              KONTROL=%00000101:HAMISI=0   'SHT11 NEM ÖLÇME
        GOSUB OLCUMAL
        GOSUB RUTHESAP:GOSUB SENSOROKU
        GOSUB KURUAL
        GOSUB EKRAN1
        GOSUB GONDER
        GOSUB RUZGARAL
        GOSUB PHAL

     
     goto BASLA 
'----------------------------ACD1-----------------------------------------------
RUZGARAL:
       ADCIN 0,HAM1
       LCDOUT $FE,$94, "RUZ=",DEC3 RUZGAR,",",DEC1 MRUZGAR,"KM PH=",DEC2 PH,",",DEC MPH               
       Ham1=ham1+1                   
       RUZGAR=(ham1 */2499)
       MRUZGAR=RUZGAR//10
       RUZGAR=RUZGAR/10
       GOSUB PHAL
RETURN               
'-----------------------------ADC 2---------------------------------------------
PHAL:       
        ADCIN 1,HAM2
        LCDOUT $FE,$94,"RUZ=",DEC3 RUZGAR,",",DEC1 MRUZGAR,"KM PH=",DEC2 PH,",",DEC MPH
        Ham2=ham2+1
        PH=(ham2 */35)
        MPH=PH//10
        PH=PH/10
       
RETURN
     
'---------------------------------------EKRANA YAZ -----------------------------
EKRAN1:
        lcdout $FE,$80,"ORT=",DEC2 ISI1,",",DEC1 ISI2,0,"  VUC=",DEC2 ISI,",",DEC1 (FLOAT),0
        lcdout $FE,$C0,"NEM=%",DEC2 U1
       
        LCDOUT $FE,$D4,"KURULUK=",DEC (KURU/1000),",",DEC (KURU//1000)
'-------------------------------------------------------------------------------
RETURN

SENSOROKU:
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN
'-------------------------------------------------------------------------------
Hesapla: 'VUC SICAKLIĞI Ham değerden Santigrat derece hesabı: BU DEĞERLER SENSÖRDEN GELN HAM BİLGİYİ SANTİGRATA ÇEVİRİR
    ISARET  = "+"
   IF ISARET_BITI = EKSI_ISI THEN
       ISARET   = "-" 
       ham=~ham+2
    endif
    float = (HAM*10)/16       
    ISI=FLOAT/10
    RETURN 
'-------------------------------SHT11 İŞLEM START -----------------------------------
T_START:
      OUTPUT DTA:OUTPUT CLK
        HIGH DTA
         LOW CLK
       PAUSE 1
        HIGH CLK
         LOW DTA
       PAUSE 1
         LOW CLK
       PAUSE 1
        HIGH CLK
       PAUSE 1
        HIGH DTA
         LOW CLK
RETURN

'-----------------------SHT11 SENSORÜNE KOMUT GÖNDER ---------------------------
OLCUMAL:
           GOSUB T_Start
        SHIFTOUT DTA,CLK,1,[KONTROL]
           INPUT DTA
         PULSOUT CLK,10
                 HATA=0
             FOR W=0 to 65500
              IF DTA=0 then GIT
            NEXT W
                 HATA=1
GIT:         
              IF HATA=1 then
           endif
         SHIFTIN DTA,CLK,0,[H1]
          OUTPUT DTA
             LOW DTA
         PULSOUT CLK,10
           INPUT DTA
         SHIFTIN DTA,CLK,0,[H0]
         PULSOUT CLK,10
RETURN

'----------------------ISI HESAP ALT PROGRAMI-----------------------------------     
ISIHESAP: 
           If HAMISI<4000 then
              ISARETSHT=1 'sıcaklık eksi değerde demek
              ISI1=(4000-HAMISI)/100
              ISI2=((4000-HAMISI)//100)/10   
         goto ISISON
        endif
             
              ISI1=(HAMISI-4000)/100
              ISI2=((HAMISI-4000)//100)/10
             
             
ISISON:   
              ISI1=(HAMISI-4000)/100
              ISI2=((HAMISI-4000)//100)/10
RETURN
     
'------------------SHT11 RUTUBET HESAP ALT PROGRAMI----------------------------
RUTHESAP:
              p1=(26542-(54722**HAMISI+hamISI))**HAMISI-40     
              P2=655+(HAMISI*5)+(HAMISI**15917)      
              P3=(P2**(ISISHT*10+2480))-(P2**2730)+P1   
              U1=p3/10:U2=p3//10
           IF HAMISI>3710 THEN
              U1=0:U2=0
        ENDIF 
return
GOSUB PHAL
'--------FORMÜL-----------------------------------------------------------------
KURUAL:
KURU=RUZGAR+ISI+ISI1+PH/U1

GOSUB GONDER
RETURN

'ISI= VUC SICAKLIĞI ,ISI1=ORT SICAKLIK  ,ISI2=ORT SICAKLIĞI VİRGÜL SONRASI, U1=NEM 
'FLOAT=VUCUT SICAKLIĞININ SON İKİ HANESİNİN 10 İLE ÇARPIMI   

'-----------------------
GONDER:
SEROUT2 PORTB.0,396,["E","Z",KURU,MKURU]
SEROUT2 PORTB.0,396,["E","Z",KURU,MKURU]
SEROUT2 PORTB.0,396,["E","Z",KURU,MKURU]
SEROUT2 PORTB.0,396,["E","Z",KURU,MKURU]

RETURN


END


hocam kodların tamamıdır. Yardımcı olursanız sevinirim.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

#5
 
DEFINE OSC 4
@ DEVICE pic16F877
@ DEVICE pic16F877, WDT_on
@ DEVICE pic16F877, PWRT_ON
@ DEVICE pic16F877, PROTECT_OFF
@ DEVICE pic16F877, XT_OSC
'--------------------------
TRISA=%00001011
TRISB=%00000000
TRISC=%00000111
TRISD=%00000000
TRISE=%00000000
PORTA=0
PORTB=0
PORTC=0
PORTD=0
PORTE=0

DEFINE LCD_DREG        PORTB
DEFINE LCD_DBIT        4
DEFINE LCD_RSREG       PORTB
DEFINE LCD_RSBIT       2
DEFINE LCD_EREG        PORTB
DEFINE LCD_EBIT        3
DEFINE LCD_BITS        4
DEFINE LCD_LINES       4

DEFINE ADC_BITS 10     ' ADCIN resolution  (Bits)
DEFINE ADC_CLOCK 1     ' ADC clock source  (Fosc/8)
DEFINE ADC_SAMPLEUS 20 ' ADC sampling time (uSec)
ADCON1=%10000100       ' 10 BİT DEĞER İÇİN


'---------------------------değişkenler-----------------------------------------
     km       var    byte
     TERM     VAR    BYTE
     NEM      VAR    BYTE
     KONTROL  VAR    BYTE
     ISI1     VAR    BYTE
     ISI2     VAR    BYTE
     U1       VAR    BYTE
     U2       VAR    BYTE
     C0       VAR    BYTE
     H0       VAR    HAMISI.BYTE0
     H1       VAR    HAMISI.BYTE1
     HAMISI   VAR    WORD
     ISISHT   VAR    WORD
     RUT      VAR    WORD
     P1       VAR    WORD
     P2       VAR    WORD
     P3       VAR    WORD
     W        VAR    WORD
     KURU     VAR    WORD
     KURU1      VAR  WORD
     MKURU    VAR    BYTE
     CLK      VAR    PORTA.5
     DTA      VAR    PORTA.2
     RUZGAR   VAR    word
     PH       VAR    word
     MPH      VAR    BYTE
     MRUZGAR  VAR    BYTE
     HAM1     VAR    WORD
     HAM2     VAR    WORD
     ISARETSHT VAR   BIT   'sensor değeri 0 ise artı, 1 ise eksi
     SIGN     VAR    BIT      'ısı isareti 0 ise artı 1 ise eksi
     HATA     var    BIT
'-------------------------------------------------------------------------------   
'     SYMBOL CIKIS=PORTb.0
     VERICI VAR BYTE
' VERICI=0
'-------------------------------------------------------------------------------
Busy        VAR BIT         ' Busy Status-Bit
HAM         VAR WORD        ' Sensör HAM okuma değeri
ISI         VAR WORD        ' Hesaplanmış ISI değeri
Float       VAR WORD        ' Holds remainder for + temp C display
X           VAR WORD
ISARET_BITI VAR HAM.Bit11   '   +/- sıcaklık İşaret biti,  1 = olursa eksi sıcaklık
EKSI_ISI   CON 1           ' Sıfır altında isaret biti=1  oluyor kontrol için
DERECE     CON 223         ' ° işareti
ISARET     VAR BYTE        '  ISI değeri için  +/-  işaret
TEMP       VAR BYTE       ' Div32 bit hesap için geçici değişken
SYMBOL COMM_PIN=PORTB.1   ' One-wire Data-Pin "DQ" PortB.0 da

'-----------------------------B A Ş L A N G I Ç ------------------------------
     PAUSE 500:ISARET=0
         LCDOUT $FE,$40,$6,$9,$9,$6,$0,$0,$0,$0        'derece işareti dataları
         LCDOUT $FE,$48,$04,$0e,$0e,$0e,$1f,$04,$04,$0
         LCDOUT $FE,$50,10,0,17,17,17,17,14,0 'LCD 2. KARAKTER HAFIZASI Ü HARFİ
'-------------------------------------------------------------------------------
BASLANGIC:


BASLA: 
              KONTROL=%00000011:HAMISI=0   'SHT 11 SICAKLIK ÖLÇME
        GOSUB OLCUMAL
        Gosub ISIHESAP
              KONTROL=%00000101:HAMISI=0   'SHT11 NEM ÖLÇME
        GOSUB OLCUMAL
        GOSUB RUTHESAP:GOSUB SENSOROKU
        GOSUB KURUAL
        GOSUB EKRAN1
        GOSUB GONDER
        GOSUB RUZGARAL
        GOSUB PHAL

     
     goto BASLA 
'----------------------------ACD1-----------------------------------------------
RUZGARAL:
       ADCIN 0,HAM1
       LCDOUT $FE,$94, "RUZ=",DEC3 RUZGAR,",",DEC1 MRUZGAR,"KM PH=",DEC2 PH,",",DEC MPH               
       Ham1=ham1+1                   
       RUZGAR=(ham1 */2499)
       MRUZGAR=RUZGAR//10
       RUZGAR=RUZGAR/10
       GOSUB PHAL
RETURN               
'-----------------------------ADC 2---------------------------------------------
PHAL:       
        ADCIN 1,HAM2
        LCDOUT $FE,$94,"RUZ=",DEC3 RUZGAR,",",DEC1 MRUZGAR,"KM PH=",DEC2 PH,",",DEC MPH
        Ham2=ham2+1
        PH=(ham2 */35)
        MPH=PH//10
        PH=PH/10
       
RETURN
     
'---------------------------------------EKRANA YAZ -----------------------------
EKRAN1:
        lcdout $FE,$80,"ORT=",DEC2 ISI1,",",DEC1 ISI2,0,"  VUC=",DEC2 ISI,",",DEC1 (FLOAT),0
        lcdout $FE,$C0,"NEM=%",DEC2 U1
       
        LCDOUT $FE,$D4,"KURULUK=",DEC (KURU1/1000),",",DEC (KURU1//1000)
'-------------------------------------------------------------------------------
RETURN

SENSOROKU:
           OWOUT   Comm_Pin, 1, [$CC, $44]' ISI değerini oku
Bekle:
           OWIN    Comm_Pin, 4, [Busy]    ' Busy değerini oku
           IF      Busy = 0 THEN Bekle    ' hala meşgulmü? , evet ise goto Bekle..!
           OWOUT   Comm_Pin, 1, [$CC, $BE]' scratchpad memory oku
           OWIN    Comm_Pin, 2, [HAM.Lowbyte, HAM.Highbyte]' İki byte oku ve okumayı bitir.
           GOSUB   Hesapla
           RETURN
'-------------------------------------------------------------------------------
Hesapla: 'VUC SICAKLIĞI Ham değerden Santigrat derece hesabı: BU DEĞERLER SENSÖRDEN GELN HAM BİLGİYİ SANTİGRATA ÇEVİRİR
    ISARET  = "+"
   IF ISARET_BITI = EKSI_ISI THEN
       ISARET   = "-" 
       ham=~ham+2
    endif
    float = (HAM*10)/16       
    ISI=FLOAT/10
    RETURN 
'-------------------------------SHT11 İŞLEM START -----------------------------------
T_START:
      OUTPUT DTA:OUTPUT CLK
        HIGH DTA
         LOW CLK
       PAUSE 1
        HIGH CLK
         LOW DTA
       PAUSE 1
         LOW CLK
       PAUSE 1
        HIGH CLK
       PAUSE 1
        HIGH DTA
         LOW CLK
RETURN

'-----------------------SHT11 SENSORÜNE KOMUT GÖNDER ---------------------------
OLCUMAL:
           GOSUB T_Start
        SHIFTOUT DTA,CLK,1,[KONTROL]
           INPUT DTA
         PULSOUT CLK,10
                 HATA=0
             FOR W=0 to 65500
              IF DTA=0 then GIT
            NEXT W
                 HATA=1
GIT:         
              IF HATA=1 then
           endif
         SHIFTIN DTA,CLK,0,[H1]
          OUTPUT DTA
             LOW DTA
         PULSOUT CLK,10
           INPUT DTA
         SHIFTIN DTA,CLK,0,[H0]
         PULSOUT CLK,10
RETURN

'----------------------ISI HESAP ALT PROGRAMI-----------------------------------     
ISIHESAP: 
           If HAMISI<4000 then
              ISARETSHT=1 'sıcaklık eksi değerde demek
              ISI1=(4000-HAMISI)/100
              ISI2=((4000-HAMISI)//100)/10   
         goto ISISON
        endif
             
              ISI1=(HAMISI-4000)/100
              ISI2=((HAMISI-4000)//100)/10
             
             
ISISON:   
              ISI1=(HAMISI-4000)/100
              ISI2=((HAMISI-4000)//100)/10
RETURN
     
'------------------SHT11 RUTUBET HESAP ALT PROGRAMI----------------------------
RUTHESAP:
              p1=(26542-(54722**HAMISI+hamISI))**HAMISI-40     
              P2=655+(HAMISI*5)+(HAMISI**15917)      
              P3=(P2**(ISISHT*10+2480))-(P2**2730)+P1   
              U1=p3/10:U2=p3//10
           IF HAMISI>3710 THEN
              U1=0:U2=0
        ENDIF 
return
GOSUB PHAL
'--------FORMÜL-----------------------------------------------------------------
KURUAL:
KURU=RUZGAR+ISI+ISI1+PH/U1
KURU1=KURU*1000/U1

GOSUB GONDER
RETURN


YENİ BİR KURU TANIMI YAPIP YENİDEN YUKARIDAKİ GİBİ DENEDİM KURU1 SONUCU YANLIŞ ÇIKIYOR HOCAM

edit: code tag (# butonu) kullanın lütfen
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

#6
Hocam ben formüldeki ISI, ISI1,U1 GİBİ değerleri doğru yerlerden aldığıma emin değilim.
Sonuç bu nedenle hesap makinesinde hesapladığım gibi çıkmıyor olabilir.
birde dec komutlarını heryerde doğru kullandığıma emin değilim. buda etkiliyor olabilir sanırım.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Programa bakınca insan ürküyor. Öyle hemen inceleyip sorun bulunacak bir şey değil.
Konsantre olup epeyce incelemek gerek. En güzeli çalıştırıp adım adım gitmek bence. Ama simulasyonu ekleyememişsin maalesef.

Ete

elektro77

Hemen ekledim hocam. ektedir.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

Programda bir çok kusur var. En önemlisi ISIHESAP adlı etiketin altındakiler.
O satırları bir incele bir birinin aynı şeyleri üst üste yazmışsın.
Ayrıca KURULUK hesabı da bana göre pek doğru değil.
Rüzgar değişkeni rüzgar değerinin tam sayı kısmını tutuyor. Mrüzgar ise ondalık kısmı tutuyor.
Sen ikisini topluyorsun bu yanlış bir uygulama. Bütün kullanılan değerler aslında xx,x şeklinde 1 hanelik ondalık hesaplanacak şekilde ayarlanmış zaten. Yapman gereken Kuruluk hesabında tamsayıya çevirilmemiş hallerini yani 10 ile çarpılmış hallerini kullanarak bu hesabı yapman.
Mesela RÜZGAR değeri başlangıçta ondalık kısmıda içerecek şekilde hesaplanıyor. Sonra , Mrüzgar=Rüzgar//10 Rüzgar=rüzgar/10  şeklinde değerler hesaplanıyor. Halbuki Rüzgar=Rüzgar/10 yapmadan önceki konumda rüzgar değeri ondalık kısmıda ihtiva ediyor idi. Bu şekilde Kuruluk hesabında kullanılmalı idi.

Benzer şekilde ISI hesabında Float değeri ISI değerinin 10 ile çarpılmış halini ihtiva etmekte. Ama sen formülde hem ISI değerini hemde Float değerini kullanarak daha büyük bir hata yapmış oluyorsun. Burada da formülde yalnızca Float değerini kullanarak işi çözmek lazım. 

ISI1 hesabında kullanılan sistemin yanlı olduğunu söylemiştim. Doğrusu şöyle olmalı;
ISIHESAP:  
           If HAMISI<4000 then
              ISARETSHT=1 'sıcaklık eksi değerde demek
              ISI1=(4000-HAMISI)/10
              ISI2=ISI1//10
              GOTO ISISON
           endif
                           
              ISI1=(HAMISI-4000)/10
              ISI2=ISI1//10 

ISISON:   
              ISI1=ISI1/10   'burada ISI1 tam sayı kısmı hesaplanıyor. Ondalık kısmı ISI2 değişkeninde     
           
RETURN

Formülde ISI2 yani ISI1 ondalık kısmınıda kullanmamışsın. Burada da ISI1/10 dan önce ISI1 değerinin 10 ile çarpılmış halini Kuruluk formülünde kullanmak lazım.
Benzer şekilde PH hesabında da PH değeri başlangıçta ondalık kısmı ihtiva etmektedir. Böylece formülün tamamını bu sisteme uygun olarak kullanmak mümkün.
Karışıklığa meydan vermemek için ben olsam ondalık kısım hiç hesaplamam. Nerede ekrana yazdırıyor isem orada tam sayı ve ondalık şeklinde gösteririm. Ama hesaplamada hep 10 ileçarpılmış hallerini kullanırım. Sonuçta,
KURU1=KURU/10*U1 şeklinde de asıl sonuca ulaşırım.
Yeri gelmiş iken hemen belirteyim burada kullandığın o KURU1=KURU*1000/U1 formülüde yanlış. Sonucu 1000 ile çarpmak işi çözmüyorki sonucu iyice bozmuşsun burada. Hepten yanlış.

Ete


elektro77

yazdıklarınızı anlamaya çalışıyorum hocam.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

#11
İlişikteki programı düzenledim. Virgülden sonra 3 hane ondalık vererek kuruluk hesaplıyor. Doğru çalışıyor.
Bir kerede sen dene ve hesap makinesi ile yaptığın hesap ile karşılaştır bakalım sonucu.

Önceden söyledim mantığı uyguladım. Kuruluk hesabında yalnızca 32 bit çarpma yapmak gerekti. Zira sayılar 16 biti aşıyor rakamları büyüttüğün zaman. Ama en son uygulamada 32 bite dönüp sonucu o şekilde alıyorum.
KURUAL:
KURU=RUZGAR*10+Float*10+ISI1*10+PH*10
KURU1=(KURU**100)
KURU1=DIV32 P3

Burada önce KURU değişken değerini parametreleri 10 ile çarparak hesaplıyorum. Zaten asıl değerler 10 ile çarpılmış olarak kullanıldı ama Nem değerine bölerken Nem in 10 katı haline böleceğimiz için onu göz ardı ediyoruz.
Bulunan sonucu  birde 100 ile çarpıyorum ve 32 bitlik bir sayı elde ediyorum. Sonra bunu p3 değerine yani NEM'in 10 ile çarpılmış haline bölüyorum. Böylece işlem sonucunda,
Kuru değeri x 1000 hesaplanıyor. Bu nedenle ekrana yazdırıken;
LCDOUT $FE,$D4,"KURULUK=",DEC kuru1/1000,",",DEC KURU1//1000,"  " şeklinde tam sayı kısmını 1000 e bölerek buluyorum. Ondalık kısmı içinde Mod 1000 işlemini uyguluyorum. Böylece sonu doğru çıkıyor.

Ete

not:
bir tavsiye, dosya isimlerinde Türkçe harf kullanma bu bir. İkincisi çok uzun dosya ismide kullanma. En fazla 8 karekter olsun. Aksi halde bir çok noktada sıkıntı yaşarsın özellikle derlemede epeyce sıkıntı çıkartır.

elektro77

Siz bu işte mükemmelsiniz hocam.
çok güzel çalışıyor.
fakat hocam ben rüzgarın tam sayı kısmını biliçli olarak 3 haneli yapmıştım. tekrar 3 haneli yapsak formülünüze etkisi olurmu
çünkü dc motor fanı saç kurutma makinesi  etkisi ile döndürüldüğünde 100 ü aşıyor.
yani saç kurutma makinesinin de kuruluğa olan etkisini ölçebilmek için 100 aşırmamız gerekli.
birde hocam sht11 im mi bozuk bilmiyorum ama gerçek devrede nemi çok fazla gösteriyor. %47 nemi %87 gösteriyor.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

elektro77

birde hocam hatalı olan yazılımda bir şekilde rf ile  verip almayı başarmıştım.
vericide ne göndereceğim alıcıda ne alacağım.
yardımcı olurmusunuz.
saygılarımla.
"Eğer bir konuyu öğrenmek istiyorsan o konunun öğretmeni ol; daha iyi öğrenmek istiyorsan o konuda bir kitap yaz; daha da iyi öğrenmek istiyorsan yazdığın kitabi oku"

ete

#14
Mesaj yazarken kod tag kullan demiştim ama hala ısrarla kullanmıyorsun. Kod tag kullanılmayan mesajları sileceğim artık.
Mesaj yazarken hemen üstte üzerinde # işareti olan butondur. Basınca köşeli parantez içinde Code yazısı görülecektir. Bu ibareden sonrasına kodarını yazıp sonrada yine köşeli parantez içinde "/code" ibaresi ile kapatacaksın.

Ete

Powered by EzPortal