Witam panowie od razu podkreślę że jeszcze uczę się bascoma więc proszę nie krzyczeć i nie usuwać tego postu do kosza
Siedzę już nad tym 3 dzień i efekt mojej pracy nie najgorszy ale mam parę pytań po pewnych rzeczy nie rozumiem i nie mogę rozwiązać.
Więc tak założeniem był pomiar temperatury przez ds18b20 wyświetlenie je na LCD i 4 wyświetlaczach 7 segmentowych LED oraz komunikacja z PC ale to później.
Starałem się by kod był czytelny i dobrze opisany zerknijcie na niego i doradźcie jak go odchudzić i jak usunąć problem z pulsującym wyświetlaczem LCD, jak zakończę pracę wrzucę gotowy kod zapewne się komuś przyda
Poprawiłem obliczenia pojedynczej cyfry lecz w zaznaczonej linijce wykrzyknikami pojawia się błąd i nie wiem dlaczego zmienna Znak jest zdeklarowana w ten sposób:
Dim Znak as Bit
a pojawia się komunikat:
error:105 StoreBit error [0]
Siedzę już nad tym 3 dzień i efekt mojej pracy nie najgorszy ale mam parę pytań po pewnych rzeczy nie rozumiem i nie mogę rozwiązać.
Więc tak założeniem był pomiar temperatury przez ds18b20 wyświetlenie je na LCD i 4 wyświetlaczach 7 segmentowych LED oraz komunikacja z PC ale to później.
Starałem się by kod był czytelny i dobrze opisany zerknijcie na niego i doradźcie jak go odchudzić i jak usunąć problem z pulsującym wyświetlaczem LCD, jak zakończę pracę wrzucę gotowy kod zapewne się komuś przyda
Poprawiłem obliczenia pojedynczej cyfry lecz w zaznaczonej linijce wykrzyknikami pojawia się błąd i nie wiem dlaczego zmienna Znak jest zdeklarowana w ten sposób:
Dim Znak as Bit
a pojawia się komunikat:
error:105 StoreBit error [0]
S = I / 16 ' podzielenie odczytu z 1wire /16 dlaczego
!!!!!!!!!!!!!!!!!!!!!!! If I < 0 then Znak = 1 else Znak = 0 end if !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
I = Abs(I) 'teraz I jest dodatnie
tempWord = I 'zapamiętanie I
$regfile = "m16def.dat" ' dyrektywa procesora
$crystal = 8000000 ' taktowanie
Config Lcd = 16 * 2
Config Lcdpin = Pin , Rs = Portd.2 , E = Portd.3 , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 'konfiguracja wyświetlacza LCD
Config 1wire = Portc.7 ' termometr ds18b20
Config Timer0 = Timer , Prescale = 256 'konfiguracja Timer0 jako timer z podziałem preskalera przez 256
config portb = output 'konfiguracja segmentów
config portc.1 = output 'konfiguracja wyświetlacza 1 jako wyjścia
config portc.2 = output 'konfiguracja wyświetlacza 2 jako wyjścia
config portc.3 = output 'konfiguracja wyświetlacza 3 jako wyjścia
config portc.4 = output 'konfiguracja wyświetlacza 4 jako wyjścia
W1 alias portc.1 'przypisanie nazwy
W2 alias portc.2 'przypisanie nazwy
W3 alias portc.3 'przypisanie nazwy
W4 alias portc.4 'przypisanie nazwy
Dim I As Integer 'zmienne do odczytu temp.
Dim S As Single 'zmienna z temperaturą przed konwersją '
Dim T As String * 4 'zmienna z temperaturą po konwersji gotowa do wyświetlenia na LCD
Dim tempWord as Word
Dim Znak as Bit
Dim A as Byte 'Zmienna 1 cyfry
Dim A1 as Long
Dim B as Byte 'zmienna 2 cyfry
Dim B1 as Single
Dim B2 as Long
Dim C as Byte 'zmienna 3 cyfry
Dim C1 as Single
Dim D as Byte 'zmienna 4 cyfry
Dim D1 as Byte
Dim D2 as Byte
Dim Nr_wysw As Byte 'zmienna określająca numer zapalonego wyświetlacza
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
On Timer0 Mult_wysw 'przerwanie od przepełnienia Timer0‚ skok nastąpi do podprogramu Mult_wysw
Do ' rozpoczęcie pętli głównego programu
1wreset 'reset 1wire
1wwrite &HCC 'CC to rozkaz adresowy SKIP ROM pominięcie wyboru układu jeżeli mamy tylko 1 czujnik
1wwrite &H44 '44 to start konwersji temperatury
Waitms 750 ' opuźnienie
1wreset 'ponowny reset 1wire
1wwrite &HCC 'CC to rozkaz adresowy SKIP ROM pominięcie wyboru układu jeżeli mamy tylko 1 czujnik
1wwrite &HBE 'rozkaz funkcyjny polecenie odczytu DS18B20
I = 1wread(2) 'zapisanie do zmiennej I 2 bajty pomiaru
S = I / 16 ' podzielenie odczytu z 1wire /16 dlaczego
If I < 0 then Znak = 1 else Znak = 0 end if
I = Abs(I) 'teraz I jest dodatnie
tempWord = I 'zapamiętanie I
Shift I , right , 4 'pozbycie się czterech bitów ułamkowych teraz I jest z zakresu 0-125 przesunięcie o 4 w prawo to to samo co dzielenie całkowite przez 16
A = I
A = A \ 100 ' cyfra setki
I = I Mod 100 ' I zawiera resztę z dzielenia przez 100
B = I
B = B \ 10 ' cyfra dziesiątki
I = I Mod 10 ' I zawiera resztę z dzielenia przez 10
C = I ' cyfra jednostki
I = tempWord ' I znowu zawiera dodatnią liczbę
Shift I, left, 12
Shift I , right , 12 ' I zawiera tylko część po przecinku
I = I*625
I = I\1000
D = I ' cyfra po przecinku
T = Fusing(s , "###.#") ' zmiana maski wyświetlania odczytu właściwej już tęperatury
Locate 1 , 1 'ustawienie pozycji wyświetlania wartości (linia , odstęp)
Lcd "Temp:" ; T ; Chr(0) ; "C" 'wyświetlanie tęperatury
Loop 'Zakończenie pętli
end 'Zakończenie programu
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
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
PortB = Lookup(A , Cyfry) 'wywołanie procedury pobierającej z tablicy kod znaku dla wartości A
Reset W1 'włączenie wyświetlacza 1
Case 1: 'gdy Nr_wysw = 1, to
PortB = Lookup(B , Cyfry) 'wywołanie procedury pobierającej z tablicy kod znaku dla wartości B
Reset W2 'włączenie wyświetlacza 2
Case 2: 'gdy Nr_wysw = 2, to
PortB = Lookup(C , Cyfry) 'wywołanie procedury pobierającej z tablicy kod znaku dla wartości C
Reset W3 'włączenie wyświetlacza 3
Case 3: 'gdy Nr_wysw = 3, to
PortB = Lookup(D , Cyfry) 'wywołanie procedury pobierającej z tablicy kod znaku dla wartości D
Reset W4 'włączenie wyświetlacza 4
End Select 'koniec instrukcji wyboru
Incr Nr_wysw 'zwiększenie o jeden wartości 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 'koniec warunku IF
Return 'powrót z podprogramu przerwania
Cyfry:
Data &B11000000 , &B11111001 , &B10100100 , &B10110000 , &B10011001 , &B10010010 , &B10000010 , &B11111000 , &B10000000 , &B10010000