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

ds18b20 attiny2313 dwupunktowy termometr, przeróbka programu

norbis15 30 Lis 2010 10:12 4925 8
  • #1 8807719
    norbis15
    Poziom 14  
    Witam chodzi o ten projekt: http://mirley.firlej.org/termometr_uniwersalny chodzi mi o zbudowanie takiego urządzenia, ale żeby można było mierzyć temperaturę w dwóch miejscach (w środku i na zewnątrz). Rozważałem budowę dwóch takich urządzeń w jednej obudowie, ale to nie ekonomiczne. Czy mógłby mi ktoś pomóc w przerobieniu programu? przełączanie między czujnikami mogło by się odbywać po przez przyciski s1 i s2. np s1- zewnętrzna, s2-wewnętrzna ds18b20 attiny2313 dwupunktowy termometr, przeróbka programu

    norbis15 napisał:
    '****************************
    'Konfiguracja
    '****************************
    $regfile = "attiny2313.dat"
    $crystal = 12000000

    Config Portb = &B11111111 : Portb = &B11111111
    Config Portd = &B11111111 : Portd = &B11111111

    Config 1wire = Pind.5

    Config Timer0 = Timer , Prescale = 64
    Enable Timer0 : On Timer0 Przerwanie0


    Enable Interrupts
    '****************************
    'Zmienne
    '****************************
    Dim Lsb As Byte
    Dim Msb As Byte
    Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
    Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
    Dim Wysw_pomoc As Word
    Dim Tempa As Word
    Dim Mux As Byte

    Dim Zezw_wysw As Bit
    Dim Pomiar_odczyt As Bit
    Dim Minus As Bit
    Dim Ur As Bit
    '****************************
    'Wartosci Poczatkowe
    '****************************
    Reset Pomiar_odczyt
    Reset Ur
    Wysw1 = 191
    Wysw10 = 191
    Wysw100 = 191
    '****************************
    'Petla glowna
    '****************************
    Do

    If Zezw_wysw = 1 Then
    Reset Zezw_wysw 'co 4ms
    Wysw = Tempa

    If Ur = 1 Then Gosub Przelicz
    Gosub Wyswietl
    End If

    Loop
    End
    '****************************
    'Przerwanie timer0
    '****************************
    Przerwanie0:
    Timer0 = 5
    Incr Co4ms
    If Co4ms = 3 Then
    Co4ms = 0
    '*************************************** co 4ms
    Set Zezw_wysw
    Incr Co100ms
    If Co100ms = 25 Then
    Co100ms = 0
    '*************************************** co 100 ms
    'ew flaga obslugi przyciskow
    Incr Co1s
    If Co1s = 7 Then
    Co1s = 0
    '*************************************** co 1s
    Pomiar_odczyt = Not Pomiar_odczyt

    Disable Interrupts
    1wreset

    If Pomiar_odczyt = 1 Then
    1wwrite &HCC
    1wwrite &H44
    Else
    If Err = 0 Then

    1wwrite &HCC
    1wwrite &HBE
    Lsb = 1wread():
    Msb = 1wread():

    Minus = Msb.7

    Tempa = Msb * 256
    Tempa = Tempa + Lsb


    If Minus = 1 Then
    Tempa = Not Tempa
    Tempa = Tempa + 1
    End If

    Tempa = Tempa * 10 'temperatura *10
    Tempa = Tempa / 16

    If Ur = 0 Then Ur = 1

    Else
    Tempa = 10000 'Er wyswietli wyswietlacz potem
    End If
    End If

    Enable Interrupts
    '***************************************
    End If
    '***************************************
    End If
    '***************************************
    End If

    Return
    '****************************
    'Inne Etykiety
    '****************************
    Przelicz:
    If Wysw < 1000 Then
    Wysw_pomoc = Wysw Mod 10
    Wysw1 = Wysw_pomoc
    Wysw = Wysw / 10
    Wysw_pomoc = Wysw Mod 10
    Wysw10 = Wysw_pomoc
    Wysw = Wysw / 10
    Wysw_pomoc = Wysw Mod 10
    Wysw100 = Wysw_pomoc

    If Wysw100 = 0 Then Wysw100 = 10 'wygaszenie zera wiodącego

    Wysw1 = Lookup(wysw1 , Tabela)
    Wysw10 = Lookup(wysw10 , Tabela2)
    Wysw100 = Lookup(wysw100 , Tabela)

    Else
    Wysw1 = 175 'r
    Wysw10 = 175 'r
    Wysw100 = 134 'E
    End If

    Return


    Wyswietl:

    Incr Mux
    If Mux = 3 Then Mux = 0

    Portd.6 = Not Minus

    Select Case Mux
    Case 0:
    Set Portd.0
    Portb = Wysw100
    Reset Portd.2

    Case 1:
    Set Portd.2
    Portb = Wysw10
    Reset Portd.1

    Case 2:
    Set Portd.1
    Portb = Wysw1
    Reset Portd.0
    End Select

    Return

    '****************************

    '****************************


    '*******************************************************************************
    'Tabele do wyswietlania na wyswietlaczu
    '*******************************************************************************
    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
    'znak: 0 1 2 3 4 5 6 7 8 9 pusty

    Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
    'znak: 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. pusty
    '*******************************************************************************

    '*******************************************************************************
  • #2 8807838
    mirekk36
    Poziom 42  
    Jeśli nie chcesz się nauczyć programować to rzeczywiście taniej ci wyjdzie zrobić takie dwa urządzenia. A jak chcesz się nauczyć programować to zacznij po kolei od najprostszych rzeczy jak miganie diodą.
  • #3 8807868
    norbis15
    Poziom 14  
    Chcę się nauczyć programować, ale jest to zbyt zaawansowany problem. Jestem na etapie mikroprocesorowej oślej łączki. A Układ bardzo chciałbym wykonać do świąt, gdyż posłuży on jako prezent. Możliwe, że kiedyś bedę sam pisał takie programy, ale aktualnie jest to poza moimi możliwościami, więc proszę o pomoc.
  • #4 8807949
    arktik1
    Poziom 27  
    I podaj plik BAS...
  • #6 8808703
    galusz
    Poziom 15  
    Spokojnie składaj sobie układ, bo program można bez problemu poprawić. Dwa if dwie zmienne oraz 1wsearch...first/next()...
  • #8 8820098
    arktik1
    Poziom 27  
    Tak możesz podłączyć.
    Dopisz jeszcze tylko zmianę wyświetlania i obsługę drugiego DS.
  • #9 8860292
    norbis15
    Poziom 14  
    No to do dzieła. Zmontowany termometr działa bez zarzutu, teraz kwestia dołożenia dodatkowego czujnika. Zmiana mogłaby się odbywać np po przez wciśnięcie przycisku bądź co np 5s., jak to zrobić, co należy zmienić? Podaje aktualny program który aktualnie działa i obsługuje jednego ds-a.
    Cytat:
    '****************************
    'Konfiguracja
    '****************************
    $regfile = "attiny2313.dat"
    $crystal = 12000000

    Config Portb = &B11111111 : Portb = &B11111111
    Config Portd = &B11111111 : Portd = &B11111111

    Config 1wire = Pind.5

    Config Timer0 = Timer , Prescale = 64
    Enable Timer0 : On Timer0 Przerwanie0


    Enable Interrupts
    '****************************
    'Zmienne
    '****************************
    Dim Lsb As Byte
    Dim Msb As Byte
    Dim Co4ms As Byte , Co100ms As Byte , Co1s As Byte
    Dim Wysw As Word , Wysw1 As Byte , Wysw10 As Byte , Wysw100 As Byte
    Dim Wysw_pomoc As Word
    Dim Tempa As Word
    Dim Mux As Byte

    Dim Zezw_wysw As Bit
    Dim Pomiar_odczyt As Bit
    Dim Minus As Bit
    Dim Ur As Bit
    '****************************
    'Wartosci Poczatkowe
    '****************************
    Reset Pomiar_odczyt
    Reset Ur
    Wysw1 = 191
    Wysw10 = 191
    Wysw100 = 191
    '****************************
    'Petla glowna
    '****************************
    Do

    If Zezw_wysw = 1 Then
    Reset Zezw_wysw 'co 4ms
    Wysw = Tempa

    If Ur = 1 Then Gosub Przelicz
    Gosub Wyswietl
    End If

    Loop
    End
    '****************************
    'Przerwanie timer0
    '****************************
    Przerwanie0:
    Timer0 = 5
    Incr Co4ms
    If Co4ms = 3 Then
    Co4ms = 0
    '*************************************** co 4ms
    Set Zezw_wysw
    Incr Co100ms
    If Co100ms = 25 Then
    Co100ms = 0
    '*************************************** co 100 ms
    'ew flaga obslugi przyciskow
    Incr Co1s
    If Co1s = 7 Then
    Co1s = 0
    '*************************************** co 1s
    Pomiar_odczyt = Not Pomiar_odczyt

    Disable Interrupts
    1wreset

    If Pomiar_odczyt = 1 Then
    1wwrite &HCC
    1wwrite &H44
    Else
    If Err = 0 Then

    1wwrite &HCC
    1wwrite &HBE
    Lsb = 1wread():
    Msb = 1wread():

    Minus = Msb.7

    Tempa = Msb * 256
    Tempa = Tempa + Lsb


    If Minus = 1 Then
    Tempa = Not Tempa
    Tempa = Tempa + 1
    End If

    Tempa = Tempa * 10 'temperatura *10
    Tempa = Tempa / 16

    If Ur = 0 Then Ur = 1

    Else
    Tempa = 10000 'Er wyswietli wyswietlacz potem
    End If
    End If

    Enable Interrupts
    '***************************************
    End If
    '***************************************
    End If
    '***************************************
    End If

    Return
    '****************************
    'Inne Etykiety
    '****************************
    Przelicz:
    If Wysw < 1000 Then
    Wysw_pomoc = Wysw Mod 10
    Wysw1 = Wysw_pomoc
    Wysw = Wysw / 10
    Wysw_pomoc = Wysw Mod 10
    Wysw10 = Wysw_pomoc
    Wysw = Wysw / 10
    Wysw_pomoc = Wysw Mod 10
    Wysw100 = Wysw_pomoc

    If Wysw100 = 0 Then Wysw100 = 10 'wygaszenie zera wiodącego

    Wysw1 = Lookup(wysw1 , Tabela)
    Wysw10 = Lookup(wysw10 , Tabela2)
    Wysw100 = Lookup(wysw100 , Tabela)

    Else
    Wysw1 = 175 'r
    Wysw10 = 175 'r
    Wysw100 = 134 'E
    End If

    Return


    Wyswietl:

    Incr Mux
    If Mux = 3 Then Mux = 0

    Portd.6 = Not Minus

    Select Case Mux
    Case 0:
    Set Portd.0
    Portb = Wysw100
    Reset Portd.2

    Case 1:
    Set Portd.2
    Portb = Wysw10
    Reset Portd.1

    Case 2:
    Set Portd.1
    Portb = Wysw1
    Reset Portd.0
    End Select

    Return

    '****************************

    '****************************


    '*******************************************************************************
    'Tabele do wyswietlania na wyswietlaczu
    '*******************************************************************************
    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144 , 255
    'znak: 0 1 2 3 4 5 6 7 8 9 pusty

    Tabela2:
    Data 64 , 121 , 36 , 48 , 25 , 18 , 2 , 120 , 0 , 16 , 255
    'znak: 0. 1. 2. 3. 4. 5. 6. 7. 8. 9. pusty
    '*******************************************************************************

    '*******************************************************************************
REKLAMA