TMR0+PORTB değişim kesmesi

Başlatan gogoce, 22 Haziran 2017, 15:19:29

gogoce

Merhabalar
Aynı anda tmr0 ve portb değişim kesmesini kullanıyorum. TMR0 bir porta.4 e bağlı. 0 olduğunda çalışacak 1 olduğunda çalışmamasını istiyorum.
İşlemci ilk çalıştığında problem yok şart sağlanıyor fakat porta.4=0 olduktan sonra porta.4=1 yapsam da kesmeye gidip zaman değişkenini arttırıyor. Nerede hata yapıyorum bulamadım

16f877 20mhz kullnıyorum


@ __config _CP_ALL & _DEBUG_OFF & _BODEN_OFF & _PWRTE_ON & _WDT_OFF & _HS_OSC & _LVP_OFF & _CPD_ON
DEFINE OSC 20
INCLUDE "modedefs.bas"
DEFINE HSER_RCSTA 90h ' Enable serial port & continuous receive
DEFINE HSER_TXSTA 24h ' Enable transmit, BRGH = 1
DEFINE HSER_SPBRG 129 ' 9600 Baud @ 0,16%
DEFINE HSER_CLROERR 1 ' Clear overflow automatically

OPTION_REG.7=1   ;PORTB PULLUP DİRENÇLER AKTİF  aslında PASIF????????????????????!!!!!!!!!!!!!!!!!!!!!!
OPTION_REG.6=0   ;RBO DÜŞEN KENAR İLE KESME OLUŞTURACAK     ;RB0 KESMESİ KAPALI
OPTION_REG.5=0   ;TMR0 DAHİLİ OSİLATÖR İLE SAYACAK
OPTION_REG.4=0   ;DÜŞEN KENARDA TMR0 SAYACAK
OPTION_REG.3=0   ;BÖLME TMR0 İÇİN GEÇERLİ OLACAK
OPTION_REG.2=1   ;
OPTION_REG.1=1   ;  BÖLME ORANI 1/256
OPTION_REG.0=1   ;
TMR0=0

ADCON1=7
TRISA=%11111111
TRISB=%11111111
TRISC=%10101111
TRISD=%00001111
TRISE=%00000111
TEMP  VAR BYTE
OLD   VAR BYTE
NEW   VAR BYTE
YON   VAR BIT
ZAMAN VAR BYTE 58
sayac var word

SYMBOL BAYRAK=INTCON.0
CLEAR
pause 500
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
INTCON.7=1 ;TÜM KESMELER AÇIK
INTCON.4=1 ;PORTB DEĞİŞİM KESMESİ AÇIK
INTCON.5=0 ;TMR0 KESMESİ AKTİF  DEĞİL
ana:
    IF PORTA.4=0 THEN
      INTCON.5=1  ;TMR0 KESMESİ AÇILDI
      IF ZAMAN=20 THEN
        SARKI=210
        GOSUB CAL
      ENDIF
    ELSE
      INTCON.5=0
    ENDIF
    goto ana

DISABLE
KESME:   
      IF INTCON.2=1 THEN
        ZAMAN=ZAMAN+1  ' zaaman kontrolü yok. alıp başını giderse ne olacak?
        TMR0=0
        INTCON.2=0
        goto CIK
      ENDIF

      NEW=PORTB & %11000000
      YON=OLD.6 ^ NEW.7
      IF YON=1 THEN
        SAYAC=SAYAC+1
      ELSE
        SAYAC=SAYAC-1
        IF SAYAC=65535 THEN SAYAC=0
      ENDIF
      OLD=NEW
      TEMP.6=PORTB.6
      TEMP.7=PORTB.7                                     
      BAYRAK=0

CIK:     
      RESUME
      ENABLE     
END   

Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

ete

Tmr0 kesmesi oluştuğunda yapılacakları yapıp diğer değişiklik kesmesi kodlarının içine sokmadan kesmeden çıkman gerekir. Ama sen tmr0 kesmesi oluştuğunda yapacaklarınıyapıp birde Değişim kesmesi uyguluyorsun.
Sorunun kaynağı bu olabilir.
Resume komutunun olduğu satıra CIK etiketini koy. TMR0 kesmesi son satırları olan
TMR0=0
INTCON.2=0
ENDIF
ENDIF satırından evvel GOTO CIK şeklinde bir satır eklemen gerekir.

Ete

gogoce

Hocam şu anda bu konumdayım ama hala proteusta zaman değerinin sürekli saydığını görebiliyorum
ayrıca intcon.5 sürekli 1 . 0 olmuyor


DISABLE
KESME:   
ZAMAN=ZAMAN+1
INTCON.2=0
TMR0=0
        RESUME
         ENABLE     
END   
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

ete

PORTA.4 open collector olduğunu biliyorsun değilmi.?
Ayrıca sim.dosyasını koysan bizde görebilirdik ne olup bittiğini.

Ete

gogoce

Hocam porta.4 pullup ile switche bağlı normalde 1 switch kapandığında 0 oluyor . Simulasyonu da birazdan ekleyeceğim
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

ete

Programda TMR0 kesmesi oluştuğunda Zaman=Zaman+1 yapıyor. Ancak sen zaman değişkenini bir yerlerde sıfırlamamışsın. Kontrol de etmiyorsun. Alıp başını giderse tekrardan sıfırlanmadıkça istediklerini yapmayacaktır.

PORTB pullup dirençleri aktif demişsin ama pasif etme komutu vermişsin OPTION_REG.7=0 olursa dirençler aktif olur.
Kesme içinde CIK etiketi kullanırsan hemen üzerindeki INTCON.2=0 komut satırınıda silmen gerekiyor. Yukarıda sıfırlanmış zaten.
Kusurlar bunlar başka bir şey göremedim.
Ete

gogoce

Farkedemediğim bir yerde intcon.5=1 olarak yazmışım. ben 0 yapsamda orada tekrar 1 oluyormuş. Şimdi farkettim. Teşekkür ederim hocam. Sürekli aynı işle uğraşmak körlük yaratıyormuş bunu tekrar öğrendim.
Ne ukalayı affederim nede yapılan haksızlığı ...
Ya sus adam sansınlar , yada adam gibi kouş ilham alsınlar

Powered by EzPortal