Pıc16F877 Sıcaklıkğa Göre Seçim Yapma,Role Açma

Başlatan bersis576, 18 Aralık 2014, 15:11:45

bersis576

Arkadaşlar aşağıda gördüğünüz şekilde bir ödevim var,yapması gerekenler belli sıcaklık değerlerin bir seçim yapacak ve sıcaklık değişene kadar o seçimde kalıp,seçmde kaldığı süre içindede roleyi açık tutacak,bunları lcd de gösterecek,fakat benim yaptığımda sıcaklık değeri değişse bile seçimi değiştirmiyor,çok karışık oldu,bir yerde hata var ama çözemiyorum,yardım ederseniz sevinirim.Ödevim yarına olduğu için sitey araştıramadım kusura bakmayın,bu alanda yeniyim ilk yaptığım proje bu olacak.



DEFINE LCD_DREG PORTC 'LCD data bacakları PortC de bağlı
DEFINE LCD_DBIT 4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTC 'LCD Enable Bacağı PortC de bağlı
DEFINE LCD_EBIT 3 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTC 'LCD RW Bacağı PortC de bağlı
DEFINE LCD_RWBIT 2 'LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG PORTC 'LCD RS Bacağı PortC de bağlı
DEFINE LCD_RSBIT 1 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 4 'LCD 2 sıra olarak çalışıyor
DEFINE OSC 4

ADCON0=%10000000
ADCON1=%0111

TRISA=%001111       
TRISC=0      
TRISD=%00000111

SICAKLIK    Var Word   ' Sicaklik Degsikeni
Kalan       Var Byte   ' Kalan Degiskeni
Derece_say  Var Byte   ' Her Santigrad icin derece sayimi Degiskeni

DS Var PORTA.4   

SYMBOL TUS1=PORTA.0
SYMBOL TUS2=PORTA.1
SYMBOL TUS3=PORTA.2

HIGH TUS1
HIGH TUS2
HIGH TUS3

lcdout $FE,1,"SSA"
LCDOUT $FE,$C0,"2211"
LCDOUT $FE,$94,"ODEV ÇALIŞMASI"
PAUSE 400

DONGU:   OWOut DS,1,[$CC, $44]
DONGU1:  OWIn DS,4,[Kalan]         
         If Kalan = 0 Then DONGU1 

OWOut DS,1,[$CC, $BE]  ' Siackligi oku
OWIn DS,0,[SICAKLIK.LOWBYTE, SICAKLIK.HIGHBYTE, Skip 4, Kalan, Derece_say]

 
SICAKLIK = (((SICAKLIK >> 1) * 100) - 25) + (((Derece_say - Kalan) * 100) / Derece_say)
Lcdout $FE,$D4,0,DEC (SICAKLIK / 100), ".", DEC2 SICAKLIK, " C DERECE" 
Pause 1000             ' Her 250 milisaniyede bir goster



                
BASLA:
lcdout $FE,1,"1.TAVUK"
LCDOUT $FE,$C0,"2.KAZ"
LCDOUT $FE,$94,"3.BILDIRCIN"
LCDOUT $FE,$D4,"LUTFEN BIRINI SECIN"
PAUSE 10

IF 0<SICAKLIK<80 THEN TUS1=0 
LCDOUT $FE,1
Lcdout $FE,$C0,0,DEC (SICAKLIK / 100), ".", DEC2 SICAKLIK, " C DERECE"
PAUSE 500 
LCDOUT $FE,$94,"TAVUK Secildi  "
HIGH PORTD.0
HIGH PORTA.3  'role çektirildi
PAUSE 500    '500 ms beklemeı 
PAUSE 500
LOW PORTD.0
PAUSE  500
GOTO DONGU

IF 88<SICAKLIK<160 THEN TUS2=0 
LCDOUT $FE,1
Lcdout $FE,$C0,0,DEC (SICAKLIK / 100), ".", DEC2 SICAKLIK, " C DERECE"
PAUSE 500 
LCDOUT $FE,$94,"BILDIRCIN Secildi  "
HIGH PORTD.0
HIGH PORTA.3  'role çektirildi
PAUSE 500    '500 ms beklemeı 
PAUSE 500
LOW PORTD.0
PAUSE  500
GOTO DONGU

IF 168<SICAKLIK<240 THEN TUS3=0 
LCDOUT $FE,1
Lcdout $FE,$C0,0,DEC (SICAKLIK / 100), ".", DEC2 SICAKLIK, " C DERECE"
PAUSE 500 
LCDOUT $FE,$94,"KAZ Secildi  "
HIGH PORTD.0
HIGH PORTA.3  'role çektirildi
PAUSE 500    '500 ms beklemeı 
PAUSE 500
LOW PORTD.0
PAUSE  500
GOTO DONGU


END

vale9

IF kullandıktan sonra ENDIF kullanmamışsın, dolayısyla IF satırındaki TUS1=0'dan sonra otomatik ENDIF kabul ediyor. Aşağıda devam eden satırlara if'e bakmadan giriyor. Sonra da GOTO DONGU gördüğü için DONGU'ye gidiyor. Diğer if'li satırlara hiç geçmiyor program. Şu şekilde değiştirmen lazım kodu:

IF 0<SICAKLIK<80 THEN 
TUS1=0 
LCDOUT $FE,1
Lcdout $FE,$C0,0,DEC (SICAKLIK / 100), ".", DEC2 SICAKLIK, " C DERECE"
PAUSE 500 
LCDOUT $FE,$94,"TAVUK Secildi  "
HIGH PORTD.0
HIGH PORTA.3  'role çektirildi
PAUSE 500    '500 ms beklemeı 
PAUSE 500
LOW PORTD.0
PAUSE  500
ENDIF

IF 88<SICAKLIK<160 THEN 
TUS2=0 
LCDOUT $FE,1
Lcdout $FE,$C0,0,DEC (SICAKLIK / 100), ".", DEC2 SICAKLIK, " C DERECE"
PAUSE 500 
LCDOUT $FE,$94,"BILDIRCIN Secildi  "
HIGH PORTD.0
HIGH PORTA.3  'role çektirildi
PAUSE 500    '500 ms beklemeı 
PAUSE 500
LOW PORTD.0
PAUSE  500
ENDIF

IF 168<SICAKLIK<240 THEN 
TUS3=0 
LCDOUT $FE,1
Lcdout $FE,$C0,0,DEC (SICAKLIK / 100), ".", DEC2 SICAKLIK, " C DERECE"
PAUSE 500 
LCDOUT $FE,$94,"KAZ Secildi  "
HIGH PORTD.0
HIGH PORTA.3  'role çektirildi
PAUSE 500    '500 ms beklemeı 
PAUSE 500
LOW PORTD.0
PAUSE  500
ENDIF

GOTO DONGU


END


Hayat 1'ler ve 0'lardan ibarettir.

ete

Bu program aşağıdaki şekilde çalışır.
Sanırım sıcaklığa göre menü seçimi yaptırılıyor.
Sigorta ayarları eksik ama hangi işlemci olduğu çok açık belli olmadığı için eklemedim. Ama eklenmesi gerekir.

Ete

DEFINE OSC 4
DEFINE LCD_DREG PORTC 'LCD data bacakları PortC de bağlı
DEFINE LCD_DBIT 4 'LCD data bacakları 4. bitten başlıyor
DEFINE LCD_EREG PORTC 'LCD Enable Bacağı PortC de bağlı
DEFINE LCD_EBIT 3 'LCD Enable Bacağı 3. bite bağlı
DEFINE LCD_RWREG PORTC 'LCD RW Bacağı PortC de bağlı
DEFINE LCD_RWBIT 2 'LCD RW Bacağı 2. bite bağlı
DEFINE LCD_RSREG PORTC 'LCD RS Bacağı PortC de bağlı
DEFINE LCD_RSBIT 1 'LCD RS bacağı 1. Bite bağlı
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı
DEFINE LCD_LINES 4 'LCD 2 sıra olarak çalışıyor

ADCON0=%10000000
ADCON1=%00000111

TRISA=%00001111       
TRISC=0      
TRISD=%00000111

SICAKLIK    Var Word   ' Sicaklik Degsikeni
Kalan       Var Byte   ' Kalan Degiskeni
Derece_say  Var Byte   ' Her Santigrad icin derece sayimi Degiskeni

DS Var PORTA.4   

SYMBOL TUS1=PORTA.0
SYMBOL TUS2=PORTA.1
SYMBOL TUS3=PORTA.2

HIGH TUS1
HIGH TUS2
HIGH TUS3

lcdout $FE,1,"SSA"
LCDOUT $FE,$C0,"2211"
LCDOUT $FE,$94,"ODEV ÇALIŞMASI"
PAUSE 400

DONGU:   OWOut DS,1,[$CC, $44]
DONGU1:  OWIn DS,4,[Kalan]         
         If Kalan = 0 Then DONGU1 

OWOut DS,1,[$CC, $BE]  ' Siackligi oku
OWIn DS,0,[SICAKLIK.LOWBYTE, SICAKLIK.HIGHBYTE, Skip 4, Kalan, Derece_say]

 
SICAKLIK = (((SICAKLIK >> 1) * 100) - 25) + (((Derece_say - Kalan) * 100) / Derece_say)
Lcdout $FE,$D4,0,DEC (SICAKLIK / 100), ".", DEC2 SICAKLIK, " C DERECE" 
Pause 1000             ' Her 250 milisaniyede bir goster
                
BASLA:
lcdout $FE,1,"1.TAVUK"
LCDOUT $FE,$C0,"2.KAZ"
LCDOUT $FE,$94,"3.BILDIRCIN"
LCDOUT $FE,$D4,"LUTFEN BIRINI SECIN"
PAUSE 10

IF SICAKLIK>0 AND SICAKLIK<80 THEN 
   TUS1=0  
   LCDOUT $FE,1
   Lcdout $FE,$C0,0,DEC (SICAKLIK / 100), ".", DEC2 SICAKLIK, " C DERECE"
   PAUSE 500 
   LCDOUT $FE,$94,"TAVUK Secildi  "
   HIGH PORTD.0
   HIGH PORTA.3  'role çektirildi
   PAUSE 500    '500 ms beklemeı 
   PAUSE 500
   LOW PORTD.0
   PAUSE  500
   GOTO DONGU
ENDIF

IF SICAKLIK>88 AND SICAKLIK<160 THEN 
   TUS2=0
   LCDOUT $FE,1
   Lcdout $FE,$C0,0,DEC (SICAKLIK / 100), ".", DEC2 SICAKLIK, " C DERECE"
   PAUSE 500 
   LCDOUT $FE,$94,"BILDIRCIN Secildi  "
   HIGH PORTD.0
   HIGH PORTA.3  'role çektirildi
   PAUSE 500    '500 ms beklemeı 
   PAUSE 500
   LOW PORTD.0
   PAUSE  500
   GOTO DONGU
ENDIF

IF SICAKLIK >168 AND SICAKLIK<240 THEN
   TUS3=0 
   LCDOUT $FE,1
   Lcdout $FE,$C0,0,DEC (SICAKLIK / 100), ".", DEC2 SICAKLIK, " C DERECE"
   PAUSE 500 
   LCDOUT $FE,$94,"KAZ Secildi  "
   HIGH PORTD.0
   HIGH PORTA.3  'role çektirildi
   PAUSE 500    '500 ms beklemeı 
   PAUSE 500
   LOW PORTD.0
   PAUSE  500
   GOTO DONGU
ENDIF
   GOTO DONGU
END
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

bersis576

yardımcı oldunuz,uğraşıp cevap verdiğiniz için teşekkür ederim.