logo elektroda
logo elektroda
X
logo elektroda
REKLAMA
REKLAMA
Adblock/uBlockOrigin/AdGuard mogą powodować znikanie niektórych postów z powodu nowej reguły.

Atmega32 Basom AVR - makra , funkcje trygonometryczne -NAN

guest666 01 Lut 2012 08:24 2009 5
REKLAMA
  • #1 10478053
    guest666
    Poziom 12  
    Witam
    Problem mam następujący..
    Walcze już od kilku dni nad przeniesieniem danych z excela a dokładnie z makr do atmegi 32 w BASCOM AVR.
    Problem jest taki, że excel prawidłowo wylicza to makro, a mój program w BASCOMIE niestety nie ;(..
    Podaje kod makra w excelu:
    
    
    Sub PMV()
    Private Sub CommandButton1_Click()
    CLO = Worksheets("PMV").Range("d8")
    MET = Worksheets("PMV").Range("d9")
    TA = Worksheets("PMV").Range("d10")
    TR = Worksheets("PMV").Range("d11")
    VEL = Worksheets("PMV").Range("d12")
    RH = Worksheets("PMV").Range("d13")
    FNPS = Exp(16.6536 - 4030.183 / (TA + 235))
    PA = RH * 10 * FNPS
    ICL = 0.155 * CLO
    M = MET * 58.15
    
    If ICL < 0.078 Then
        FCL = 1 + 1.29 * ICL
    Else
        FCL = 1.05 + 0.645 * ICL
    End If
        
    HCF = 12.1 * VEL ^ 0.5
    TAA = TA + 273
    TRA = TR + 273
    
    TCLA = TAA + (35.5 - TA) / (3.5 * (6.45 * ICL + 0.1))
    P1 = ICL * FCL
    P2 = P1 * 3.96
    P3 = P1 * 100
    P4 = P1 * TAA
    P5 = 308.7 - 0.028 * M + P2 * (TRA / 100) ^ 4
    XN = TCLA / 100
    XF = TCLA / 50
    ' xn=xf
    N = 0
    EPS = 0.0015
    While Abs(XN - XF) > EPS
        XF = (XF + XN) / 2
        HCF = 12.1 * VEL ^ 0.5
        HCN = 2.38 * Abs(100 * XF - TAA) ^ 0.25
    
        If HCF > HCN Then
            HC = HCF
        Else
            HC = HCN
        End If
        
        XN = (P5 + P4 * HC - P2 * (XF ^ 4)) / (100 + P3 * HC)
        N = N + 1
    Wend
    
    TCL = 100 * XN - 273
    '
    '
    ' heat loss diff. through skin
    '
    HL1 = 3.05 * 0.001 * (5733 - 6.99 * M - PA)
    '
    'heat loss by sweating (comfort)
    '
    If M > 58.15 Then
        HL2 = 0.42 * (M - 58.15)
    Else
        HL2 = 0
    End If
    '
    'latent respiration heat loss
    '
    HL3 = 1.7 * 0.00001 * M * (5867 - PA)
    '
    ' dry respiration heat loss
    '
    HL4 = 0.0014 * M * (34 - TA)
    '
    ' heat loss by radiation
    '
    HL5 = 3.96 * FCL * (XN ^ 4 - (TRA / 100) ^ 4)
    '
    ' heat loss by convection
    '
    HL6 = FCL * HC * (TCL - TA)
    '
    ' thermal sensation trans coeff
    '
    TS = 0.303 * Exp(-0.036 * M) + 0.028
    
    If VEL < 0.2 Then
        TPO = 0.5 * TA + 0.5 * TR
    Else
        If VEL >= 0.2 And VEL <= 0.6 Then
            TPO = 0.6 * TA + 0.4 * TR
        Else
            TPO = 0.7 * TA + 0.3 * TR
        End If
    End If
    
    PMVval = TS * (M - HL1 - HL2 - HL3 - HL4 - HL5 - HL6)
    
    Sheets("PMV").Range("d16") = TPO
    Sheets("PMV").Range("d17") = PMVval
    Sheets("PMV").Range("d25") = N
    End Sub
    
    


    A oto co zrobiłem w bascom AVR:
    
                                                                         
                                                                         
                                                                         
                                                 
    '$sim
    $regfile = "m32def.dat"
    $crystal = 11059200
    $baud = 9600                                                ' predkość transmisji
    $hwstack = 256                                              ' rozmiar stosu sprzętowego
    $swstack = 128                                              ' rozmiar stosu
    $framesize = 128
    
    
    '********************* Konfiguracja wyświetlacza
    Config Lcdpin = Pin , Rs = Portd.2 , E = Portd.3 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7
    Config Lcd = 20 * 4
    Cursor Off
    
    
    
    Declare Sub Pmv
    
    Dim Fnps As Single
    Dim Ta As Single
    Dim Pa As Single
    Dim Rh As Single
    Dim Icl As Single
    Dim Clo As Single
    Dim M As Single
    Dim Met As Single
    Dim Fcl As Single
    Dim Hcf As Single
    Dim Vel As Single
    Dim Taa As Single
    Dim Tra As Single
    Dim Tr As Single
    Dim Tcla As Single
    Dim Eps As Single
    Dim Tpo As Single
    Dim Pmvval As Single
    Dim N As Single
    
    
    Clo = 1
    Met = 1
    Ta = 20
    Tr = 20
    Vel = 0
    Rh = 50
    
    
    Cls
    
    Do
    Pmv
    Locate 1 , 1
    Print "Tpo: " ; Tpo
    Lcd "Tpo: " ; Tpo
    Locate 2 , 1
    Print "PMV: " ; Pmvval
    Lcd "PMV: " ; Pmvval
    Locate 3 , 1
    Print "N: " ; N
    Lcd "N: " ; N
    
    'Wait 3
    'Cls
    Loop
    End
    
    
    
    Sub Pmv
    
    
    Local P1 As Single
    Local P2 As Single
    Local P3 As Single
    Local P4 As Single
    Local P5 As Single
    Local Xn As Single
    Local Xf As Single
    Local Hcn As Single
    Local Hc As Single
    Local Tcl As Single
    Local Hl1 As Single
    Local Hl2 As Single
    Local Hl3 As Single
    Local Hl4 As Single
    Local Hl5 As Single
    Local Hl6 As Single
    Local Ts As Single
    
    
    
    Local Tcla1 As Single
    Local Tcla2 As Single
    
    Local P51 As Single
    Local P52 As Single
    
    Local Xn1 As Single
    Local Xn2 As Single
    
    Local Hl51 As Single
    Local Hl52 As Single
    
    Local Tpo1 As Single
    
    
    
    Local Xnxf As Single
    
    
    'Private Sub CommandButton1_Click()
    'CLO = Worksheets("PMV").Range("d8")
    'MET = Worksheets("PMV").Range("d9")
    'TA = Worksheets("PMV").Range("d10")
    'TR = Worksheets("PMV").Range("d11")
    'VEL = Worksheets("PMV").Range("d12")
    'RH = Worksheets("PMV").Range("d13")
    
    
    ' FNPS = Exp(16.6536 - 4030.183 / (TA + 235))
    Fnps = Ta + 235
    Fnps = 4030.183 / Fnps
    Fnps = 16.6536 - Fnps
    
    Fnps = Exp(fnps)
    
    'Pa = Rh * 10 * Fnps
    Pa = Rh * 10
    Pa = Pa * Fnps
    
    ICL = 0.155 * CLO
    M = MET * 58.15
    
    If ICL < 0.078 Then
        'Fcl = 1 + 1.29 * Icl
         Fcl = 1.29 * Icl
         Fcl = 1 + Fcl
    Else
       ' FCL = 1.05 + 0.645 * ICL
       Fcl = 0.645 * Icl
       Fcl = 1.05 + Fcl
    End If
    
     'HCF = 12.1 * VEL ^ 0.5
      Hcf = Vel ^ 0.5
      Hcf = 12.1 * Hcf
      Taa = Ta + 273
      Tra = Tr + 273
    
     ' TCLA = TAA + (35.5 - TA) / (3.5 * (6.45 * ICL + 0.1))
       Tcla1 = 6.45 * Icl
       Tcla1 = Tcla1 + 0.1
       Tcla1 = 3.5 * Tcla1
       Tcla2 = 35.5 - ta
       Tcla2 = Taa + Tcla2
       Tcla = Tcla2 / Tcla1
    
      P1 = Icl * Fcl
      P2 = P1 * 3.96
      P3 = P1 * 100
      P4 = P1 * Taa
      'P5 = 308.7 - 0.028 * M + P2 *(tra / 100) ^ 4
       P51 = Tra / 100
       P51 = P51 ^ 4
       P51 = P2 * P51
       P52 = 0.028 * M
       P52 = 308.7 - P52
       P5 = P52 + P51
    
      Xn = Tcla / 100
      Xf = Tcla / 50
    ' xn=xf
      N = 0
      Eps = 0.0015
      'While Abs(xn - Xf) > Eps
       Do
    
       'XF = (XF + XN) / 2
        Xf = Xf + Xn
        Xf = Xf / 2
        'Hcf = 12.1 * Vel ^ 0.5
         Hcf = Vel ^ 0.5
         Hcf = 12.1 * Hcf
        'HCN = 2.38 * Abs(100 * XF - TAA) ^ 0.25
         Hcn = 100 * Xf
         Hcn = Hcn - Taa
         Hcn = Abs(hcn)
         Hcn = Hcn ^ 0.25
         Hcn = 2.38 * Hcn
        If HCF > HCN Then
            HC = HCF
        Else
            HC = HCN
        End If
    
        'XN = (P5 + P4 * HC - P2 * (XF ^ 4)) / (100 + P3 * HC)
        Xn1 = P3 * Hc
        Xn1 = 100 + Xn1
        Xn2 = Xf ^ 4
        Xn2 = P2 * Xn2
        Xn = P4 * Hc
        Xn = P5 + Xn
        Xn = Xn - Xn2
        Xn = Xn / Xn1
        Incr N
        Xnxf = Xn - Xf
        Xnxf = Abs(xnxf)
        If Xnxf > Eps Then Exit Do
    
    Loop
    
    'TCL = 100 * XN - 273
    Tcl = 100 * Xn
    Tcl = Tcl - 273
    '
    '
    ' heat loss diff. through skin
    '
      'HL1 = 3.05 * 0.001 * (5733 - 6.99 * M - PA)
      Hl1 = 6.99 * M
      Hl1 = 5733 - Hl1
      Hl1 = Hl1 - Pa
      Hl1 = Hl1 * 0.001
      Hl1 = 3.05 * Hl1
    
    '
    'heat loss by sweating (comfort)
    '
    If M > 58.15 Then
        'HL2 = 0.42 * (M - 58.15)
        Hl2 = M - 58.15
        Hl2 = 0.42 * Hl2
    Else
        HL2 = 0
    End If
    '
    'latent respiration heat loss
    '
    'HL3 = 1.7 * 0.00001 * M * (5867 - PA)
      Hl3 = 5867 - pa
      Hl3 = Hl3 * M
      Hl3 = Hl3 * 0.00001
      Hl3 = 1.7 * Hl3
    
    '
    ' dry respiration heat loss
    '
    'HL4 = 0.0014 * M * (34 - TA)
      Hl4 = 34 - ta
      Hl4 = M * Hl4
      Hl4 = 0.0014 * Hl4
    
    '
    ' heat loss by radiation
    '
    'HL5 = 3.96 * FCL * (XN ^ 4 - (TRA / 100) ^ 4)
      Hl51 = Tra / 100
      Hl51 = Hl51 ^ 4
      Hl52 = Xn ^ 4
      Hl5 = Hl52 - hl51
      Hl5 = Fcl * Hl5
      Hl5 = 3.96 * Hl5
    '
    ' heat loss by convection
    '
     ' HL6 = FCL * HC * (TCL - TA)
     Hl6 = Tcl - ta
     Hl6 = Hl6 * Hc
     Hl6 = Fcl * Hl6
    '
    ' thermal sensation trans coeff
    '
      'Ts = 0.303 * Exp( -0.036 * M) + 0.028
       Ts = -0.036 * M
       Ts = Exp(ts)
       Ts = 0.303 * Ts
       Ts = Ts + 0.028
    
    
    
    If VEL < 0.2 Then
        'TPO = 0.5 * TA + 0.5 * TR
        Tpo1 = 0.5 * Tr
        Tpo = 0.5 * Ta
        Tpo = Tpo + Tpo1
    
    Else
        If VEL >= 0.2 And VEL <= 0.6 Then
            'TPO = 0.6 * TA + 0.4 * TR
            Tpo1 = 0.4 * Tr
            Tpo = 0.6 * Ta
            Tpo = Tpo + Tpo1
        Else
            'TPO = 0.7 * TA + 0.3 * TR
            Tpo1 = 0.3 * Tr
            Tpo = 0.7 * Ta
            Tpo = Tpo + Tpo1
        End If
    End If
    
    'PMVval = TS * (M - HL1 - HL2 - HL3 - HL4 - HL5 - HL6)
     Pmvval = M - hl1
     Pmvval = Pmvval - Hl2
     Pmvval = Pmvval - Hl3
     Pmvval = Pmvval - Hl4
     Pmvval = Pmvval - Hl5
     Pmvval = Pmvval - Hl6
     Pmvval = Ts * Pmvval
    
    'Sheets("PMV").Range("d16") = TPO
    'Sheets("PMV").Range("d17") = PMVval
    'Sheets("PMV").Range("d25") = N
    End Sub
    


    Niestety przy wyliczeniu PMVval w bascomie ( nawet w symulacji) mam na wyświetlaczu -NAN
    Co to oznacza??
    Ma ktoś podobny problem
  • REKLAMA
  • REKLAMA
  • #3 10478107
    guest666
    Poziom 12  
    Witam
    Jak trzeba to zapłace za przerobienie tego kodu na bascomowy...
    Może problem jest taki że excel jak wylicza wartości to on operuje na innych zmiennych np typu Double??.
    Jak można to ruszyć...już mi ręce opadają...
    Może źle zamieniłem wartość ABS ??
  • REKLAMA
  • REKLAMA
  • #5 10478652
    Mundi1970
    Poziom 24  
    Dodaj na początku programu:
    Kod: text
    Zaloguj się, aby zobaczyć kod

    i sprawdź czy wynik poprawny.
  • #6 10479026
    guest666
    Poziom 12  
    Witam
    Wynik już jest...już nie pokazuje NAN, jak zamnieniłem single na double to też był wynik, ale też inny niż w excelu...
    Nie wiem gdzie jest problemm..
    Walcze i szukam
    Pytanie czy excelowskie makro:
    
    While Abs(XN - XF) > EPS
        XF = (XF + XN) / 2
        HCF = 12.1 * VEL ^ 0.5
        HCN = 2.38 * Abs(100 * XF - TAA) ^ 0.25
    
        If HCF > HCN Then
            HC = HCF
        Else
            HC = HCN
        End If
    
        XN = (P5 + P4 * HC - P2 * (XF ^ 4)) / (100 + P3 * HC)
        N = N + 1
    Wend
    

    będzie równoznaczne z:
    Do
    
       'XF = (XF + XN) / 2
        Xf = Xf + Xn
        Xf = Xf / 2
        'Hcf = 12.1 * Vel ^ 0.5
         Hcf = Vel ^ 0.5
         Hcf = 12.1 * Hcf
        'HCN = 2.38 * Abs(100 * XF - TAA) ^ 0.25
         Hcn = 100 * Xf
         Hcn = Hcn - Taa
         Hcn = Abs(hcn)
         Hcn = Hcn ^ 0.25
         Hcn = 2.38 * Hcn
        If Hcf > Hcn Then
            Hc = Hcf
        Else
            Hc = Hcn
        End If
    
        'XN = (P5 + P4 * HC - P2 * (XF ^ 4)) / (100 + P3 * HC)
        Xn1 = P3 * Hc
        Xn1 = 100 + Xn1
        Xn2 = Xf ^ 4
        Xn2 = P2 * Xn2
        Xn = P4 * Hc
        Xn = P5 + Xn
        Xn = Xn - Xn2
        Xn = Xn / Xn1
        N = N + 1
    
        Xnxf = Xn - Xf
        Xnxf = Abs(xnxf)
      Loop Until Xnxf > Eps
REKLAMA