TMR0(TİMER)

Başlatan turkbowling, 18 Ağustos 2006, 22:42:51

turkbowling

sanırım bu protonu ya herkes çok iyi biliyo yada ben çok kötüyüm

neyse 16f877 pdf'lerde geçen bu timer olayları proton ile nasıl yapılıyor proton help'inde timer diye bi şey geçmiyor iyice inceledim sadece counter olayı var belli bir zaman diliminde seçtigimiz portu sayıyor o kadar

visual basicde oldugu gibi bir timer olayı yokmu ??

örnegin giriş olarak tanımladıgımız portc.0 daki btona 1 kere basınca timer saymaya başlasa tekrar bastıgımızda ise dursa geçen süreyi lcd ye gönderse ne güzel olurdu demi!!!!

ama yook protonda timer diye bişey yok yok


sorunumu şöle detaylı bir şekilde anlatayım belki bir acıyıp çözen olur

gemide uydu için bir düzenek hazırlıyorum sorunum şu gemi sağa-sola değişken hızlarla sallanmaktadır sistemi denğede tutan motorun devrini
geminin sağa sola sallanma hızına göre belirlemek istiyorum daha basitçe gemi yavaş sallanıyorsa motor yavaş çalışacak gemi hızlı sallanıyorsa motor hızlı çalışacak

acaba sisteme bir 1K pot koysam bu pot ile geminin sallanma derecelerini bulabilirim ama sallanma hızını bulabilirmiyim???

veya okullarda olduğu gibi a noktasından b noktasına araba kaç saatde ulaşır mantığını burda uygulayabilirmiyiz

herkese teşekkürler

OG

İlgili PIC'in datalarından timer registerlerini inceleyeceksin. Bu registerler nasıl kullanılır, kaç bit çalışır. Taşma sonuçları hangi flaglardan alınır, timer register değeri okunabiirmi nasıl okunur, timer registeri gerekli süreler için nasıl set edilir vs vs.
FORUMU İLGİLENDİREN KONULARA ÖM İLE CEVAP VERİLMEZ.

ibrsel

ON INTERRUPT GoTo KESME   'kesme oluşursa KESME adlı etikete git.
OPTION_REG=%10000101     'Pull up dirençleri İPTAL-Bölme oranı 64
INTCON=%10100000         'Kesmeler aktif ve TMR0 kesmesi aktif
TMR0=0  

(yukarıdaki ayarlar ile dahili tmr0 kesmesini aktif yaparsın.Devrende 4MHZ kristal kullandığında yaklaşık 1 sn elde edersin..Nasılmı:
Bölme oranını option registerinden 64 ayarladık.Tmr0 her 256 sayımında bir kesme oluşturur. Dolayısı ile 256*64=16384 eder..Her kesme oluştuğunda kesme alt programında bir değişkeni kontrol edip değerini arttırırsak;)


DISABLE
KESME:
     sayac=sayac+1
     if sayac=61 then
       sayac=0
       sn=sn+1        
       lcdout $fe,1,"sn=",#sn

     endif
     
   INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
RESUME
ENABLE

sayac değişkeni 61 olduğunda 16384*61=999424 mili saniye yapar,ki oda yaklaşık olarak 1 sn dir.

Yukarıda anlattıklarım dahili  tetikleme ile  TMR0 ın kullanımı idi..Option registerinde gerekli düzenlemeleri yaparak RA4 ucundan yapacağın tetikleme ile TMR0 ı saydırabilirsin..

Yada dahili kesmeyi kullanıp bir butona bastığında sn değerini bir değişkene atarsın..Başka bir butona veya yine aynı butona bastığında o anki sn değerini okutup bir değişkene atarsın..Bu iki değişken arasındaki fark senin butonlara basma aralığını verir..

rree

4 Mhz kristal için tam 1 sn  formül:   4 Mhz içte 4 bölünür. >>>1Mhz

Timer0 sabit ön bülücü 1/2 >> 500 Khz  On bolucu 32 ayarla >>15625 Hz

Timer 0 bolme oranını 125 ayarla timer0=131 >>15625/125=125 Hz

Yazılım ile select case vs 125 bol 125/125>>> 1.0000 Hz .  1 -2-4-8-16-32

Mhz için sabit on bolocu değiştirmek ile bu formulde 1 Hz yakalamak mümkün iyi günlerde kullanın......

turkbowling

cvp
#4
anladıgım kadarıyla kodu yazayım eksiklerimi tamamlarsanız sevinirim teşekkürler
'---------------------------------------------------------------------------------------
DEVICE 16F877
XTAL=4


ALL_DIGITAL=TRUE                'tüm çikislar djital acik

trisc=1
portc=0

'LCD TANITMA BOLÜMÜ.....................................................................................
DEFINE LCD_DREG		PORTB	    'LCD data bacaklari hangi porta bagli? portb
DEFINE LCD_DBIT		PORTB.4		'LCD data bacaklari hangi bitten basliyor? portb.4 den itibaren
DECLARE LCD_ENPIN   PORTB.1     'LCD "E" pin portb nin hangi bitine baglidir.
DECLARE LCD_RSPIN   PORTB.0     'LCD "RS" pin portb nin hangi bitine baglidir.
DEFINE LCD_BITS			4		'LCD 4 bit  olarak bağlı

ON INTERRUPT GoTo KESME 'kesme oluşursa KESME adlı etikete git. 
OPTION_REG=%10000101 'Pull up dirençleri İPTAL-Bölme oranı 64 
INTCON=%10100000 'Kesmeler aktif ve TMR0 kesmesi aktif 
TMR0=0 

dim  sayac as word
dim  sn as word

basla:
while portc.0=0                             'portc.0=1 olana kadar bekle
wend

---------??    'tusa basıldı timer saymaya baslasın TMR0 her 256 sayısından sonra 1 kesme olusturur ve kesme alt baslıgına gider..burda timer saymaya nasıl baslatacagız???
    
KESME: 
sayac=sayac+1                                     'timer her kesme yapısında sayac degeri 1 artar
if sayac=61 then                                     'sayac 61 oldugunda 1 sn elde etmis oluruz
sayac=0                                                  '1 sn elde ettikten sonra sayac sıfırlanır 

sn=sn+1                                                     'elde edilen saniyeler burda toplanarak lcd'ye gönderilir
lcdout $fe,1,"sn=",#sn 

endif 

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

goto basla

Veli B.

T0IE(INTCON.5)  TMR0'ı  başlatır.
Bütün kesmeler için GIE(INTCON.7)' nin set edilmiş olması önkoşuldur.

proton da
ON INTERRUPT 
ON_INTERRUPT

iki farklı anlama gelir.
ON INTERRUPT software interrupt olarak yürütülür.(yürütülmekte olan komutu müteakiben kontrol yapılır.Pbp da bu yöntemle işlem yapmaktadır)

ON_INTERPUPT ise assembly de olduğu gibi donanımsal olarak işletilir ve  2 çevrimde ilgili kesme rutinine gider.  


Helpinden detay bilgi alabilirsiniz.

turkbowling

cvp
#6
bir saat örnegini inceleyerek ve cevaplarla karsilastirarak bihayli ilerleme kaydettim diyebilirm tabi timer la ilgili daha bicok deneme yaparak saglamlastırmam gerek; asagıda timer0 saymaya devam ederken (sadece sn olarak) istedigim anda zaman bilgilerini alabilmekteyim ve aradaki gecen zamani bulabilmekteyim tabi bu is icin 3 giris feda ettim ama daha az tusla yapmaya ugrasacagim
    yardimlarini esirgemeyen herkese tesekkürler ileriki asamalarda sanirim birkac sorum daha olacak :))

ornek kod:

DEVICE 16F877 
XTAL=4 


ALL_DIGITAL=TRUE 'tüm çikislar djital acik 

trisc=1 
portc=0 

'LCD TANITMA BOLÜMÜ..................................................................................... 
DEFINE LCD_DREG PORTB 'LCD data bacaklari hangi porta bagli? portb 
DEFINE LCD_DBIT PORTB.4 'LCD data bacaklari hangi bitten basliyor? portb.4 den itibaren 
DECLARE LCD_ENPIN PORTB.1 'LCD "E" pin portb nin hangi bitine baglidir. 
DECLARE LCD_RSPIN PORTB.0 'LCD "RS" pin portb nin hangi bitine baglidir. 
DEFINE LCD_BITS 4 'LCD 4 bit olarak bağlı 

'timer0 ayarlari
ON INTERRUPT GoTo KESME 'kesme oluşursa KESME adlı etikete git. 
OPTION_REG=%10000101 'Pull up dirençleri İPTAL-Bölme oranı 64 
INTCON=%10100000 'Kesmeler aktif ve TMR0 kesmesi aktif 
TMR0=0 

SAYAC       VAR   BYTE
SN          VAR   BYTE
zaman1      VAR   BYTE
zaman2      VAR   BYTE
dim gecenzaman 

CLEAR  'tüm değişkenler sıfırlandı
PAUSE 200
LCDOUT $FE,1

basla: 

LCDOUT $FE,$84,DEC2 SN
LCDOUT $FE,$c0,DEC2 zaman1,"---",dec zaman2,"---",dec gecenzaman

if portc.0=1 then zaman1=sn
if portc.1=1 then zaman2=sn
if portc.2=1 then gecenzaman=zaman2-zaman1


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
             
           
         ENDIF
         INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
         RESUME
         ENABLE
         
END

goto basla

mhk

Alıntı yapılan: "turkbowling"
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
           
         
        ENDIF
        INTCON.2=0        'TMR0 Kesme bayrağı sıfırlanıyor
        RESUME
        ENABLE
       
END

goto basla

Burda 999.424 us elde edilir.( Kesme ve diğer komut süreleri hesaba dahil değildir) Amaç, 1sn elde etmek olunca; 1 sn=1.000.000 us dir. 1.000.000-999.424=576 us 'lik bir hata meydana gelir. Küçük bir hata gibi görünebilir , lakin; 1 sn de 576 us 1.000sn( Yaklaşık 17 dakika ) de 576.000 us ==> yaklaşık 0,6 sn.  1 günde yaklaşık 50 sn hata demektir. Hata giderek büyüyecektir. Oysaki;SAYAC değişkeni 61 olduğunda tmr0 oranını değiştirerek hata minimuma indirilebilir. Şöyleki ;576 us ,seçilmiş olan 64 bölme oranına bölünürse, 576/64=9 tam rakamı çıkar. Buda SAYAC değişkeninin 61 değerini aldığında  ( 256-9=247) tmr0=247 yapıldığında kalan 576 us lik beklemeyide gerçekleştirebiliriz. SAYAC=62 olduğunda "SN=SN+1" şeklinde yapılabilir.
"Ya olduğun gibi görün, Ya da göründüğün gibi ol..." Mevlana

EAelek.


muhittin_kaplan

Hoşgeldiniz. Büyük Karakterlerle Yazmayalım.