[ dejanmaksimovic1976 @ 21.01.2009. 07:29 ] @
Zanima me kako se citaju vrednosti iz DS1820 a pri tome se program pise u MicroBasic studiu a za pic 16F84A.
Naime imam rutinu za iscitavanje temperature ali mi na displeju ne pokazuje vrenosti kada su u minusu.

Code:

symbol DQ = PORTb.2 ' Dq linija je povez. na pin RE2

temperatura Var Word ' Promen.za cuvanje izmer. temp.
count_remain Var Byte ' Ostatak
count_per_c Var Byte ' Ostatak po stepenu C
ADCON1 = 7 ' PORTA i PORTE su digitalni
Pause 100 ' Pauza za start LCD-a
Pocetak:
OWOut DQ, 1, [$CC, $44] ' Start merenja temperature
Cekaj: OWIn DQ, 4, [count_remain] ' Provera da li jos traje
If count_remain = 0 Then Cekaj
OWOut DQ, 1, [$CC, $BE] ' Procitaj izmerenu temperaturu
OWIn DQ, 0, [temperatura.LOWBYTE, temperatura.HIGHBYTE, Skip 4, count_remain, count_per_c]

' Prikazi temperaturu u DEC obliku

temperatura = (((temperatura >> 1) * 100) - 25) + (((count_per_c - count_remain) * 100) / count_per_c)
Lcdout $fe, 1, " TEMPERATURA"
Lcdout $fe, $C0, " ", DEC (temperatura / 100), ".", DEC2 temperatura, " C"
Pause 5000 ' Zadrzi pet sekundi

GoTo Pocetak ' Ponovi sve
End ' Kraj programa
[ Sepa011 @ 21.01.2009. 10:42 ] @
DS1820 ili DS18S20 ili DS18B20?
koji od ova tri?

1820 i 18S20 imaju 9-bitnu rezoluciju dok 18B20 9, 10, 11 ili 12-bitnu rezoluciju.
Ako koristis 18B20 sa programcetom koji si (pre)pisao, naravno da ce ti prikazivati pogresnu temperaturu posto mu je rezolucija po difoltu 12 bita
[ dejanmaksimovic1976 @ 21.01.2009. 11:10 ] @
Nisam ni rekao da sam pisao kod vec da imam kod.
Uopste mi je nebitno koji od ovih senzora se koriste, bitno je da mogu da izmerim temperaturu i to pokazem na displeju.
[ Robinzon Kruso @ 21.01.2009. 21:30 ] @
Ovako:

Radi se o PIC16F877 senzor DS1820, razvojni system EasyPIC, autor hardware i software Microelectronica. U dodatku imas deo programa ako hoces podatke da prikazes na 7-segmentnom display-u koji mozes da ubacis kao podprogram... naravno radi se o celobrojnom decimalnom prikazu jedinica i desetica... Naravno ne treba da napominjem ako koristis ovaj podprogram ili kao program moras da definises koriscene promenjive...

'****************************************************************
' IME PROGRAMA: DS1820.BAS
' OPIS: Program cita temperaturu sa digitalnog senzora DS1820
' i prikazuje je na LCD displeju koga treba postaviti na
' port D.
' NAPOMENA: Kratkospojnik treba biti spojen na RE2
'****************************************************************

DEFINE LCD_DREG PORTD ' I/O port na kome se nalazi LCD
DEFINE LCD_DBIT 4
DEFINE LCD_RSREG PORTD
DEFINE LCD_RSBIT 2 ' Register select pin
DEFINE LCD_EREG PORTD
DEFINE LCD_EBIT 3 ' Enable pin
DEFINE LCD_BITS 4 ' 4-bitni data bus
DEFINE LCD_LINES 2 ' LCD ima dva reda karaktera
symbol DQ = PORTE.1 ' Dq linija je povez. na pin RE2
dectemperatura Var Word
temperatura Var Word ' Promen.za cuvanje izmer. temp.
count_remain Var Byte ' Ostatak takta
count_per_c Var Byte ' Takt po stepenu C
ADCON1 = 7 ' PORTA i PORTE su digitalni
pause 100 ' Pauza za start LCD-a
Main:
OWOut DQ, 1, [$CC, $44] ' Start merenja temperature
Cekaj: OWIn DQ, 4, [count_remain] ' Provera da li jos traje
If count_remain = 0 Then Cekaj
OWOut DQ, 1, [$CC, $BE] ' Procitaj izmerenu temperaturu
OWIn DQ, 0, [temperatura.LOWBYTE, temperatura.HIGHBYTE, Skip 4, count_remain, count_per_c]

' Prikazi temperaturu u DEC obliku

temperatura = (((temperatura >> 1) * 100) - 25) + (((count_per_c - count_remain) * 100) / count_per_c)
dectemperatura = temperatura
Lcdout $fe, 1, dec ( dectemperatura / 100 )
Lcdout $fe, $C0, DEC (temperatura / 100), ".", DEC2 temperatura, " C stepeni"
Pause 10
Goto Main ' Ponovi sve
End ' Kraj programa

'********************************************************************************************
'
' Prikaz izmerene temperature na 7-seg disply-u (dvocifreno integer) 7-seg je povezan na port B
'
'*********************************************************************************************
7-seg DISPLAY:
for k = 1 to kk
W=temperatura / 100
Cifra=W dig 1 ' Desetice u prom. Cifra
Lookup Cifra,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6f],Maska
PORTB=Maska ' Postavi maski cifre na port B
LEDDis2=1 ' prikazi cifru desetica
pause 1 ' zadrzi prikaz 1 ms
LEDDis2=0 ' iskljuci cifru desetica

Cifra=W dig 0 ' Jedinice u prom. Cifra
Lookup Cifra,[$3F,$06,$5B,$4F,$66,$6D,$7D,$07,$7F,$6f],Maska
PORTB=Maska
LEDDis1=1 ' prikazi cifru jedinica
pause 1 ' zadrzi prikaz 1 ms
LEDDis1=0 ' iskljuci cifru jedinica
next k

return

Nadam se da sam bio od pomoci....


[ dejanmaksimovic1976 @ 22.01.2009. 06:44 ] @
Hvala Kruso. Bice mi od velike koristi.
[ milos_ladni @ 27.01.2009. 00:33 ] @
Da li postoje ovakvi senzori ali da se ocitavaju preko i2c porta?
[ Sepa011 @ 27.01.2009. 07:35 ] @
DS1621, DS1631, DS620, DS7505,...

[ Sepa011 @ 28.01.2009. 16:19 ] @
@dejanmaksimovic1976

Da li si bio uspesan sa DS1820?
[ dejanmaksimovic1976 @ 29.01.2009. 07:29 ] @
Nisam jos stigao da probam. Videcu kad uhvatim malo vremena da se pozabavim time. U nekoj sam guzvi na poslu pa cu probati kad stignem.
[ Sepa011 @ 29.01.2009. 08:11 ] @
Evo ti malko za razmisljanje, pisano u Proton-u i za DS 18B20 (moj malecki kucni unutra/spolja termometar, unutrasnji je i tremostat, deo koda izbacen)
Code:
Device 16F628
Config BODEN_OFF, CP_ALL, PWRTE_ON, WDT_OFF, INTRC_OSC_NOCLKOUT, LVP_OFF, MCLRE_OFF

XTAL = 4
ALL_DIGITAL TRUE
PORTB_PULLUPS FALSE

Declare LCD_DTPIN PORTB.4
Declare LCD_ENPIN PORTB.1
Declare LCD_RSPIN PORTB.3
Declare LCD_INTERFACE 4
Declare LCD_LINES 2

Symbol DQ = PORTA.3

Dim Stat As Byte
Dim TempDec1 As Word
Dim TempRem1 As Word
Dim Temperature1 As Word
Dim TempDec2 As Word
Dim TempRem2 As Word
Dim Temperature2 As Word
Dim Sign1 As Byte
Dim Sign2 As Byte

DelayMS 1000
Cls

Main:
' prvi senzor
OWrite DQ, 1, [$55, $28, $98, $F0, $B7, $00, $00, $00, $BF, $44]
Stat = 0
While Stat = 0
    DelayMS 10
    ORead DQ, 4, [Stat]
Wend

OWrite DQ, 1, [$55, $28, $98, $F0, $B7, $00, $00, $00, $BF, $BE]
ORead DQ, 2, [Temperature1.LowByte, Temperature1.HighByte]



' drugi senzor
OWrite DQ, 1, [$55, $28, $3B, $E2, $B7, $00, $00, $00, $45, $44]
Stat = 0
While Stat = 0
    DelayMS 10
    ORead DQ, 4, [Stat]
Wend

OWrite DQ, 1, [$55, $28, $3B, $E2, $B7, $00, $00, $00, $45, $BE]
ORead DQ, 2, [Temperature2.LowByte, Temperature2.HighByte]

If Temperature1.15 = 1 Then
    Temperature1 = ~Temperature1 + 1
    Sign1 = "-"
Else
    Sign1 = " "
EndIf

If Temperature2.15 = 1 Then
    Temperature2 = ~Temperature2 + 1
    Sign2 = "-"
Else
    Sign2 = " "
EndIf
    
TempDec1 = Temperature1 >> 4
TempRem1 = Temperature1 & $000F
TempRem1 = TempRem1 * 625

TempDec2 = Temperature2 >> 4
TempRem2 = Temperature2 & $000F
TempRem2 = TempRem2 * 625

Print At 1, 13, HEX4 Temperature1   ' cisto radi provere
Print At 1, 1, Sign1, DEC2 TempDec1, ".", DEC4 TempRem1, " ", 223, "C"
Print At 2, 13, HEX4 Temperature2   ' cisto radi provere
Print At 2, 1, Sign2, DEC2 TempDec2, ".", DEC4 TempRem2, " ", 223, "C"

DelayMS 5000
GoTo Main


End

dopada mi se prikaz sa 4 decimale
[ dejanmaksimovic1976 @ 29.01.2009. 16:00 ] @
A shema?
[ Sepa011 @ 29.01.2009. 21:28 ] @
Pa sve ti pise u programu, i gde je okacen LCD i gde su prikaceni senzori. Ostaje samo da se doctra cica Glisa

Evo ovako:
LCD (2x16) je prikljucen cetvorobitno na PORTB pocev od pina RB4
Enable LCD-a na RB1
Register Select LCD-a na RB3

1Wire pin je RA3, pulapovan sa 4k7

Jos nesto?
[ dejanmaksimovic1976 @ 30.01.2009. 05:31 ] @
Thanks.
Samo da zavrsim regulaciju struje i napona za masinu za secenje stiropora i regulaciju broja okretaja za valjke koji vuku stiropor i odmah se bacam na resavanje ovog problema za DS1820.
[ dejanmaksimovic1976 @ 08.06.2009. 08:02 ] @
Konacno sam uspeo da ugrabim malo vremena i zavrsim termostat sa ds1820.
Sve radi kako treba.