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
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