16f88 de Portb change kesme hatası

Başlatan mesutoner01, 01 Eylül 2013, 19:16:12

mesutoner01

Merhabalar uzun zamandır microchip ailesi ile ugrasiyorum. bugun içine girdiğim veri yapraklarını taramama ragmen içinden çıkamadığı (büyük ihtimal ile çok fazla üzerine düştüğüm için gözden kaçmıştır) daha önceleri farklı işlemcilerde kullanmış oldugum RB4...RB7 değişiklik kesmesinin 16f88 de birtürlü kullanamadım. mutlaka benden kaynaklı gözden kaçan bir durum vardır. Ricam bilenlerden programa göz atmaları şimdiden teşekkürler
PORTB=0
Device = 16F88
@CONFIG_REQ
@__CONFIG _CONFIG1, CP_OFF & CCP1_RB3 & DEBUG_OFF & WRT_PROTECT_OFF & CPD_OFF & LVP_OFF & BODEN_OFF & MCLR_OFF & PWRTE_OFF & WDT_OFF & INTRC_IO
@__CONFIG _CONFIG2, IESO_OFF & FCMEN_OFF
On Interrupt GoTo KesmeDurumu


;eecon1=0
OSCCON= %01100000
TRISA=%00010000
TRISB=%11110000
ANSEL=%00010000
INTCON= %10001000       
;OPTION_REG=%00000101
CMCON=7


Xtal = 4
Declare Adin_Res = 8
Declare Adin_Tad = FRC
Declare Adin_Stime=50


Cls   
Baslangic:

   
   
GoTo    Baslangic





Disable
KesmeDurumu:
    High PORTB.3
    PORTA.0=PORTB.4
    PORTA.1=PORTB.5
    PORTA.2=PORTB.6
    PORTA.3=PORTB.7
   
   
    INTCON.0=0
Resume
Enable
End

ete

Portb değişiklik kesmesi sistem olarak portb.4-7 pinlerinde bşr değişiklik olduğu zaman gerçekleşir. Sistemin değişikliği algılaması için kesme içinde port okunup bir değişkene verilmelidir. Çünki kesme oluştuğu zaman Intcon.0 (Rbif biti) direk Incon.0=0 şeklinde sıfırlanamaz. Sıfırlama ancak temp=PortB şeklinde port okunarak sıfırlanır. Sende olan eksiklik bu.
Temp isimli bir byte değişkeni tanımla.
Kesme içine çıkmadan;
Temp=PortB
Şeklinde bir komut satırı ekle derleyip yeniden dene bakalım.

Ete

mesutoner01

Teşekkürler... İşten geldim gelir gelmez denedim bu hali ile çalışıyor. dediğiniz eklemeyi yapıp intcon.0=0 satırını silince Çalıştı. Tmr0 bayrağını sıfırlar gibi sıfırlanacağını düşüyordum demekki yanılmışım. İşine yarayan olur diye kodu aşağıda veriyorum.
Birde merak ettiğim henuz veri yaprağına tam bakamadım ama. kesme durumunda haricen sıfırlamam gereken bir bayrak varmı. birde veri sayfasında yanlış anımsamıyorsam Portb change kesmesi ile ilgili intcon.4 bitini temizlemeden ve eecon1 ve eecon2 resisterlere bakmamı söylüyordu bu registerlerin değişiklik kesmesi ile alakası nedir ?

PORTB=0
Device = 16F88
@CONFIG_REQ
@__CONFIG _CONFIG1, CP_OFF & CCP1_RB3 & DEBUG_OFF & WRT_PROTECT_OFF & CPD_OFF & LVP_OFF & BODEN_OFF & MCLR_OFF & PWRTE_OFF & WDT_OFF & INTRC_IO
@__CONFIG _CONFIG2, IESO_OFF & FCMEN_OFF
On Interrupt GoTo KesmeDurumu


;eecon1=0
OSCCON= %01100000
TRISA=%00010000
TRISB=%11110000
ANSEL=%00010000
INTCON= %10001000       
;OPTION_REG=%00000101
CMCON=7


Xtal = 4
Declare Adin_Res = 8
Declare Adin_Tad = FRC
Declare Adin_Stime=50

Dim Temp        As Word
 
Baslangic:

   
   
GoTo    Baslangic





Disable
KesmeDurumu:
   
    High PORTB.3
    PORTA.0=PORTB.4
    PORTA.1=PORTB.5
    PORTA.2=PORTB.6
    PORTA.3=PORTB.7
    Temp=PORTB
   
   
   
Resume
Enable
End

ete

Başka sıfırlanacak bayrak yok. Sistemde çalıştığına göre eklenecek bir şey yok demektir.
Söylediğin portb değişiklik kesmesi ile ilgili diğer şeyleri data sheet de göremedim. Yerini söylersen bakarım. Bir alakası olduğunu sanmıyorum.

Ete

mesutoner01

İlginiz için teşekkürler şimdi baktım 140 ncı sayfada boyle bir ibareye rastladım yanlışda yorumlamış olabiliririm. tekrar teşekkürler.Bu arada hocam olursunuz bir çok kişi gibi sizin derslerinizle başladım bu işe çok teşekkürler iyiki varsınız.

mesutoner01

Hocam tekrar merhaba 16f88 işlemcisi ile iki kesmeyi aynı anda kullanmaya çalışıyorum. daha öncede bu tür sorunla karşılaşmıştım. diğer işlemciler için yapılan tmr0 hesabını aynen uyguluyorum. birçok işlemcide çalışırken 16f88 de çok uzun bekleme süresi oluyor. Acaba bilmediğim veya fark edemediğim bir register ayarımı var.
PORTB=0
Device = 16F88
@CONFIG_REQ
@__CONFIG _CONFIG1, CP_OFF & CCP1_RB3 & DEBUG_OFF & WRT_PROTECT_OFF & CPD_OFF & LVP_OFF & BODEN_OFF & MCLR_OFF & PWRTE_OFF & WDT_OFF & INTRC_IO
@__CONFIG _CONFIG2, IESO_OFF & FCMEN_OFF
On Interrupt GoTo KesmeDurumu

OSCCON= %01110110
TRISA=%00010000
TRISB=%11110000
ANSEL=%00010000
INTCON= %10101000       
OPTION_REG=%10000101
CMCON=7

Xtal = 8
Declare Adin_Res = 8
Declare Adin_Tad = FRC
Declare Adin_Stime=50

Dim YeniDeger           As Word
Dim Sayac               As Byte
Dim Zaman               As Word
Dim Saniye              As Byte
Dim Led                 As PORTB.3

PORTB=0
TMR0=0
Zaman=61

 
Baslangic:

   
   
GoTo    Baslangic


Disable
KesmeDurumu:
   
    If INTCON.0=1 Then ; PortB değişiklik kesmesi
       
        YeniDeger=PORTB
    EndIf
    If INTCON.2=1 Then ;Tmr0 sayac kontrolu
       
        Sayac=Sayac +1
        If Sayac=61 Then Sayac=0 : Saniye=Saniye +1
        If Saniye=60 Then Saniye=0 :Toggle Led
        TMR0=0
        INTCON.2=0
    EndIf
   
   
   
Resume
Enable
End

ete

Kesme kullandığın zaman özellikle zamana bağlı işlerde komutlarınde bir gecikme yaratacağını unutmamalısın.
Yazdığın kesme bölümü kodlarına bir bakalım. Ben olsam tek if ile hangi kesmenin olduğuna karar verirdim. Kesme oluştuğuna göre ya biri ya diğeridir. O halde birini test ederim ki en doğrusu tmr0 kesmesini önce test etmek gerekir o değilse diğeridir. O halde kesme kısmı şöyle yazılabilir;
Kesmedurumu:
If Intcon.2=1 then
  Sayac=Sayac+1
   If Sayac=61 then
     Sayac=0
     Sn=sn+1
     If sn=60 then
        Sn=0
        Toggle led
      Endif
     Endif
     Tmr0=0
      Intcon.2=0
      Goto CIK
    Endif
     YeniDeger=PortB
CIK:
     Resume
     Enable

Ete
     

mesutoner01

Hocam sadece toggle led yapsam dahi bariz bir gecikme oluşuyor. gecikmeden kasıt saniyeler degil dakikaları buluyor

ete

Aslında tmr0 için verdiğin ayarlar 4 mhz için olan değerler. Senin sistem ise 8 Mhz de çalışıyor.
Bu nedenle daha hızlı çalışması gereken bir durum var iken neden çok yavaş çalışıyor amlamadım doğrusu. Proton dili zaman zaman böyle abuk subuk durumlar yaratabiliyor. Derleyici bug'ı olabilir.
Sen yinede OSCCON register değerlerini incele. Başka da bir şey aklıma gelmiyor.
Ete

mesutoner01

Teşekkürler hocam ilgi ve alakanız için bi incelim tekrar çözümü bulursam yine bu başlık altında paylaşırım aynı dertden muzdarip olanlara faydası dokunur. iyi çalışmalar

Powered by EzPortal