RB0/INT KESMESİ HAKKINDA Özel bir durum

Başlatan umitedi, 02 Eylül 2023, 00:41:02

umitedi

Erol hocam merhaba .

16f877A ile RB=/INT yükselen kenar kesmesi yapmak istiyorum . Fakat kesme oluştuğunda yükselen kenar tekrar düşene kadar kesme esnasında bir değişkeni saydırıp ekrana yazdırmak istiyorum .

Sorum şu olacak : Yükselen kenar kesmesinde RB0=0 olana kadar iş yaptırabilir  miyim ? Ancak düşen kenar oluştuğunda kesme esnasında yaptığı işe geri dönsün tabi bu sırada yeni kesme için bayrağı sıfırlayacak vs vs ..

Cevabınız için şimdiden teşekkür ederim . (Pic Basic Dilinde )

ete

Program bir kere KESME alt programına girmiş ise orada otomatikman yeni bir kesme oluşması engellenir.
Diyelimki INT pini LOW dan HIGH konuma yükseldi ve kesme oluştu. Kesme etiketine geldin orada;
WHILE INT_PINI=1
 burada INT pini yeniden LOW oluncaya kadar while-wend arasında iş yapabilirsin yani kalabilirsin.
 Bu araya istediğin komutları bu aralığa yazabilirsin.
WEND
program bu satıra gelince INT pini yeniden LOW oldu demektir sende bayrağı sıfırlayıp kesmeden çıkarsın ve INT pini yeniden HIGH olursa yeni bir kesme oluşacaktır.
Sorduklarının cevabı anladığım kadarı ile budur.
Şunu unutma KESME etiketi içinden Ana program bölümüne GOSUB veya GOTO ile gidemezsin.
Kesme etiketine gelmek geri planda epeyce bir protokole tabidir. Kesme içine girerken önemli registerler kayıt altına alınır ve çıkışta bunlar geri yüklenir. Arada sen ana program bölümüne gidersen işler çorbaya döner register değerleri şaşar. Kısacası Kesme özel bir bölümdür oradan çıkıncaya kadar yanlızca orada komut vererek işlem yapabilirsin. Elbette LCD ye birşeyler yazdırabilirsin hesap yapabilirsin ama ana program bölümüne gidip gelemezsin.


Ete

designer.21

Ete hocam, KESME içinde ana program bölümüne gidip gelemezsin diye belirtmişsiniz. bununla ilgili daha önce başıma gelip te paylaşamadığım bir merak konusunu dile getirmek istiyorum

aşağıda eğitim amacıyla yazmış olduğum RB0/INT programında kesme içerisinde ana programa ait gecikme programını kullandım. herhangi bir sorun çıkmadı. benim bu yaptığım hatalı bir yöntem mi yoksa bu şekil gecikme programlarını kullanmakta mahsur yok mudur.

2. olarak benim yaptığım bu yöntem ile "umitedi" arkadaşımızın istediği bir programa doğru yol alabilir miyiz acaba







bu programda;
ana program portb,1 pini flaşör olarak yanıp sönerken, kesme oluştuğunda portb'nin diğer pinleri, GECIKME1 ile gerekli gecikmeyi sağlayıp 3 kere konum değiştiriyor.
LIST P=16F628A
INCLUDE "P16F628A.INC"
__CONFIG _INTRC_OSC_NOCLKOUT &_BODEN_OFF &_PWRTE_ON &_MCLRE_ON &_WDT_OFF &_LVP_OFF &_CP_OFF
CBLOCK 0X20
SAYAC1, SAYAC2
ENDC

ORG 0X00
GOTO BASLA
ORG 0X04
GOTO KESME

BASLA
	CLRF PORTB
	BSF STATUS,5			;BANK1
	MOVLW B'00000001'		;PORTB,0 GIRIS PIN'i
	MOVWF TRISB
	MOVLW B'10111111'		;DUSEN KENAR TETIKLENMESI OLARAK YARLANDI
	MOVWF OPTION_REG
	BCF STATUS,5			;BANK0
	MOVLW 0X07				;PORTA PINLERI DIJITAL GIRIS CIKIS
	MOVWF CMCON
	
	BSF INTCON,7			;TUM KESMELERE IZIN VER
	BSF INTCON,4			;RB0/INT KESMESINE IZIN VER
	BCF INTCON,1			;RB0/INT BAYRAGINI SIFIRLA
	
DONGU						; ANA PROGRAM DONGUSU
	BSF PORTB,1				; ANA PROGRAM DONGUSU
	CALL GECIKME1			; ANA PROGRAM DONGUSU
	BCF PORTB,1				; ANA PROGRAM DONGUSU
	CALL GECIKME1			; ANA PROGRAM DONGUSU
	GOTO DONGU				; ANA PROGRAM DONGUSU
	
KESME
    CALL GECIKME1           ;Arklanma gecikme suresi
	BCF INTCON,4            ;RB0/INT kesmesine izin VERME
	
	MOVLW B'11111100'       ;""""KESME PROGRAMI """""
	XORWF PORTB,F           ;""""KESME PROGRAMI """""
	CALL GECIKME1           ;""""KESME PROGRAMI """""

    MOVLW B'11111100'       ;""""KESME PROGRAMI """""
    XORWF PORTB,F           ;""""KESME PROGRAMI """""
	CALL GECIKME1           ;""""KESME PROGRAMI """""

    MOVLW B'11111100'       ;""""KESME PROGRAMI """""
	XORWF PORTB,F           ;""""KESME PROGRAMI """""
	CALL GECIKME1           ;""""KESME PROGRAMI """""
	
	BCF INTCON,1           ;RBO/INT kesme bayragini sifirladik
	BSF INTCON,4           ;RB0/INT kesmesine izin ver
	RETFIE
	
	
GECIKME1                    ;GECIKME PROGRAMI
	MOVLW 0XFF
	MOVWF SAYAC1
GECIKME2
	MOVLW 0XFF
	MOVWF SAYAC2
GECIKME3
	DECFSZ SAYAC2,F
	GOTO GECIKME3
	DECFSZ SAYAC1,F
	GOTO GECIKME2
	RETURN
	END


*programın herhangi bir amacı yok sadece eğitim amaçlıdır.

mehmet

#3
Yükselen de tanımlanan OPTION_REG.6,
INT kesmesine girince sıfıra çekilerek
düşende kesme oluşması sağlanır.

Yine aynı kesme içerisinde yükseleni ve
düşeni ayırt edecek if bloğu olur.

if bloğu yükselen durumunda; sayac başlatılır,
düşen if bloğu içinde de sayac başka bir
değişkene aktarılıp sıfırlanır.

Aktarılan bu değişken değeri, ana döngüde
ekrana yazdırılır.

Düşük devir okumak için kullanılabilir.
Olan olmuştur,
olacak olan da olmuştur.
Olacak bir şey yoktur.
http://www.mehmetbilgi.net.tr
CC BY

Powered by EzPortal