Kesme neden çalışmıyor

Başlatan POWER, 30 Haziran 2018, 23:27:57

POWER

İyi çalışmalar,
Proğram dht22 ile ısı ve nem okuma ile ilgili.ısı ve nemi kontrol için basit menü sistemi oluşturdum.Fakat donanımsal kesmeyi bir türlü çalıştıramadım.proğram bazı satırlarını iptal ettiğim zaman problemsiz çalışıyor.Misal Set_Hassasiyet etiketindeki butonlarla ilgili kısmı iptal ettiğim zaman kesme çalışıyor bu kısmı aktif ettiğim zaman kesme oluşmuyor ve zaman çalışmıyor.hata, proğramın genel akışıylamı ilgili yoksa kesmeninin oluşturulmasıylamı ilgili bilemedim ve işin içinden çıkamadım malesef.
Device = 16F88
@CONFIG_REQ
@__CONFIG _CONFIG1, INTRC_IO & WDT_OFF & PWRTE_ON & MCLR_OFF & BODEN_OFF & LVP_OFF & WRT_PROTECT_OFF & CP_OFF & CPD_OFF & DEBUG_OFF
Xtal 4
OSCCON=%01101100

TRISA=%00000000
TRISB=%11100000
PORTA=0
PORTB=0
INTCON=%10100000        'Kesmeler aktif ve TMR0 kesmesi aktif 
TMR0=0
OPTION_REG=%00000101 'pull-up dirençleri aktif, bölme oranı 1/64
On_Hardware_Interrupt GoTo KESME
CMCON =7
ANSEL=0 
Declare All_Digital TRUE
Declare LCD_DTPin PORTB.0  ' LCD Data Pin  
Declare LCD_RSPin PORTB.4  ' LCD RS Pin
Declare LCD_ENPin PORTA.4  ' LCD EN Pin
Declare LCD_Lines 2        ' LCD Satır
Declare LCD_Interface 4    ' LCD Data Pin Sayısı 4

Symbol dTa =PORTA.3
Symbol motor_role =PORTA.0
Symbol lamba_role =PORTA.6
Symbol nem_role =PORTA.7
Symbol buzer =PORTA.2
Symbol menu =PORTB.6
Symbol asagi =PORTB.7
Symbol yukari =PORTB.5
Symbol lcd_led =PORTA.1        

Print $FE,$40,$00,$15,$0E,$1F,$0E,$15,$00,$00  ' *  
Print $FE,$48,$0F,$00,$0F,$10,$17,$11,$0F,0    'Ğ dataları--1
Print $FE,$50,$0A,$00,$11,$11,$11,$11,$0E,0    'Ü dataları--2 
Print $FE,$58,$0F,$10,$10,$0E,$01,$05,$1E,$00  'Ş dataları--3 
Print $FE,$60,4,0,4,4,4,4,4,0                  'İ dataları--4      
Print $FE,$68,$0A,$0,$0E,$11,$11,$11,$0E,0      'Ö dataları--5 
Print $FE,$70,$0E,$11,$10,$10,$11,$0E,$04      'Ç dataları--6 
Print $FE,$78,$40,$00,$0C,$04,$04,$04,$0E,$00,0 'ı dataları--7              
Print $FE, 1 ; clear di

Dim Y As Byte
Dim I As Byte
Dim TaMrUt As Word
Dim OnDaRuT As Byte
Dim tAmIsI As Word
Dim OnDaIsI As Byte
Dim cOnTroL As Byte
Dim saat As Byte
Dim dakika As Byte
Dim saniye As Byte

Dim isi As Word    'tam-ısı ve onda-ısı bu değişkende tutuluyor
Dim nem As Word    'tam-nem ve onda-nem bu değişkende tutuluyor
Dim isi_set As Word 'set edilecek isi değeri  
Dim nem_set As Word 'set edilecek nem değeri

Dim isi_set_tam  As Byte  'set edilecek isi değerinin tam kısmı
Dim isi_set_onda As Byte  'set edilecek isi değerinin onda kısmı
Dim nem_set_tam  As Byte  'set edilecek nem değerinin tam kısmı
Dim nem_set_onda As Byte  'set edilecek nem değerinin onda kısmı

Dim a_don_zamani As Byte
Dim a_don_suresi As Byte
Dim zmn As Byte
Dim poz As Bit
Dim lcd_sn1 As Byte
Dim sayac As Byte
Dim lcd_sn As Byte
Dim a As Byte
Dim ayr As Byte
Dim x As Word

Dim isi_hassasiyet As Byte
Dim nem_hassasiyet As Byte

a=0
ayr=0
poz=0
buzer=0 
sayac=0
saat=0
dakika=59
saniye=50
lcd_sn=0                    
lcd_sn1=0
lamba_role=0
motor_role=0
nem_role=0
''''''''--------------------------------------------------------------------
isi_set.LowByte=ERead 1
isi_set.HighByte=ERead 2
If isi_set=65535 Then isi_set=300
nem_set.LowByte=ERead 3
nem_set.HighByte=ERead 4
If nem_set=65535 Then nem_set=700

isi_set_tam=ERead 5
If isi_set_tam=255 Then isi_set_tam=50
isi_set_onda=ERead 6
If isi_set_onda=255 Then isi_set_onda=10

isi_hassasiyet=ERead 9
If isi_hassasiyet=255 Then isi_hassasiyet=2
'''''----------------------------------------------------------------------------------------------
buzer=0
GIRIS:
GoSub  TEMIZLE
GoSub EKRAN

BASLA:
    
      GoSub SeNsOROkU
      GoSub ARK_SONDURR
      GoSub EKRAN
'      DelayMS 600
''''-----------------------------------------------------------------------------
If zmn>50 Then  'MENÜ TUŞ GECİKMESİ 
  buzer=0
  poz=1
  lcd_sn1=0
  GoSub TEMIZLE
  GoTo ANA_MENU
EndIf

        GoTo BASLA

EKRAN:
    Print At 1,1,Dec2 TaMrUt ,".",Dec1 OnDaRuT," RH  "
    Print At 1,11,Dec2 tAmIsI,".",Dec1 OnDaIsI ," C  "
    Print At 2,1,Dec2 saat,":",Dec2 dakika,":",Dec2 saniye
    GoSub ARK_SONDURR
    Return
                              
TEMIZLE:
 Cls
 Return

BIPBIP:
    High buzer  
    DelayMS 50
    Low buzer 
      DelayMS 100
    High buzer
      DelayMS 50
    Low buzer 
    Return
BIP:
    High buzer
    For x=0 To 3000  '1000
    Next x
    Low buzer
    Return

KAYDET:
      Print At 1,1,"AYARLAR"
      Print At 2,1,"KAYDEDILIYOR...."
      
'      EWrite 1,[isi_set.LowByte]
'      DelayMS 10
'      EWrite 2,[isi_set.HighByte]
'      DelayMS 10
'      EWrite 3,[nem_set.LowByte]
'      DelayMS 10
'      EWrite 4,[nem_set.HighByte]
'      DelayMS 10
'      EWrite 5,[isi_set_tam]
'      DelayMS 10
'      EWrite 6,[isi_set_onda]
'      DelayMS 10
'      EWrite 7,[nem_set_tam]
'      DelayMS 10
'      EWrite 8,[nem_set_onda]
'      DelayMS 10
'      EWrite 9,[isi_hassasiyet]
'      DelayMS 10    
'      EWrite 10,[a_don_zamani]
'      DelayMS 10
'      EWrite 11,[a_don_suresi]
      GoSub BIPBIP
      DelayMS 3000
      a=0
      poz=0 
      lcd_sn=0
      lcd_sn1=0
      ayr=0
      zmn=0
      GoSub TEMIZLE
GoTo BASLA

 ANA_EKRAN:
  GoSub BIPBIP
      ayr=0
      a=0
      poz=0 
      lcd_sn=0
      lcd_sn1=0
  GoSub TEMIZLE
GoTo GIRIS

AYARLANDI:
    Print At 1,1,"AYARLANDI...    "
    Print At 2,1,"                "  
    GoSub BIP
    lcd_sn1=0
    DelayMS 1000

ANA_MENU:
    If yukari=0 Then 
        lcd_sn1=0
        GoSub ARK_SONDUR
        ayr=ayr+1
        GoSub BIP
        While yukari=0
        Wend
    If ayr>5 Then ayr=0
        EndIf
    
    If asagi=0 Then 
      lcd_sn1=0
      GoSub ARK_SONDUR
      lcd_sn1=0
      ayr=ayr-1
      GoSub BIP
      While asagi=0
      Wend
    If ayr=255 Then ayr=5
      EndIf
    GoTo DURUM
    GoTo ANA_MENU

DURUM:
      Select Case ayr
Case 0
Print At 1,1,"  ISI AYARLAMA  " 
      If lcd_sn1>10 Then GoTo ANA_EKRAN      
      If menu=0 Then 
      GoSub ARK_SONDUR
      a=a+1
      While menu=0
      Wend
      EndIf
  If a>1 Then 
      GoSub BIP
      GoTo SET_ISI
  EndIf
Case 1
Print At 1,1,"  NEM  AYARI  "
      Print At 2,1,"                " 
      If lcd_sn1>10 Then GoTo ANA_EKRAN
      If menu=0 Then
      GoSub ARK_SONDUR                
      While menu=0
      Wend
      GoSub BIP
      GoTo SET_NEM
      EndIf
Case 2
Print At 1,1,"HASSAS",4,"YET AYARI"
      Print At 2,1,"                " 
      If lcd_sn1>10 Then GoTo ANA_EKRAN
      If menu=0 Then
      GoSub ARK_SONDUR                
      While menu=0
      Wend
      GoSub BIP
      GoTo SET_HASSASIYET
      EndIf
Case 3
Print At 1,1,"  MOTOR  KA",6,"  "          
Print At 2,1," SAATTE D",5,"NECEK "    
      If lcd_sn1>10 Then GoTo ANA_EKRAN
      If menu=0 Then
      GoSub ARK_SONDUR
      While menu=0
      Wend
      GoSub BIP
      GoTo SET_DONDURME_ZAMANI
      EndIf
Case 4
Print At 1,1," MOTOR  ",6,"EV",4,"RME "      
Print At 2,1,"              " 
      If lcd_sn1>10 Then GoTo ANA_EKRAN
      If menu=0 Then
      GoSub ARK_SONDUR
      While menu=0
      Wend
      GoSub BIP
'      GoTo SET_DONDURME_SURESI
      EndIf
Case 5
Print At 1,1," MEN",2,"DEN  ",6,"IKI",3," "  
Print At 2,1,"                "
      If lcd_sn1>10 Then GoTo ANA_EKRAN
      If menu=0 Then
      GoSub ARK_SONDUR
      While menu=0
      Wend
      GoSub TEMIZLE
      GoTo KAYDET
      EndIf
End Select
GoTo ANA_MENU
GoTo TEMIZLE

SET_ISI:                                                                          
If lcd_sn1>10 Then GoTo ANA_EKRAN
Print At 1,1,"  ISI AYARLAMA  "
isi_set_tam=isi_set/10
isi_set_onda=isi_set//10 
Print At 2,6,Dec2 isi_set_tam,".",Dec1 isi_set_onda
If yukari=0 Then 
    lcd_sn1=0
    isi_set=isi_set+1
    If isi_set>500 Then isi_set=500
    GoSub BIP
    While yukari=0
    Wend
EndIf      
If asagi=0 Then 
    lcd_sn1=0
    isi_set=isi_set-1
    If isi_set=65535 Then isi_set=0
    GoSub BIP
    While asagi=0
    Wend
EndIf      
  If menu=0 Then
    ayr=5
    GoTo AYARLANDI
    GoSub BIP
  EndIf
GoTo SET_ISI

SET_NEM: 
If lcd_sn1>9 Then GoTo ANA_EKRAN 
Print At 1,1,"  NEM  AYARI  "
nem_set_tam=nem_set/10
nem_set_onda=nem_set//10 
Print At 2,6,Dec2 nem_set_tam,".",Dec1 nem_set_onda," %"
If yukari=0 Then 
    lcd_sn1=0
    nem_set=nem_set+1
    If nem_set>1000 Then nem_set=1000
    GoSub BIP
    While yukari=0
    Wend
EndIf      
If asagi=0 Then 
    lcd_sn1=0
    nem_set=nem_set-1
    If nem_set=65535 Then nem_set=0
    GoSub BIP
    While asagi=0
    Wend
EndIf        
  If menu=0 Then
    ayr=5
    GoTo AYARLANDI
    GoSub BIP
  EndIf
GoTo SET_NEM

SET_HASSASIYET: 
If lcd_sn1>9 Then GoTo ANA_EKRAN
Print At 1,1,"HASSAS",4,"YET AYARI"
Print At 2,8,Dec2 isi_hassasiyet
'If yukari=0 Then 
'    lcd_sn1=0
'    isi_hassasiyet=isi_hassasiyet+1
'    If isi_hassasiyet>30 Then isi_hassasiyet=30
'    GoSub BIP
'    While yukari=0
'    Wend
'EndIf      
'If asagi=0 Then 
'    lcd_sn1=0
'    isi_hassasiyet=isi_hassasiyet-1
'    If isi_hassasiyet=255 Then isi_hassasiyet=0
'    GoSub BIP
'    While asagi=0
'    Wend
'EndIf        
'  If menu=0 Then
'    ayr=5
'    GoTo AYARLANDI
'    GoSub BIP
'  EndIf
GoTo SET_HASSASIYET

SET_DONDURME_ZAMANI:
If lcd_sn1>9 Then GoTo ANA_EKRAN
Print At 1,1," DONDURME SAATI"      
Print At 2,1,"    ",Dec2 a_don_zamani,"  SAAT    "
If yukari=0 Then 
    lcd_sn1=0
    a_don_zamani=A_DON_ZAMANI+1
If a_don_zamani>23 Then a_don_zamani=23 
    GoSub BIP
    While yukari=0
    Wend
EndIf      
If asagi=0 Then 
  lcd_sn1=0
  a_don_zamani=A_DON_ZAMANI-1
If a_don_zamani=0 Then a_don_zamani=1
    GoSub BIP
    While asagi=0
    Wend
EndIf      
  If menu=0 Then
    ayr=5
    GoTo AYARLANDI
    GoSub BIP
  EndIf
GoTo SET_DONDURME_ZAMANI

SeNsOROkU:      
    INTCON.7=0
    Output dTa
    dTa =1 '1
    DelayUS 5
    dTa =0  '0
    DelayMS 5      '1-10 ms bekle
    dTa =1        'Data pinini High yap
    DelayUS 40    '40 us bekle
    Input dTa
    DelayUS 5
    While dTa =0
    Wend
    DelayUS 80
    If dTa =1 Then HaTa

TaMrUt=0
    For I=15 To 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
    While dTa =0
    Wend  
    DelayUS 30
    If dTa =1 Then LoadBit TaMrUt,I,1
'----------------------------------------------------------------------------------------
    If dTa=1 Then 
    SetBit TaMrUt,I
    EndIf
'-----------------------------------------------------------------------------------------  
    While dTa =1
    Wend
    Next

tAmIsI=0
    For I=15 To 0 STEP-1  'MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
    While dTa=0
    Wend
    DelayUS 30
    If dTa=1 Then LoadBit tAmIsI,I,1
'--------------------------------------------------------------------------------------------    
    If dTa=1 Then 
    SetBit tAmIsI,I
    EndIf
'-------------------------------------BURASI ----------------------------------------------------------    
    While dTa =1
    Wend 
    Next          

cOnTroL=0
    For I=7 To 0 STEP-1  '7 de hata veriyo.MSB bitleri önce geleceği için döngümüzü tersten kuruyoruz.
    While dTa =0
    Wend 
    DelayUS 30
    If dTa=1 Then LoadBit cOnTroL,I,1
'-----------------------------------------------------------------------------------------
    If dTa=1 Then 
    SetBit cOnTroL,I
    EndIf
'-------------------------------BURASI SORUNLU-------------------------------------------
    While dTa =1
    Wend  
'''---------------------------------------------------------------------------------------
    Next
    Output dTa
    dTa=0

    isi=OnDaIsI
    isi=tAmIsI
    
    nem=OnDaRuT
    nem=TaMrUt
    
    OnDaRuT=TaMrUt//10
    TaMrUt =TaMrUt /10
    OnDaIsI=tAmIsI//10 
    tAmIsI =tAmIsI /10
    INTCON.7=1 
    Return

HaTa:
    Print At 1,12,"    "
    Print At 1,1,"S E N S O R" 
    Print At 2,1,"    "
    Print At 2,6,"H A T A S I"
'    DelayMS 1000 
GoTo SeNsOROkU

ARK_SONDUR: 
    For I = 1 To 10 
    DelayMS 3
    Next I 
    Return

ARK_SONDURR: 
    For Y = 1 To 100  '100
    DelayMS 4
    Next Y 
    Return

KESME:
Context  Save
If poz=0 Then  
    If menu=0 Then            'MENU BUTON GECİKMESİ İÇİN
      zmn=zmn+1
      buzer=1  
      lcd_sn=0
'      lcd_led=1
    Else
      buzer=0
      zmn=0
    EndIf
EndIf
      sayac=sayac+1
    If sayac<50 Then    GoTo CIK  '  61    5 OLACAK    08:44 DONUYOR  02:37 OLABİLİR
      sayac=0        
      saniye=saniye+1
      lcd_sn=lcd_sn+1
      lcd_sn1=lcd_sn1+1
    If saniye >= 60 Then
      saniye=0
      dakika=dakika+1
    If dakika >= 60 Then
      dakika=0
      saat=saat+1
    If saat >= 24 Then
      saat=0
    EndIf
    EndIf
    EndIf
CIK:
INTCON.2=0
Context Restore
End
Tüm dosyalar linkte.
http://s7.dosya.tc/server7/8xhf9n/16F88.rar.html
TB6BKG

mg1980

Proton bilmiyorum ama biraz PicBasic'e benziyor gibi..Yanlış anlamayın tereciye tere satmak gibi olmasın da onda KESME etiketinden önce DISABLE, sonunda RESUME..ENABLE oluyordu...buna benzer şeyler Proton'da var mı ?

POWER

Alıntı yapılan: mg1980 - 01 Temmuz 2018, 00:27:43Proton bilmiyorum ama biraz PicBasic'e benziyor gibi..Yanlış anlamayın tereciye tere satmak gibi olmasın da onda KESME etiketinden önce DISABLE, sonunda RESUME..ENABLE oluyordu...buna benzer şeyler Proton'da var mı ?
estağfirullah,o söyledikleriniz picbasic için doğru.fakat protonda donanımsal kesme özelliği var normal kesmeden farklı olarak.bende protonu yeni yeni kullanıyorum o yüzden kesme oluşturmada bir eksiğim olabilir belki diye düşünüyorum.
TB6BKG

F.T

Kesmeye girip girmediğini kontrol için kesme içinde bir çıkış portunu toggle yapıp yada lcd ekranına bir kesme içi sayıcı  yerleştirip anlayabilirsiniz.Önceden sorun olmayıpta kodlar eklendikçe sorun oldu ise eklenen kodları inceleseniz daha iyi olur.
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

POWER

Protonu yeni yeni kullanıyorum ve çok fazla tecrübem yok malesef.Şöyle bir ilginçlik var,sanki satır sayısında bir kısıltlama var.yada bir kapasitesi varda onu geçtiğinde kesme oluşmuyor.satırların bir çoğunu pasif hale getirdim ve saniye saymaya başladı(yani kesme oluşuyor)sonra satırları tek tek aktif ederek denedim.en son satırlardan bir tanesini aktif ettiğim zaman kesme oluşmuyor vede saniye saymıyor.bu sefer proğramın herhangi bir satırını(proğramın akışını aksatmayacak bir satırı)pasif hale getirip derleme yapıp deniyorum saniye sayıyor(kesme çalışıyor)sanki çalıştığı anda kaç satır aktifse ondan sonraki satır yada satırlarda kesme oluşmuyor.Çok tuhaf bir durum gerçekten,uzman arkadaşlardan ve hocalarımdan yardım bekliyorum.
TB6BKG

POWER

#5
F.T hocam,
söylediğiniz gibi kesme içinde sayaç çalıştırdım ve ona bağlı saniye-dakika-saat şeklinda sayıcı çalıştırarak kesmenin oluşup oluşmadığını anlıyorum.eklenen kodları çok inceledim ama bir sorun bulamadım malesef ve sıkışıp kaldım.
TB6BKG

F.T

Hocam derleyici hatasıda olabilir.Sensör okuma kısmında INTCON.5 Bitinide müdahale ettim.Sürüm 3.6.0.7 ile derledim lcd ekranda saatte bir takılma görmedim.Deneyin isterseniz.Bu arada simülasyonda yanıltabilir.

http://s7.dosya.tc/server7/lb7qzf/16F88.rar.html
Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

POWER

F.T hocam,
hata dediğiniz gibi derleyiciden çıktı.benim sürüm çok eski imiş.sizin sürüme yükselttim sorun çözüldü.şimdi herşey olması gerektiği gibi çalışıyor.İyi çalışmalar.
TB6BKG

F.T

Hakk şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.