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
İ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.
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..
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......
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
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.
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
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.
KOLAY GELSİN
Hoşgeldiniz. Büyük Karakterlerle Yazmayalım.
https://elektrokod.wordpress.com/2013/10/17/timer0/ (https://elektrokod.wordpress.com/2013/10/17/timer0/)
https://elektrokod.wordpress.com/2013/10/18/timer0-zamanlama-uygulamasi/ (https://elektrokod.wordpress.com/2013/10/18/timer0-zamanlama-uygulamasi/)