[BASCOM] DS18B20 - część ułamkowa temperatury


Witam :)
Wiem, że niedawno był już temat związany z DS18B20, jednak mój problem jest innej natury więc postanowiłem założyć swój wątek.
Robię właśnie zegarek z wyświetlaczem 7-segmentowym na PCF8583 i DS18B20 jednak mam z nim pewien problem. Przy wyświetlaniu temperatury mogę jedynie wyświetlać część całkowitą temperatury, z tą ułamkową mam już problem.

To co chcę osiągnąć, to posiadanie w dwóch zmiennych typu Byte (calosci, ulamek) informacji o temperaturze tzn:

24.3 *C to byłoby calosci=24 ulamek=3
15.7 *C to calosci=15 ulamek=7

W ten sposób byłoby mi łatwo wyświetlać temperaturę korzystając z napisanego już przeze mnie kodu do wyświetlania godziny. Czy mógłby mi ktoś z tym pomóc? :)




Portret użytkownika EDC

Odp. [BASCOM] DS18B20 - część ułamkowa temperatury

Nie pokazałeś żadnego kawałka kodu więc nie można Ci podpowiedzieć jak można to zrobić jeszcze lepiej, ale możesz zrobić tak. Instrukcja MOD nie tylko w BASCOM zwraca resztę z dzielenia(możesz wpisać w Google "Modulo"). Jeśli więc Twoją wartość temperatury pomnożysz razy 10 będziesz miał przykładowo 243. Jeśli teraz wyciągniesz z tego Modulo(tu liczba przez którą dzielimy) to jeśli podzielisz przez 10 reszta wyniesie 3.
(24 dziesiątki i reszta 3)

Dim Temperatura As Single
Dim Ulamek As Byte, Cale As Byte
Dim Help As Word
 
Cale = Temperatura 'dlatego że to Byte nie przepisze przecinka
Temperatura = Temperatura * 10 'przesuwa przecinek
Help = Temperatura ' wpisanie do WORD odetnie przecinek a musi być większy bo dla temp. 45 wynosi 450 czego nie     pomieści BYTE
Ulamek = Help MOD 10

Normalnie Single trzyma przecinek którego Ty nie potrzebujesz i połowy rzeczy stad mógłbyś się pozbyć na etapie odczytu z DS`a. niemniej powyższy kod powinien działać.
Przemyśl to. Pomnóż dane prędzej a Single bedzie niepotrzebna. Działania na Single wymagają dużych nakładów.

Edit. ..a to jest chyba to co Cię zainteresuje

Dim T As Integer
Dim Minus As Bit
Dim Wysw_dziesiatki As Byte
Dim Wysw_jednosci As Byte
Dim Wysw_ulamek As Byte
 
 
Temp:
 
   1wreset
   1wwrite &HCC
   1wwrite &HBE
   T = 1wread(2)
   Minus = T.15
   T = Abs(t)
   T = T * 10
   T = T / 16
   1wreset 
   1wwrite &HCC
   1wwrite &H44
 
  Wysw_ulamek = T Mod 10                                    'z 243 reszta 3
  Wysw_dziesiatki = T / 10                                  'z 243 = 24
  Wysw_jednosci = Wysw_diesiatki Mod 10                     'z 24 = 4
  Wysw_dziesiatki = Wysw_dziesiatki / 10                    'z 24 = 2
Return

-

BARTek
Moja strona

Portret użytkownika Bakuś

Wielkie dzięki! Szczególnie

Wielkie dzięki! Szczególnie ten drugi kawałek kodu mi pomógł :) Jednak zamiast zmiennej Byte trzeba użyć Word bo np przy 26,0 *C wychodzimy poza zakres tej zmiennej (260 a zmienna może mieć max 255). W każdym razie odczyt temperatury już działa, dziękuję :)

Portret użytkownika matrix

Re: DS18B20 - część ułamkowa temperatury - pytanie poboczne

Ja mam takie poboczne pytanie. Czemu służy ten zapis ?

Minus = T.15

Nie chodzi mi konkretnie w tym przypadku tylko ogólnie czemu służy zapis po kropce ?
Tyle czasu piszę w bascomie a nie mam pojęcia do czego to jest.

Portret użytkownika EDC

Odp.Re: DS18B20 - część ułamkowa temperatury - pytanie poboczne

Tutaj jest to szesnasty bit licząc od zera i od prawej strony. Normalnie w bajcie numer bitu licząc od najmłodszego.

-

BARTek
Moja strona

Portret użytkownika matrix

Re: DS18B20 - część ułamkowa temperatury - pytanie poboczne

Czyli po kropce odczytujemy wartość z danego miejsca danej zmiennej lub danego portu ?

Portret użytkownika EDC

Odp. [BASCOM] DS18B20 - część ułamkowa temperatury

No tak. Najlepsze jednak są kombinacje tego ze zmiennymi.

For N = 4 to 7
 PORTD.n = 1
Next

Ustawi bez większych komplikacji cztery najstarsze Bity/Piny w porcie D nie ruszając tych od 0 do 3 :D
...i inne takie wariacje na temat. W zmiennych te numery po kropce to tak jak by patrzeć na ich zapis &B

-

BARTek
Moja strona