Pokusao sam napisati program za mjerenje temperature s DS1820 s prikazom na cetri sedam segmentna led displeja.Dijelovi programa su primjeri s ubrzanog kursa i stvar funkcionira ali mi prikaz na displeju blica.Svaki put kad program ode da mjeri temperaturu ugase se displeji i opet upale kad se izmjeri temeratura.Sto bi trebalo napraviti da prikaz na displeju ostane prikazan dok program mjeri tmperaturu.
'****************************************************************
'* Name : multiplexiranje *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 20.10.2012 *
'* Version : 1.0 *
'* Notes : PIC16F877A *
'* : *
'****************************************************************
TRISA = %0000000 'Postavi sve pinove porta A kao izlazni
TRISB = %00000000 'Postavi sve pinove porta B kao izlazne
TRISC = $00 'Postavi sve pinove porta C kao IZLAZNI
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 ISKLJUCI KOMPARATORE I ANALOGNE ULAZE
'VARIJABLE ZA MULTIPLEXIRANJE
BROJ VAR WORD
BROJ1 VAR BYTE
BROJ2 VAR BYTE
BROJ3 VAR BYTE
BROJ4 VAR BYTE
I VAR BYTE
'VARIJABLE MJERENJA TEMPERATURE
symbol DQ = PORTE.2
V VAR WORD
T VAR WORD
temperatura Var Word ' Promen.za cuvanje izmer. temp.
count_remain Var Byte ' Ostatak
count_per_c Var Byte ' Ostatak po stepenu C
POCETAK: ' POCETAK PROGRAMA
BROJ1 = T DIG 3
BROJ2 = T DIG 2
BROJ3 = T DIG 1
BROJ4 = t dig 0
FOR I = 1 TO 100 ' u ovom slucaju stavili smo da se ispis na displeju ponovi 100 puta, sto znaci da ce vreme prikazivanja broja na displeju biti oko 2 sekunde
PORTB=BROJ1
HIGH PORTB.7
PAUSE 2
LOW PORTB.7
PORTB=BROJ2
HIGH PORTB.6
PAUSE 2
LOW PORTB.6
PORTB=BROJ3
HIGH PORTB.5
PAUSE 2
LOW PORTB.5
PORTB=BROJ4
HIGH PORTB.4
PAUSE 2
LOW PORTB.4
NEXT I
'MJERENJE TEMPERATURE
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)
v=20000-temperatura
'PRIKAZ ZNAKA
If v < 20000 then 'AKO JE TEMP VECA OD NULE NE SVIJETLI MINUS
portA.0 = 0
Else
HIGH PORTA.0 'AKO JE TEMP MANJA OD NULE SVIJETLI MINUS
endif
'------------IZRACUN TEMERATURE U PLUS I MINUS-----------------
If V >= 20000 then ' nad 0 C.
Temperatura=V-20000
t=temperatura
Else
Temperatura=20000-V ' pod 0 C
t=temperatura
EndIf
GOTO POCETAK
end
'****************************************************************
'* Name : multiplexiranje *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 20.10.2012 *
'* Version : 1.0 *
'* Notes : PIC16F877A *
'* : *
'****************************************************************
TRISA = %0000000 'Postavi sve pinove porta A kao izlazni
TRISB = %00000000 'Postavi sve pinove porta B kao izlazne
TRISC = $00 'Postavi sve pinove porta C kao IZLAZNI
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 ISKLJUCI KOMPARATORE I ANALOGNE ULAZE
'VARIJABLE ZA MULTIPLEXIRANJE
K VAR BIT
BROJ VAR WORD
BROJ1 VAR BYTE
BROJ2 VAR BYTE
BROJ3 VAR BYTE
BROJ4 VAR BYTE
I VAR BYTE
'VARIJABLE MJERENJA TEMPERATURE
symbol DQ = PORTE.2
V VAR WORD
T VAR WORD
temperatura Var Word ' Promen.za cuvanje izmer. temp.
count_remain Var Byte ' Ostatak
count_per_c Var Byte ' Ostatak po stepenu C
POCETAK: ' POCETAK PROGRAMA
'MJERENJE TEMPERATURE
OWOut DQ, 1, [$CC, $44] ' Start merenja temperature
Cekaj:
OWIn DQ, 4, [count_remain] ' Provera da li jos traje
If count_remain = 0 Then
K=1
CALL ispis
endif
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)
v=20000-temperatura
If V >= 20000 then ' nad 0 C.
Temperatura=V-20000
t=temperatura
Else
Temperatura=20000-V ' pod 0 C
t=temperatura
EndIf
ispis:
'PRIKAZ ZNAKA
If v < 20000 then 'AKO JE TEMP VECA OD NULE NE SVIJETLI MINUS
portA.0 = 0
Else
HIGH PORTA.0 'AKO JE TEMP MANJA OD NULE SVIJETLI MINUS
endif
BROJ1 = T DIG 3
BROJ2 = T DIG 2
BROJ3 = T DIG 1
BROJ4 = t dig 0
FOR I = 1 TO 100 ' u ovom slucaju stavili smo da se ispis na displeju ponovi 100 puta, sto znaci da ce vreme prikazivanja broja na displeju biti oko 2 sekunde
PORTB=BROJ1
HIGH PORTB.7
PAUSE 2
LOW PORTB.7
PORTB=BROJ2
HIGH PORTB.6
PAUSE 2
LOW PORTB.6
PORTB=BROJ3
HIGH PORTB.5
PAUSE 2
LOW PORTB.5
PORTB=BROJ4
HIGH PORTB.4
PAUSE 2
LOW PORTB.4
NEXT I
if K=1 then goto cekaj
K=0
GOTO POCETAK
end
shema je s druge stranice skracenog kursa s tim da koristim PIC16f877. Na portB su spojeni displeji u multipleksu ,dekoderski cip je cd4511,a ds1820 je spojen na RE.2 pin.
'****************************************************************
'* Name : multiplexiranje *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 20.10.2012 *
'* Version : 1.0 *
'* Notes : PIC16F877A *
'* : *
'****************************************************************
TRISA = %0000000 'Postavi sve pinove porta A kao izlazni
TRISB = %00000000 'Postavi sve pinove porta B kao izlazne
TRISC = $00 'Postavi sve pinove porta C kao IZLAZNI
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 ISKLJUCI KOMPARATORE I ANALOGNE ULAZE
'VARIJABLE ZA MULTIPLEXIRANJE
K VAR BIT
BROJ VAR WORD
BROJ1 VAR BYTE
BROJ2 VAR BYTE
BROJ3 VAR BYTE
BROJ4 VAR BYTE
I VAR BYTE
'VARIJABLE MJERENJA TEMPERATURE
symbol DQ = PORTE.2
V VAR WORD
T VAR WORD
temperatura Var Word ' Promen.za cuvanje izmer. temp.
count_remain Var Byte ' Ostatak
count_per_c Var Byte ' Ostatak po stepenu C
POCETAK: ' POCETAK PROGRAMA
'MJERENJE TEMPERATURE
OWOut DQ, 1, [$CC, $44] ' Start merenja temperature
Cekaj:
OWIn DQ, 4, [count_remain] ' Provera da li jos traje
If count_remain = 0 Then
K=1
CALL ispis
else
K=0
endif
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)
v=20000-temperatura
If V >= 20000 then ' nad 0 C.
Temperatura=V-20000
t=temperatura
Else
Temperatura=20000-V ' pod 0 C
t=temperatura
EndIf
ispis:
'PRIKAZ ZNAKA
If v < 20000 then 'AKO JE TEMP VECA OD NULE NE SVIJETLI MINUS
portA.0 = 0
Else
HIGH PORTA.0 'AKO JE TEMP MANJA OD NULE SVIJETLI MINUS
endif
BROJ1 = T DIG 3
BROJ2 = T DIG 2
BROJ3 = T DIG 1
BROJ4 = t dig 0
FOR I = 1 TO 100 ' u ovom slucaju stavili smo da se ispis na displeju ponovi 100 puta, sto znaci da ce vreme prikazivanja broja na displeju biti oko 2 sekunde
PORTB=BROJ1
HIGH PORTB.7
PAUSE 2
LOW PORTB.7
PORTB=BROJ2
HIGH PORTB.6
PAUSE 2
LOW PORTB.6
PORTB=BROJ3
HIGH PORTB.5
PAUSE 2
LOW PORTB.5
PORTB=BROJ4
HIGH PORTB.4
PAUSE 2
LOW PORTB.4
NEXT I
if K=1 then cekaj
GOTO POCETAK
end
probaj sad bila je mrtva petlja u ispisu sad je nema
Moze i drugacije da se izvede, da se ne ceka ds...
Nego se samo poziva, pa ako je gotov on sam upise novu temperaturu, ako nije gotov odmah se vraca nazad.
OWOut DQ, 1, [$CC, $44] ' Start merenja temperature, obavezno pre glavne petlje
Pocetak: ' POCETAK PROGRAMA
blbal bla...
Call Merenje
GOTO Pocetak
Merenje:
OWIn DQ, 4, [count_remain] ' Provera da li jos traje
If count_remain > 0 Then 'Ako je izmerio, procitaj, pa pokreni opet
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 itd...
' Malopre procitana temperatura, pa je meri opet...
OWOut DQ, 1, [$CC, $44]
Endif
Return
Eve me s rezultatima,malo sam prepravio Pedjin kod i sad sam zadovoljan s rezultatom.Povecao sam vrijednost kristala na 10MHz tako da mi vise ne trepere displeji i izbacio sam ovo iz koda: OWIn DQ, 4, [count_remain] ' Provera da li jos traje
If count_remain > 0 Then 'Ako je izmerio, procitaj, pa pokreni opet
dok je to u kodu onda blicnu displeji ,valjda zbog cekanja rezultata iz DS-a
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 29.11.2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
define OSC 10
TRISA = %0000000 'Postavi sve pinove porta A kao izlazni
TRISB = %00000000 'Postavi sve pinove porta B kao izlazne
TRISC = $00 'Postavi sve pinove porta C kao IZLAZNI
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 ISKLJUCI KOMPARATORE I ANALOGNE ULAZE
'VARIJABLE ZA MULTIPLEXIRANJE
BROJ VAR WORD
BROJ1 VAR BYTE
BROJ2 VAR BYTE
BROJ3 VAR BYTE
BROJ4 VAR BYTE
I VAR BYTE
'VARIJABLE MJERENJA TEMPERATURE
symbol DQ = PORTE.2
V VAR WORD
T VAR WORD
temperatura Var Word ' Promen.za cuvanje izmer. temp.
count_remain Var Byte ' Ostatak
count_per_c Var Byte ' Ostatak po stepenu C
porta=%0000000
OWOut DQ, 1, [$CC, $44] ' Start merenja temperature, obavezno pre glavne petlje
Pocetak:
' POCETAK PROGRAMA
gosub Merenje ' ZOVI SUBRUTINU ZA MJERENJE TEMPERATURE
'IZDVAJANJE BROJEVA IZ TEMPERATURE ZA PRIKAZ NA DISPLEJU
BROJ1 = T DIG 3
BROJ2 = T DIG 2
BROJ3 = T DIG 1
BROJ4 = t dig 0
'MULTIPLEKSIRANJE DISPLEJA I PRIKAZ
PORTB=BROJ1
HIGH PORTB.7
PAUSE 2
LOW PORTB.7
PORTB=BROJ2
HIGH PORTB.6
PAUSE 2
LOW PORTB.6
PORTB=BROJ3
HIGH PORTB.5
PAUSE 2
LOW PORTB.5
PORTB=BROJ4
HIGH PORTB.4
PAUSE 2
LOW PORTB.4
'NEXT I
'PALJENJE MINUS PREDZNAKA
If v < 20000 then 'AKO JE TEMP VECA OD NULE NE SVIJETLI MINUS
portA.0 = 0
Else
HIGH PORTA.0 'AKO JE TEMP MANJA OD NULE SVIJETLI MINUS
endif
GOTO Pocetak
Merenje: 'SUBRUTINA ZA MJERENJE TEMPERATURE
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)
v=20000-temperatura
If V >= 20000 then ' nad 0 C.
Temperatura=V-20000
Else
Temperatura=20000-V ' pod 0 C
EndIf
'VARIJABLA T ZA IZDVAJANJE BROJEVA IMA VRIJEDNOST TEMPERATURA
t=temperatura
' Malopre procitana temperatura, pa je meri opet...
OWOut DQ, 1, [$CC, $44]
Return
end
Jos jedno pitanjce,
negdi sam to vidio a sad vise ne mogu naci ,kako na pocetku programa napisti postavke za programator.
Znaci dok uvedem hex file u programator da mi odma budu izabrane postavke za programiranje.Da oscilator bude na HS,watchdog bude ukljucen,power on timer da bude iskljucen itd....
Hvala na odgovoru, to je to sto mi treba da programator zapamti postavke.
Imam ja jos pitanja.Koji bi senzor za mjerenje temperature po vasem misljenu bio idealan za velike razdaljine.
Naime senzor bi trebao biti u plasteniku a ostala elektronika u kuci.Duljina kabla izmedju senzora i PICa je oko 100 metara mozda malo vise.Da li bi bilo dobro napraviti da senzor ima svoj PIC i da preko RS485 protokola salje podatke drugom PIC procesoru koji se nalazi u kuci i koji bi transceiver bio pogodan LTC485 ili nest slicno
Ja sam na jednom nogometnom semaforu (veliki stadion) samo podigao napon na 12V pomoću tranzistora na predajnoj strani; odnosno na prijemnoj na isti način smanjio na 5V. Informaciju sam slao serijski: DATA, CLOCK i STROBE. Mada smatram da bi 485 bilo kvalitetnije....
'****************************************************************
'* Name : UNTITLED.BAS *
'* Author : [select VIEW...EDITOR OPTIONS] *
'* Notice : Copyright (c) 2012 [select VIEW...EDITOR OPTIONS] *
'* : All Rights Reserved *
'* Date : 29.11.2012 *
'* Version : 1.0 *
'* Notes : *
'* : *
'****************************************************************
define OSC 10
TRISA = %0000000 'Postavi sve pinove porta A kao izlazni
TRISB = %00000000 'Postavi sve pinove porta B kao izlazne
TRISC = $00 'Postavi sve pinove porta C kao IZLAZNI
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 ISKLJUCI KOMPARATORE I ANALOGNE ULAZE
'VARIJABLE ZA MULTIPLEXIRANJE
BROJ VAR WORD
BROJ1 VAR BYTE
BROJ2 VAR BYTE
BROJ3 VAR BYTE
BROJ4 VAR BYTE
I VAR BYTE
'VARIJABLE MJERENJA TEMPERATURE
symbol DQ = PORTE.2
V VAR WORD
T VAR WORD
temperatura Var Word ' Promen.za cuvanje izmer. temp.
count_remain Var Byte ' Ostatak
count_per_c Var Byte ' Ostatak po stepenu C
porta=%0000000
OWOut DQ, 1, [$CC, $44] ' Start merenja temperature, obavezno pre glavne petlje
Pocetak:
' POCETAK PROGRAMA
gosub Merenje ' ZOVI SUBRUTINU ZA MJERENJE TEMPERATURE
'IZDVAJANJE BROJEVA IZ TEMPERATURE ZA PRIKAZ NA DISPLEJU
BROJ1 = T DIG 3
BROJ2 = T DIG 2
BROJ3 = T DIG 1
BROJ4 = t dig 0
'MULTIPLEKSIRANJE DISPLEJA I PRIKAZ
PORTB=BROJ1
HIGH PORTB.7
PAUSE 2
LOW PORTB.7
PORTB=BROJ2
HIGH PORTB.6
PAUSE 2
LOW PORTB.6
PORTB=BROJ3
HIGH PORTB.5
PAUSE 2
LOW PORTB.5
PORTB=BROJ4
HIGH PORTB.4
PAUSE 2
LOW PORTB.4
'NEXT I
'PALJENJE MINUS PREDZNAKA
If v < 20000 then 'AKO JE TEMP VECA OD NULE NE SVIJETLI MINUS
portA.0 = 0
Else
HIGH PORTA.0 'AKO JE TEMP MANJA OD NULE SVIJETLI MINUS
endif
GOTO Pocetak
Merenje: 'SUBRUTINA ZA MJERENJE TEMPERATURE
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)
v=20000-temperatura
If V >= 20000 then ' nad 0 C.
Temperatura=V-20000
Else
Temperatura=20000-V ' pod 0 C
EndIf
'VARIJABLA T ZA IZDVAJANJE BROJEVA IMA VRIJEDNOST TEMPERATURA
t=temperatura
' Malopre procitana temperatura, pa je meri opet...
OWOut DQ, 1, [$CC, $44]
Return
end