Termostat sa PIC16F84A

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

Moderators: pedja089, stojke369, [eDo], trax

User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Termostat sa PIC16F84A

Post by dejanmaksa »

Citajuci po forumu uspeo sam nekako da sklopim jedan uredjaj koji bi mi sluzio kao termostat za TA pec.
Koristio sam 16x2 LCD displej i ds1820 temperaturni senzor.
Napravio sam da mogu da zadam temperaturu na displeju, da mi uredjaj izmeri temperaturu ali nikako neuspevam da uporedim te dve temperature i da ako je zadata temperatura manja od izmerene da prekine pec da duva.
Koristio sam MicroCode studio 3.0

evo i koda pa ako bi neko mogao da mi kaze gde gresim.

Code: Select all

TRISB.0=%11111011
TRISA=0
SYMBOL UP=PORTB.4
SYMBOL DOWN=PORTB.5
symbol led=portb.2
output led
LOW portb.2
symbol DQ = PORTB.0 ' Dq linija je povez. na pin Rb2

BROJ VAR WORD
decimala var word
pause 500        
lcdout $FE, 1

POCETAK:
IF UP<1 THEN
BROJ=BROJ+1
ENDIF
IF BROJ>50 THEN
BROJ=0
ENDIF
IF DOWN<1 THEN
BROJ=BROJ-1
ENDIF
IF BROJ<1 THEN
BROJ=0
ENDIF
decimala=broj
lcdout $fe, $C0, "Zadata: ", dec broj ," C"; ispisuje na LCD-u Zadata i broj prikazuje kao decimalnu velicinu
pause 10      

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

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, $80, "Trenutna: " , DEC (temperatura / 100), ".", DEC2 temperatura, " C "
Pause 10
goto Uporedjivanje 

Uporedjivanje: 
if BROJ>(temperatura/100) then
high led
endif
if BROJ<(temperatura/100) then
low led
endif
Goto POCETAK ' Ponovi sve
End ' Kraj programa
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Termostat sa PIC16F4A

Post by pedja089 »

ima tu dosta propusta...
kao prvo definisanje promenljivih ne moze da bude u sred programa, vec na samom pocetku. zadavanje promenljivih je takodje lose uradjeno, trebao si staviti neku pauzu, bas 200ms, da se brojevi ne menjaju jako brzo.
zacega ce ti ovaj red "decimala=broj"
pauza iza ispisa na lcd-u je takodje nepotrebna. nju bi bilo logicnije da si stavijo pre goto pocetak, i malo je povecaj
onaj red goto uporedjivanje i labela uporedjivanje su besmisleni, jer stoje jedan ispod drugog a i nigde se u programu ne koristi ta labela.
if BROJ>(temperatura/100) then
ovo uporedjivanje i nije bas korektno.
tu bih trebao uporediti 2 celobrojne promenljive. iznad uporedjivanj bih trebao napraviti
nekua promenljiva da je jednaka temperatura/100
a u ostalom mislim da imas negde primer koda za termometar, feko ga je radio...
User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Re: Termostat sa PIC16F4A

Post by dejanmaksa »

Evo probao sam da prepravim ali mi proteus nereauguje i nece da upali led iako mislim da je sad OK.
Moracu da sacekam da mi stigne displej pa da probam.

Code: Select all

TRISB=%11111011
TRISA=0
SYMBOL UP=PORTB.4
SYMBOL DOWN=PORTB.5
symbol led=portb.2
output led
high led
symbol DQ = PORTB.0 ' Dq linija je povez. na pin Rb2
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
temp var word
zadato var word

BROJ VAR word             'promenjiva za cuvanje decimalnog broja
lcdout $FE, 1
pause 100

POCETAK:
IF UP<1 THEN
broj=broj+1
ENDIF
IF broj>40 THEN
broj=15 
lcdout $FE, 1
pause 100
ENDIF
IF DOWN<1 THEN
broj=broj-1
ENDIF
IF broj<15 THEN
broj=15
lcdout $FE, 1
pause 100
ENDIF
lcdout $fe, $C0, "Zadata: ", dec broj ,  "." , "00 C"; ispisuje na LCD-u Zadata i broj prikazuje kao decimalnu velicinu
zadato = broj
pause 100
         
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, $80, "Trenutna: " , DEC (temperatura / 100), ".", DEC2 temperatura, " C "
temp=temperatura/100
Pause 100

poredjenje:
if zadato<temp then
high led
else
low led
endif
Goto pocetak ' Ponovi sve
End ' Kraj programa
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Termostat sa PIC16F4A

Post by pedja089 »

ovo bih trebalo da radi, ja sam nemam DS1820(zameno mu + i -) pa ne mogu probati i videti gde zapinje...
User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Re: Termostat sa PIC16F4A

Post by dejanmaksa »

Nadam se da ce da proradi kada ga pokrenem sa pravim displejem. DS1820 sam nabavio ostaje mi jos display. Imam vec gomilu PIC16F84A i 16F628 sto sam nakupovao da experimentisem da se nadje ako neki rikne.
User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Re: Termostat sa PIC16F4A

Post by dejanmaksa »

evo i scheme.
Attachments
schema-1.jpg
schema-1.jpg (17.29 KiB) Viewed 7151 times
User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Re: Termostat sa PIC16F84A

Post by dejanmaksa »

Sada mi se java jedan novi problem.
Kada sam sve napravio, na displeju mi pokazuje konstantno 84.75 C, a kada skinem ds1820 onda pokazuje 654,75 C.
Nikako da skontam zasto.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Termostat sa PIC16F84A

Post by pedja089 »

ne znam sta bi moglo biti...
jesi mozda probao drugi ds?
User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Re: Termostat sa PIC16F84A

Post by dejanmaksa »

Nemam drugi DS1820. Interesuje me da li su isti DS1820 i DS18S20, posto mi u proteusu radi sa DS18S20, a DS1820 nema, ima DS18B20 ali sa njim ne radi uopste.
User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Re: Termostat sa PIC16F84A

Post by dejanmaksa »

izgleda da sam ukapirao o cemu se radi.
Da li je moguce da mi DS1820 ocitava temperaturu u Fahrenheit i da mi tu informaciju izbacuje na displej. Kada pretvorim 84,75 F u celzijuse dobijem oko 29 C koliko je i bilo otprilike u prostoriji. Probacu sutra u toku dana pa cu da vidim da li je to u pitanju.
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Termostat sa PIC16F84A

Post by pedja089 »

e to ne znmam stvarno...
User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Re: Termostat sa PIC16F84A

Post by dejanmaksa »

Ima li neko iskustva i da li moze da mi kaze kakva je razlika izmedju DS1820 i DS18S20?
User avatar
pedja089
Administrator sajta
Administrator sajta
Posts: 7877
Joined: 20-02-2007, 14:50
Location: Beočin -Srbija

Re: Termostat sa PIC16F84A

Post by pedja089 »

u nacinu na koji se racuna temperatura. pazljivo procitaj datasheet, i mislim da je razlika jos u rezoluciji
Branez
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 457
Joined: 22-04-2008, 16:27
Location: Maribor(SLO) Koprivnica(HR)
Contact:

Re: Termostat sa PIC16F84A

Post by Branez »

Probaj sa tim, doduše je za 628 ali malo preinaka pa bude OK.

Code: Select all

'******************************************************************
'*  Name    : TERMOSTAT.BAS                                       *
'*  Author  : Branko Zupan                                        *
'*  Notice  : Copyright (c) 2009 B.Z.                             *
'*          : All Rights Reserved                                 *
'*  Date    : 21.3.2009                                           *
'* B0 = Tipka način    (In)   A0 = LCD Enable     (Out)           *
'* B1 = Tipka +        (In)   A1 = LCD RS         (Out)           *
'* B2 = Tipka -        (In)   A2 = izhod "toplo"  (Out)           *
'* B3 = DQ1 DS1820     (In)   A3 = izhod "hladno" (Out)           *
'* B4 = LCD Bit 4      (Out)  A4 = DQ DS1820      (In)            *
'* B5 = LCD Bit 5      (Out)                                      *
'* B6 = LCD Bit 6      (Out)                                      *
'* B7 = LCD Bit 7      (Out)  PIC16F628 Code size = 1052 Words    *
'*                                                                * 
'* Oscillator XP (4 MHz.) - Power up timer enabled - MCR enable   *
'******************************************************************

TRISA= %11110000                        ' RA0..3=Outputi RA4=Input
TRISB= %00001111 			          ' RB0..RB3=Inputi, RB4..RB7=Outputi
CMCON=7                                 ' onemogoči komparatorje

DEFINE LCD_DREG PORTB                   ' LCD on port B
DEFINE LCD_DBIT 4                       ' Data biti B4..B7
DEFINE LCD_RSREG PORTA                  ' RS na PORTA
DEFINE LCD_RSBIT 1                      ' RS na A1 
DEFINE LCD_EREG PORTA                   ' E na PORTA
DEFINE LCD_EBIT 0                       ' E na A0
DEFINE LCD_BITS 4                       ' LCD 4 bit način
DEFINE LCD_LINES 2                      ' 2 vrstični LCD display

Temperatura 	Var	Word	          ' Shrani temperaturo
CiljnaTemp	Var	Word		          ' Željena temperatura
Hyst		Var	Word		          ' Histereza
V		Var	Word		          ' Var. za display
B1              Var     Byte            ' Byte za izračun ciljne temperature 
B2              Var     Byte            ' Byte za izračun ciljne temperature
Izrac_traja 	Var 	Byte		    ' Še izračunava?
Izrac_za_C 	Var	Byte		          ' izračun za stopinje C
Znak		Var	Byte		          ' +/- Znak
Nacin 		Var	Byte		    ' 0=prikaži temp., 1=nastavi temp., 2=nastavi histerezo
DQ		Var	PORTA.4		    ' One-wire data pin
'DQ1		Var	PORTB.3		    ' One-wire data pin

DATA 46, 224, 20                        ' Temp MSB, TEMP LSB, histereza DIV 10

PORTA.2=0                               ' izhod "toplo" Low
PORTA.3=0                               ' izhod "hladno" Low
Nacin=0                                 ' način prikaza temperature  

LCDOUT $FE, 1, $FE, $0C                 ' Clear display, cursor off

Read 0, B1                              ' prečitaj CiljnaTemp MSB
Read 1, B2                              ' prečitaj CiljnaTemp LSB
CiljnaTemp=B1*256+B2                    ' izračunaj vrednost CiljnaTemp(Default=20.0 C.)
Read 2, B1                              ' prečitaj histerezo 
Hyst=10*B1                              ' izračunaj vrednost histereza(Default= 2.0 C.)  

GlavnaZanka: 
 If PORTB.0=0 then                      ' gleda če je tipka pritisnjena
  Pause 50                              ' Debounce 
'  LcdOut $FE, $8F, "*"                  ' prikaže da je ukaz sprejet 
  If PORTB.0=0 then GlavnaZanka         ' čaka dokler ni gumb sproščen  
  Nacin=Nacin+1                         ' povečuje Nacin
  If Nacin=2 then                       ' shrani ciljno temperaturo (Nacin1 -> Nacin2)
   Write 0, CiljnaTemp / 256	          ' CiljnaTemp MSB
   Write 1, CiljnaTemp MOD 256          ' CiljnaTemp LSB
  EndIf
  If Nacin > 2 Then                     ' shrani histerezo (Nacin 2 -> Nacin 0) 
   Nacin=0               		    ' samo 0, 1, 2 veljajo
   Write 2, Hyst / 10                   ' deli Hyst vrednost, da se prilega v Byte
  EndIf
 EndIf

 If Nacin =1 then                       ' nastavljanje ciljne temperature
  LcdOut $FE, $80, "Nastavi "           ' prikaže funkcijo
  V=CiljnaTemp                          ' CiljnaTemp v V  
  Gosub IzberiZnak                      ' Izberi +/prazno/- 
  Gosub PrikaziTemp                     ' prikaži ciljno temperaturo
  If (PORTB.1=0) Or (PORTB.2=0) then    ' pritisnjeno gor ali dol?
   If PORTB.2=0 then                    ' dol tipka 
    If CiljnaTemp > 7500 then           ' ne dovoli manj kot -25 C. (10000-MinTemp * 100)
     CiljnaTemp=CiljnaTemp-25           ' znižuje temperaturo za 0.25 C.
    EndIf
   EndIf
   If PORTB.1=0 then                    ' gor tipka
    If CiljnaTemp < 17500 then          ' ne več kot 75 C. (10000+MaxTemp * 100)
     CiljnaTemp=CiljnaTemp+25           ' zvišuje temperaturo za 0.25 C.
    EndIf
   EndIf
   GoSub SetCiljnaTemp                  ' prikaži ciljno temperaturo in zaostanek 0.25 Sec.
  EndIf
 EndIf 

 If Nacin=2 then                        ' nastavi histerezo   
  LcdOut $FE, $80, "Hist.   "           ' prikaže funkcijo
  Znak=" "                              ' ni predznaka  
  V= 10000+Hyst                         ' določi vrednost za V  
  Gosub PrikaziTemp                     ' prikaži histerezo
  If (PORTB.1=0) Or (PORTB.2=0) then    ' pritisnjeno gor ali dol 
   Znak=" "                             ' ni predznaka za histerezo
   If PORTB.2=0 then                    ' tipka dol
    If Hyst > 10 then Hyst=Hyst-10      ' ne dovoli manj kot 0.1 C.
   EndIf
   If PORTB.1=0 then                    ' tipka gor
    If Hyst < 1000 then Hyst=Hyst+10    ' ne dovoli več kot 10.0 C.
   EndIf 
   V= 10000+Hyst                        ' določi vrednost za V
   Gosub PrikaziTemp                    ' prikaži histerezo 
   Pause 250                            ' zaostanek 0.25 Sec.
  EndIf
 EndIf 

 If Nacin > 0 then GlavnaZanka          ' nastavljanje ciljne temperature ali histereze
 LcdOut $FE, $80, "Trenutno"            ' prikaže funkcijo

 Output DQ             			    ' pin izhod
 DQ=0					          ' OneWire linija Low
 PauseUs 480                            ' zadrži za 480 µS  
 Input DQ                               ' pin vhod
 PauseUs 70                             ' čaka 70 µS
 If DQ=1 then                           ' ni signala iz DS1820  
  LcdOut $FE, $1, "Ni senz."            ' prikaže obvestilo
  Pause 500                             ' čaka 0.5 Sec. 
  Goto GlavnaZanka                      ' preveri še enkrat
 EndIf

 OWOut DQ, 1, [$CC, $44]       	    ' začetek temperaturne konverzije
WaitLoop: OWIn DQ, 4, [Izrac_traja]     ' preveri če se še vedno izvaja
 If Izrac_traja = 0 Then WaitLoop       ' še dela 
 OWOut DQ, 1, [$CC, $BE]		    ' preberi temperaturo
 OWIn DQ, 0, [Temperatura.LowByte, Temperatura.HighByte, Skip 4, Izrac_traja, Izrac_za_C]
 Temperatura = (((Temperatura >> 1) * 100) - 25) + (((Izrac_za_C - Izrac_traja) * 100) / Izrac_za_C)
 if Temperatura > 32767 then
  Temperatura= ~Temperatura
  V= 10000 - Temperatura                ' 25 C=12500  0 C=10000  -10 C=9000 
 else
  V= 10000 + Temperatura
 EndIf

 If V < CiljnaTemp - Hyst then          ' nižje od ciljne temperature - histereze
  PORTA.2=1                             ' aktivira "toplo" izhod
  PORTA.3=0                             ' deaktivira "hladno" izhod
 EndIf

 If V > CiljnaTemp + Hyst then          ' višjeje od ciljne temperature - histereze
  PORTA.2=0                             ' deaktivira "toplo" izhod
  PORTA.3=1                             ' aktivira   "hladno" izhod
 EndIf

 GoSub IzberiZnak                       ' +/prazno/- znak 
 GoSub PrikaziTemp                      ' Temperatura na LCD

Goto GlavnaZanka				    ' vrti neskončno

' SUBRUTINE:
'----------------------------------------
IzberiZnak:
 If v = 10000 then                      ' Temperatura = 0 C.
  Znak=" " 				          ' brez znaka
 Else 
  If v < 10000 then              	    ' <> 0
   Znak="-"				          ' Temperatura pod 0 C. 	
  Else
   Znak="+"				         ' Temperatura nad 0 C.
  EndIf
 EndIf
Return

'----------------------------------------
PrikaziTemp:
 If V >= 10000 then                     ' nad 0 C.      
  Temperatura=V-10000                   
 Else                                   
  Temperatura=10000-V                   ' pod 0 C. 
 EndIf
 
 LcdOut $FE, $C0, Znak, DEC (Temperatura / 100), ".", DEC2 Temperatura,223,"C "
 
Return

'-----------------------------------------
SetCiljnaTemp:
 V=CiljnaTemp
 Gosub IzberiZnak
 Gosub PrikaziTemp 
 Pause 250
Return

'-----------------------------------------
Real Radios Glow in the Dark!
User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Re: Termostat sa PIC16F84A

Post by dejanmaksa »

Hvala Branez na primeru. Definitivno mi je crkao DS cim mi stignu novi probacu kako radi. U proteusu mi radi ok i sa mojim kodom i sa ovim koji si ti poslao ali mi na uredjaju nesto ne funkcionise kako treba sto se tice citanja temperature. Reaguje na podizanje i spustanje temperature, pali i gasi led koji sam stavio kao probu kako treba ali nece da mi cita temperaturu. Nadam se da ce da proradi kada mi stignu novi senzori.
Branez
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 457
Joined: 22-04-2008, 16:27
Location: Maribor(SLO) Koprivnica(HR)
Contact:

Re: Termostat sa PIC16F84A

Post by Branez »

Mala greška. :oops:
Last edited by Branez on 25-05-2009, 08:11, edited 1 time in total.
Real Radios Glow in the Dark!
Branez
Pravo uznapredovao :)
Pravo uznapredovao :)
Posts: 457
Joined: 22-04-2008, 16:27
Location: Maribor(SLO) Koprivnica(HR)
Contact:

Re: Termostat sa PIC16F84A

Post by Branez »

dejanmaksa wrote:Ima li neko iskustva i da li moze da mi kaze kakva je razlika izmedju DS1820 i DS18S20?
Čitaj!
http://www.picbasic.org/forum/showthread.php?t=6869" onclick="window.open(this.href);return false;
Real Radios Glow in the Dark!
User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Re: Termostat sa PIC16F84A

Post by dejanmaksa »

Evo konacno je sve proradilo.
Problem je bio u DS-u (crko)
Stavio sam novi DS1820 i DS18S20 i potpuno isto rade.
Hvala svima na pomoci.
User avatar
dejanmaksa
Napredujem
Napredujem
Posts: 159
Joined: 28-10-2008, 22:15
Location: Velika Plana

Re: Termostat sa PIC16F84A

Post by dejanmaksa »

Evo kompletan program cita temperaturu i u minusu i u plusu.
Code:

Code: Select all

'****************************************************************
'*  Name    : SOBNI SA MEMORIJOM.BAS                            *
'*  Author  : DEJAN MAKSIMOVIC                                  *
'*  Notice  : Copyright (c) 2009 DMAXPRO                        *
'*          : All Rights Reserved                               *
'*  Date    : 25.5.2009                                         *
'*  Version : 1.0                                               *
'*  Notes   :                                                   *
'*  PROCESOR: PIC16F84A                                         *
'****************************************************************
clearwdt
TRISB=%11111011
TRISA=%000000
DEFINE LCD_BITS 4
DEFINE LCD_DREG PORTA
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 4
DEFINE LCD_EREG PORTB
DEFINE LCD_EBIT 3
DEFINE LCD_LINES 2
pause 100                                 'cekanje inicijalizacije displeja
SYMBOL UP=PORTB.4
SYMBOL DOWN=PORTB.5
symbol led=portb.7
symbol led2=portb.2

SYMBOL SCL=PORTB.1
SYMBOL SDA=PORTB.6
DEFINE I2C_SCL=PORTB.1
DEFINE I2C_SDA=PORTB.6
DEFINE I2C_SCLOUT
i VAR BYTE
ADR VAR WORD
output led
high led
symbol DQ = PORTB.0 ' Dq linija je povez. na pin Rb0
temperatura Var Word ' Promen.za cuvanje izmer. temp.
count_remain Var Byte ' Ostatak takta
count_per_c Var Byte ' Takt po stepenu C
termo var word
zadato var word
zadata2 var word
BROJ VAR word             'promenjiva za cuvanje decimalnog broja
V VAR WORD
znak var byte
FAKTOR CON 5/10
lcdout $FE, 1 ,"*Termostat DGS1*"
pause 1500
lcdout $FE, 1
broj=100
high led
pause 100
ADR=BROJ
I=BROJ

MEMORIJA_CITAJ:
i2cwrite sda,scl,$a0,adr,[i]
PAUSE 10

POCETAK:
BROJ=ADR
IF UP<1 THEN
broj=broj+5
pause 100
ENDIF
IF broj>400 THEN
broj=150 
lcdout $FE, 1
pause 10
ENDIF
IF DOWN<1 THEN
broj=broj-5
pause 150
ENDIF
IF broj<100 THEN
broj=100
lcdout $FE, 1
pause 100
ENDIF
lcdout $FE, $80, " Zadata:+", dec (broj/10) ,  "." ,dec2 (broj*10), "C "; ispisuje na LCD-u Zadata i broj prikazuje kao decimalnu velicinu
zadato = broj/10
ADR=BROJ
pause 100

 
MEMORIJA_UPIS:
i2cwrite sda,scl,$a0,adr,[i]
pause 10

Main:
IF UP<1 OR DOWN<1 THEN
goto memorija_citaj
ELSE
GOTO START
ENDIF

START:
OWOut DQ, 1, [$CC, $44] ' Start merenja temperature
pause 100
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]
temperatura = (((temperatura >> 1) * 100)-25) + (((count_per_c - count_remain) * 100) / count_per_c)

v=10000-temperatura

IzberiZnak:
    If v = 10000 then                      ' Temperatura = 0 C.
      Znak=" "                       ' brez znaka
    Else
      If v < 10000 then                     ' <> 0
       Znak="+"                      ' Temperatura pod 0 C.    
      Else
       Znak="-"                     ' Temperatura nad 0 C.
      EndIf
    EndIf
    
PrikaziTemp:
    If V >= 10000 then                     ' nad 0 C.     
      Temperatura=V-10000                   
    Else                                   
      Temperatura=10000-V                   ' pod 0 C.
    EndIf

    LcdOut $FE, $C0, "Merena:",Znak, DEC (Temperatura / 100), ".", DEC2 Temperatura,"C "
termo=temperatura/100
zadata2=zadato-2

poredjenje:
if termo>=zadato then
low led
else
goto poredjenje2
endif

poredjenje2:
if termo<=zadata2 then
high led
else
goto MAIN
endif
Goto MAIN                        ' Ponovi sve
End                                 ' Kraj programa
User avatar
Smjesko
Stariji član
Stariji član
Posts: 4012
Joined: 26-12-2005, 17:12

Re: Termostat sa PIC16F84A

Post by Smjesko »

@Maks, kad si se već toliko trudio, ajde budi dobar pa pretvori ovu hrpu slova i brojeva u *.hex - da se ja ne moram s tim gnjaviti. Hvala!
Post Reply