Longos
Guest
Sun Sep 19, 2004 4:46 pm
Mój DS1820 podpięty pod 2051 pokazuje ciągle 85.0 stopni. O co mu
chodzi, może zbyt mocno go podgrzałem przy lutowaniu ?
Longos
Listnig programu w Bascom-ie:
'Praca dyplomowa
' BASCOM College
' (EdW 2001.01 str. 20)
' Temat : "Termometr z Dallas DS1820"
' wersja 1.1 (20.03.2001)
' Compiler : BASCOM 8051 LIBRARY V 2.06
' Used ROM : &H7A3 1955 (dec) > Ok
' Poprawki do ver. 1.0:
' - poprawiony błąd odczytu temp > 41,5 st.C (bo Waitms działa tylko
dla wartości 1-255)
' - optymalizacja kodu (skrócenie):
' - przerzucenie polecenia 1Wreset do podprocedury skróciło program
o 15 bajtów
' - drobna poprawka procedury wyświetlania temperatury (Wysw_temp)
'Części składowe:
' TEST BOARD AVT-2500 z AT89C2051 i LCD,
' DS1820 na magistrali 1WIRE
'Autor :
' Artur Schwartz
' artursch@rumia.edu.pl
' (058) 671-52-30
' Konfiguracja sprzętowa : 1WIRE, LCD
' 1 Wire:
' P 1.0
' LCD:
' RS - P1.2
' EN - P1.3
' DB4 - P1.4
' DB5 - P1.5
' DB6 - P1.6
' DB7 - P1.7
' 1 Wire commands:
' 1. Read ROM - 33h
' 2. Match ROM - 55h
' 3. Search ROM - F0h
' 4. Skip ROM - CCh
' 5. Alarm Search - ECh
' Convert T - 44h
' Read Scratchpad - BEh
' WriteScratchpad - 4Eh
' Copy Scratchpad - 48h
' Recall E2 - B8h
' Read Power Supl - B4h
' Konfiguracja programowa :
Config 1wire = P1.0 ' wskazanie
kompilatorowi do którego pinu podłączamy magistralę
Config Lcd = 16 * 1a 'wyświetlacz
LCD
Deflcdchar 0 , 238 , 234 , 238 , 224 , 224 , 224 , 224 , 224
'definicja symbolu "stopień"
' Zmienne
Dim Is_device As Bit 'zmienna
wskazująca czy na magistrali jest urządzenie
Dim Number(

As Byte 'tu
przechowamy serial number urządzenia
Dim T(2) As Byte 'tu
przechowamy odczytaną wartość z DS1820
Dim X As Byte
Dim R As Byte
Dim Temp As Single 'wartość
temperatury po przekształceniach
Dim Str_temp As String * 5 'string do
wyświetlenia temperatury
' Stałe
Const R_rom = &H33 '1. Read
ROM - 33h
Const Con_t = &H44 'Convert
- 44h
Const M_rom = &H55 '2. Match
ROM - 55h
Const R_src = &HBE 'Read
Scratchpad - BEh
' Komunikaty
Const Kom_1 = "Termometr 1.1" 'Komunikat
powitalny
Const Kom_2 = "Temp. :"
Const Minus = "-"
Const Celcj = "C" 'symbol stopni
CELCJUSZA
Const Err_1 = "Error: " 'komunikat
błędu - np. przerwa na 1WIRE
Const Err_2 = "No Device !" 'komunikat
błędu - brak urządzenia
'Deklaracje procedur
Declare Sub Read_numbers 'Odczytaj
SerialNumber urządzenia
Declare Sub Pomiar_temp 'Dokonaj
pomiaru temperatury
Declare Sub Match_rom 'Wywołaj
urządzenie na magistrali
Declare Sub Wysw_temp
'Konwertuj/wyświetl odczytaną wartość
Declare Sub 1w_reset
' Początek programu
Cls
Is_device = 1 'Na początek
zakładamy, że urządzenie jest na magistrali
Cursor Off
Lcd Kom_1 'Powitanie
Wait 1
Cls
Cursor Off
Lcd Kom_2
Do 'początek
pętli programowej
1w_reset 'inicjacja
magistrali 1WIRE
If Err = 1 Then 'jeżeli żaden
układ nie odpowiedział
'na wezwanie
to:
Is_device = 0 ' brak
urządzenia
Cls ' wyczyść
wyświetlacz
Lcd Err_1 ; Err_2 ' wyświetl
komunkikat
Waitms 250 ' zaczekaj 250
ms
Else
Call Read_numbers 'przeczytaj
serial układu 1WIRE
Call Pomiar_temp 'Odczytaj
temperaturę
Call Wysw_temp 'Wyświetl
odczytaną wartość na LCD
End If
Loop
' Koniec programu
'Procedury
Sub Read_numbers
'Odczytaj/zapamiętaj SerialNumber urządzenia
If Is_device = 0 Then 'jeśli był
poprzednio wyświetlony błąd
Cls
Lcd Kom_2 ' wyczyść
teksty i już nie rób "czyszczenia"
Is_device = 1 ' wyświetlacza
następnym razem
End If
1wwrite R_rom 'żądanie
podania przez odnaleziony
'układ jego
numeru seryjnego
For R = 1 To 8
Number(r) = 1wread() 'odczytaj z
magistrali 1WIRE kolejne
'bajty numeru
układu i zapamiętaj
Next R
End Sub
Sub Pomiar_temp 'Dokonaj
pomiaru temperatury
1w_reset 'inicjacja
magistrali 1WIRE
Call Match_rom 'Wybierz
konkretne urządzenie
1wwrite Con_t 'Convert T
Waitms 250 'Idle DS1820
Waitms 250 'Idle DS1820
(w sumie 500 ms)
1w_reset 'inicjacja
magistrali 1WIRE
Call Match_rom 'Wybierz
konkretne urządzenie
1wwrite R_src 'żądanie
odczytania temperatury
T(1) = 1wread() 'odczytaj z
magistrali 1WIRE 1 bajt
T(2) = 1wread() 'odczytaj z
magistrali 1WIRE 2 bajt
1w_reset 'inicjacja
magistrali 1WIRE
End Sub
Sub Match_rom 'Wywołaj
urządzenie na magistrali
1wwrite M_rom 'Żądanie
"Match ROM"
For R = 1 To 8
1wwrite Number(r) ' dla
urządzenia o SerialNum.
If Err = 1 Then 'jeżeli Błąd
Is_device = 0 ' ustaw
Brak_Urządzenia
Cls ' wyczyść
wyświetlacz
Lcd Err_1 ; R ' wyświetl
komunkikat
Wait 1 ' chwilkę
zaczekaj/wyświetlaj
End If
Next R
End Sub
Sub Wysw_temp
'Konwertuj/wyświetl odczytaną wartość
Locate 2 , 2
If T(2) = 0 Then 'Temperatury
dodatnie
Temp = T(1) / 2 ' oblicz
temperaturę
Else 'Temperatury
ujemne
X = 256 - T(1) ' oblicz
temperaturę
Temp = X / 2 ' oblicz
temperaturę
Lcd Minus ' znak "minus"
dla ujemnych
End If
Str_temp = Fusing(temp , ###.&) ' przekształć
do string
Lcd Str_temp ; Chr(0) ; Celcj ; " " 'Wyświetl
temperaturę
End Sub
Sub 1w_reset ' dla
skrócenia kodu
1wreset
End Sub
Piotrek Sz.
Guest
Sun Sep 19, 2004 6:58 pm
...
Quote:
1wwrite Con_t 'Convert T
Waitms 250 'Idle DS1820
Waitms 250 'Idle DS1820
(w sumie 500 ms)
...
Witam.
Ciągłe wskazania +85 C oznacza tylko jedno:
za mało czasu na konwersję temperatury.Daj 750 ms i powinno byc ok.
Pzdr.
Piotrek Sz.
--
Wysłano z serwisu Usenet w portalu Gazeta.pl ->
http://www.gazeta.pl/usenet/
Pablo C
Guest
Mon Sep 20, 2004 6:37 am
.... lub coś z zasilaniem. mi się kiedyś uszkodził termometr i działał
tylko przy zasilaniu pasożytniczym. przy 3 przewodach pokazywał właśnie
85st czyli wartośc domyślną.
PC