Bayrak (flag) nedir ne amaçla kullanılır?

Başlatan . Kağan, 26 Ocak 2014, 16:54:32

. Kağan

Bayrak (flag) nedir ne amaçla kullanılır? Basit ve çalışabilecek bir kod yazarak örnek verebilirmisiniz.

Teşekkürler.

F®T

röle gibi düşünün.röle çekik yada bırakık.1 yada 0 durumu.

B      var     bit

BB    var      byte

   B = 0   
         
mainloop:

  IF BB=13 THEN

B=1    'BURDA BU BAYRAK OLARAK KULLANILIYOR.YANİ BUNU RÖLE OLARAK DÜŞÜN RÖLEYİ ÇEKTİRİYORSUN.
          'KURDUKTAN SONRA İSTEDİĞİN YERDE ŞART OLARAK KULLANIRSIN.
ENDIF

IF BB=9 THEN

B=0   'BURDADA BAYRAĞI SIFIRLIYORSUN.YANİ RÖLEYİ BIRAKTIRIYORSUN.

ENDIF
         
        Goto mainloop 
"Hakk" şerleri hayr eyler Zannetme ki gayr eyler Ârif anı seyreyler Mevlâ görelim neyler Neylerse güzel eyler.

Hattuşa

slm ete hocamın kesme dersindeki saat uygulamasında;

KESME:
      SAYAC=SAYAC+1  'kesme sayacı  1 sn= 61(sayac) x 256 (Tmr0) x 64 (bölme)
      IF SAYAC=61 then  '61 adet kesme olunca 1 sn. süre geçiyor.(999424 us)
         SAYAC=0        'sayaç sıfırlanıyor
         SN[0]=SN[0]+1
         IF ROLE=0 then ATLA
         SN[ROLE]=SN[ROLE]+1        'saniye değeri bir artırılıyor
         
         
         
ATLA:    IF SN[0]=60 THEN  'saniye 60 olmuş ise 1 dakika süre geçti ohalde
               SN[0]=0
               SN[ROLE]=0        ' saniye sıfırlanıyor
               DAK[0]=DAK[0]+1
               DAK[ROLE]=DAK[ROLE]+1   ' dakika değeri bir artırılıyor
                  IF DAK[0]=60 then   'dakika 60 olmuş ise 1 saat süre geçti
                     DAK[0]=0
                    DAK[ROLE]=0         ' dakika sıfırlanıyor
                     SAAT[0]=SAAT[0]+1
                     SAAT[ROLE]=SAAT[ROLE]+1   ' saat değeri bir artırılıyor
                        IF SAAT[0]=24 THEN  'saat 24 olmuş ise 1 gün geçti
                           SAAT[0]=0
                           SAAT[ROLE]=0        'saat sıfırlanıyor
                           GUN=GUN+1     'gün değeri bir artırılıyor
                              IF GUN=365 THEN GUN=0  'gün 365 olmuş ise
                        endif                    'gün sıfırlanıyor 1 yıl geçti
                  ENDIF
            ENDIF
         ENDIF
         INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
         RESUME
         ENABLE


burda INTCON ayarının 2. biti TMR kesmesinin bayrağı, yani TMR kesmesi oluşunca INTCON.2 1 oluyor ve sen bunu 0 larsan tekrar TMR kesmesinin oluşmasına izin vermiş oluyorsun

ete

İşlemcilerin pek çoğu bit bazında çalışan Flag 'lar ile çalışır. Bu bir yerde bir iş gerçekleştiğinde bir değişikeni set etmek gibi bir şeydir. Adına bayrak demişler çünki kalabalığın arasında birini ararken biri bayrak kaldırırsa onu çabucak bulmak gibi bir şeydir.
Tabiiki set edilecek değişken bit bazında olunca işlemci pek çok hafızadan tasarruf eder. Ama bazenbit değil byte bazında da bayrak kullanabiliriz.  Yer gelirse onuda örneklerim. Bayrak konusunda Örnek aramaya gerek yok karşında bir sürü duruyor zaten. En basitleri kesme işlemlerinde görülür.
Bir Timer0 kesmesinde 8 bitlik sayaç olarak çalışan TMR0 sürekli artarak ilerler. değeri 255 den sonra rtmaya devam edince tekrar sıfıra döner ama bu arada kesme bayrağı kalkar (set edilir) al san örnek işte. İşlemcide bu bayrağa bakarak programı kesme kısmına aktarır.

Benzer şekilde PortB.0 kesmesinde şayet PortB.0 pini konum değiştirirse otomatikman B0 kesme bayrağı set edilir ve işlemcide ona bakarak programı kesme kısmına aktarır.

Bunlar işlemcilerin kullandıkları bayrak örnekleri idi. Şimdi zaman zaman bizimde bayrak kullanmamız gerekir. Bunada örnek vereyim.
RS232 den veri alan bir sistemimiz olsun. Veri gelip gelmediğini bayrak yardımı ile anlayabiliriz.
Veri alma kısmında HSERIN komutlarından sonra ALDI=1 şeklinde bir bayrak kullanırsak yalnızca veri geldiğinde bu bayrak set edilmiş olur.
Ana program kısmında ise,
IF ALDI=1 and GELENVERI=100 THEN
  TOGGLE PORTA.0
   ALDI=0 'bayrağı işimiz bitince sıfırlıyoruz ki yeniden kullanabilelim
ENDIF
şeklindebir komut dizilimi ile bayraktan faydalanıyoruz. Unutma bayrak bir işaret elemanıdır bir göstergeçtir. İşlem görmesi için işin bitince onu sıfırlaman gerekir. İşte gerek işlemci kendi uygulamalarında kesmelerden çıkarkenbayrağı sıfırlayıp çıkma nedenimiz budur. Yukarıdaki örnekte de bayraktan yeniden yararlanmak için işimiz bitince onu sıfırladığımızı görebilirsin.

Bazen byte cinsinden bayrak kullanmamız gerekir demiştim.
bir programda 3 veya 4 alternatifli bir işlemde alternatifleri sıraya koyup,
IF portA.0=1 then POZ=1
IF PORTA.1=1 then POZ=2
IF PORTA.3=1 then POZ=3
şeklinde POZ değişkenimizi bayrak olarak kullanıp alternatiflere göre bayrağı set edebilmek için byte değişkeni kullanırız.
Bunun sebebi tabiiki alternatifin 2 den fazla olmasıdır. 2 alternatifte daima bit (1-0) bazında bayrak kullanmak en doğrusudur.

Söyleyeceklerim bu kadar umarım konu anlaşılmıştır.

Ete


. Kağan

Merhaba arkadaşlar,

Pro-Tr nin verdiği ETE hocanın yazdığı kodun sonunda

"INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor"

Şeklinde bir satır var. Burada INTCON.2 neyi ifade ediyor. Verdiğim satır niçin kullanılıyor.

Birde, internette incelediğimde FLAG.1, Flag.2, flag.3 şeklinde ifadeler geçiyor ve bu ifadelerde de örneğin Flag.2=0 yada Flag.2=1 şeklinde ifadeler geçiyor. Bunlardaki Flag.2 ifadesi ile INTCON.2 ifadesi aynı şeyimi tanımlıyor. Burada tanımlanan nedir? 

ete

#5
Data sheet'i açıp INTCON registerini bulup onun 2. bitine bakıp hangi amaçla kullanılıyor diye bakmak aklına gelse bu soruları sorma gereğini bile bulmazdın. Zira açıklamalarımda belirtmiştim. Program kesme' içine kesme bayrağı kalktığı (set edildiği için girer) diye. Ayrıca kesmeden çıkmadan önce de bu kalkmış bayrağı indirmek (yani sıfırlamak) gerektiğinide belirtmiştim. Aksi halde program sürekli kesmeye girmeye çalışır. Şimdi sorduğun soru kesme sonundaki kesme bayrağının sıfırlanması meselesi ile ilgili ve sen neden bu komut kullanılıyor diye soruyorsun. Ya yazdıklarımı okumuyorsun yada okuduğunu anlamıyorsun.!!!!
Kesme bayrağı neden sıfırlanır ????? Yine kalabalık örneğini vereceğim.
Kalabalık içinde bayrak kaldıranı bul dedğim zaman kalkmış bayrağı hemen görürsün ve adamı bulursun. Peki bulduktan sonra o bayrağı indirmez isen iki dakika sonra yine aynı adamı bulmak zorunda kalırsın çünki emir kalkmış bayrağı bul şeklindedir. Bayrak inerse bir kere bulursun bir müddet sonra başka bir sebepten dolayı bayrak yine kalkarsa o zaman yine bulursun aksi halde bayrak inmemiş ise adamı sürekli bulmak zorunda kalırsın. İşte işin bitince (kesmenin sonuna gelmiş isen) bayrağı indirmen gerekirki yanlış alarm olmasın ve program yeniden aynı sebeple kesmeye girmesin.

Yukarıdaki açıklamalarımı yaparken sürekli olarak bayrak tabirini kullandım. İnternette gördüğün işde de benzer şekilde bir şeyi açıklamak için Flag-1 , Flag-2 diye ayırım yapılmış olabilir. Gördüğün yeri ve şekli açıklamaz isen açıklamasını nasıl yapabilirimiki ancak burada yaptığım gibi genelleme yapabilirm. İşlemcilerde donanım olarak Flag diye adlandırılmış  bir register tanımıyorum. O halde olsa olsa bir programda yazan kişinin tanımladığı kendi bayrak değişkenleridir. Bende zaman zaman yaparım bunu.
Bir programda hem TMR0 kesmesi, Hem PortB.0 kesmesi hem TMR1 kesmesi kullanıyorsam bunların bayraklarına Bayrak-0, Bayrak-1 , Bayrak-2 gibi isimler verebilirim. O açıklamada benzer bir işi çağrıştırıyor bana.

Ete

Powered by EzPortal