Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

BASCOM-zbyt duzy rozmiar kodu....

rokoko 22 Nov 2005 16:27 1409 6
  • #1
    rokoko
    Level 20  
    Witam!
    Prosze szanownych znawcow tematu o vopinie odnosnie projektu termometru 2 liniowgo. Mam z nim duzy klopot, mianowicie kod zajmuje 3244 no i do 2 KB procka raczej do nie wbije. :( Prosze o pomoc i wszelkie wskazowki....Nadmieniam ze projekt jest zlepka kilku projektow termometru poniewaz nie mam doswiadczenia w 1wire
    Code:

    Config 1wire = Portd.0                                      'konfiguracja magistrali 1wire
    Config Lcd = 16 * 2                                         'konfiguracja wyswietlacza
    Deflcdchar 1 , 4 , 10 , 4 , 32 , 32 , 32 , 32 , 32          'znak stopnia
    Dim T1 As Single
    Dim T2 As Single
    Dim B1 As Byte , B2 As Byte , R As Byte
    Dim Tmp As String * 6
    Dim Znak As String * 1
    Dim Dsid1(8) As Byte
    Dim Dsid2(8) As Byte
    R = &HFF
    Declare Sub Lwr
    Declare Sub Odczyt
    Declare Sub Gol                                             'podprogram resetujacy magistrale 1w
    Cursor Off
    Cls
    Dsid1(1) = 1wsearchfirst()
    Dsid2(1) = 1wsearchnext()
    Waitms 500
    Wait 1
    Cls


    Do
    Home
    1wverify Dsid1(1)                                           'Issues the "Match ROM "
    If Err = 1 Then
             Lcd "  Blad pomiaru"                               'Err = 1 if something is wrong
       Elseif Err = 0 Then
             Odczyt
              Lcd "T.zewn.:" ; Znak ; Tmp ; Chr(1) ; "C   "
             Gol
             End If
    Waitms 250


    1wverify Dsid2(1)
    Lowerline
    If Err = 1 Then
           Lcd "  Blad pomiaru "
       Elseif Err = 0 Then
           Odczyt
           Lcd "T.wewn.:" ; Znak ; Tmp ; Chr(1) ; "C   "
      End If
    Waitms 250




    Loop


    Sub Lwr                                                     'podprogram resetujacy magistrale
    1wreset
    End Sub


    Sub Odczyt
        Lwr                                                     'podprogram 1wr
        1wwrite &HCC                                            'komenda skip ROM
        1wwrite &H44                                            'komenda convert T
        Waitms 250
        Waitms 250
        Lwr                                                     'podprogram 1wr
        1wwrite &HCC                                            'komenda skip ROM
        1wwrite &HBE                                            'komenda read

        B1 = 1wread()                                           'odczyt z termometru
        B2 = 1wread()
        Lwr                                                     'podprogram 1wr
        If B2 >= 248 Then                                       'w przypadku temperatur ujemnych
        B1 = R - B1                                             'Od 255 Odejmujemy B1
        B2 = R - B2                                             'od 255 odejmujemy B2
        Znak = "-"
        Else
        Znak = "+"
        End If
        T1 = B1 / 16                                            'Przesuniecie w pawo o 4 bajty
        T2 = B2 * 16                                            'przesuniecie w lewo o 4 bajty
        T1 = T1 + T2
        Tmp = Fusing(t1 , "###.&&")
        End Sub


    Sub Gol
    If T1 < 0.8 Then
       Lowerline
       Lcd "Mozliwa Gololedz"
       End If
    End Sub
    Kamery 3D Time of Flight - zastosowania w przemyśle. Darmowe szkolenie 16.12.2021r. g. 10.00 Zarejestruj się
  • #2
    crazy_phisic
    VIP Meritorious for electroda.pl
    operacje mnozenia i dzielenia dumnie opisane jako przesuniecie bitowe lepiej zrealizowac jako przesuniecie bitowe ;) polecenie Shift, szczegóły w helpie... inne propozycje jak bede mial wiecej czasu ;)
    Pozdrawiam
  • #3
    shg
    Level 35  
    Code:
    Dim T1 As Single
    
    Dim T2 As Single

    A co to?
    "Przesunięcia bitowe" na liczbach zmiennoprzecinkowych?

    Zamień single na int i powinno śmigać.
    Procedury obliczeńna liczbach zmiennoprzecinkowych pożerają mnóstwo miejsca.

    Dzielenie liczb całkowitych w bascomie AVR robi się za pomocą \, a nie /, ot taka ciekawostka. Użycie / powoduje wykonanie tego dzielenia jako zmiennoprzecinkowego (no zgroza normalnie, jak można było coś takiego wymeśleć?). W bascomie '51 nie ma tego problemu, / to normalne dzielenie.
  • #4
    rokoko
    Level 20  
    Zroblem co zaproponowaliscie i poskutkowalo - wielkosc kodu mniejsza od 2KB. Jako ze to nie do konca jest program mojego autorstwa mam pewne watpliwosci co do zmiany zmiennych z single na integer. Mianowicie: czy nie poskutkowalo to tym, ze z terometru (DS18B20) bedzie odczytywana jedynie wartosc calkoita?? Nie znam sie za dobrze na programowaniu wiec prosze wybaczcie moje bledy i lamerskie pytania.... Z gory dziekuje.
  • #5
    crazy_phisic
    VIP Meritorious for electroda.pl
    zobacz jak wyglada sam odczyt temperatury: B1=1wread... gdzie B1 masz zdeklarowane jako Byte, czyli wartośc całkowitą, dalsze operacje to tylko odpowiednie przeliczenie tego i przesunięcie przecinka a operacja fusing to tylko czysto kosmetyczna i jednoczesnie pamiecio żerna zabawa w estetyczny wynik na lcd....
    Jednocześnie nie jestem do konca przekonany czy ostatnia instrukcja warunkowa bedzie dobrze wykonana dla typu Single... rzutowanie w Bascomie to hmmmm... sporna sprawa ;)
    (jeśli to co napisalem to głupota to wybaczcie ale mam mała uroczystośc rodzinną ;) wię sami rozumiecue)
  • #6
    Raflles
    Level 13  
    a nie lepiej zastosować AT89c4051 ?? PRzecież różni się od AT89c2051 tylko tym że ma 4kb pamięci. I kłopot będzie z głowy.
  • #7
    zumek
    Level 39  
    jezus2001 wrote:
    a nie lepiej zastosować AT89c4051 ?? PRzecież różni się od AT89c2051 tylko tym że ma 4kb pamięci. I kłopot będzie z głowy.

    1)Kolega rokoko pisze na AVR-a
    2)Program , który miałby robić to , co opisał autor - spoko zmieści się 2051.

    :arrow: rokoko
    Przy odczycie 2 DS-ów na jednej magistrali , nie możesz stosować SKIP ROM przed ich odczytem . MUSISZ zastosować MATCH ROM lub dać 2 magistrale.Poza tym , skąd tak dziwne obliczenia temperatury - zważywszy , że interesuje Cie tylko część całkowita :?:

    Piotrek
pcbway logo