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

Termometr DS18B20+ATmega8+4543+5xLED 7seg.

MatiZ 04 Paź 2009 12:56 3182 10
  • #1 7089188
    MatiZ
    Poziom 15  
    Witam.
    Drodzy koledzy, od pewnego czasu borykam się z dość banalnym problemem, mianowicie potrzebuje zrobić termometr z wykorzystaniem czujnika DS18B20, i pięcioma wyświetlaczami LED (3cyfry i znak"°" oraz "C"). Układ zaprojektowałem, schemat w załączniku, płytkę wykonałem, niby wszystko OK, lecz pojawia się poważny problem- Program.
    Wiele razy robiłem podobne urządzenia, ale aż wstyd się przyznać nigdy nic z użyciem wyświetlaczy 7segmentowych LED, zawsze LCD i pokrótce mówiąc temat mnie troszkę przerasta. Bardzo proszę o pomoc w napisaniu programu obsługującego ten termometr na LED'ach.
    Program próbowałem sklecić w BASCOM'ie, lecz ciągle nie trafia do mnie obsługa multipleksowa wyświetlaczy 7'segmentowych. Wspomagałem się książką M. Wiązania, lecz temat wyświetlaczy 7segmentowych w obsłudze multipleksowej jest tam bardzo kiepsko i nie jaśnie opisany.
    Za każdą pomoc z góry bardzo dziękuję.
    Format wyświetlania miałby wyglądać następująco XX.X °C, gdzie wartość temperatury jest wyświetlana jako trzycyfrowa, z jedną cyfrą po przecinku, oraz symbolami "°", "C" wyświetlanymi jako "8","8", gdzie zamalowanie odpowiednich segmentów da odczyt "°", "C"
  • #2 7089375
    Konto nie istnieje
    Poziom 1  
  • #3 7089556
    janbernat
    Poziom 38  
    Te dwa ostatnie wyświetlacze podłączyć na stałe.
    To znaczy anoda na stałe do + a odpowiednie segmenty przez oporniki do masy.
    Dwa tranzystory mniej i dwie linie procesora mniej.
  • #4 7089678
    Konto nie istnieje
    Poziom 1  
  • #5 7089813
    MatiZ
    Poziom 15  
    Drodzy koledzy, w tym momencie układ już mam fizycznie wykonany, więc usunięcie dekodera raczej odpada, po drugie, aktualnie zrobiłem jak kolega "atom1477" stwierdził.... wolę aby te dwa wyświetlacze zostały załączone normalnie, gdyż jeśli kiedyś chciałbym coś zmienić, to będą "jak znalazł".
    Największy problem mam z wysterowaniem wyświetlaczy, obsługę DS18B20 na one-wire sobie zrobię. Nie potrafię sobie poradzić tylko z wyświetlaczami. Tak jak już wspomniałem, całe życie wszystko na LCD robiłem, i to jest mój pierwszy układ z LED, dlatego będę wdzięczny za każda pomoc przy realizacji. Mile widziany kod, lub jakieś fragmenty. Pozdrawiam.
  • #6 7089854
    Konto nie istnieje
    Poziom 1  
  • #7 7089886
    MatiZ
    Poziom 15  
    Dzięki kolego za kod, widzę że jest to kod obsługi jakiegoś zegarka, bardzo podobny kod znajduje się u M.Wiązania.
    
    'Program multipleksowego sterowania czterema wyświetlaczami
    '7-segmentowymi LED poprzez dekoder 4543
    'cyfra załadowana do A będzie wyświetlana na wyświetlaczu 1
    'cyfra załadowana do B będzie wyświetlana na wyświetlaczu 2
    'cyfra załadowana do C będzie wyświetlana na wyświetlaczu 3
    'cyfra załadowana do D będzie wyświetlana na wyświetlaczu 4
    'zmienna Kr1 steruje kropką wyświetlacza 1
    'zmienna Kr2 steruje kropką wyświetlacza 2
    'zmienna Kr3 steruje kropką wyświetlacza 3
    'zmienna Kr4 steruje kropką wyświetlacza 4
    'częstotliwość sterowania cyfr wynosi 250 Hz
    'czyli częstotliwość odświeżania 4 wyświetlaczy
    'wynosi ok. 250/4 = 62 Hz
    
    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
            'dyrektyw mikrokontrolera
    $crystal = 8000000                                          'informuje kompilator
            'o częstotliwości oscylatora
            'taktującego mikrokontroler
    Config Pind.0 = Output                                      'linia PD0 jako wyjściowa
    Config Pind.1 = Output                                      'linia PD1 jako wyjściowa
    Config Pind.2 = Output                                      'linia PD2 jako wyjściowa
    Config Pind.3 = Output                                      'linia PD3 jako wyjściowa
    Config Pind.7 = Output                                      'linia PD7 jako wyjściowa
    Config Pinb.0 = Output                                      'linia PB0 jako wyjściowa
    Config Pinb.1 = Output                                      'linia PB1 jako wyjściowa
    Config Pinb.2 = Output                                      'linia PB2 jako wyjściowa
    Config Pinb.3 = Output                                      'linia PB3 jako wyjściowa
    Config Timer0 = Timer , Prescale = 256
            'konfiguracja Timer0 jako timer
            'z podziałem preskalera przez
            '256
    Declare Sub Zapis_cyfry(cyfra As Byte)
            'deklaracja procedury
            'zapisującej cyfrę do dekodera
            '4543
    On Timer0 Mult_wysw                                         'przerwanie od przepełnienia
            'Timer0, skok nastąpi do
            'podprogramu Mult_wysw
    Dim A As Byte , B As Byte , C As Byte , D As Byte           'definicje zmiennych A, B, C, D
            'w których będą przechowywane
            'wartości do wyświetlenia
    Dim Nr_wysw As Byte                                         'zmienna określająca numer
            'zapalonego wyświetlacza
    Dim Kr1 As Bit , Kr2 As Bit , Kr3 As Bit , Kr4 As Bit       'zmienne bitowe sterujące
            'kropkami wyświetlaczy
    Dim I As Byte                                               'zmienna, której wartość będzie
            'wyświetlana na wyświetlaczach
    W1 Alias Portb.0                                            'przypisanie linii PB0 nazwy W1
    W2 Alias Portb.1                                            'przypisanie linii PB1 nazwy W2
    W3 Alias Portb.2                                            'przypisanie linii PB2 nazwy W3
    W4 Alias Portb.3                                            'przypisanie linii PB3 nazwy W4
    Kropki Alias Portd.7                                        'przypisanie linii PD7 nazwy
            'Kropki
    
    Enable Interrupts                                           'odblokowanie globalnego systemu
            'przerwań
    Enable Timer0                                               'odblokowanie przerwania od
            'przepełnienia Timer0
    Load Timer0 , 125                                           'załadowanie do licznika
            'wartości początkowej 131, bo
            '256 - 125 = 131
    Set Kr1                                                     'wyłączenie kropki
            'wyświetlacza 1
    Set Kr2                                                     'wyłączenie kropki
            'wyświetlacza 2
    Set Kr3                                                     'wyłączenie kropki
            'wyświetlacza 3
    Set Kr4                                                     'wyłączenie kropki
            'wyświetlacza 4
    
    Do                                                          'początek nieskończonej pętli
     A = I                                                      'wyświetlenie na wyświetlaczu 1
            'wartości zmiennej I
     B = I                                                      'wyświetlenie na wyświetlaczu 2
            'wartości zmiennej I
     C = I                                                      'wyświetlenie na wyświetlaczu 3
            'wartości zmiennej I
     D = I                                                      'wyświetlenie na wyświetlaczu 4
            'wartości zmiennej I
     Incr I                                                     'zwiększenie o 1 wartości
            'zmiennej I
     If I = 11 Then                                             'jeśli wartość I osiągnie 11, to
      I = 0                                                     'wyzerowanie tej zmiennej
     End If
     Toggle Kr1                                                 'zmiana na przeciwny stanu bitu
            'sterującego kropką
            'wyświetlacza 1
     Toggle Kr3                                                 'zmiana na przeciwny stanu bitu
            'sterującego kropką
            'wyświetlacza 3
     Waitms 500                                                 'opóźnienie 500 ms
    Loop                                                        'koniec pętli nieskończonej
    End                                                         'koniec programu
    
    Sub Zapis_cyfry(cyfra As Byte)                              'definicja procedury zapisującej
            'cyfrę do układu 4543
     Cyfra = Cyfra And &B00001111                               'wyzerowanie zmiennej Cyfra 4
            'najbardziej znaczących bitów
     Portd = Portd And &B11110000                               'zamaskowanie 4 bardziej
            'znaczących bitów i wyzerowanie
            '4 mniej znaczących bitów
            'rejestru PORTD
     Portd = Portd Or Cyfra                                     'wystawienie na port D wartości
            'zmiennej Cyfra bez naruszenia 4
            'bardziej znaczących bitów
            'rejestru PORTD
    End Sub                                                     'koniec procedury
    
    Mult_wysw:                                                  'podprogram przerwania od
            'przepełnienia Timer0
     Load Timer0 , 125                                          'załadowanie do licznika
            'wartości początkowej
     Set W1                                                     'wygaszenie wyświetlacza 1
     Set W2                                                     'wygaszenie wyświetlacza 2
     Set W3                                                     'wygaszenie wyświetlacza 3
     Set W4                                                     'wygaszenie wyświetlacza 4
     Select Case Nr_wysw                                        'w zależności od wartości
            'Nr_wysw
            'wykonaj:
     Case 0:                                                    'gdy Nr_wysw = 0 to
      Call Zapis_cyfry(a)                                       'wywołanie procedury zapisującej
            'wartość zmiennej A do układu
            '4543
      Kropki = Kr1                                              'wpisanie na linie PD7
            'sterującej kropką wartości bitu
            'Kr1 dla wyświetlacza 1
      Reset W1                                                  'włączenie wyświetlacza 1
     Case 1:                                                    'gdy Nr_wysw = 1 to
      Call Zapis_cyfry(b)                                       'wywołanie procedury zapisującej
            'wartość zmiennej B do układu
            '4543
      Kropki = Kr2                                              'wpisanie na linie PD7
            'sterującej kropką wartości bitu
            'Kr2 dla wyświetlacza 2
      Reset W2                                                  'włączenie wyświetlacza 2
     Case 2:                                                    'gdy Nr_wysw = 2 to
      Call Zapis_cyfry(c)                                       'wywołanie procedury zapisującej
            'wartość zmiennej C do układu
            '4543
      Kropki = Kr3                                              'wpisanie na linie PD7
            'sterującej kropką wartości bitu
            'Kr3 dla wyświetlacza 3
      Reset W3                                                  'włączenie wyświetlacza 3
     Case 3:                                                    'gdy Nr_wysw = 3 oraz
      Call Zapis_cyfry(d)                                       'wywołanie procedury zapisującej
            'wartość zmiennej D do układu
            '4543
      Kropki = Kr4                                              'wpisanie na linie PD7
            'sterującej kropką wartości bitu
            'Kr4 dla wyświetlacza 4
      Reset W4                                                  'właczenie wyświetlacza 4
     End Select                                                 'koniec instrukcji wyboru
     Incr Nr_wysw                                               'zwiększenie o jeden wartość
            'Nr_wysw
     If Nr_wysw = 4 Then                                        'jeśli wartość Nr_wysw osiągnie
            '4 to
      Nr_wysw = 0                                               'zeruj wartość Nr_wysw
     End If
    Return                                                      'powrót z podprogramu przerwania
    
    Kody7seg:                                                   'tablica stałych Kody7seg
            'przechowująca kody
            'wyświetlanych cyfr
    'Kody cyfr
    Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110,
    Data &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111
    


    Właśnie nad tym kodem pracuję, problem polega na tym, że po wrzuceniu go do procka mam cztery zera, a wg kodu powinny się te cyfry zmieniać, nie wiem gdzie jest problem.

    Po dopisaniu w pętli głównej komendy zmiany stanu portu sterującego minusem, minus mruga w takt pętli, a cyfry się nie zmieniają...

    Dodano po 45 [minuty]:

    Stworzyłem takie coś:
    
    
    $regfile = "m8def.dat"
    
    $crystal = 8000000
    
    Config Pind.0 = Output
    Config Pind.1 = Output
    Config Pind.2 = Output
    Config Pind.3 = Output
    Config Pind.6 = Output
    Config Pind.7 = Output
    Config Pinb.0 = Output
    Config Pinb.1 = Output
    Config Pinb.2 = Output
    Config Pinb.3 = Output
    Config Pinb.4 = Output
    Config Timer0 = Timer , Prescale = 256
    
    Declare Sub Zapis_cyfry(cyfra As Byte)
    
    On Timer0 Mult_wysw
    
    Dim A As Byte , B As Byte , C As Byte , D As Byte , E As Byte
    
    Dim Nr_wysw As Byte
    
    Dim Kr1 As Bit , Kr2 As Bit , Kr3 As Bit , Kr4 As Bit
    Dim I As Byte
    
    W1 Alias Portb.0
    W2 Alias Portb.1
    W3 Alias Portb.2
    W4 Alias Portb.3
    W5 Alias Portb.4
    Minus Alias Portd.6
    Kropki Alias Portd.7
    
    
    Enable Interrupts
    
    Enable Timer0
    Load Timer0 , 125
    Set Kr1
    Set Kr2
    Set Kr3
    Set Kr4
    
    
    Waitms 800
    Do
     A = I
     B = I
     C = I
     D = I
     E = I
     Incr I
     If I = 11 Then
      I = 0
     End If
     Toggle Minus
     Waitms 500
    Loop
    End
    
    Sub Zapis_cyfry(cyfra As Byte)
     Cyfra = Cyfra And &B00001111
     Portd = Portd And &B11110000
     Portd = Portd Or Cyfra
    End Sub
    
    Mult_wysw:
     Load Timer0 , 125
     Set W1
     Set W2
     Set W3
     Set W4
     Set W5
     Select Case Nr_wysw
    
     Case 0:
      Call Zapis_cyfry(a)
      Reset W1
     Case 1:
      Call Zapis_cyfry(b)
      Reset W2
     Case 2:
      Call Zapis_cyfry(c)
      Reset W3
     Case 3:
      Call Zapis_cyfry(d)
      Reset W4
     Case 4:
      Call Zapis_cyfry(e)
      Reset W5
     End Select
    
     Incr Nr_wysw
    
     If Nr_wysw = 5 Then
    
      Nr_wysw = 0
     End If
    Return
    
    Kody7seg:
    
    
    Data &B00111111 , &B00000110 , &B01011011 , &B01001111 , &B01100110,
    Data &B01101101 , &B01111101 , &B00000111 , &B01111111 , &B01101111
    


    Wg. mnie program powinien zmieniać cyfry, podczas gdy mi mruga led "minus" a ciągle wyświetlają mi się pięć zer. Gdzie jest błąd?? Bo już całkiem zaczynam się w tym gubić...
  • #8 7090149
    janbernat
    Poziom 38  
    Wydaje mi się że jednak trzeba wpisać "start timer0" w przerwaniu.
    Chyba że load uruchamia timer- ale chyba nie.
  • #9 7090164
    MatiZ
    Poziom 15  
    Wydaje mi się ze nie po stronie timer leży błąd, gdyż on jest używany w zasadzie tylko do multipleksowania, a to działa dobrze bo jednak wyświetlanych jest pięć cyfr..... ale dlaczego zer?? i dlaczego się nie zmieniają ?
  • #10 7090878
    Konto nie istnieje
    Poziom 1  
  • #11 7094591
    MatiZ
    Poziom 15  
    Uporałem się w końcu z problemem. Temat zamykam. Pozdrawiam.
REKLAMA