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
'-----------------------------------------