Yes of course.
All comments are in Serbian.
Programm:
	Code:
	'@ DEVICE XT_OSC,WDT_OFF,PROTECT_ON
'DEFINE LCD_BITS 4
'DEFINE LCD_DREG PORTB
'DEFINE LCD_DBIT 0
'DEFINE LCD_RSREG PORTB
'DEFINE LCD_RSBIT 4
'DEFINE LCD_EREG PORTB
'DEFINE LCD_EBIT 5
'DEFINE LCD_LINES 2
DEFINE LCD_BITS 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 3
DEFINE LCD_LINES 2    
    Tz var word
    Tt Var Word         
    Set var byte        
    Ton var byte
    Toff var byte
    Mode var byte
 
    CR Var Byte         
         
    
    Sn var byte
    Ss var byte
    
    Znak1 var byte
    Znak2 var byte
    Znak3 var byte
    Znak4 var byte
    I var byte
    
    symbol DQ = portb.4          
    symbol Tmode= portb.5
    symbol Tp=portb.6
    symbol Tm=portb.7
    symbol Rele=porta.1
    
    SYMBOL SCL = portc.4     
    SYMBOL SDA = portc.5
    
    input tmode
    input tp
    input tm
    output rele
    'adcon1=7
    clear
ss = tm         
rele=0
set=0
i=0
pause 100
lcdout $fe,1, " ....."
Lcdout $fe, $C0," www.....hr"
pause 2000
I2Cread SDA,SCL,$A0,0,[tz.lowbyte,tz.highbyte,toff,ton]
if tz>600 then tz=200
if toff=>100 then toff=5
if ton=>100 or ton=0 then ton=5
Pocetak:
sn = tmode
 if sn<ss then  set= set + 1
    
  if set>3 then 
   set = 0
  endif 
       
ss=sn
select case set
    CASE 0
     znak1=" "
     znak2=" "     
     znak3=" "
     call izmeri
     i=0  
    
    CASE 1 
     znak1=">"
     znak2=" " 
     znak3=" "
     if tp=0 and tz<600 then 
      tz=tz+5
      i=0
     endif 
     if tm=0 and tz=>5 then 
      tz=tz-5 
      i=0  
     endif
      I2CWrite SDA,SCL,$A0,0,[tz.lowbyte,tz.highbyte]
    
    CASE 2
     znak1=" "
     znak2=">"
     znak3=" "
     if tp=0 and ton<100 then 
      ton=ton+5
      i=0
     endif 
     if tm=0 and ton=>5 then 
      ton=ton-5
      if Ton=0 and toff=0 then ton=5
      i=0  
     endif
     I2CWrite SDA,SCL,$A0,3,[ton]
     
    CASE 3 
     znak1=" "
     znak2=" " 
     znak3=">"
     if tp=0 and toff<100 then 
      toff=toff+5
      i=0
     endif 
     if tm=0 and toff=>5 then
      toff=toff-5 
      if Ton=0 and toff=0 then toff=5
      i=0  
     endif
     I2CWrite SDA,SCL,$A0,2,[toff]
     
END SELECT 
 if tz+ton<=tt and set=0 and znak4="+" then 'ako je zadata temp manja od trenutne 
  rele=1                    'ukljuci rele
 endif                      
 if (tz=>toff and tz-toff=>tt and znak4="+") or (tz<toff and toff-tz<=tt and znak4="-" ) or set>0 then             'ako je zadata temperatura veca od trenutne ili si usao u meni
  rele=0
 endif
 
   
 i=i+1
 if i >100 then set = 4 'izadji iz menija
call prikazi
pause 150
goto pocetak
Prikazi:           
       Lcdout $fe,1,znak1,"+",DEC2 (tz / 10), ".",#(tz dig 0),223, "C"
       if set=0 then lcdout $fe,$89,znak4,DEC2 (tt / 10), ".",#(tt dig 0) ,223, "C" '178
       Lcdout $fe, $C0, znak2,"+",DEC2 (ton / 10), ".",#(ton dig 0),223, "C",znak3,"-",DEC2 (toff / 10), ".",#(toff dig 0),223, "C"        
return
Izmeri:
 OWOut DQ, 1, [$CC, $44]      ' Start merenja temperature
 Cekaj:    OWIn DQ, 4, [cr]     ' Provera da li jos traje
        If cr = 0 Then Cekaj
        
        OWOut DQ, 1, [$CC, $BE]      ' Procitaj izmerenu temperaturu
        OWIn DQ, 0, [tt.LOWBYTE, tt.HIGHBYTE]', Skip 4, cr, cpc]
        
        If tt.bit15=1 then
         znak4="-"
         tt = abs(tt)
        else
         znak4="+"
        endif
        tt=(tt>>1)*10+tt.0*5        
return
 It's simple thermostat with hysteresis.
I tested it on easypic5 and PIC16F877, everything works great,but when I tried to compile for the PIC16F57, I got errors...
When I remove LCDOUT comands, then I get this:
	Code:
	Called Adresses must Reside in Lower Half of Page
 I tried to reorganize the code, remove LCDOUT, but then i get an error when using I2C commands...
	Code:
	'@ DEVICE XT_OSC,WDT_OFF,PROTECT_ON
'DEFINE LCD_BITS 4
'DEFINE LCD_DREG PORTB
'DEFINE LCD_DBIT 0
'DEFINE LCD_RSREG PORTB
'DEFINE LCD_RSBIT 4
'DEFINE LCD_EREG PORTB
'DEFINE LCD_EBIT 5
'DEFINE LCD_LINES 2
DEFINE LCD_BITS 4
DEFINE LCD_DREG PORTB
DEFINE LCD_DBIT 0
DEFINE LCD_RSREG PORTA
DEFINE LCD_RSBIT 2
DEFINE LCD_EREG PORTA
DEFINE LCD_EBIT 3
DEFINE LCD_LINES 2    
    Tz var word
    Tt Var Word         
    Set var byte        
    Ton var byte
    Toff var byte
    Mode var byte
 
    CR Var Byte         
         
    
    Sn var byte
    Ss var byte
    
    Znak1 var byte
    Znak2 var byte
    Znak3 var byte
    Znak4 var byte
    I var byte
    
    symbol DQ = portb.4          
    symbol Tmode= portb.5
    symbol Tp=portb.6
    symbol Tm=portb.7
    symbol Rele=porta.1
    
    SYMBOL SCL = portc.4     
    SYMBOL SDA = portc.5
    
    input tmode
    input tp
    input tm
    output rele
    'adcon1=7
    clear
ss = tm         
rele=0
set=0
i=0
pause 100
'lcdout $fe,1, "....."
'Lcdout $fe, $C0," www....r"
pause 2000
'I2Cread SDA,SCL,$A0,0,[tz.lowbyte,tz.highbyte,toff,ton]
if tz>600 then tz=200
if toff=>100 then toff=5
if ton=>100 or ton=0 then ton=5
Pocetak:
sn = tmode
 if sn<ss then  set= set + 1
    
  if set>3 then 
   set = 0
  endif 
       
ss=sn
select case set
    CASE 0
     znak1=" "
     znak2=" "     
     znak3=" "
     'call izmeri
     OWOut DQ, 1, [$CC, $44]   ' Start merenja temperature
     OWOut DQ, 1, [$CC, $44]      ' Start merenja temperature
 Cekaj:    OWIn DQ, 4, [cr]     ' Provera da li jos traje
        If cr = 0 Then Cekaj
        
        OWOut DQ, 1, [$CC, $BE]      ' Procitaj izmerenu temperaturu
        OWIn DQ, 0, [tt.LOWBYTE, tt.HIGHBYTE]', Skip 4, cr, cpc]
        
        If tt.bit15=1 then
         znak4="-"
         tt = abs(tt)
        else
         znak4="+"
        endif
        tt=(tt>>1)*10+tt.0*5   
     i=0  
    
    CASE 1 
     znak1=">"
     znak2=" " 
     znak3=" "
     if tp=0 and tz<600 then 
      tz=tz+5
      i=0
     endif 
     if tm=0 and tz=>5 then 
      tz=tz-5 
      i=0  
     endif
      'I2CWrite SDA,SCL,$A0,0,[tz.lowbyte,tz.highbyte]
    
    CASE 2
     znak1=" "
     znak2=">"
     znak3=" "
     if tp=0 and ton<100 then 
      ton=ton+5
      i=0
     endif 
     if tm=0 and ton=>5 then 
      ton=ton-5
      if Ton=0 and toff=0 then ton=5
      i=0  
     endif
     'I2CWrite SDA,SCL,$A0,3,[ton]
     
    CASE 3 
     znak1=" "
     znak2=" " 
     znak3=">"
     if tp=0 and toff<100 then 
      toff=toff+5
      i=0
     endif 
     if tm=0 and toff=>5 then
      toff=toff-5 
      if Ton=0 and toff=0 then toff=5
      i=0  
     endif
     'I2CWrite SDA,SCL,$A0,2,[toff]
     
END SELECT 
 if tz+ton<=tt and set=0 and znak4="+" then 'ako je zadata temp manja od trenutne 
  rele=1                    'ukljuci rele
 endif                      
 if (tz=>toff and tz-toff=>tt and znak4="+") or (tz<toff and toff-tz<=tt and znak4="-" ) or set>0 then             'ako je zadata temperatura veca od trenutne ili si usao u meni
  rele=0
 endif
 
   
 i=i+1
 if i >100 then set = 4 'izadji iz menija
'call prikazi
       'Lcdout $fe,1,znak1,"+",DEC2 (tz / 10), ".",#(tz dig 0),223, "C"
       'if set=0 then lcdout $fe,$89,znak4,DEC2 (tt / 10), ".",#(tt dig 0) ,223, "C" '178
       'Lcdout $fe, $C0, znak2,"+",DEC2 (ton / 10), ".",#(ton dig 0),223, "C",znak3,"-",DEC2 (toff / 10), ".",#(toff dig 0),223, "C"        
    
pause 150
goto pocetak
 If uncomment I2C or LCDOU, I get an error...
Sorry for bad English...
				
			
Bookmarks