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.

Program do obsługi termostatu w Bascom

Sławek47 26 Jan 2006 08:20 2679 8
  • #1
    Sławek47
    Level 11  
    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ść


    Code:
     $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
    Moderated By 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
    maxiu25
    Level 16  
    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
    Jaca
    Level 29  
    Przedziały w Case nachodzą na siebie:

    Code:
       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:

    Code:
       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:

    Code:
    $regfile = "m8def.dat"


    Pozdrawiam...
  • #4
    Sławek47
    Level 11  
    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??
  • #6
    Sławek47
    Level 11  
    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
    hunterhouse
    Level 26  
    mam coś dla ciebie. działający prosty programik do testowania DS'ów
    Code:

    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
    User removed account
    User removed account  
  • #9
    hunterhouse
    Level 26  
    niestety ujemnych liczb cgba nie obsługóje , chociaz może ???
    co do zaokrąglania to mozna dać

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


    i powinno działać

    pozdrawiam[/code]