Elektroda.pl
Elektroda.pl
X
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

DS18B20 Optymalizacja kodu

higlos 24 Maj 2005 13:08 1506 4
  • #1 24 Maj 2005 13:08
    higlos
    Poziom 12  

    Ponizej przedstawiam podprogram odczytu temperatury z czujnika Ds18B20 i mam pytanko w jaki sposb zrealizowac odczyt temperatury aby nie wplywal on na opoznienia czsowe glownego programu. Kombinowalem na Timerach ustawiajac poprogramy tak aby najpier wykonaly czynnosc
    "
    1wreset
    1wwrite &HCC
    1wwrite &H44

    "

    i za 750 ms czynnosc

    "

    1wreset
    1wwrite &HCC
    1wwrite &HBE

    Temperatura1 = 1wread() 'odczyt z termometru
    Temperatura2 = 1wread()

    1wreset 'podprogram 1wr

    If Temperatura2 >= 248 Then 'w przypadku temperatur ujemnych
    Temperatura1 = R - Temperatura1 'Od 255 Odejmujemy B1
    Temperatura2 = R - Temperatura2 'od 255 odejmujemy B2
    End If
    T1 = Temperatura1 / 16 'Przesuniecie w pawo o 4 bajty
    T2 = Temperatura2 * 16 'przesuniecie w lewo o 4 bajty
    T1 = T1 + T2


    "

    jednak nie moglem uzyskac oczekiwanych rezultatów :/ mozliwe ze popelniam w czyms blad przez ktory nie chce to zadzialac albo i nie jest mozliwa taka praca owego czujnika temperatury. Jesli ktos ma pomysł w jaki sposb zrealizowac to zadanie to prosiłbym o pomoc.

    Pozdrawiam

    Sub Odcz_temp

    1wreset
    1wwrite &HCC
    1wwrite &H44

    Wait 1

    1wreset
    1wwrite &HCC
    1wwrite &HBE

    Temperatura1 = 1wread()
    Temperatura2 = 1wread()

    1wreset

    If Temperatura2 >= 248 Then
    Temperatura1 = R - Temperatura1
    Temperatura2 = R - Temperatura2
    End If
    T1 = Temperatura1 / 16
    T2 = Temperatura2 * 16
    T1 = T1 + T2

    End Sub

    0 4
  • #2 24 Maj 2005 14:11
    Viperus
    Poziom 13  

    Odczytywać temperature po ustawieniu określonej flagi w przerwaniu.
    Kawałek kodu z mojego programu kiedy robiłem to jeszcze w Bascom

    Code:


    Dim Flaga As Byte : Flaga = 0

    On Timer0 Int_timer0                                        ' wskazanie do obsługi przerwania Timer 0
    Const Factor = &H6A                                         'częstość wywołania przerwania timera
    Config Timer0 = Timer , Prescale = 64                       'ustawiona na ok. 1,6ms
    Timer0 = Factor
    Enable Timer0                                               'włączenie timera
    Enable Interrupts

    Do
      If Flaga > 200 Then
        Read18b20                                               'odczyt temperatury pokonwersji
        Convert                                                 'ponowna konwersja temperatury
        flaga = 0
      End If
    Loop

    End                                                         'koniec programu głównego

    Int_timer0:
    incr flaga
    return


    Read18b20 i Convert to odpowiednie procedury inicjujące pomiar i odczytujace temp po konwersji. Program nie czeka bezczynnie tylko wykonuje się dalej dopuki nie upłynie czas potrzebny na konwersje.
    Pescaler i factor(wartość początkową licznika) musisz ustawić zależnie od posiadanego kwarcu, u mnie był 6MHz.
    W drugim przypadku u Ciebie za krótko czekasz na oczyt temp po konwersji, sprawdź te czasy w nocie aplikacyjnej. Zależą od rozdzielczości przetwornika.

    Pozdrawiam,
    Grzesiek

    0
  • #3 25 Maj 2005 09:41
    pch
    Poziom 14  

    Można też zrobić tak:

    obsluga_termometru:
    gosub Odczytaj_temperature
    gosub Inicjuj_termometr
    return

    Bez żadnych opóźnień odczytać i od razu zainicjować konwersję kolejnej wartości a wykonywać podprogram np. co sekundę.

    PC

    0
  • #4 25 Maj 2005 10:26
    Viperus
    Poziom 13  

    Witam.
    Przecież dokładnie to samo napisałem, plus to jak wykonać te procedury co określony czas ustawiajac timer. Można oczywiście ustawić od razu timer na 1s, tyle że u mnie on jeszcze odpowiadał za multiplex wyświetlacza 7LED.

    Grzesiek.

    0
  • #5 25 Maj 2005 10:38
    pch
    Poziom 14  

    Zwracam honor. Niedoczytałem dokładnie.

    PC

    0