for-next döngüsü

Başlatan turkbowling, 27 Ocak 2006, 15:17:10

turkbowling

for-next döngüsünü ögrenmeye çalışıyorum internetde basit sadece for-next için yapılmış bir örnek bulamadım digerlerindende bir şey anlamadım

anladıgım kadarıyla yapmaya çalıştım eksigim ne acaba

DEVICE 16F877                      ;ENTEGRE TANIMLAMA
XTAL 4                                 ;KRISTAL FREKANSI 
           
TRISB=0
PORTB=0
k VAR BYTE                          ;k YI DEGISKEN OLARAK TANIMLA 
            
BASLA:
For k=2 TO 100 step 2          ;2 den başlayayrak 2 şer 2 şer 100' e kadar 
                                          ;say sonra devam et
Next
 HIGH LED                           ;led'i yak

END

teşekkürler


mod notu: Sanırım böyle daha güzel görünüyor arkadaşlar.Bu şekle # ikonunu kullanarak getirdim.X

ftsahin

Led'i Portb'nin 0 nolu ucuna bağla ve Basla'dan sonraki kısma şunu yaz:

BASLA:
FOR K=1 TO 10
PORTB.0=1
PAUSE 250
PORTB.0=0
PAUSE 250
NEXT K

GOTO BASLA


Bu kod Led'i 10 defa yakıp söndürür. K değişkenini 10'a kadar saydırmamızın sebebi budur. Dikkat edersen döngü içerisinde K'yı kullanmadık. Yani K'nın içeriği önemli değil. Bu durumda K'nın başlangıç ve bitiş değerleri önemli değil kaç defa  saydığı önemli.
FOR K= 100 TO 110 yazsaydık ta aynı sonucu verecekti.
Döngü değişkenini döngü içerisinde kullanmak istersek   o zaman başlangıç ve bitiş değerleri önemlidir. Mesela LCD ekranda tüm karakterlerin 1 sn arayla geçmesini istiyoruz.
1'den başlayarak 255'e kadar sayan bir döngü kurarız. LCD'ye hem döngü değişkenini hem de içeriğini göndeririz.

FOR K=1 TO 255
LCDOUT $FE,2,#K,"=",K,"         "
PAUSE 500
NEXT K


Başarılar.

turkbowling

teşekkürler

vaktiniz varsa timer kullanılmasıyla ilgili  küçük bir örnek verebilirmisiniz

OG

Proteus'daki bütün ledler düzgün çalışmıyor.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ftsahin

Pic Basic Pro' da timer içeriğini okuyup bir değişkene atan komuta rastlamadım. Bildiğim kadarıyla timer maximum değerine ulaşınca bir interrupt oluşuyor ve bu interrupt sonucu istediğiniz şeyi yapıyorsunuz. Timer'ın içeriğini bir değişkene atayan komut Pic Basic Plus'ta var. PbPro'da timer kullanımı daha iyi bilen arkadaşlar var belki onlar yardımcı olurlar.

seco06

picte timer için en güzel örnek TMR0 KESMESİ dir.
ilkönce senin neye ihtiyacin var onu bilelim,

TMR0 KESMESİ :

Ram belleğin 01 adresinde bulunan özel bir yazmaçdır.  Genellikle adı üstünde zamanlayıcı   olarak kullanılır. 8 bitlik bir sayıcıdır. Yazılabilir okunabilir. Programlanabilen bir özel bölücüsü (prescaler) vardır. Harici veya dahili clock palsları ile sayım yapabilir. Sayma yönü daima artan yöndedir.
Bu sayıcı veya zamanlayıcı 255 değerini aştığı zaman değeri tekrar sıfır olur ve bu anda bir kesme oluşturulabilir.  Bu sayıcının diğer önemli bir özelliği ise arka planda yani ana programdan bağımsız çalışmasıdır. Ana program çalışırken veya kesme oluştuğu andan itibaren saymasına devam eder.

OPTION Yazmacının ilk üç biti frekans bölme (prescaler) ayarlaması için kullanılır. Bu üç bitin aldığı değerlere göre bölücünün aldığı değerler aşağıda gösterilmiştir. Bu bölücü aynı zamanda WDT içinde kullanıldığından tabloda WDT için bölücü değerleride gösterilmiştir.


Bitler   TMR0   WDT
000   1/2   1/1
001   1/4   1/2
010   1/8   1/4
011   1/16   1/8
100   1/32   1/16
101   1/64   1/32
110   1/128   1/64
111   1/256   1/128

Tablodan da anlaşılacağı üzere  sinyal kaynağından gelen palsların TM0 sayıcısını 1/1 yani direkt saydıracağı bir konum mevcut değildir. Özellikle dışarıdan bir sinyal kaynağından gelen palsların sayılmasında lazım olacak olan bu husus için OPTION yazmacının 3. biti 1 (bir) yapılarak frekans bölme işlemi WDT için yapılır. Bu bir nevi aldatmadır. Bölme WDT için yapılınca Frekans bölücü TM0 için Bay-Pass edilmiş yani atlanmış olur. Dolayısıyla gelen sinyaller 1/1 olarak Timer0 tarafından sayılır. Bunu yapacağımız örnekte göreceğiz.

TM0 sayısının kullanılması için bazı parametrelerin önceden ayarlanması gerekiyor. Bunlar sırası ile;
1.   Sayıcının sayabilmesi için gerekli olan clock sinyalinin kaynağı ne olacaktır?. Bu kaynak dahili osilatör olabileceği gibi standart olarak PortA.4 /TOCKI bacağı kullanılarak dışarıdan bir sinyal kaynağı ile beslenebilir. Bu seçim OPTION yazmacının 5. biti olan TOCS biti ile yapılır.
TOCS biti = 0 ise sinyal kaynağı dahili osilatör dür.
TOCS biti = 1 ise sinyal kaynağı PortA.4 pinin den giren harici sinyal kaynağıdır.

2.   Harici sinyal kaynağı seçilir ise, sayacın düşen kenarda mı yoksa yükselen kenarda mı sayma işini yapacağı OPTION yazmacının 4. biti olan TOSE biti ile ayarlanır.
TOSE Biti = 0 ise düşen kenarda sayma
TOSE Biti = 1 ise Yükselen kenarda sayma yapılır.

3.   Frekans bölme işlemi TMR0 için mi yoksa WDT için mi geçerli olacaktır? Bunu seçmek için OPTION yazmacının 3. biti olan PSA biti kullanılır.
PSA Biti = 0 ise Frekans Bölme TMR0 için geçerli,
PSA Biti = 1 ise Frekans Bölme WDT için geçerli olur.

4.   Son olarak da Frekans bölme kullanılacak ise değeri ayarlanır. Bunun içinde OPTION yazmacının ilk 3 bitinin kullanıldığını söylemiştik. Tabloda verdiğimiz değerlerden biri seçilerek OPTION yazmacına yazılır.

5.   Programın baş kısmına ON INTERRUPT GOTO KESME komutu verilerek kesme oluştuğunda programın gideceği yer (KESME) belirlenir.

6.   INTCON yazmacının 5. biti bu kesme için ayrılmıştır. Bu bit 1 yapılarak kesme aktif edilir.  

7.   Kesme bölümüne başlarken DISABLE komutu verilerek kesme anında yeniden kesme oluşumuna imkan verilmeyecek.

8.   Kesme bölümünde INTCON.2=0 komutu verilerek kesmeden dolayı 1 olan bayrak tekrar sıfırlanır ve sonradan yeni kesme oluşmasına imkan tanınır.

9.   Kesme bölümünün sonunda RESUME komutu verilerek programın kesme oluşmasından önceki yerine dönmesi sağlanır.

10.   En sona ENABLE komutu yazılarak kesmeden dönüldükten sonra tüm kesmeler aktif hale getirilir.
k1saca bu .

seco06

Dahili veya harici osilatör kullanılması durumunda, frekans değerinin Pic'e bağlı kristal değerinin dörtte biri olacağını bilmeniz gerekiyor. Diyelimki Pic 4 MHz lik bir kristal ile çalışıyor. O halde  TMR0 için kullanılacak sinyal kaynağı 1 MHz frekansa sahip olacaktır.

Dahili osilatör ve Frekans bölücü pek çok uygulamalarda kullanılır. Özellikle hassas zamanlama işlerinde önemli bir kullanım alanı vardır. Bunların başında Pic'in bir saat olarak kullanılması gelir. Dahili veya harici ösilatör ve frekans bölücü kullanılarak pic'in her bir saniyede bir kesme oluşturmasını sağlayabiliriz. Şayet bu zamanı hassas bir şekilde ayarlayabilir isek doğru çalışan bir saat yapabiliriz.

Şimdi bunu bir örnek ile açıklayalım. Yapacağımız örnek de  4 MHz de çalışan bir 16F628 kullanacağız. Dahili sinyal kaynağını kullanarak gelen sinyali 64'e böleceğiz. Bu durumda pic, TMR0' ile 0 dan başlayıp 255'e kadar sayıp kesme oluşturabilmesi için ;
1 us x 64 x 256 = 16384 us süre kullanacaktır. 1 sn = 1000 ms ve oda  1000.000 us ye eşit olduğundan şayet 1.000.000 us değerini 16384'e bölersek  61 değerini buluruz.
O halde her kesme oluştuğunda bir başka değişkeni saydırır ve bunun değeri 61 den 62 ye geçtiği anda değerini sıfırlayıp saniye değerini bir artırırsak bir saniyelik saat palslarını yakalamış oluruz. Bunu bir programda kullanarak da saat yapabiliriz.

'****************************************************************
'*  Name    : KESMETMR0.BAS                                    *
'*  Author  : [Erol Tahir Erdal]                                   *
'*  Notice  : Copyright (c) 2005 [ETE]                             *
'*          : All Rights Reserved                                  *
'*  Date    : 23.04.2005                                           *
'*  Version : 1.0                                                  *
'*  Notes   :                                                      *
'*          :                                                      *
'****************************************************************
PORTA=0:portb=0
TRISB=%00000000   'PortB tamamı çıkış yapıldı.
TRISA=%00000000   'A portu tamamı çıkış yapıldı.
'-----------------------------------------------------------------
@ DEVICE pic16F628                              'işlemci 16F628                                
@ DEVICE pic16F628, WDT_OFF              'Watch Dog timer kapalı
@ DEVICE pic16F628, PWRT_ON             'Power on timer açık
@ DEVICE pic16F628, PROTECT_OFF     'Kod Koruma kapalı
@ DEVICE pic16F628, MCLR_off               'MCLR pini kullanılıyor.
@ DEVICE pic16F628, INTRC_OSC_NOCLKOUT  'Dahili osilatör kullanılacak
'-----------------------------------------------------------------
DEFINE LCD_DREG   PORTB   'LCD data bacakları hangi porta bağlı?
DEFINE LCD_DBIT      4      'LCD data bacakları hangi bitten başlıyor?
DEFINE LCD_EREG   PORTB   'LCD Enable Bacağı Hangi Porta bağlı?
DEFINE LCD_EBIT      3      'LCD Enable Bacağı Hangi bite bağlı ?
define LCD RWREG         PORTB      'LCD R/W Bacağı Hangi Porta bağlı?
define LCD_RWBIT       2             'LCD R/W Bacağı Hangi bite bağlı ?
DEFINE LCD_RSREG   PORTB   'LCD RS Bacağı Hangi Porta bağlı ?
DEFINE LCD_RSBIT   1      'LCD RS bacağı Hangi Bite bağlı  ?
DEFINE LCD_BITS      4      'LCD 4 bit mi yoksa 8 bit olarak bağlı?
DEFINE LCD_LINES   2      'LCD Kaç sıra yazabiliyor
'-------------------------------------------------------------------------
ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101       'Pull up dirençleri İPTAL- Bölme oranı 1/64.
INTCON=%10100000         'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0
CMCON=7             '16F628 de komparatör pinleri iptal hepsi giriş çıkış
'----------------------------------------------------------------------------
SAYAC   VAR   BYTE
SN          VAR   BYTE
DAK        VAR   BYTE
SAAT     VAR   BYTE
GUN       VAR   BYTE
'-----------------------------------------------------------------------------
CLEAR  'tüm değişkenler sıfırlandı
PAUSE 200
LCDOUT $FE,1
LOW PORTB.2  Â‘LCD -R/W bacağı LOW'a çekildi.

'-----------------------------------------------------------------------------
BASLA:
LCDOUT $FE,$84,DEC2 SAAT,":",DEC2 DAK,":",DEC2 SN
GOTO BASLA

DISABLE
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=SN+1              'saniye değeri bir artırılıyor
           IF SN=60 THEN        'saniye 60 olmuş ise 1 dakika süre geçti o halde
              SN=0              ' saniye sıfırlanıyor
              DAK=DAK+1         ' dakika değeri bir artırılıyor
                 IF DAK=60 THEN   'dakika 60 olmuş ise 1 saat süre geçti
                    DAK=0               ' dakika sıfırlanıyor
                    SAAT=SAAT+1   ' saat değeri bir artırılıyor
                       IF SAAT=24 THEN  'saat 24 olmuş ise 1 gün geçti
                          SAAT=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
       
END
‘-----------------------------------------------------------------------------------

evet ete arkadasimiz bunu çok iyi açiklamis