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.

Atmega 8 - DS18B20 brak wskazań temp.

Andrzej 1947 04 Maj 2016 19:28 963 3
  • #1 04 Maj 2016 19:28
    Andrzej 1947
    Poziom 2  

    Witam. Napisałem program w bascomie, zwykły termometr z wyjściem na Mikroprocesor to Atmega8 + lcd + DS18b20.
    Wskazuje tylko tem:25.5oC ,brak reakcji na tem.Nie wiem ,gdzie zrobiłem błąd.
    Może jakaś podpowiedż.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod



    Moderowany przez dondu:

    Poprawiłem SYNTAX - następnym razem proszę robić to prawidłowo:
    Instrukcja: https://www.elektroda.pl/rtvforum/viewtopic.php?p=14652518#14652518

    0 3
  • Pomocny post
    #2 04 Maj 2016 20:56
    LA72
    Poziom 39  

    Problem polega na tym, że odczytujesz wartość ADC z uC zamiast z DS18xxx.
    Brakuje ci obsługi DS18B20.
    Poniżej fragment kodu działającego u mnie.

    Kod: vbnet
    Zaloguj się, aby zobaczyć kod

    0
  • #3 22 Maj 2016 19:02
    Andrzej 1947
    Poziom 2  

    Problem rozwiązałem w 50%. To znaczy dzięki podpowiedzią kolegów co mi brakowało żeby działał termometr, który pracuje bardzo dobrze ,dopisałem do programu woltomierz , który pracuje dobrze.
    Do zamknięcia tematu pozostał jeszcze amperomierz , który mierzy spadek napięcia na boczniku sygnał wzmocniłem wzmacniaczem LM358.Nie wiem jak przeliczyć spadek napięcia na kod zrozumiały dla procesora I=U/R,gdzie R=0,10 Ohma oraz w dalszej kolejności policzyć moc.O ile to możliwe proszę o jakoś pomoc.
    Kod:

    $regfile = "m8def.dat"
    $crystal = 8000000


    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portb.1 , E = Portd.1 , Rs = Portd.0 'Komunikaqcja z LCD
    Config Lcd = 16 * 2
    Cls
    Cursor Off
    Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32 ' definicja znaki stopnia stopnia celcjusza
    '****CONFIG****

    Config Adc = Free , Prescaler = Auto , Reference = Avcc
    '****KONIEC CONFIG****


    '****CONFIG ZMIENNYCH****
    Dim Odczyt(2) As Byte , A As Byte , Licznik As Byte , T As Integer , T1 As Single , Napis As String * 5,
    Dim Temp1 As Byte
    Dim Wynik As Single
    Dim Rezu As Integer
    Dim Wolty As String * 4
    'Deklaracja wszystkich zmiennych potrzebnych do pracy programu


    '****PROGRAM GLOWNY****

    Start Adc 'odpalamy ADC

    Config 1wire = Portd.5 '0,1,2 NOP 3,4,5,6,7 works good ON MY Equipment

    Do
    1wreset 'reset
    1wwrite &HCC 'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
    1wwrite &H44 'dokonaj konwersji
    Waitms 750 'przeczekaj czas konwersji
    Set Portb.2 'gasimy diodę

    Reset Portb.2 'teraz zapalamy diodę
    1wreset 'reset
    1wwrite &HCC 'rozkaz adresowy SKIP ROM
    1wwrite &HBE 'rozkaz funkcyjny - polecenie odczytu DS18x20

    Odczyt(1) = 1wread(2) 'odczytaj dwa pierwsze bajty
    T = Odczyt(2) 'przepisz starszy bajt do zmiennej typu Integer
    Shift T , Left , 8 'przesuń ten bajt w lewo na wyższe pozycje
    T = T + Odczyt(1) 'przepisz - dodaj młodszy bajt
    T1 = T * 0.0625 'dokładność dla pomiaru 12 bit, wynik wpisz do zmiennej Temp1
    Napis = Fusing(t1 , "#.#") 'format wyświetlania x.x

    Rezu = Getadc(4)
    Rezu = Getadc(4)
    Wynik = Rezu / 40

    Wolty = Fusing(wynik , "#.##")


    Cls : Cursor Off : Lcd "Nap" ; Spc(3) ; Wolty ; "V"
    Lowerline
    Lcd "Temp: " ; Napis ; " " ; Chr(1) ; "C" 'wy?wietl wynik ze zmiennej Single
    Waitms 300
    Loop : End
    Witam Andrzej 1947
    Napisałem program "Termostat" Bascom Atmega 8
    Korzystając z książki Mikrokontrolery dla początkujących Piotr Górecki i oczywiście korzystając podpowiedzi kolegów.
    Program działa poprawnie, ale tylko z ustawioną temperaturą w programie.
    Nie potrafię rozwiązać problemu z ustawianiem temperatury za pomocą przycisków .O ile to możliwe proszę o jakoś pomoc.
    w załączeniu kod programu.Temperatury ustawione niskie w celu kontroli działania układu.





    $regfile = "m8adef.dat"
    $crystal = 8000000

    Config Pinb.0 = Input 'linia PB0 jako wejście
    Config Pinb.1 = Input 'linia PB1 jako wejście
    Config Portd.7 = Output
    Config Portc.3 = Output
    Config Portc.5 = Output
    Config 1wire = Portd.5
    Config Lcdpin = Pin , Db4 = Portd.2 , Db5 = Portd.3 , Db6 = Portd.4 , Db7 = Portd.6 , E = Portd.1 , Rs = Portd.0
    Deflcdchar 1 , 14 , 17 , 17 , 14 , 32 , 32 , 32 , 32 ' definicja znaki stopnia stopnia celcjusza
    Config Lcd = 16 * 2
    Cls
    '--------------------DEKLARACJA ZMIENNYCH--------------------------------------'

    Dim Odczyt(2) As Byte , T1 As Single , T As Integer , Napis As String * 5


    S1 Alias Pinb.0 'przypisanie nazwie Pinb.0 nazwy S1
    S2 Alias Pinb.1 'przypisanie nazwie Pinb.1 nazwy S2

    Set Portb.0 'dołączenie do linii PB0 rezystora podciągającego
    Set Portb.1 'dołączenie do linii PB1 rezystora podciągającego

    '------------------------KONFIGURACJA LCD--------------------------------------'
    Cls
    Cursor Off
    Lcd ; Spc(3) ; "TERMOSTAT" 'wyświetlanie ekranu początkowego
    Lowerline
    Lcd ; "Atmega 8 LCD2x16" 'wyświetlanie ekranu początkowego
    Wait 3
    Cls
    '------------------------POCZĄTEK PĘTLI GŁÓWNEJ--------------------------------'

    Do
    1wreset 'reset
    1wwrite &HCC 'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
    1wwrite &H44 'dokonaj konwersji
    Waitms 750 'przeczekaj czas konwersji

    1wreset 'reset
    1wwrite &HCC 'rozkaz adresowy SKIP ROM
    1wwrite &HBE 'rozkaz funkcyjny - polecenie odczytu DS18x20

    Odczyt(1) = 1wread(2) 'odczytaj dwa pierwsze bajty
    T = Odczyt(2) 'przepisz starszy bajt do zmiennej typu Integer
    Shift T , Left , 8 'przesuń ten bajt w lewo na wyższe pozycje
    T = T + Odczyt(1) 'przepisz - dodaj młodszy bajt
    T1 = T * 0.0625 'dokładność dla pomiaru 12 bit, wynik wpisz do zmiennej Temp1
    Napis = Fusing(t1 , "#.#") 'format wyświetlania x.x
    Waitms 750

    If T1 >= 26 And T1 <= 28 Then 'sygnalizacja zał: wentylatora dioda D1
    Portc.3 = 1
    Else
    Reset Portc.3
    End If

    If T1 >= 26 And T1 <= 28 Then 'Załącz wentylator
    Portd.7 = 1
    Else
    Reset Portd.7
    End If

    Home Upper
    Lcd "odczyt z DS18B20 "
    Lowerline
    Lcd "Odcz" ; Spc(1) ; "Temp:" ; Napis ; Chr(1) ; "C" ; 'wyświetlanie pomierzonych wartości
    Waitms 100
    Loop
    End
    '----------------------------KONIEC PĘTLI GŁÓWNEJ-----

    0