bilsisco
Üye
- Katılım
- 19 Tem 2010
- Mesajlar
- 10
- Puanları
- 1
- Yaş
- 43
arkadaşlar kaç aydır yapmaya çalıştığım,
alarmlı ayarlanabilen bir termometre projesi hakkında yardımlarınıza ihtiyacım var.
devre proteusta sorunsuz çalışıyor, breadboarda ise
nedenini bilmediğim bir şekilde döngüye giriyor.
__ alarm butonları __ denen yerde key3=1 olduğunda
if komutundaki alt (yada ust) etiketine sürekli dalıyor.
tek sorun bu key3=0 oldğunda sıcaklığı sorunsuz okuyor
alarmlı ayarlanabilen bir termometre projesi hakkında yardımlarınıza ihtiyacım var.
devre proteusta sorunsuz çalışıyor, breadboarda ise
nedenini bilmediğim bir şekilde döngüye giriyor.
__ alarm butonları __ denen yerde key3=1 olduğunda
if komutundaki alt (yada ust) etiketine sürekli dalıyor.
tek sorun bu key3=0 oldğunda sıcaklığı sorunsuz okuyor
Kod:
@ devıce pic16f628a
@ devıce pic16f628a, wdt_off
@ devıce pic16f628a, pwrt_off
@ devıce pic16f628a, bod_off
@ devıce pic16f628a, lvp_off
@ devıce pic16f628a, protect_off
@ devıce pic16f628a, mclr_off
@ devıce pic16f628a, ıntrc_osc_noclkout
defıne osc 4 '4 mhz hızında çalışıyoruz.
define button_pause 50
cmcon=7 'komparatörleri iptal eder bu yalnızca 877a da vardır 877 de yok.
'pinlerin hepsi dijital
'adcon1=000111 'tüm porta girişleri dijital
'adc leri iptal pinlerin hepsi digital
'877 de kullanılır
ınclude "modedefs.bas"
lcd var porta '====> lcd kullanılmamıştır
sensor var portb.7 'sensör portb.7'ye bağlı
d1 var portb.0 'display1
d2 var portb.1 'display2
led2 var portb.2 'led
key3 var portb.3 'anahtar
buton4 var portb.4 '1.buton
buton5 var portb.5 '2.buton
alarm var portb.6 'alarm pini
mesgul var byte 'çeşitli değişken tanımlamaları
bılgı var word
ısaret var byte
onda1 var word
onda2 var word
ara var word
deger var byte
disp1 var byte 'display 1
disp2 var byte 'display 2
basamak var byte 'her displaye aktarılan dijit
alt_deger var byte
ust_deger var byte
x var byte ' x ve y alarm butonlarının sayaçları
y var byte 'disp2 'disp1
m var byte 'nm ikilisi > n m
n var byte
r var byte 'sr ikilisi > s r
s var byte
trısa=000000 'port giriş-çıkış tanımalamları
trısb=111000
lcd=000000
portb=000000
basla:
disp1=0
disp2=0
x=0
y=0
'______________alarm butonları_______________'
if key3=1 then
repeat
if buton4=0 then
goto alt
endif
if buton5=0 then
goto ust
endif
goto bitti
'____________alarm ayarlama bölümü___________'
alt:
d1=1
d2=0 '--- butona basılış örnek ---
x=x+1 'x=7 olursa yada x=14 olursa
basamak=x//10 'b=7 olur b=4 olur ** gosterilir **
gosub lcd_goster
m=basamak 'nm display ikilisi
d1=0
d2=1 '--- yukarı yuvarlama engelleniyor ----
basamak=x-basamak 'b=0 yada b=10
basamak=basamak/10 'b=0 b=1 ** gosterilir **
gosub lcd_goster
n=basamak 'nm display ikilisi (alarm için alt sıcaklık kaydı)
goto bitti
ust:
d1=1
d2=0
y=y+1
basamak=y//10
gosub lcd_goster
r=basamak 'sr display ikilisi (alarm için üst sıcaklık kaydı)
d1=0
d2=1
basamak=y-basamak
basamak=basamak/10
gosub lcd_goster
s=basamak
goto bitti
'___________alarm(lcd) gösterme bölümü____________'
lcd_goster:
lcd=basamak
pause 400
return
'_________________________________________________'
bitti:
until key3=0
endif
'_____________sıcaklık okuma bölümü_______________'
ısaret="+"
owout sensor,1,[$cc,$44]'sensöre sıcaklığı okumasını söyle.
bekle: 'sensör hazır olana kadar bekle.
owın sensor,4,[mesgul]
'ıf mesgul=0 then
'goto bekle
'endıf
devam:
owout sensor,1,[$cc,$be] 'sensöre okuduğu değeri göndermesini söyle.
owın sensor,0,[bılgı.lowbyte,bılgı.hıghbyte] 'gelen 16 bitlik bilgiyi al.
ıf bılgı.bıt13=1 then 'sıcaklık negatif ise
ısaret="-" 'sıcaklık sıfırın altında
bılgı=~bılgı 'gelen bilgideki bitleri tersle, 1->0, 0->1
bılgı=bılgı+1 'bilgiyi 1 arttır.
endıf
ara=bılgı*625 '12 bit hassasiyet kullandığımız için her değer
deger=dıv32 10000 '0.0625 santigrat dereceye denk geliyor.
ara=bılgı*625
onda1= dıv32 1000
ara=bılgı*625
onda2= dıv32 100
onda1=onda1-(deger*10)
onda2=onda2-((deger*100)+(onda1*10))
disp1=deger//10 'bulunan değerin ilk basamağı
disp2=deger/10 'bulunan değierin ikinci basamağı
pause 10
if isaret="+" then
led2=0
else
led2=1
endif
'___________sıcaklık gösteriliyor_______'
high d1
low d2
lcd=disp1
pause 50
low d1
high d2
lcd=disp2
pause 50
alt_deger=n*10+m 'nm display ikilisi alarm için kullan, alarm=portb.6 biti
ust_deger=s*10+r
'__________________alarm_________________'
if (alt_deger<=deger)and(ust_deger>=deger) then
'high alarm
'*melodi1 sound alarm,[90,1,80,2,125,1,90,2,100,2] '*melodi1
'*melodi2 'sound alarm,[140,1,80,2,125,1,95,2] *melodi2
sound alarm,[140,1,120,2,110,1,100,2]
'*melodi3
else
low alarm
endif
goto basla 'basla etiketine dön
end
