timer projesi için yardım ?

Başlatan mustafa_cmbz, 25 Ağustos 2007, 13:51:19

mustafa_cmbz

arkadaşlar başlık altındakı tımer örneklerinin bazılarını incledim fakat işimi görücek bir örnekle karşılaşmadım...şimdi ben 10 seçenekli bir menü tasarlıcam ve bu menülerin her birinde bir zamana seçeneği olucak 1 butonla bu menüyü seçeceğim 2. butonlada set edicem buraya kadar sorun yok fakat menülerin zaman değerlerini ayarlayamıyorum mesela 1. seçenekte 10dk seçeneği olucak ve 2. butonla onu set edince  10 dk sonra bir buzzer ötücek aynen su fırınlarda olduğu gibi fakat dediğim gibi kesmeleri inceledim fakat kesmenın ne kadar sureceği konusnda takıldım kaldım onu nasıl belirlicez onu anlamadım mesela 10dk bir kesme oluşturmak için nasıl birşey yazıcaz ?..ve birde 1 picle 10 kesme yapabilrimiyiz yanlız aynı anda olmıcak dediğim gibi 1.butonla seçilcek 2. butonla set edilince o kesme aktif olucak böye bir imkanımız varmı eğer yoksa nasıl bir yöntem kullanmalıyım açıklarsanız yeni şeyler öğrenecem :D kolay gelsin

titanium

Umarım sorunu doğru anlamışımdır.

Timer1 için düşünelim ve Fosc = 4Mhz olsun.

Pic' de 4 cycle da 1 işlem yapılır.  Prescaler ayarı yapılarak Timer1' in içeriğinin kaç saat darbesinde bir artacağı belirlenir. Dolayısıyla
Prescaler = 1 olması  durumunda Timer1' in içeriği  

(1/4000000) *4

saniyede bir 1 artar. Prescaler = 8 olması durumunda ise

(1/4000000) *4 *8

saniyede bir Timer1' in içeriği 1 artar.  Timer1 16-bit dir. Bundan dolayı Yukarıda yazılan şartlarda Timer1,

(1/4000000)*4*8*65536 =  524 ms

kadar sayacak ve taşacaktır. Taşma oluşana kadar 524 ms değilde 500 ms geçmesini istediğimizi düşünelim. Bunu yapabilmek için Timer' a bir ön değer yüklemeliyiz. Böylece timer saymaya bu değerden başlayacak ve timer içeriği max. değere daha çabuk ulaştığından taşma daha erken(500ms sonra) gerçekleşecektir. Prescaler = 8 olması durumunda timer daki herbir artış için  

(1/4000000) *4 *8  

saniye geçeceğini söylemiştik. Bizim burada yapmamız gereken, timer a yüklediğimiz değerle 24 ms bekleme işini yerine getirmemesini böylece 500 ms lik süre sonunda taşmasını sağlamaktır. 24 ms için timer daki artış miktarı

(24*10^-3)/((1/4000000)*4*8)) = 3000

olarak bulunur. Şimdi yapmamız gereken bu değeri Timer1' e yüklemektir.

10 dk. olayına gelirsek,
Bu işlem için bir dğişken tanımlayabilirsin ve her kesmede değerini bir arttırabilirsin. Örneğin 500 ms. de bir taşma oluşuyorda, her kesme geldiğinde değerini bir arttırdığın bu değişkenin değeri 1200 kere arttığında gereken işlemi yaparsın böylece 10 dk. yı elde etmiş olursun. Tabi bu sadece fikir vermesi için yazmış olduğum bir örnek, başka yollardan da yapılabilir.

mustafa_cmbz

açıklamalarınız için teşekkürler bende pic basic derslerinden 6. derse bakıyordum ondan bir önce 11 dersteki konuları inceledim bişey anlamadım ama açıklamalarınızı okuyup tekrar göz attığında yeni şeyler öğrendiğimin farkına vardım mesea başlangıç değerinin atanması bazı programlarda komutlardan dolayı gecikmeler oluşuyormuş bu yuzdende istenılen seviyede bir pals elde edilemiyormuş sizinde izah ettiğiniz gibi başlangıç değerini uygun bir sayı girdiğimizde bunu dengelemış oluyormusuk...


benım soruma gelince  yazdığınız cvp benım soruma pek bir katkısı oldu denılemez ama yinede faydalıydı şimdik benım demek istediğim su yanı ben 3 tane ayrı ayrı kesme1 kesme2 kesme3 diye etiket oluşturdum diyelim ve her kesmenınde zaman değerleri farklı dediğim gibi 1. sinde 10dk lık bir gecikme sağlıcak mısal....2. sinde ise 20dk diyelim ama asıl sorun ve merak edip sorduğum sey şu picte mesela kesmeyi nasıl aktif edicez mesela şöyle olurmu...


diyelim 3 tane buton var ve bu butonlardan hangısıne basarsak o butonun sartı yanı kesmesi aktif olurmu kodla ile daha iği anlaşılcaktır


örnek:


ıf buton1=1 then kesme1
ıf buton2=1 then kesme2
ıf buton3=1 then kesme3


yanı anlatmaya çalıştığım bir bakıma bu

mesela 1. buton aktif olduğunda kesme 1 etiketine gidicek gidicek ama bu etikete vardığında kesme aktif olmuş oluckamı yanı 3 butonun durumuna göre nasıl kesmeyi aktif ederiz ve bu kesmelerin fazla oluşu herhangı bir sorun teşkil edermı yanı aynı anda değilde tek tek aktıf olan kesme ye  ihtiyacım var ve nasıl butonlara bağlı olarak kesmenın başlatılacağına :D

mustafa_cmbz

arkadaşlar pic basic derslerin 6.sında bir kod vardı onun üsütnd biraz oynama yaptım lcd yi çıkarttım ve ledleri koydum lederi röle kabul edin ve her etikette sayma süresi bitince biri aktif olucak verdiğim kodta menu oluşturmadım ama 1.ve 2. butonlara sırasıyla basılınca kesme etiketine yönlendirdim ama doğru mu yanlışmı bilmiyorum isiste bir sürü msj veriyo :D

Alıntı yapılan: "mustafa_cmbz"
   
'-----------------------------------------------------------------
@ 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


'-------------------------------------------------------------------------
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
'-----------------------------------------------------------------------------
SYMBOL SET=PORTA.4
SYMBOL AYAR=PORTA.3
'******************************************************************************
SYMBOL LED1=PORTB.2
SYMBOL LED2=PORTB.3
'******************************************************************************
CLEAR  'tüm değişkenler sıfırlandı
PAUSE 200

'-----------------------------------------------------------------------------
 BASLA:
  IF AYAR=1 then
  GOTO SETBUTONU
  ELSE
  GOTO BASLA
    ENDIF
 
 
  SETBUTONU:
 
  IF SET=1 THEN
  GOTO SAYAC1
   ELSE
   GOTO SETBUTONU
   ENDIF


SAYAC1:

DISABLE

KESME1:
     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=20 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=1 THEN
                 HIGH LED1
                       
                       ENDIF                    
                 ENDIF
           ENDIF
         INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor

        RESUME
        ENABLE
     
     
   
END
'-----------------------------------------------------------------------------------
 


sanıyeyi 20 yaptım isiste cok beklediği için....



arkadaşlar bu kesme etiketinde 2 tane yaptım ama zamanlayıcı çalışıyor ama led2 yerine led1 i yakıyor böyle 2-3 tane kesme etiketi oluşturup bunlara belli bir gecikme süresi belirleyip butonları tarayıp ve değerlere göre sartlandırıp eğer sart uyuyorsa  butona atanan ksme etiketine gidip istediğimiz ledi yakabilirmiyiz? ve bir soru daha su kodun anlamı ne INTCON.2=0

Alıntı yapılan: "mustafa_cmbz"SAYAC2:

DISABLE

KESME2:
     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=20 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=1 THEN
                 HIGH LED2
                       
                       ENDIF                    
                 ENDIF
           ENDIF
         INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor

        RESUME
        ENABLE
     
     
   
END
bu 2. kesme etiketi olucak fakat denediğimde 2. butona bastığımda programı sayac 2ye yolluyorum ama çıkışta led2 yanması gerekirken led1 yanıyor programın basına kesme olduğunda suraya git komutundan 2 tane yazdım yin aynı ben bişey anlamadım kendi kendime tırmalıyorum biraz yardım edersenız sevinirim ....

mustafa_cmbz

arkadaşlar verilen dersşerde benım sorduğum veya yapmak istediğim seyler yazmıyor bunun için sizden yardım sitiyorum kimse bişey yazmıcaksa silinsin bu konu boşuna yer tutmasın kımse yorum yapmıyor ne oldu ynalış bişeymı söledik yanlış bir şeymı yaptık eğer bazıları bize tavır aldıysa haberimiz olsun bende bişeyler için çabalıyorum bişeylr öğrenmek için ama kımse bişey yazmıyor hanı balık tutulmaz balık tutmak öğretilirdi burda bişeyler öğrenmeye çalışıyoruz ama kımsenın bişey yaptığı yok böyle olaylar olunca öğrenmek için hevesim kırılıyor ama olsun elimden geldiği kadar..kimseye zorla bişey yaptırma sansım yok fakat  yazmayanlara soruyorum çok bildiğiniz içinmi ilgilenmıyorsunuz, küçük görüyorsunuz yoksa bilmediğiniz içinmi?

mustafa_cmbz

moderatör arkadaşa sesliyorum konyu silelim lütffen kımsenın umrunda değil boşuna yer kaplamasın...