Termometre yardım resimli

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

Forum istatistikleri

Konular
133,514
Mesajlar
971,992
Kullanıcılar
459,571
Son üye
MelitaTech

Yeni konular

Geri
Üst