Hızlı Çalıştırma ve Durdurma Sorunu

Başlatan ahmet5454, 22 Ekim 2017, 22:56:14

ahmet5454

Selam arkadaşlar bir program yazdım
.Fakat sorun yaşıyorum.Yazmış olduğum programda stop komutlarını hızlı bir şekilde nasıl aktif hale getirebilirim.
aslında araştırdım kesmelerle yapılıyor galiba fakat kesme konusu biraz karısık tam olarak anlayamadım.Eger hızlı bir şekilde durdurmam için kesme kullanmam gerekirse hangi kesme komutunu kullanmaliyım.Yardımcı olabilecek arkadaşlara şimdiden teşekkürler

@ __CONFIG _CONFIG1, _HS_OSC & _WDT_OFF & _LVP_OFF & _CP_OFF & _PWRTE_ON 
@ __CONFIG _CONFIG2, _BOR40V & _WRT_OFF
    TRISB  = %00000000      ' PORTB'nin tüm pinleri çıkış
    TRISA  = %00011111      ' PORTA'nın RA4 ve RA5 hariç tamamı çıkış
    TRISC  = %00000000      ' PORTC tamamı çıkış
    ANSEL = 0               ' PORTA ve PORTE tümü dijital giriş
    ANSELH = 0
porta=0
portb=0
basla:
    if porta.0=1 and portb.2=0 then motor 'porta.0 start butonu
    IF porta.1=1 THEN d  'stop butonu
    if porta.2=1 and portb.5=0 then motor1'porta.2 start butonu
    IF porta.3=1 then du 'stop butonu
    goto basla
motor:
    portb.0=1:portb.1=1
    pause 30000 'normalde 5 sn fakat 5 sn olarak çalışmıyor
    portb.1=0:portb.2=1
    GOSUB BASLA
d: 
portb.0=0:portb.1=0:portb.2=0
    gosub basla
motor1:
    portb.3=1:portb.4=1
    pause 30000'normalde 5 sn fakat 5 sn olarak çalışmıyor
    portb.4=0
    portb.5=1
    gosub basla
du:   
    portb.3=0:portb.4=0:portb.5=0
      GOSUB BASLA
      END   

   
   
KODLARINIZI KOD EKLE # TAG'INI KULLANARAK EKLEYINIZ !!!!

ete

Bir tuşa basılıp basılmadığını kontrol etmenin iki yolu vardır.
Birincisi sürekli o tusa bakmaktır. Ama sürekli bir tusa ;
IF TUS=0 THEN GIT_SUNU_YAP  demekle yapılacak başka işleride aksatmış olursun.
Çünki işlemci çok hızlı çalışır ve bazı algılama işlerinide sende olduğu gibi hızlı yapmalıdır.
Başka işlere bakmaya gidip orada vakşt kaybederse ve bu esnada o tusa basılmış olursa geri gelip o tusa bakmadan basıldığını anlayamayacaktır.

İkincisi ise kesme kullanmaktır. Kesme sistemi işlemciye yazılan programın gerisinde ve programdan bağımsız çalışır. Yani senin programın ne yaparsa yapsın kesme işi sürekli işlemci tarafından kontrol edilir tabiiki kesme aktif edilmiş ise. Bu şuna benzer kapıya biri gelece sende onu bekliyorsun. Birinci yöntemde sen işini bırakıp sürekli kapıya gidip gözetleme deliğinden bakıp biri gelmişmi diye bakman gerekir. Buda evdeki işini gücünü bırakıp sürekli kapıya gidip bakmanı gerektirir. İkinci yöntemde ise sen sürekli işlerini yaparsın ve kapı zili çalınca biri geldi deyip sadece ve sadece beklediğin kişi geldiğinde kapıya gidip bakarsın. Kesme öyle bir şeydir ve bu gibi durumlarda faydası tartışılmaz olur.

İşlemciler yapan insanlar düşünmüşler ve demişlerki bu işlemciye buton-anahtar-sensör vs bağlanacak mutlaka. Bu nedenle portun birini bu işe uygun hale getirelimki kullanıcılar yararlansın demişler ve B portunu (bütün Pic işlemcilerinde aynıdır) bu işe adamışlar. Peki ne yapmışlar ekstra özellik katmak için. En başta PortB pinlerine dahili pullup direnci eklemişler aktif ettiğin zaman giriş olan pinler otomatik HIGH da bekler bu pullup direncinden dolayı ve ekstra direnç bağlamazsın. PortB pinlerinin bazılarını yada kimi işlemcide tamamını Kesme ye bağlamışlar. En çok kullanılan pin ise PORTB.0 dır ve genelde INT kesmesi olarak adlandırılır.
Kesme INTCON registeri ile aktif hale getirilir.
INTCON.7= Global kesme bitidir. Bu genel anlamda bütün kesmelerin bir ucunu aktif eder. Ama ilgili kesmeyi aktif edebilmen için o kesmeye özel bit'ide aktif etmen gerekir. Kısaca INTCON.7 biti programda herhangi bir kesmenin kullanılacağını anlatır.
INTCON.6= Perhiperal denilen yan ünite kesmelerini akti eder. Timer-1 kesmesi USART kesmesi , Eprom kesme vs gibi kesmeleri de bu genel anlamda aktif eder.
INTCON.5= TMR0 kesmesini açar.
INTCON.4=PORTB.0 kesmesini açar.
Sana lazım olan PortB.0 kesmesidir. Her bir kesmenin çalışabilmesi için bir kesme bayrağına ihtiyaç vardır. Sistem kesme oluştuğunu buradan anlar. Kısaca PORTB.0 da bağlı bir tuşa basıldığı zaman geri plandaki sistem o kesmenin Bayrağı olan PORTB.2 bitini SET eder. Böylece sistem hemen kesme alt programına atlar. Böylece orada artık sana düşen tuşa basılınca ne yapacaksan onu yaparsın ve kesmeden çıkmadan önce o kesme bayrağını reset edersin. Aksi halde sistem yeniden hemen kesmeye gelir bayrak set olarak beklediği için.
Sonuçta yapman gereken ve bana göre yanlış yaptığın PORTA pinerini giriş olarak kullanmak yerine aynı girişleri PORTB pinlerine bağlaman, Pullup açman ve PORTB.0 pinine bağlamış olduğun DUR butonu içinde kesme aktif etmen olacaktır.
Adım adım veriyorum şimdi;
1.TRISB=%00011111 tabiiki burada PORTA pinlerini çıkış yapacaksın.
2.INTCON=%10010000 vererek kesmeleri aktif edip PORTB.0 kesmesinide aktif hale getirmiş olacaksın.
3.OPTION_REG.7=0 vererek pullap dirençlerini aktif edeceksin. İŞlemcin belli değil genelde bu komut ile açılır ama yeni nesillerde WPU registeride kullanılabiliryor ona dikkat et.
4. TUş tanımlamalarını yeni porta göre yeniden yap.
5. ON INTERRUPT GOTO KESME komut satırını ekle programa (BASLA satırından bir evvele koyabilirsin)
..
DISABLE
KESME:
        ...
.......
Burada DUR tusuna basılınca  motru durduran komutları yazacaksın.
INTCON.2=0  bayrağı sıfırlayıp çıkıyorsun artık
RESUME
ENABLE
şeklinde bu komutlarıda ekledinmi kesmen çalışır artık.
D: isimli etiket altında pinleri sıfırlayıp onun altınada GOSUN BASLA yazmışsın. Bu büyük bir hata elbette.
Başlangıç satırına hiç bir zaman GOSUB ile gidilmez.
GOSUB komutu programı bir etikete gönderip tekrar ayrıldığı yere otomatik dönmesi için kullanılır. Gittiği yerde mutlaka RETURN komutu olmalıdır. Program bunu görür ve GOSUB ile ayrıldığı yerin bir sonraki komutuna geri döner. Program GOSUB komutunu görünce ayrıldığı adresi STACK isimli ara hafızaya yazar. Gittiği yerde işini bitirip RETURN görünce o yazdığı adresi tekrar geri alıp +1 ekleyerek bir sonraki adrese geri döner.
Ama bir yere GOSUB ile gidip GOTO ile dönerseniz o adres Stack da kalır ve bir sonraki Gosub da bir başka adres de Stack'e kayıt edilerek geri alınmayan adresler nedeni ile stack bir noktada şişer ve dolar programda bu noktadan sonra artık çalışamaz hale gelir. Temel prensip Gosub ile gidilen yerden mutlaka RETURN ile dönülmesidir.  BAsla satırından sonraki komutlarda GOSUB D deyip oradan RETURN ile dönmeniz daha uygun olurdu. Bu şekilde ters olmuş ve programı kilitleyecek nitelikte gözüküyor.

GOTO ise koşulsuz olarak programı bir yere gönderirsin demektir. Oradan bir başka yere GOTO ile gider ama Program bu işlem esnasında RETURN görürse şaşırır. Bunlara dikkat etmek gerekir aksi taktirde programınız kitlenir.
Bütün bunların geniş açıklamaları ve örnekler Basic derleri altında ders ders işlenmiştir bakmanızı tavsiye ederim.

Ete

ahmet5454

Ilgi ve alakaniz icin cok tesekkurler hocam cok sagolun varolun.

Powered by EzPortal