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

Optymalizacja kodu BASCOM dla termometru 2-liniowego - jak zmniejszyć rozmiar?

rokoko 22 Lis 2005 16:27 1637 6
REKLAMA
  • #1 2015399
    rokoko
    Poziom 20  
    Posty: 484
    Pomógł: 6
    Ocena: 57
    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
    
    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
  • REKLAMA
  • #2 2015740
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 131
    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
  • REKLAMA
  • #3 2015864
    shg
    Poziom 35  
    Posty: 2289
    Pomógł: 339
    Ocena: 135
    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.
  • REKLAMA
  • #4 2016906
    rokoko
    Poziom 20  
    Posty: 484
    Pomógł: 6
    Ocena: 57
    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 2017179
    crazy_phisic
    VIP Zasłużony dla elektroda
    Posty: 2244
    Pomógł: 278
    Ocena: 131
    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)
  • REKLAMA
  • #6 2018277
    Raflles
    Poziom 14  
    Posty: 93
    Pomógł: 4
    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 2018483
    zumek
    Poziom 39  
    Posty: 3352
    Pomógł: 695
    Ocena: 52
    jezus2001 napisał:
    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

Podsumowanie tematu

LABEL_AI_GENERATED
Dyskusja dotyczy optymalizacji kodu w BASCOM dla termometru 2-liniowego opartego na magistrali 1-Wire, którego kod zajmuje ponad 3 KB, co przekracza pamięć 2 KB mikrokontrolera. Główne sugestie obejmują zastąpienie zmiennych typu Single typem Integer, co znacząco zmniejsza rozmiar kodu, ponieważ operacje na liczbach zmiennoprzecinkowych są pamięciochłonne. Zwrócono uwagę na poprawne użycie operatorów dzielenia całkowitego ( zamiast /) w BASCOM dla AVR. Wskazano również, że odczyt temperatury z czujnika DS18B20 może być realizowany na wartościach całkowitych, a formatowanie wyniku na LCD jest dodatkowym, kosztownym pod względem pamięci etapem. Poruszono problem obsługi dwóch czujników na jednej magistrali 1-Wire, gdzie zamiast SKIP ROM należy stosować MATCH ROM lub użyć dwóch magistrali. Zaproponowano także rozważenie użycia mikrokontrolera AT89C4051 z większą pamięcią 4 KB jako alternatywę dla AT89C2051. Wskazano, że program powinien zmieścić się w pamięci 2 KB przy odpowiedniej optymalizacji i poprawnym podejściu do obsługi magistrali i typów danych.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA