DS18b20 vise njih na jednoj magistrali
Moderators: pedja089, stojke369, [eDo], trax
DS18b20 vise njih na jednoj magistrali
Jos jedno pocetnicko pitanje,
na internetu sam nasao dosta primjera za mjerenje temperature s jednim DS18b(s)20 chipom ali ja bih htio da imam dva DS chipa na jednoj magistrali tako da mi jedam mjeri vanjsku temperaturu a drugi unutarnju i da je rezultat prikazan na jednom LCD displayu.Na koji nacin PIC prepozna DS chipove ili kako se oni adresiraju da PIC zna s kojega treba procitati temperaturu recimo svakih 10 minuta.Znam da DS chipovi imaju vec pri proizvodnji upisanu jedinstvenu adresu ali kako da to procitam i recem PIC-u s kojega da cita.
Nemam ideju kako to procitati,moze mali savjet.
Ispricavam se na mozda jednostavnim pitanjima ali eto htio bih i to naucit kako se radi.
na internetu sam nasao dosta primjera za mjerenje temperature s jednim DS18b(s)20 chipom ali ja bih htio da imam dva DS chipa na jednoj magistrali tako da mi jedam mjeri vanjsku temperaturu a drugi unutarnju i da je rezultat prikazan na jednom LCD displayu.Na koji nacin PIC prepozna DS chipove ili kako se oni adresiraju da PIC zna s kojega treba procitati temperaturu recimo svakih 10 minuta.Znam da DS chipovi imaju vec pri proizvodnji upisanu jedinstvenu adresu ali kako da to procitam i recem PIC-u s kojega da cita.
Nemam ideju kako to procitati,moze mali savjet.
Ispricavam se na mozda jednostavnim pitanjima ali eto htio bih i to naucit kako se radi.
Re: DS18b20 vise njih na jednoj magistrali
primjer za mjerenje temperature s dva DS1820 senzora i prikaz na 4x20 LCD-u
]
Code: Select all
[
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 20.5.2012 *
'* Version : 1.0 *
'* Notes : PROGRAM RADI I CITA teperaturu *
'* : *
'****************************************************************
define osc 4
DEFINE LCD_BITS 4 ' LCD broj Bita na liniji 4 ili 8
DEFINE LCD_DREG PORTB ' LCD data port
DEFINE LCD_DBIT 4 ' LCD pocetni bit podataka 0 ili 4(od kojeg pina na mikrokontroleru pocinje 0 bit podataka)
DEFINE LCD_RSREG PORTB ' LCD registar select port
DEFINE LCD_RSBIT 2 ' LCD registar select bit (na koji pin na mikrokontroleru je povezan RS bit)
DEFINE LCD_EREG PORTB ' LCD enable port
DEFINE LCD_EBIT 3 ' LCD enable bit(na koji pin na mikrokontroleru je povezan E bit)
DEFINE LCD_LINES 4 'LCD koristi 4 reda za ispis 4x20 lcd
TRISA = $1F 'Postavi sve pinove porta A kao ulazne
TRISB = $00 'Postavi sve pinove porta B kao izlazne
TRISC = $ff 'Postavi sve pinove porta C kao ulazne
TRISD = $00 'Postavi sve pinove porta D kao izlazne
TRISE = 111 'Postavi sve pinove porta E kao ulazne
ADCON1 = 7 ' PORTA i PORTE su digitalni
portd.1=0
symbol DQ = PORTE.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
pause 100 ' Pauza za start LCD-a
'MJERENJE TEMPERATURE S PRVOG SENZORA
Pocetak:
OWOut DQ, 1, [$55,$10,$ED,$6E,$7C,$02,$08,$00,$A8,$44] ' Start merenja temperature i adresa 1 senzora
Cekaj: OWIn DQ, 4, [count_remain] ' Provera da li jos traje
If count_remain = 0 Then Cekaj
OWOut DQ, 1, [$55,$10,$ED,$6E,$7C,$02,$08,$00,$A8, $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,$80, "VANJSKA TEMP"
Lcdout $fe, $C0, " ", DEC (temperatura / 100), ".", DEC2 temperatura, " 'C"
'pause 5000 ' Zadrzi pet sekundi
'MJERENJE TEMPERATURE S DRUGOG SENZORA
OWOut DQ, 1, [$55,$10,$16,$B6,$7C,$02,$08,$00,$42,$44] ' Start merenja temperature i adresa drugog senzora
Cekaj1: OWIn DQ, 4, [count_remain] ' Provera da li jos traje
If count_remain = 0 Then Cekaj1
OWOut DQ, 1, [$55,$10,$16,$B6,$7C,$02,$08,$00,$42,$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,$94, "UNUTARNJA TEMP"
LCDOUT $FE,$D4, " ", DEC (temperatura / 100), ".", DEC2 temperatura, " 'C"
if (temperatura / 100) > 24 then portd.1=1 'ako temp predje iznad 25 stup pali led
if (temperatura / 100) < 25 then portd.1=0 'ako temp padne ispod 25 stup gasi led
'pause 5000 ' Zadrzi pet sekundi
Goto Pocetak ' Ponovi sve
End ' Kraj programa[code]
Re: DS18b20 vise njih na jednoj magistrali
primjer programa za citanje serijskog broja iz DS senzora
Code: Select all
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 22.5.2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 22.5.2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
define osc 4
DEFINE LCD_BITS 4 ' LCD broj Bita na liniji 4 ili 8
DEFINE LCD_DREG PORTB ' LCD data port
DEFINE LCD_DBIT 4 ' LCD pocetni bit podataka 0 ili 4(od kojeg pina na mikrokontroleru pocinje 0 bit podataka)
DEFINE LCD_RSREG PORTB ' LCD registar select port
DEFINE LCD_RSBIT 2 ' LCD registar select bit (na koji pin na mikrokontroleru je povezan RS bit)
DEFINE LCD_EREG PORTB ' LCD enable port
DEFINE LCD_EBIT 3 ' LCD enable bit(na koji pin na mikrokontroleru je povezan E bit)
DEFINE LCD_LINES 2
TRISA = $1F 'Postavi sve pinove porta A kao ulazne
TRISB = $00 'Postavi sve pinove porta B kao izlazne
TRISC = $ff 'Postavi sve pinove porta C kao ulazne
TRISD = $00 'Postavi sve pinove porta D kao izlazne
TRISE = $00 'Postavi sve pinove porta E kao izlazne
ADCON1 = 7 'disable A/d work digital
DQ VAR PortE.2 ' One-wire data pin "DQ" on PortE.2
ID VAR BYTE[8] ' Array storage variable for 64-bit ROM code
Start_Convert
OWOUT DQ, 1, [$33] ' Issue Read ROM command
ID_Loop:
OWIN DQ, 0, [STR ID\8]' Read 64-bit device data into the 8-byte array "ID"
LCDOUT $FE,1
LCDOUT $FE,$80,"Family Code = ",HEX2 ID[0],"h"
LCDOUT $FE,$C0,"Ser# = ",HEX2 ID[1],HEX2 ID[2],HEX2 ID[3],HEX2 ID[4],HEX2 ID[5],HEX2 ID[6],"h"
LCDOUT $FE,$94,"CRC Value = ",HEX2 ID[7],"h"
ID_Device:
IF ID[0] = $5 THEN
LCDOUT $FE,$D4, "Device = Switch"
ENDIF
IF (ID[0] = $28) OR (ID[0] = $10) THEN
LCDOUT $FE,$D4, "Device = Temp Sensor"
ENDIF
IF ID[0] = $01 THEN
LCDOUT $FE,$D4, "Device = Serial # "
ENDIF
PAUSE 10000 ' 10-second pause
GOTO Start_Convert
END
Re: DS18b20 vise njih na jednoj magistrali
Veci dio programa za mjerenje temperature preuzet je iz knjige Programiranje mikrokontrolera s picbasicom od gospodina Voje Milanovića ,a program za citanje serijskog broja iz DS senzora je preuzet s Rentron web stranice....moj trud je samo sto sam to sve zajedno uspio prilagodit mojim potrebama.
Da li se netko igrao s Rotary encoderom.Naime skinuo sam nekoliko primjera s PICbasic.co.uk stranice i ne rade mi ,ne zele brojati ni gore ni dolje.Ima li netko primjer kako to u praksi radi.
Da li se netko igrao s Rotary encoderom.Naime skinuo sam nekoliko primjera s PICbasic.co.uk stranice i ne rade mi ,ne zele brojati ni gore ni dolje.Ima li netko primjer kako to u praksi radi.
Re: DS18b20 vise njih na jednoj magistrali
Nisam imao problema s rotary encoderom, cak sam ga iskoristio na termostatu koji je pravio Feko http://www.elektronika.ba/forum/viewtop ... 30&t=10808
Evo kako to i izgleda http://www.youtube.com/watch?v=6c2Kln8l ... ature=plcp
Samo sam umjesto tastera stavio enkoder i radilo je kako treba.
Evo kako to i izgleda http://www.youtube.com/watch?v=6c2Kln8l ... ature=plcp
Samo sam umjesto tastera stavio enkoder i radilo je kako treba.
Re: DS18b20 vise njih na jednoj magistrali
Ovaj primjer radi super od kada je napisan ali ima jednu veliku manu,ispis mu je na LCD displaju i nevidim rezultat procitati s vece udaljenosti.Htio bih rezultat temerature prikazati na LED displeju ali neznam kako.
Koristio bih SAA 1064 kao led driver i usput da naucim I2C komunikaciju.
Posto za ispis na LCD se koristi ovo:
kako promjenjivu temperatura pretvoriti u pojedinacne cifre i poslati na SAA1064
I2CWrite SDA,SCL,adresa chipa,bajt instrukcije,kontrolni bajt1[cifra1, cifra2,cifra3,cifra4]
Koristio bih SAA 1064 kao led driver i usput da naucim I2C komunikaciju.
Posto za ispis na LCD se koristi ovo:
Code: Select all
temperatura = (((temperatura >> 1) * 100) - 25) + (((count_per_c - count_remain) * 100) / count_per_c)
Lcdout $fe,$80, "VANJSKA TEMP" 'prvi red na lcd zanemarimo ovo
Lcdout $fe, $C0, " ", DEC (temperatura / 100), ".", DEC2 temperatura, " 'C"
I2CWrite SDA,SCL,adresa chipa,bajt instrukcije,kontrolni bajt1[cifra1, cifra2,cifra3,cifra4]
Re: DS18b20 vise njih na jednoj magistrali
Procitaj malo kurs... Dig 0, dig 1 itd...
-
- Pocetnik na forumu
- Posts: 30
- Joined: 12-11-2012, 23:27
Re: DS18b20 vise njih na jednoj magistrali
Imal ko da mu je ovo uspjelo ev 2 dana se patim nece i nece sve sam probo neznam samo za ovaj crc bajt kod komunikacije sa pojedinim senzorom imal on kakve veze posto u proteusu se on nemoze podesit al svejendo sam iscitavao taj zadnji bajt al opet ni sa njim nista ne pokazuje. Ko on nesto iscita iz senzora al to je uvijek ista vrijednos bez obzira sto mijenjam temperaturu imal ko to odradjeno u proteusu da postavi sa DSN fajlom nije samo pbp
hvala
hvala
-
- Pocetnik na forumu
- Posts: 30
- Joined: 12-11-2012, 23:27
Re: DS18b20 vise njih na jednoj magistrali
Code: Select all
'****************************************************************
'* Name : 1-WireT.Bas *
'* Author : Bruce Reynolds *
'* Date : 11/26/2001 *
'* Version : 1.0 *
'* Notes : 1-Wire Temperature & Addressable Switch Sample *
'* : Uses 20 x 4 Serial LCD for Display *
'****************************************************************
DEFINE LCD_DREG PORTB 'LCD data port
DEFINE LCD_DBIT 0 'LCD data starting bit 0 or 4
DEFINE LCD_RSREG PORTB 'LCD register select port
DEFINE LCD_RSBIT 4 'LCD register select bit
DEFINE LCD_EREG PORTB 'LCD enable port
DEFINE LCD_EBIT 5 'LCD enable bit
DEFINE LCD_BITS 4 'LCD bus size 4 or 8
DEFINE LCD_LINES 4 'Number lines on LCD
DEFINE OSC 4 ' We're using a 4 MHz oscillator
DQ VAR PortC.0 ' One-wire data pin "DQ" on PortC.0
Stat VAR BIT ' Busy or not bit
Deg CON 223 ' Data to display "Deg" symbol
Sign VAR BYTE ' + or - temp indicator
Temp VAR WORD ' Temp storage
Begin:
PAUSE 500 ' Wait .5 [1/2] seconds
Temp_1:
OWOUT DQ, 1, [$55,$28,$B1,$FE,$22,$00,$00,$00,$5D,$44]
W1:
OWIN DQ, 4, [Stat]' Check for still busy converting
IF Stat = 0 THEN W1' Still busy?, then loop
OWOUT DQ, 1,[$55,$28,$B1,$FE,$22,$00,$00,$00,$5D,$BE]
OWIN DQ, 2, [Temp.LOWBYTE,Temp.HIGHBYTE]' Read two bytes, then end communications
IF Temp.bit15 = 1 THEN Below_32 ' Check for temp below 0°C
W2: Sign = "+"
Temp = ((((Temp >> 4) + 50) * 9) /5) -58
LCDOUT $FE, 1, "Temp #1 = ", Sign, DEC Temp,".", DEC2 Temp, Deg, "F "
Temp_2:
OWOUT DQ, 1, [$55,$28,$C1,$03,$23,$00,$00,$00,$00,$44]
W3:
OWIN DQ, 4, [Stat]' Check for still busy converting
IF Stat = 0 THEN W3' Still busy?, then loop
OWOUT DQ, 1, [$55,$28,$C1,$03,$23,$00,$00,$00,$00,$BE]
OWIN DQ, 2, [Temp.LOWBYTE,Temp.HIGHBYTE]' Read two bytes, then end communications
IF Temp.bit15 = 1 THEN Below_32B ' Check for temp below 0°C
W4: Sign = "+"
Temp = ((((Temp >> 4) + 50) * 9) /5) -58
LCDOUT $FE, $C0, "Temp #2 = ", Sign, DEC Temp, ".", DEC2 Temp, Deg, "F "
PAUSE 1000
GOTO BEGIN
Below_32:
Temp = ~Temp >> 4
Temp = (((-Temp + 50)* 9) /5) - 58
LCDOUT $FE, 1, "Temp #1 = ", Sign, DEC Temp,".", DEC2 Temp, Deg, "F "
GOTO Temp_2
Below_32B:
Temp = ~Temp >> 4
Temp = (((-Temp + 50)* 9) /5) - 58
LCDOUT $FE, $C0, "Temp #2 = ", Sign, DEC Temp,".", DEC2 Temp, Deg, "F "
GOTO Begin
END
KOD JE SA :http://www.rentron.com/PicBasic1.htm
SIMULACIJA U PROTEUSU NE RADI UZ PREPRAVLJENE VRIJEDNOSTI ROM-A POJEDINIH SENZORA
Re: DS18b20 vise njih na jednoj magistrali
Nemoj vikat na nas i stavi dns file.
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
-
- Pocetnik na forumu
- Posts: 30
- Joined: 12-11-2012, 23:27
Re: DS18b20 vise njih na jednoj magistrali
Evo dsn file al opet pgledajte Rom adresse neznam bas jel to to jer nisam nikad ovo prije koristio
- Attachments
-
- dalastest.rar
- (8.15 KiB) Downloaded 362 times
-
- Pocetnik na forumu
- Posts: 30
- Joined: 12-11-2012, 23:27
Re: DS18b20 vise njih na jednoj magistrali
proradilo samo treba naopako napisati adresu ROMa
Re: DS18b20 vise njih na jednoj magistrali
Svaka cast.
Probaj napraviti i automatsko iscitavanje ROM-a.
Zakacis ds, stisnes taster i on ga upamti, i tako redom...
Probaj napraviti i automatsko iscitavanje ROM-a.
Zakacis ds, stisnes taster i on ga upamti, i tako redom...
-
- Pocetnik na forumu
- Posts: 30
- Joined: 12-11-2012, 23:27
Re: DS18b20 vise njih na jednoj magistrali
Code: Select all
ID var byte[8]
adr1 var byte[8]
adr2 var byte [8]
adr3 var byte [8]
x var byte
x=0
trisc=$ff
TRISB=$00
DQ var portc.1
'.
'.
'.
'adrn var byte[8]
main:
if portc.2=1 then
call adresa
PAUSE 1000
TOGGLE PORTB.0
goto main
adresa:
OWOUT DQ, 1, [$33]
OWIN DQ, 0, [STR ID\8]
select case x
case 0
adr1=Id
case 1
adr2=ID
case 2
adr3=ID
' case n
'adrn=ID
END SELECT
X=X+1
RETURN
Re: DS18b20 vise njih na jednoj magistrali
adr1=Id
To ne moze tako... TI si samo prvi bajt jednog niza dodelio drugom nizu... Pogledaj komandu array write. To uopste nije puno... Evo uredjaj nakome sada radim koristi samo 2K RAM memorije(2000 promenljivih) za podesavanja... Naravno skoro svi su nizovi od par bajtova, do stotinak...
Eventualno mogao bi upisivati u eeprom pa onda u petlji citati po 8 lokacija iz njega, pa onda pozivati senzor, i tako redom... Po meni je sasvim ok drzati i u promenljivama...
To ne moze tako... TI si samo prvi bajt jednog niza dodelio drugom nizu... Pogledaj komandu array write. To uopste nije puno... Evo uredjaj nakome sada radim koristi samo 2K RAM memorije(2000 promenljivih) za podesavanja... Naravno skoro svi su nizovi od par bajtova, do stotinak...
Eventualno mogao bi upisivati u eeprom pa onda u petlji citati po 8 lokacija iz njega, pa onda pozivati senzor, i tako redom... Po meni je sasvim ok drzati i u promenljivama...