DS18b20 vise njih na jednoj magistrali

Rasprava o PIC mikrokontrolerima, PIC projekti i drugo vezano za PIC-eve...

Moderators: pedja089, stojke369, [eDo], trax

Post Reply
febo26
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 207
Joined: 12-08-2008, 19:58

DS18b20 vise njih na jednoj magistrali

Post by febo26 »

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.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: DS18b20 vise njih na jednoj magistrali

Post by pedja089 »

febo26
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 207
Joined: 12-08-2008, 19:58

Re: DS18b20 vise njih na jednoj magistrali

Post by febo26 »

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]
]
febo26
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 207
Joined: 12-08-2008, 19:58

Re: DS18b20 vise njih na jednoj magistrali

Post by febo26 »

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


febo26
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 207
Joined: 12-08-2008, 19:58

Re: DS18b20 vise njih na jednoj magistrali

Post by febo26 »

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.
User avatar
MHN
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 350
Joined: 11-03-2005, 22:02
Location: Sarajevo

Re: DS18b20 vise njih na jednoj magistrali

Post by MHN »

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.
febo26
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 207
Joined: 12-08-2008, 19:58

Re: DS18b20 vise njih na jednoj magistrali

Post by febo26 »

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:

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"
       
kako promjenjivu temperatura pretvoriti u pojedinacne cifre i poslati na SAA1064
I2CWrite SDA,SCL,adresa chipa,bajt instrukcije,kontrolni bajt1[cifra1, cifra2,cifra3,cifra4]
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: DS18b20 vise njih na jednoj magistrali

Post by pedja089 »

Procitaj malo kurs... Dig 0, dig 1 itd...
PicBeginer1
Pocetnik na forumu
Pocetnik na forumu
Posts: 30
Joined: 12-11-2012, 23:27

Re: DS18b20 vise njih na jednoj magistrali

Post by PicBeginer1 »

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 :evil: imal ko to odradjeno u proteusu da postavi sa DSN fajlom nije samo pbp
hvala
PicBeginer1
Pocetnik na forumu
Pocetnik na forumu
Posts: 30
Joined: 12-11-2012, 23:27

Re: DS18b20 vise njih na jednoj magistrali

Post by PicBeginer1 »

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
IMAL KO DA ZNA ZASTO OVO NE RADI
KOD JE SA :http://www.rentron.com/PicBasic1.htm
SIMULACIJA U PROTEUSU NE RADI UZ PREPRAVLJENE VRIJEDNOSTI ROM-A POJEDINIH SENZORA :?: :?: :?:
User avatar
Kukinjos
Pravi forumaš
Pravi forumaš
Posts: 1724
Joined: 28-03-2012, 18:01
Location: Split

Re: DS18b20 vise njih na jednoj magistrali

Post by Kukinjos »

Nemoj vikat na nas i stavi dns file. :wink:
Cezare, star sam i nemoćan, ali poslušaj moj savjet ....
PicBeginer1
Pocetnik na forumu
Pocetnik na forumu
Posts: 30
Joined: 12-11-2012, 23:27

Re: DS18b20 vise njih na jednoj magistrali

Post by PicBeginer1 »

Evo dsn file al opet pgledajte Rom adresse neznam bas jel to to jer nisam nikad ovo prije koristio :roll:
Attachments
dalastest.rar
(8.15 KiB) Downloaded 362 times
PicBeginer1
Pocetnik na forumu
Pocetnik na forumu
Posts: 30
Joined: 12-11-2012, 23:27

Re: DS18b20 vise njih na jednoj magistrali

Post by PicBeginer1 »

proradilo :D samo treba naopako napisati adresu ROMa
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: DS18b20 vise njih na jednoj magistrali

Post by pedja089 »

Svaka cast.
Probaj napraviti i automatsko iscitavanje ROM-a.
Zakacis ds, stisnes taster i on ga upamti, i tako redom...
PicBeginer1
Pocetnik na forumu
Pocetnik na forumu
Posts: 30
Joined: 12-11-2012, 23:27

Re: DS18b20 vise njih na jednoj magistrali

Post by PicBeginer1 »

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 
Ev nesto sam probo :D , al jel se mora za svaku adresu roma rezervirat memorija. Ovako mi nes puno memorije zauzima mozelse to rijesit da se ne definisu promjenjive za svaku adresu vec da imam samo jednu promjenjivu a da recimo spremam kao konstanut il tako nesto :?:
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: DS18b20 vise njih na jednoj magistrali

Post by pedja089 »

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...
Post Reply