TİMER0 Kesmesi Kısmında Ana Program Komutlarının Kullanılması

Başlatan ahmet5454, 25 Mayıs 2022, 21:06:30

ahmet5454

Selamlar ustalarım Kesme etiketi altında  ana programa ait şartların oluşması durumunda  bir sayac oluşturdum ve bu sayac degerini ana programda kullandım
yazdığım kod çalışmaktadır.
Ana programa ait  komutlarının kesme etiketi altında  veya kesme etiketi altında yazılan kodun ana programda  kullanılması doğru mudur acaba? Kodun çalışması durumunda acaba problem olur mu?
Fikir verebilecek ustalarıma şimdiden teşekkürler

@ __config _INTRC_OSC_NOCLKOUT & _WDT_OFF & _MCLRE_OFF & _LVP_OFF & _CP_OFF & _BODEN_OFF
TRISA=%11111111
TRISB=0
on INTERRUPT GOTO KESME 'KESME OLUŞTUĞUNDA KESME ADLI ETİKETE GİT
OPTION_REG=%10000100    'PULLUP DİRENÇLERİ PASİF VE PRESCALER DEĞERİ(BÖLME ORANI) TMR0 İÇİN 1/32 ORANINDA SEÇİLDİ
INTCON=%10100000         'BÜTÜN KESMELER AKTİF FAKAT SADECE TMRO KESMESİ GEÇERLİ
CMCON=%111                'KOMPRATÖR PİNLERİ İPTAL EDİLDİ
TMR0=0   
ARTIR VAR BYTE
CMCON=%111  
VRCON=0
A VAR BIT
B VAR BIT
C VAR BIT
D VAR BIT
E VAR BIT
F VAR BIT

ISARET1 VAR BIT
ISARET2 VAR BIT
ISARET3 VAR BIT
ISARET4 VAR BIT
ISARET5 VAR BIT
ISARET6 VAR BIT
SAYAC VAR BYTE
 
PORTA=0
PORTB=0 
ISARET1=0
ISARET2=0
ISARET3=0
ISARET5=0
ISARET6=0
A=0
B=0
C=0
D=0
E=0
F=0





pause 2000

BASLA:



IF PORTA.0=1 AND PORTA.1=1 AND ISARET1=0 THEN      ' TEK ALARM GELMESİ
GOSUB YAK1
ELSE 
 ENDIF ' 2 DEDEKTOR  ALARM                         ' TEK ALARM GELMESİ

IF PORTA.0=0 AND PORTA.1=0  THEN 
GOSUB YAK2
ENDIF

IF PORTA.0=1 AND PORTA.1=0 AND ISARET2=0 THEN            ' TEK ALARM GELMESİ
GOSUB YAK3 
ENDIF 

IF PORTA.0=0 AND PORTA.1=1 AND ISARET3=0 THEN             'TEK ALARM GELMESİ
GOSUB YAK4
ELSE

ENDIF 



IF PORTA.0=1 AND PORTA.1=0 AND PORTB.0=1 AND PORTB.2=1 THEN   '2 ALARMDAN TEK ALARMA GEÇİŞ 1
GOSUB YAK5
ENDIF

IF PORTA.0=0 AND PORTA.1=1 AND PORTB.0=1 AND PORTB.2=1 THEN   '2 ALARMDAN TEK ALARMA GEÇİŞ 2
GOSUB YAK6
ENDIF

IF PORTA.2=0 THEN  'BUZZER KABUL
A=0
C=0
D=0
SAYAC=0

PORTB.1=0
ENDIF





IF SAYAC==1 THEN
PORTB.1=1
ENDIF

IF SAYAC==3 THEN
PORTB.1=0
SAYAC=0
ENDIF




GOTO BASLA  '-------------------------------------------------------------


YAK1:                  ' 2 ALARMIN OLMASI DURUMU
'PAUSE 50
PORTB.0=1
PORTB.2=1
ISARET1=1
A=1
RETURN

YAK2:        'RESET GİBİ ÇALIŞIYOR   2 ALARMIN OLMAMASI DURUMU

LOW PORTB.0
LOW PORTB.1
LOW PORTB.2

ISARET1=0
ISARET2=0
ISARET3=0
 A=0
 C=0
 D=0
 SAYAC=0

RETURN

YAK3:                   'TEK ALARM GELMESİ
'PAUSE 50
HIGH PORTB.0
C=1
ISARET2=1

RETURN

YAK4:

HIGH PORTB.2         ' TEK ALARM GELMESİ
D=1
ISARET3=1

RETURN

YAK5:
                      'TEK ALARMIN GİTMESİ
PORTB.2=0
ISARET1=0
ISARET2=0
ISARET3=0



RETURN
                      'TEK ALARMIN GİTMESİ
YAK6:
'PAUSE 50
PORTB.0=0
ISARET1=0 
ISARET2=0
ISARET3=0

RETURN
DISABLE                  'KESME ANINDA YENİDEN KESME OLUŞMASI ÖNLENİR

KESME:              'BURADA KESME OLUŞUYOR
IF A=1 OR C=1 OR D=1 THEN 
ARTIR=ARTIR+1
ENDIF             'BURADA HER KESMEDE ARTIR İSMİNDEKİ DEĞİŞKENİN İÇERİĞİ 1 ARTTIRILIYOR
IF ARTIR=123 THEN          '123 ADET KESME OLUŞUNCA YAKLAŞIK 1 SN OLUYOR
 SAYAC=SAYAC+1
 ARTIR=0
 ENDIF
 

                             
INTCON.2=0                  'YENİ KESME ÇALIŞABİLMESİ İÇİN TMR0 BAĞRAĞI SIFIRLANDI
RESUME                       'KESME OLUŞMADAN ÖNCEKİ BÖLÜME GERİ DÖN
ENABLE   


END

alisumer

ilk önce kısaca kesmeden bahsedeyim. program sayıcı (PC) yazdığımız komutların hafızada tutuldukları adreslerden sıra ile çağrılmasını sağlar komutları 0x00 adresten başlayıp dallanma olmazsa sıra ile arttırarak ilerler çoğu PIC de 0x04 satır donanımda kesme olduğunda gidilecek komut satırıdır kesme oluştuğunda aynı call komutu gibi önce belli bir kayıtçıya mevcut satır adresini bir artırıp yazar sonra PC ye 0x04 yazarak o satıra gider. yani kesme için ayrı bir ram bölgesi değildir bundan dolayı kesme içerisinde yazdığın komut ile ana programda yazdığın komut arasında işlevsel olarak bir fark yoktur kesme sadece bir "call" komutu gibi çalışır tek farkı donanımsal olarak tetiklenmesidir. sizin sorunuza gelirsek kesme ile ne yapmak istediğinize bağlı yazdığınız kodu okumadım ama  kesme kullanıyorsanız bu demek oluyorki ya timer ile rutin aralıklı bir şey yapacaksınız ya da beklenmedik bir şekilde ana program çalışırken bir girişin, bir özel amaçlı yazmacın değişimini algılamaya çalışacaksınız.şöyle bir öneri yapabilirim program yazmaya başlamadan önce bir akış diagramı oluşturun nelerin nasıl ve hangi sıra ile çalıştığını koşullar oluştuğunda nerellere dallanacağını  çizin program yazmanızı kolaylaştırır sonrasında hata bulmanızı ve düzeltmenizide kolaylaştırır 
Hep meraktan

ahmet5454

Çok çok teşekkürler hocam çok sagolun🖐

Powered by EzPortal