Picproje Elektronik Sitesi

DERLEYİCİLER => Proton+ => Konuyu başlatan: POWER - 30 Haziran 2018, 23:27:57

Başlık: Kesme neden çalışmıyor
Gönderen: POWER - 30 Haziran 2018, 23:27:57
İ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
Başlık: Ynt: Kesme neden çalışmıyor
Gönderen: mg1980 - 01 Temmuz 2018, 00:27:43
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ı ?
Başlık: Ynt: Kesme neden çalışmıyor
Gönderen: POWER - 01 Temmuz 2018, 02:55:17
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.
Başlık: Ynt: Kesme neden çalışmıyor
Gönderen: F.T - 01 Temmuz 2018, 11:54:05
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.
Başlık: Ynt: Kesme neden çalışmıyor
Gönderen: POWER - 01 Temmuz 2018, 11:58:55
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.
Başlık: Ynt: Kesme neden çalışmıyor
Gönderen: POWER - 01 Temmuz 2018, 12:04:40
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.
Başlık: Ynt: Kesme neden çalışmıyor
Gönderen: F.T - 01 Temmuz 2018, 12:30:24
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
Başlık: Ynt: Kesme neden çalışmıyor
Gönderen: POWER - 02 Temmuz 2018, 19:16:41
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.
Başlık: Ynt: Kesme neden çalışmıyor
Gönderen: F.T - 02 Temmuz 2018, 20:02:00
Sevindim.Iyi çalışmalar.