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