Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

led'li aktif göstergesi...?

Başlatan mustafa_cmbz, 19 Kasım 2007, 00:03:23

mustafa_cmbz

arkadaşlar for & next ile belirli bir zaman gecikmesi sağladım fakat bunun yanında benim çok uğraşıp yapamadığım bir özellik eklemek istiyorum bir türlü çözümü bulamadım...çünki daha kesmeleri öğrenemedim benim yapamya çalıştığım örnek üzerinde kesme ile bir led'i  1 sn de bir yakıp söndürmek istiyorum fakat bunu yaparken diğer for-next'li program çalışmasını sürdürecek...

not:  devrede azaman1 - azaman2 diye gitmekte ve her etikette değerler değişmekte.fakat ledin yanıp sönme süresi sabit kalacak fakat azaman etiketlerine geldiğinde başlamalı...bu arada  etiketleri butonlar ile seçiyorum...




AZAMAN1:

 For I=0 to 10 
pause 59000 
next 
HIGH RELAY 
PAUSE 50000
[/color]

kurudğum döngü bu şekilde...for-next sayarken aynı anda led yanıp-sönecek fakat nasıl ?

ErsinErce

Symbol Led PortB.1

Led = I.0

ve ya

if I.0 = 1 then high led
if I.0 = 0 then low led

gecikme süresinide for da kullandığın I nin 0. biti 1. biti gibi değiştirip yanıp sönme hızını değiştirebilirsin

ete

Öncelikle Basic de kesme çalıştırılırken Pause yada Pauseus komutlarına dikkat etmek gerekir. Basic de genel kaide şudur. Bir kesme oluştuğu zaman o anda yürütülen basic komutunun bitmesi beklenir. Şimdi programa ;
pause 5900   şeklinde bir komut yazarsan ve tam bu komut icra edilirken kesme oluşursa 5900 ms yani yaklaşık 6 sn bekledikten sonra kesme etiketine gidilir. Buda senin led'in flash yapma süresini fazlası ile etkileyecektir. Bu hususu göz önüne alarak; Kesme kullanılan programlarda kullanılan gecikmelerin 5 us den daha fazla olmamasına dikkat etmek gerekir. En büyük gecikme 5 us olacağına göre daha uzun gecikmeleri nasıl sağlayacağız.? Bunun için yine döngü kullanmak gerekecek.
Kısaca 1 sn lik bir gecikme için;
For X=1 to 200
Pauseus 5
next
komutları bize 200 x 5 = 1000 ms (hatta program komutlarınıda hesaba katarsanız 1200 us) lik bir gecikme sağlayacaktır. Böylece kesme oluşursa her 5 us de bir kesme kısmına gitme imkanınız olacaktır.
Bir de gecikme komutlarının değerleri konusunda biraz bilgi vereyim. Belki bilmeyen vardır.
1 sn= 1000 ms = 1.000.000 us. dir.

Senin yapmak istediğin programda TMR0 kesmesi kullanılması gerekir.
Her 1 saniyede bir led yanıp söneceğine göre senin her 1000 ms de bir kesme oluşturman lazım gelir. Ancak TMR0 8 bitlik bir sayıcı olduğundan ve 4 MHz de her komut süresinin 1 us olduğu göz önüne alınırsa hiç bir şekilde TMR0 ile bu süreyi yakalayamazsın. Ufak bir hesap yaparsak;
Bölücü yü 1/256 olarak ayarlarsan 1 us x 256 x 256=65.535 us de bir kesme yaratabilirsin. Bu durumda 1000000/65535= 15 kesmede bir led'i toggle yaparsan yaklaşık 1 sn de bir ledi yakıp söndürmüş olacaksın demektir.
Yada bölücü oranını 128 olarak kullanır isen;
128 x 256 = 32768 us ve buda yaklaşık 35 kesmede bir 1 sn lik süre demektir.
Buna benzer hesaplamalar yapıp süreni ayarlaman gerek.
Programda TMR0 kesmesini kuracaksın ve yaklaşık program satırlarında aşağıdaki gibi olacaktır;


AZAMAN1:

    For I=1 to 59000
          pauseus 5
    next
    For I=1 to 59000
          pauseus 5
    next
HIGH RELAY
    For I=1 to 10000
    PAUSEUS 5
    next
    GOTO AZAMANI
Disable
Kesme:
       Sayac=Sayac+1
       If SAYAC=15 then
          SAYAC=0
          TOGGLE LED   (yada LED=1-LED)
       ENDIF

       BURADA TMR0 Kesme Bayrağını sıfırla
       RESUME 
       ENABLE


Komutların tamamını olması gerektiği gibi yazmadım. Biraz çalışasın diye.
En azından tmr0 kesmesi nalsıl kurulur bayrak nasıl sıfırlanır bunları okuyup öğrenmek gerek.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

alayli

Alıntı yapılan: "ete"Öncelikle Basic de kesme çalıştırılırken Pause yada Pauseus komutlarına dikkat etmek gerekir. Basic de genel kaide şudur. Bir kesme oluştuğu zaman o anda yürütülen basic komutunun bitmesi beklenir. Şimdi programa ;
pause 5900   şeklinde bir komut yazarsan ve tam bu komut icra edilirken kesme oluşursa 5900 ms yani yaklaşık 6 sn bekledikten sonra kesme etiketine gidilir. Buda senin led'in flash yapma süresini fazlası ile etkileyecektir. Bu hususu göz önüne alarak; Kesme kullanılan programlarda kullanılan gecikmelerin 5 us den daha fazla olmamasına dikkat etmek gerekir. En büyük gecikme 5 us olacağına göre daha uzun gecikmeleri nasıl sağlayacağız.? Bunun için yine döngü kullanmak gerekecek.
..........................

Ete

Ete hocamın bu anlattıkları melabs Pic Basic için geçerli. Tüm bu anlatılanlar o derleyicinin acizliği ve eksiklikleri... (Onun gibi profesyonel birinin hala o derleyici ile çalışmaktaki ısrarını da şahsen anlayabilmiş değilim, bu vesile ile çok merak ettiğim bir şeyi de sormuş olayım kendisine)

Eğer Proton+ kullanırsan hardware interrupt ile anında donanım kesmesi oluşturabilirsin falanca komutun icrası bitsin de interrupt oluşsun gibi ön şart yok. Programına dilediğin uzunlukta gecikme koyabilir, hatta watchdog'u da açıp, bunu sadece bir deklarasyonla belirtip, gerisini düşünmezsin. Hardware interrupt ile derleyicinin oluşturduğu kod da daha az yer kaplar. Bu, özellikle uzun programlarda kod alanından çok yer kazandırır.

Device = 16F628
XTAL=4
.
.
DIM KESME_SAYICI as BYTE
DIM I                      as BYTE
.
.
Symbol LED = portX.X
Symbol GIE      = INTCON.7
Symbol T0IE     = INTCON.5     
Symbol T0IF     = INTCON.2
.
.

On_Interrupt KESME
              OPTION_REG=%00000111  'Pull up lar açık, TMR0 önbölücü 256
              GIE  = 1 ' Genel kesmelere izin ver.
              T0IE = 1 ' TMR0 kesmesi için izin ver.

AZAMAN1: 

For I=0 to 10 
   pause 59000 
next 
HIGH RELAY 
PAUSE 50000

goto AZAMAN1

KESME:
Context SAVE   ' Kesme sırasında kritik değişkenlerin yedeği alınıyor
        Inc KESME_SAYICI'kesme sayacı 1 sn= 15(sayac) x 256 (Tmr0) x 256 (bölme)
        If KESME_SAYICI = 15 Then '15 adet kesme olunca 1 sn. süre geçiyor.(983040 us)
           KESME_SAYICI=0 'sayıcı sıfırlanıyor
           LED = ~ LED  'saniyede bir led yanıp söndürülüyor...
        Endif
T0IF = 0   'timer 0 kesme bayrağı resetlenip yeni kesmeye izin veriliyor
Context Restore 'Kritik değişkenler tekrar yükleniyor
Anca kazganmiş itmiş ilimiz törümüz erti. Türk Oguz begleri budun esiding. Üze tengri basmasar, asra yir telinmeser, Türk budun, ilingin törüngin kim artati? (udaci erti)

mustafa_cmbz

@alayli hocam çok sağ ol...biraz daha basic öğrendikten sonra protona geçeceğim...bu kod o zaman  faydalı olacaktır kütüphaneme aldım...

@ ete hocam ben kodu denemek için biraz değiştirdim.birazda sizin derslerden kopya çektim ama bişeyler öğrenmiş oldum mantığını anladım gibi fakat kodları vermeden ve size bir şey soracağım.hani başta kesme olduğunda kesme etiketine git yazdıkya ondan sonra INTCON yazmacının 5. biti 1 olduğunda kesme aktif oluyor  onu da programın basında 1 yaptığımız için kesme direk pic enerji aldıktan kısa bir süre sonra çalışmaya başlıyor sanırsam peki biz bu kesmeyi etiket içinde bir butonun konumuna göre başlatamazmıyız?sorum bu kadar?

sizin verdiğiniz kodu az çok tamamlamaya çalıştım :

 
   
ON INTERRUPT GOTO KESME 
    
    OPTION_REG=%10000111   ' 1/256 
    INTCON=%10100000        'TİMER SEÇİMİ VE AKTİF ETMEK
    CMCON=7 
    
    SYMBOL LED=PORTA.0
    SYMBOL BUTON=PORTA.1
    SYMBOL ROLE=PORTA.2
    
    SAYAC VAR BYTE
    
      BASLA:
    IF  BUTON=1 THEN  ROLECEK 
    GOTO BASLA
    
    ROLECEK:
    HIGH ROLe
    RETURN
    
    Disable 
    KESME:
    
    Sayac=Sayac+1 
    If SAYAC=15 then 
    SAYAC=0 
    TOGGLE LED   '(yada LED=1-LED) 
    ENDIF 
    
    INTCON.2=0 'BURADA TMR0 Kesme Bayrağını sıfırlaDIM 
    RESUME 
    ENABLE 
    END
[/color]



şimdi burada şöyle bir sorun var hocam :

şimdi simule başladığında led 1 sn ye de bir yanıp sönüyor butona bastığımda röle çekiyor fakat kesme takılıyor kalıyor sonra role "0" olunda saymaya devam ediyor...sanırsam benım kullandığım komutlardan kaynaklanan gecikmenin 5us'yi aşmasından kaynaklanıyor...bunun yerine şöyle bir kod yazmaya kalksak nasıl olur.mantık mantıklımıdır? :D(kesmelerin mantığını kavramaya çalışıyorum.. mesela biz butonlara her bastığımızda bir değişkenin değeri +1 artacak diyelim  ve diğer butona bastığımızda bu değerden saymaya başlıcak tabi bizde böylece belli bir süre geçikme sağlamış olacağız, sizce olurmu?