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

Jak poprawić działanie programu termostatu w Bascom z czujnikiem DS18B20?

Sławek47 26 Sty 2006 08:20 2832 8
  • #1 2220269
    Sławek47
    Poziom 11  
    Posty: 24
    Ocena: 3
    Witam,
    napisałem prosty programik do obsługi ds18b20, który miałby mierzyć temperaturę i według zadanych kryteriów włączać ew. wyłączać urządzenia (narazie to tylko diody, ale docelowo będą to przekaźniki). uP Atmega8

    Po uruchomieniu programu napotkałem na następujący problem:

    W przedziale od 10 do 20 świeci jedna dioda ale ogrzanie czujnika nie powoduje zapalenia następnej diody. Natomiast gdy ogrzeję powyżej 20 stopni czujnik i wyłączę i włączę układ zapalają się dwie diody, ale gdy czujnik ochłodzi się poniżej 20 stopni to diody nie gasną.
    Co zrobić aby rozwiązać ten problem?

    Poniżej listing programu
    ps. programuję dopiero od paru dni więc proszę o wyrozumiałość


     $crystal = 8000000
    Config Pinc.5 = Output                                      ' piny jako wyjścia
    Config Pinc.4 = Output
    Config 1wire = Portd.0                                      ' termometr ds18b20
    Dim I As Integer                                            'zmienne do odczytu temp.
    Dim S As Single
    
    Pomiar:                                                     'pomiar temp. na termometrze ds18b20
    Do
       1wreset
       1wwrite &HCC
       1wwrite &H44
       Waitms 750
    
       1wreset
       1wwrite &HCC
       1wwrite &HBE
    
       I = 1wread(2)
       S = I / 16
    
       Select Case S                                            ' wybór diody
          Case 0 To 10 : Gosub Zero                             ' obie diody zgaszone
          Case 10 To 20 : Gosub Jedna                           'jedna dioda świeci
          Case 20 To 30 : Gosub Dwie                            'obie diody świecą
       End Select
    Loop
    
    Zero:
       Reset Portc.5                                            'zgaś obie diody
       Reset Portc.4
    Return
    
    Jedna:
       Set Portc.5                                              'dioda 1 świeci
       Reset Portc.4                                            ' dioda 2 zgaszona
    Return
    
    Dwie:
       Set Portc.5                                              'dioda 1 świeci
       Set Portc.4                                              'dioda 2 świeci
    Return
    Moderowany przez Light-I:

    3. W temacie wiadomości należy dokładnie zawrzeć całą istotę wysyłanych informacji. Gwarantuje to łatwe wyszukiwanie i czytelne przeglądanie przez osoby zainteresowane. Nie akceptujemy tematów w stylu "pomoc", "problem"
    Regulamin www.elektroda.pl znajduje się Tutaj. Wyróżnianie tematu jest możliwe przez odpowiednie spożytkowanie punktów na tym forum. Treść tematu zmieniono.

  • #2 2220515
    maxiu25
    Poziom 16  
    Posty: 190
    Pomógł: 16
    Ocena: 3
    nie znam sie na bascomie ale to co mowisz o dzialaniu programu wyglada tak jabys tylko raz na poczatku odczytywal temperature wiec moze spróbuj zapetlic program aby robil to w nieskonczonosc
  • #3 2220734
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Przedziały w Case nachodzą na siebie:

       Select Case S                                            ' wybór diody 
          Case 0 To 10 : Gosub Zero                             ' obie diody zgaszone 
          Case 10 To 20 : Gosub Jedna                           'jedna dioda świeci 
          Case 20 To 30 : Gosub Dwie                            'obie diody świecą 
       End Select 


    Powinno być raczej:

       Select Case S                                            ' wybór diody 
          Case 0 To 9 : Gosub Zero                             ' obie diody zgaszone 
          Case 10 To 19 : Gosub Jedna                           'jedna dioda świeci 
          Case 20 To 29 : Gosub Dwie                            'obie diody świecą 
          itd...
       End Select 


    ps. dopisz na początku:

    $regfile = "m8def.dat"


    Pozdrawiam...
  • #4 2220985
    Sławek47
    Poziom 11  
    Posty: 24
    Ocena: 3
    Zrobiłem jak polecił kol. Jaca ale niestety diody nadal nie reagują na zmianę temperatury. Dopiero włączenie i wyłączenie układu powoduje zmianę stanu diod.

    Może ktoś ma jakieś pomysły??
  • #5 2221411
    Jaca
    Poziom 32  
    Posty: 1332
    Pomógł: 239
    Ocena: 217
    Masz tu mój program termostatu. Może uda Ci się coś z niego wyciągnąć do własnych projektów.
    Załączniki:
    • TERM.zip (6.83 KB) Musisz być zalogowany, aby pobrać ten załącznik.
  • #6 2223146
    Sławek47
    Poziom 11  
    Posty: 24
    Ocena: 3
    No niestety program jest dosyć rozbudowany, a ja jestem dopiero początkujący i potrzebuję wszystko mieć łopatologicznie wytłumaczone.
    Jeżeli ktoś ma jakiś pomysł to proszę zapodawać na pewno go wypróbuję.
    Jest to dla mnie b. ważne
    Pozdrawiam
    Sławek
  • #7 2223407
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    mam coś dla ciebie. działający prosty programik do testowania DS'ów
    
    Const Skip_rom = &HCC
    Const Convert = &H44
    Const Read_sp = &HBE
    Const Write_sp = &H4E
    Const Copy_sp = &H48
    Const Recall_ee = &HB8
    Const Search_rom = &HF0
    Const Read_rom = &H33
    Const Match_rom = &H55
    Const Alarm = &HEC
    Config Lcd = 16 * 2
    
    Dim Scrachpad(8) As Byte
    Dim Tmp As Integer
    Dim Wynik As Single
    
    Cls
    Lcd "Temperature sensor"
    Wait 1
    Cls
    Config 1wire = Portb.7
    Waitms 100
    
    1wreset
    1wwrite Skip_rom
    1wwrite Write_sp
    1wwrite 0
    1wwrite 0
    1wwrite &H7F
    
    Do
    
    1wreset
    1wwrite Skip_rom
    1wwrite Convert
    Waitms 800
    
    1wreset
    1wwrite Skip_rom
    1wwrite Read_sp
    
    Scrachpad(1) = 1wread()
    Scrachpad(2) = 1wread()
    Tmp = Scrachpad(2) * 256
    Tmp = Tmp + Scrachpad(1)
    Wynik = Tmp
    Wynik = Wynik / 16
    
    Cls
    Lcd Wynik
    
    Wait 1
    Loop


    co do twojego programu to powinien działać.
    moze sprubuj ustawić większe stosy w opcjach kompliacji. ja ustawiam na wszystkich 128, chociaż to za duzo to mają 1k ramu to i tak się większość marnuje a moze akurat sie przyda.
    możesz też dać większe odstępy czasu między odczytami z ds'a.
    a jakiego trybu zasialnia uzywasz??
  • #8 2502522
    Konto nie istnieje
    Konto nie istnieje  
  • #9 2507125
    hunterhouse
    Poziom 26  
    Posty: 893
    Pomógł: 84
    Ocena: 3
    niestety ujemnych liczb cgba nie obsługóje , chociaz może ???
    co do zaokrąglania to mozna dać

    Lcd Fusing(Wynik , "#.##")


    i powinno działać

    pozdrawiam

Podsumowanie tematu

✨ Dyskusja dotyczy problemów z działaniem prostego programu termostatu napisanego w Bascom dla mikrokontrolera Atmega8 z czujnikiem temperatury DS18B20. Głównym problemem jest brak reakcji diod na zmiany temperatury w czasie rzeczywistym – diody zapalają się tylko po ponownym uruchomieniu układu, a nie podczas dynamicznego wzrostu lub spadku temperatury. Sugerowano, że program powinien być zapętlony, aby ciągle odczytywał temperaturę, a także poprawiono zakresy w instrukcji Select Case, aby uniknąć nakładania się przedziałów temperatur. Podano przykładowy, prosty program testowy do obsługi DS18B20 z wykorzystaniem protokołu 1-Wire, który wyświetla temperaturę na LCD i działa w pętli. Poruszono także kwestie formatowania wyświetlanej temperatury, w tym zaokrąglania do dwóch miejsc po przecinku oraz obsługi temperatur ujemnych, które Bascom może nie obsługiwać natywnie. Wskazano na konieczność poprawnej konfiguracji pliku rejestru mikrokontrolera oraz ewentualne zwiększenie stosów w opcjach kompilatora.
Podsumowanie AI na podstawie dyskusji. Może zawierać błędy.
REKLAMA