F

tmr0 kullanılarak yürüyen ışık yapımı

Başlatan ferdi0435, 28 Ekim 2011, 15:30:32

ferdi0435

iyi günler
tmr0 kesmesı kullanılarak yürüyen ışık nasıl yapılır? kodlarını yazarsanız sevinirim....

ete

Kod yazmadan sen bize lafla tarif ederek bunu madde madde yaz bende yazdıklarını koda çevireyim.
Ama özellikle Tmr0 kullanarak yapacaksın bu işi (neden illaki TMR0 acaba?)
Ben başlangıcı yapayım istersen;
- TMR0'ı 1/x bölüye göre ayarla ve TMR0=xx ön yükleme değerini ver.
- Basla satırına gel ve basla
- Kesme oluşunca.........  yap
-  ...
- ...


Ete

ferdi0435

#2
hocam aşağıdaki kodu yazdım fakat sorun veriyor ????

her 1sn de diğer led yanacak şekilde istiyorum?         


  TRISb=0
               ON INTERRUPT GoTo KESME
OPTION_REG=%00000101
INTCON=%10100000
               
TMR0=0
CMCON=7
sayac var byte
               basla: 
           if sayac=61then
                 
                              portb.1=portb<<1
                              sayac=0
                         
                  endif
                goto basla
               
           
               
               
                disable
                kesme:
               
                  sayac=sayac+1
                 
             

INTCON.2=0                         
RESUME
ENABLE
             end

ete

Kod yaz dememiştim.
Bana lazım olan adımlar şeklinde programın açıklaması bir nevi senaryosu. Kodu ben yazacağım.
Ama sen TMR0 ile bir yürüyen ışık yapacaksın. Yalnızca tarif etmen yeterli.
İstiyorsan ben açıklamayı vereyim sen kodu yaz. Yanlış anlama ben senin kod geliştirme yeteneğine katkıda bulunmak istiyorum.
Kod öyle balıklama dalınarak yazılan bir şey değildir. Önce düşünürsün. Ortada bir konu veya proje vardır. Bu projeyi nasıl gerçekleştiririm dersin ve sanki programı çalıştırıyorsun gibi adımlar halinde programı önce lafla yazarsın. Sonra o adımları koda dönüştürürsün. Senden istediğim lafla bu programı yazman.

Yularıda yazdığın kod tamamen bir cehalet örneği. Hiç yayınlanan derslere çalışmadığın belli oluyor. Eksiklerin şunlar;
Her programın bir formatı vardır. Önden hazırlanan bazı registerler vardır. Giriş çıkış pinlerinin ayarlanması vardır.
İşlemci seçimi vardır. Bir TMR0 kesmesinden bahsedildiğine göre program içinde bir de kesme olması gerekiyor. Önce Global kesmelerin aktif edilmesi ve daha sonrada hangi kesme kullanılacak ise onun aktif edilmesi gerekir.
Sen bir şeyler yazmışsın ama bence bunları bir yerlerden aynen kopyalamışsın. Üstelik bir kısmının ne işe yaradığını bilmeden bunu yapmışsın.

Bir Yürüyen ışık yapmak için önce ortaya bir şema koyulur. Program da o şemaya göre oluşturulur. Kaçtane led kullanılacak bunlar hangi pinlere bağlanacak hangi işlemci kullanılacak. Bunların hepsi şemada gösterilir.
Biraz daha çalışmalısın. Bu dediklerimi biraz düşün ve kodmu yazacaksın yoksa senaryo+ şemayı mı yapacaksın.
İKisinden birisini sen diğerini ben yapacağım. Tercih senin.

Ete


ferdi0435

#4
 


yukarıda gösterilen şemadaki yuruyen ışığı yapacağım (portb bacaklarıyla motor kontrolu yapacagım ).... porta nın ılk 5 pınıne baglı ledler her 1 snde bır sola kayacak....benım istediğim ana programın aksamasını sağlamayacak bir şekilde yürüyen ışık yapmak yani ana programdan bağımsız bir şekilde devamlı çalışşsın.....

pic 16f628a

ete

#5
Şemaya bakılırsa PortA.0 ile PortA.4  arasında bağlı olan ledleri her saniyede bir konum değiştirerek yürütmek istiyorsun.

TMR0 bu işte kullanılacak ise 8 bitlik bir sayaç olduğunu biliyorsun. Bu sayacın bölücülerinide kullanarak en fazla sağlanacak kesme gecikmesi aşağıdaki şekilde olacaktır. Burada maksimum bölme oranı olan 256 kullanılmıştır.;
256 * 256=65535 ms dir. Bunu 50 ms yeye düşürürsek bir standart değer sağlayabiliriz.  Bu durumda hesabımız;
Z * 256 =50.000(us) çıkmalıdır. Z=50.000/256 =195 bulunur. O halde her kesmede sayılacak rakam 195 olacaktır.
Bu ise TMR0 sayacına 256-195=61 değeri önden verilerek sağlanır. Sayac 61 den başlayacak 195 sayınca 256 ya ulaşacak ve kesme oluşturacaktır. Geriye bir iki hesap daha yapmak gerekiyor. 1 sn=1000 ms dir. Bizim kesmemiz en fazla 50 ms de bir oluştuğuna göre 1000/50=20 kesme sonra ancak 1 sn lik süreyi yakalamış olacağız.
O halde yapılacak iş adımlar halinde şöyle olacaktır;
1. TMR0 kesmesini aç. Option registerinden bölme oranınını 256 yap. Option_Reg=%01000111
2. INTCON registerinden INTCON=%10100000 şeklinde TMR0 kesmesini aktif et.
3. PORTA ya önce %00000001 değerini vererek PortA.0 da bağlı olan led'i yakıyoruz. Bunun için YURU isimli bir değişken kullanacağız. Başlangıçta YURU=1 ve PORTA=YURU diyerek programı açacağız.
4. Kesme kısmında bir sayaç çalıştır. Buna sayac diyelim.
5. Her kesme oluştuğunda SAYAC=SAYAC+1 diyoruz ve
    IF SAYAC=20 then
       SAYAC=0
       YURU=YURU<<1:IF YURU=32 then YURU=1 diyerek PortA.4'i geçtiğimiz zaman yenidenbirinci lede döneceğiz.
       PORTA=YURU
    endıf
    INTCON.2=0 'kesme bayrağını sıfırlayacağız.
    RESUME
    ENABLE
şeklinde kesmeden çıkacağız.

Hepsi bu kadar.
Anlaşılmayan yer olursa sorarsın.

Ete

Powered by EzPortal