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.

[ATTiny2313][Bascom]Termometr na DS18B20 i 2 x wys. LED

Michał~88 08 Sie 2008 23:19 5248 4
  • #1 08 Sie 2008 23:19
    Michał~88
    Poziom 14  

    Witam.
    Wykorzystuje płytkę testową AVT 3500 i chciałem zrobić termometr na LED.
    Problem polega na kodzie który znalazłem na elektrody od Elektronika.
    Wyświetlacz jest podwójny i jest segment dziesiętnych zapalany poprzez port D4 a jedności poprzez port D3. Wszystko by było ok gdyby mi wyświetlały się wszystkie cyfry. Wyświetla mi się cyfra jedności która moim zdaniem działa dobrze. Ostatnia liczba wskazuje tą która jest w pokoju. Nie wskazuje natomiast liczba dziesiętnych. Pusto brak reakcji. A DS18B20 jest podłączony pod port D.5

    Code:
    Config Portb = &B11111111 : Portb = &B11111111
    
    Config Portd = &B1111111 : Portd = &B1111111
    Dim Zmienna As Byte
    Dim Liczba As Byte
    Dim Jednosci As Byte
    Dim Dziesiatki As Byte
    Dim Temp As Byte
    Dim 1cyfra As Byte
    Dim 2cyfra As Byte
    Dim A As Byte
    Dim Odczyt(2) As Byte
    Dim T As Integer
    Config 1wire = Portd.5
    Liczba = 77

    Do
       1wreset : 1wwrite &HCC : 1wwrite &HBE
       Odczyt(1) = 1wread(2)
       T = Odczyt(2)
       Shift T , Left , 8
       T = T + Odczyt(1)
       Shift T , Right , 4
         1wreset
         1wwrite &HCC
         1wwrite &H44
    Liczba = T
    Gosub Wyswietlanie
    Loop


    Wyswietlanie:
    Gosub Oblicz
    For A = 0 To 125
    If Dziesiatki = 0 Then
    Dziesiatki:
    Portd.4 = 0
    Portb = 1cyfra
    Waitms 3
    Goto Jednosci
    End If

    Jednosci:
    Portb = 2cyfra
    Portd.3 = 0
    Waitms 3
    Next A
    A = 0
    Return


    Oblicz:
    Temp = Makebcd(liczba)
    Jednosci = Temp And &B00001111
    Shift Temp , Right , 4
    Dziesiatki = Temp
    1cyfra = Lookup(dziesiatki , Tabela)
    2cyfra = Lookup(jednosci , Tabela)
    Return
    End
    Tabela:
    Data 192 , 249 , 164 , 176 , 153 , 146 , 130 , 248 , 128 , 144

    Myślę iż znajdzie ktoś przyczynę nie wyświetlania dziesiętnej cyfry.
    Pozdrawiam

    Zmieniłem tytuł i przeniosłem do właściwego subforum
    https://www.elektroda.pl/rtvforum/topic1015361.html
    [zumek]

    0 4
  • #2 09 Sie 2008 10:05
    K_o_n_r_a_d
    Poziom 23  

    1. Popatrz gdzie robisz skoki poprzez GOTO. Zlikwiduj GOTO i napisz tak program aby nie wymagał użycia GOTO.

    3. Przeanalizuj ten fragment:

    Code:
    For A = 0 To 125
    
    If Dziesiatki = 0 Then
    Dziesiatki:
    Portd.4 = 0
    Portb = 1cyfra
    Waitms 3
    Goto Jednosci
    End If

    Jednosci:
    Portb = 2cyfra
    Portd.3 = 0
    Waitms 3
    Next A

    Po co ta pętla? Po co skoki? Dlaczego nie wykorzystasz przerwań?

    3. Za bardzo kombinujesz w tych fragmentach i tutaj jest błąd:
    Code:
    Dim Liczba As Byte 
    
    Dim T As Integer
    ...
    Shift T , Left , 8
    T = T + Odczyt(1)
    Shift T , Right , 4
    ...
    Liczba = T


    Zrób lepiej coś tego typu:
    Code:
    T = Makeint(odczyt(1) , odczyt(2))
    
    jednosci = T mod 10
    dziesiatki = T /10

    0
  • #3 09 Sie 2008 14:43
    Michał~88
    Poziom 14  

    Dalej nic nie dało.
    Nie wyświetla mi dziesiątych liczb. Wyświetlacz sprawny na 100%

    0
  • #4 09 Sie 2008 16:37
    zumek
    Poziom 39  

    Michał~88 napisał:
    ...Nie wyświetla mi dziesiątych liczb. Wyświetlacz sprawny na 100%

    No przecież sam napisałeś w kodzie warunek , żeby nie wyświetlał dziesiątek jeśli nie są równe 0 , a dokładnie rzecz ujmując , to napisałeś , żeby wyświetlał dziesiątki , kiedy ich wartość jest równa ZERO :!:
    Code:

    Wyswietlanie:
    Gosub Oblicz
    For A = 0 To 125
       If Dziesiatki = 0 Then   'Oto twój warunek
          Dziesiatki:         'nie nazywaj identycznie , zmiennych i etykiet
          Portd.4 = 0
          Portb = 1cyfra
          Waitms 3
    '      Goto Jednosci     'niepotrzebny "skok"
       End If

    Jednosci:
       Portb = 2cyfra
       Portd.3 = 0
       Waitms 3
    Next A
    A = 0
    Return

    Poza tym , wcale nie wygaszasz wyświetlaczy :idea:
    Po małych poprawkach:
    Code:

    Wyswietlanie:
    Gosub Oblicz
    For A = 0 To 125
       
       If Dziesiatki > 0 Then   'Wyświetlaj tylko liczby , które są większe od zera
          Portb = 1cyfra
          Portd.4 = 0
          Waitms 3
          Portd.4=1    ' lub Set Portb.4 - wygaszenie wyświetlacza dziesiątek
       End If
    'cyfry jedności , będą wyświetlane zawsze
       Portb = 2cyfra
       Portd.3 = 0
       Waitms 3
       Portd.3=1    ' lub Set Portb.4 - wygaszenie wyświetlacza dziesiątek

    Next A
    A = 0
    Return

    Co jeszcze. Twoje obliczenia temperatury są "prawdziwe" , tylko dla temperatur dodatnich , w przedziale 0-99 C.
    Taki sposób obsługi wyświetlacza , nie zda za bardzo egzaminu , ponieważ będzie "mrugał" . Natomiast zastosowanie przerwań do sterowania wyświetlaczami , wymaga pewnych zabiegów , by te(przerwania) nie zakłócały transmisji 1wire.
    Poszukaj dobrze , bo ten temat był już na pewno poruszany.

    K_o_n_r_a_d -> Nie zapomniałeś tu o czymś :?:
    Code:

    T = Makeint(odczyt(1) , odczyt(2))
    jednosci = T mod 10
    dziesiatki = T /10

    0
  • #5 09 Paź 2008 03:38
    michał154
    Poziom 11  

    Witam
    Nie za bardzo kumam tej linijki

    Jednosci = Temp And &B00001111

    na jakiej zasadzie to działa?
    Pozdrawiam

    0