Elektroda.pl
Elektroda.pl
X
Arrow Multisolution Day
Proszę, dodaj wyjątek www.elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

[Atmega8][Bascom] Termometr Ds18b20, wyswietlacze 7seg. led

siwekyhy 18 Gru 2009 22:53 3813 0
  • #1 18 Gru 2009 22:53
    siwekyhy
    Poziom 14  

    Witam

    Zrobiłem termometr na Ds18b20 i wynik wyświetlany jest na 3 wyświetlaczach 7 segmentowych Led. Dodatnia temperatura działa bardzo dobrze jednak gdy pojawia się ujemna temperatura poniżej - 10 stopni na wyświetlaczach pokazują sie same 8 8 8 . Może to dlatego że pojawia się - ? Nie wiem jak w bascomie można napisać moduł z liczby np. |-10| = 10 może problem by zniknął wtedy. Minus wskazywany jest przez zapalającą się diodę LED podłączoną do portu C. Program jest napisany w bascomie scaliłem parę projektów w nim innych autorów i dodałem trochę swojego kodu.

    pozdrawiam

    Code:



    $regfile = "m8def.dat"                                      'informuje kompilator o pliku
            'dyrektyw mikrokontrolera
    $crystal = 8000000                                          'informuje kompilator o
            'częstotliwości oscylatora
            'taktującego mikrokontroler
    Config Portd = Output


    Config Portc = Output
    Portc = 0                                                   'port D jako wyjściowy
    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 Pobr_znaku(cyfra As Byte)                       'deklaracja procedury
            'pobierającej kod cyfry do
            'wyświetlenia z tablicy
    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                       'definicje zmiennych A, B, C,
            'D, w których będzie
            'przechowywana wartość 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                    'zmienne bitowe sterujące
            'kropkami
    Dim Wart As Byte                                            'zmienna Wart przechowująca
            'liczbę do wyświetlenia
    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
                                              'przypisanie linii PB3 nazwy W4

    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

    Dim Ta As Single
    Dim Dzies As Byte
    Dim Setko As Byte
    Dim Spryt As Byte
    Dim Elo As Single
    Dim Razy As Byte
    Dim Odczyt(2) As Byte , Ad As Byte , Licznik As Byte , T As Integer , T1 As Single







    Config 1wire = Portb.4

    Do

    Ta = T1

    1wreset                                                     'reset
      1wwrite &HCC                                              'jedna kostka, więc wykorzystujemy rozkaz SKIP ROM
      1wwrite &H44                                              'dokonaj konwersji
      Waitms 750                                                'przeczekaj czas konwersji
      1wreset                                                   'reset
      1wwrite &HCC                                              'rozkaz adresowy SKIP ROM
      1wwrite &HBE                                              'rozkaz funkcyjny - polecenie odczytu DS18x20
      Odczyt(1) = 1wread(2)                                     'odczytaj dwa pierwsze bajty
      T = Odczyt(2)                                             'przepisz starszy bajt do zmiennej typu Integer
      Shift T , Left , 8                                        'przesuń ten bajt w lewo na wyższe pozycje
      T = T + Odczyt(1)                                         'przepisz - dodaj młodszy bajt

      T1 = T * 0.0625                                           'wyraź w stopniach Celsjusza, wynik wpisz do zmiennej Single

    If T1 >= 0 Then

    Portc = 0

    Set Kr1
    Set Kr3


    A = Ta / 10
    Dzies = A * 10
    Setko = Ta - Dzies
    B = Setko
    Spryt = Dzies + Setko
    Elo = Ta - Spryt
    Razy = Elo * 10
    C = Razy


    Lcd A ; " " ; B ; " " ; C ;



    Else

    Portc = &B1111111

    Set Kr1
    Set Kr3


    A = Ta / 10
    Dzies = A * 10
    Setko = Ta - Dzies
    B = Setko
    Spryt = Dzies + Setko
    Elo = Ta - Spryt
    Razy = Elo * 10
    C = Razy


    Lcd A ; " " ; B ; " " ; C ;

    End If



       Waitms 5000
                                                        'opóźnienie 5 sekund
     Loop
                                                           'koniec pętli nieskończonej
    End


    Wait 1                                                      'koniec programu

    Sub Pobr_znaku(cyfra As Byte)                               'definicja procedury
            'Pobr_znaku
     If Cyfra < 10 Then                                         'jeżeli wartość otrzymanej do
            'wyświetlenia cyfry < od 10,
      Portd = Lookup(cyfra , Kody7seg )                         'to wpisanie do portu D
            'wartość kodu z tablicy
            'stałych Kody7seg
     Else                                                       'w przeciwnym razie
      Portd = 0                                                 'wpisanie do portu D wartości
            '0 która wygasza wyświetlacz
     End If                                                     'koniec warunku If...Then
    End Sub                                                     'koniec procedury

    Mult_wysw:                                                  'podprogramu obsługi
            'przerwania od przepełnienia
            'Timer0 w którym odbywa się
            'multipleksowanie
     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
                                                         '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 Pobr_znaku(a)                                       'wywołanie procedury
            'pobierającej z tablicy kod
            'znaku dla wartości A
       Portd.7 = 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 Pobr_znaku(b)                                       'wywołanie procedury
            'pobierającej z tablicy kod
            'znaku dla wartości B
       Portd.7 = 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 Pobr_znaku(c)                                       'wywołanie procedury
            'pobierającej z tablicy kod
            'znaku dla wartości C
       Portd.7 = Kr3                                            'wpisanie na linie PD7
            'sterującej kropką wartości
            'bitu Kr3 dla wyświetlacza 3
       Reset W3                                                 'włączenie wyświetlacza 3
                                                  'włączenie wyświetlacza 4
     End Select                                                 'koniec instrukcji wyboru
     Incr Nr_wysw                                               'zwiększenie o jeden wartości
            'Nr_wysw
     If Nr_wysw = 3 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 &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001,
    Data &B10010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000

    0 0
  • Arrow Multisolution Day