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.

[Atmega8][Bascom] Termostat

ma16 31 Oct 2009 21:34 3717 8
  • #1
    ma16
    Level 13  
    Witam
    Potrzebuje pomocy przy programie termostatu. Mam napisany program lecz niestety nie chce mi załączyć wyjścia PB.0 załączam kod programu

    Code:
    $regfile = "m8def.DAT"
    
    $crystal = 1000000

    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config Lcd = 16 * 2
    Config Portb.0 = Output
    Config 1wire = Portd.5
    Dim I1 As Integer , Ss As String * 6

    Dim Dsid1(8) As Byte

    Dim B As Byte
    Dim W As Byte

    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32



    Cursor Off

    Dsid1(1) = 1wsearchfirst()                                  '

    If Dsid1(8) = Crc8(dsid1(1) , 7) Then
     Locate 1 , 1
     Lcd "CRC OK Czujnik 1 ID"
     Wait 1
     Locate 1 , 1
     For B = 1 To 8
     Lcd Hex(dsid1(b))
     Next
    End If
    Wait 2
    Cls

    Do
       1wreset
       1wwrite &H55
       1wverify Dsid1(1)
       1wwrite &HBE
       I1 = 1wread(2)

       1wreset
       1wwrite &HCC
       1wwrite &H44
    Wait 1

       I1 = I1 * 10
       I1 = I1 / 16
       'If I1 > 0 Then Cls
       Ss = Str(i1)
       Ss = Format(ss , " 0.0")
       Locate 1 , 1
       Lcd "  Temperatura"
       Locate 2 , 6
       Lcd Ss ; Chr(0) ;
       Wait 1
       If I1 > 25 Then
       Set Portb.0
       End If
       If I1 <= 25 Then
       Reset Portb.0
       End If
    Loop


    Program jest jak na razie w wersji próbnej jeszcze będę dodawał histerezę ale najpierw chce żeby zadziałał mi w takiej postaci.
    [28-30.06.2022, targi] PowerUP EXPO 2022 - zasilanie w elektronice. Zarejestruj się za darmo
  • #2
    dan_mad
    Level 10  
    Podaj informację co Ci teraz działa... Termometr jest odczytywany prawidłowo (temperatura) i wyświetlane na wyświetlaczu ? Czy w ogóle nic nie działa ?
  • #3
    ma16
    Level 13  
    Temperatura jest wyświetlana prawidłowo.
    Nie wiem czemu ale załącza się wyjście PB.0, gdy temp. jest ponizej 2 C.
  • #4
    Ture11
    Level 38  
    ma16 wrote:

    Config Portb.0 = Output

    to mi się nie podoba... dlaczego Bascom pozwolił na skompilowanie tego? Nie jestem geniuszem, ale tam chyba powinno być
    Code:
    config pinb.0 = output
  • #5
    ZbeeGin
    Level 39  
    I brakuje jeszcze histerezy programowej.
  • #6
    Freddy
    Level 43  
    Ture11 wrote:
    ma16 wrote:

    Config Portb.0 = Output

    to mi się nie podoba... dlaczego Bascom pozwolił na skompilowanie tego? Nie jestem geniuszem, ale tam chyba powinno być
    Code:
    config pinb.0 = output

    Bo taki jest Bascom ....
    Racja, a dokładniej :
    Code:
    .....
    
    Syntax
    CONFIG PORTx = state
    CONFIG PINx.y = state
    ......
    You can also set a single port pin with the CONFIG PIN = state, statement.
    Again, you can use INPUT, OUTPUT or a number. In this case the number can be only zero or one.
     


    ZbeeGin :arrow: na razie histereza nie jest potrzebna do działania, bez niej też powinno działać.

    ma16 :arrow: Może jeszcze łaskawie powiedz jakiego używasz czujnika temperatury.
  • #7
    ma16
    Level 13  
    Freddy wrote:


    ma16 :arrow: Może jeszcze łaskawie powiedz jakiego używasz czujnika temperatury.


    czujnik to DB18B20 z rezystorem 4k7..

    Co do config Portb.0 to działa tak skompilowane udało mi się ustawić temperature i działa mi termostat (sygnalizator jest uaktywniany stanem niskim)

    Załanczam kod programu"

    Code:

    $regfile = "m8def.DAT"
    $crystal = 1000000

    Config Lcdpin = Pin , Db4 = Portc.3 , Db5 = Portc.2 , Db6 = Portc.1 , Db7 = Portc.0 , E = Portc.4 , Rs = Portc.5
    Config Lcd = 16 * 2
    Config Portb.0 = Output
    Config 1wire = Portd.5
    Dim I1 As Integer , Ss As String * 6
    Dim T As Integer                                            ' temperatura

    Dim Dsid1(8) As Byte

    Dim B As Byte
    Dim W As Byte

    Deflcdchar 0 , 8 , 20 , 11 , 4 , 4 , 4 , 3 , 32

    Cursor Off

    Dsid1(1) = 1wsearchfirst()                                  '

    If Dsid1(8) = Crc8(dsid1(1) , 7) Then
     Locate 1 , 1
     Lcd "CRC OK Czujnik 1 ID"
     Wait 1
     Locate 1 , 1
     For B = 1 To 8
     Lcd Hex(dsid1(b))
     Next
    End If
    Wait 2
    Cls

    Do
       1wreset
       1wwrite &H55
       1wverify Dsid1(1)
       1wwrite &HBE
       I1 = 1wread(2)

       1wreset
       1wwrite &HCC
       1wwrite &H44
    Wait 1

       I1 = I1 * 10
       I1 = I1 / 16
        T = I1 / 10


       Ss = Str(i1)
       Ss = Format(ss , " 0.0")
       Locate 1 , 1
       Lcd "  Temperatura"
       Locate 2 , 6
       Lcd Ss ; Chr(0) ;
       Reset Portb.0
       Wait 1
       If T < 35 Then
       Set Portb.0
       End If
       If T > 80 Then
       Set Portb.0
       End If

    Loop
  • #8
    Ture11
    Level 38  
    To w sumie już nic z tego nie rozumiem - to w końcu działa czy nie działa? Jeżli działa to co było przyczyną?
  • #9
    ma16
    Level 13  
    nie działał ale po kilku godzinach siedzenia przy kodzie udało mi sie utworzyć kod przy którym udało mi się załączyć układ. Przyczyną załanczania przy innej temperaturze było to że nie brałem rzeczywistej temperatury tylko odczyt z czujnika przed obliczeniem temperatury.

    Jeszcze tylko nie rozumiem czemu jak daje Set Portb.0 podczas warunku T<35 to zamiast załączyć jak temperatura spadnie poniżej 35 C to wtedy z stanu wysokiego idzie w stan niski....