Merhabalar,
daha önce TMR0 sorunum vardı 16f628de onu aştım şimdi de karşıma
16F873te sorun çıktı.. bu sefer TIMER1 kullanımı..
Nasıl kullanacağımı bilmiyorum.. Yardımcı olabilir misiniz?
Harici saydırma yapacam timer1 ile...
Timer1 i kontrol eden register T1CON registeridir.
"Data sheet den aldığım" bilgilere göre
bit 1 TMR1CS: Timer1 Clock Source Select bit
1 = External clock from pin RC0/T1OSO/T1CKI (on the rising edge)
0 = Internal clock (FOSC/4)
bit 0 TMR1ON: Timer1 On bit
1 = Enables Timer1
0 = Stops Timer1
Harici bir sinyal kaynağından gelen palsların saydırılması için T1CON registerinin 1. biti High (yani 1) yapılmalı
aynı zamanda saymayı başlatmak içinde T1CON registerinin sıfırıncı biti yine HIGH yapılmalıdır.
Timer1 16 bitlik bir sayıcıdır ama okunurken Timer1 diye okunmaz. Okurken MSB (TMR1H) ayrı okunmalı ve LSB (TMR1L) ayrı okunmalıdır.
Tabiiki saydırmaya başlamadan önce bu sayaçları ayrı ayrı sıfırlaman gerekiyor.
Örnek vermek gerekir ise;
TMR1H=0
TMR1L=0
T1CON.1=1
T1CON.0=1
dedinmi timer başlayacak T1CK1 bacağından (PortC.0) gelen palsleri saymaya.
İstediğin bir anda ise sayac değerini TMR1H ve TMR1L registerlerinden alabilirsin. Kolay olması bakımından SAYAC isimli word değişkeni kullan ve
TMR1H=SAYAC.Byte1
TMR1L=SAYAC.Byte0
dersen SAYAC sana 16 bit olarak timer1 değerini verecektir.
Ete
hocam teşekkür ederim öncelikle..
datasheet'ten ben de o ayarları yaptım fakat
trm1l ve tmr1h ayarlarını yapamadığım için okuyamadım sanırım..
deneyim tekrar dönecem..
Device= 16F873A
XTAL=4
ADCON1=$07
TRISA=%00000000
TRISB=%00000000
TRISC=%00000001
Dim SAYAC As Word
Symbol p PORTC.0
Symbol l PORTC.1
Symbol k PORTC.2
PORTA=0
PORTB=0
T1CON=%110000000
TMR1H=0
TMR1L=0
basla:
TMR1H=SAYAC.BYTE1
TMR1L=SAYAC.BYTE0
If SAYAC=0 Then
l=%1
EndIf
If SAYAC>0 Then
k=%1
EndIf
GoTo basla
End
hocam bu programı yaptım çalışmadı..
nerede yanlışlık var acaba?
hocam
t1con.1=1
t1con.0=1
olarak yapınca sorun çözüldü fakat.
basla:
SAYAC.BYTE1=TMR1H
SAYAC.BYTE0 =TMR1L
If SAYAC<=5 Then
l=%1
EndIf
If SAYAC>5 Then
k=%1
EndIf
GoTo basla
End
döngüsünü simule ettiğimde, 5. basışımda diğer ledi yakıyor.. 1 önden gidiyor gibi.
ne diyorsunz ?
Bahadır
if sayac>=5 then
high k
yada k=1
yaparsan düzelir sanırım
karbal656
Bahadır,
Önce neden çalışmadı dedğin programla ilgili durumu söyleyeyim.
T1CON=%11000000 (sen 9 adet bit yazmışsın 8 olacak dikkat)
eşitliğine bakarsan T1CON.7=1 ve T1CON.6=1 yapıyorsun (daha doğrusu yapmaya çalışıyorsun). Hatan burada. Sıfır ve 1. bitleri 1 yapacaksın.
Led konusuna gelince;
If SAYAC<=5 Then
l=%1
EndIf
If SAYAC>5 Then
k=%1
EndIf
GoTo basla
End
satırlarını ben olsam şöyle yazardım;
If SAYAC<=5 Then
l=1
else
l=0
EndIf
If SAYAC>5 Then
k=1
else
k=0
EndIf
Birde TMR1'i kullanıma açmadan önce;
TM1H=0
TMRL=0
satırlarını koyman gerek. Bir şekilde TMR1 sayacında bir sayı bulunabilir. Sıfırlamak bence gerekli.
Ete
evet , ben de yeni farkettim T1CON'u yanlış yazmışım..
Hocam TMR1.H=0 ve TMR1.L=0 komutlarını döngünden önce yazmıştım.. söylemeyi unutmuşum..
bu arada kartal senin dediğin gibi de denedim yine 4. basışımda diğerini yakıyor..
Herhangi bir yanlış anlamaya sebep olmamak için tüm programı veriyorm.
Device= 16F873A
XTAL=4
ADCON1=$07
TRISA=%00000000
TRISB=%00000000
TRISC=%00000001
Dim SAYAC As Word
Symbol p PORTC.0
Symbol l PORTC.1
Symbol k PORTC.2
PORTA=0
PORTB=0
T1CON.1=1
T1CON.0=1
TMR1H=0
TMR1L=0
basla:
SAYAC.BYTE1=TMR1H
SAYAC.BYTE0 =TMR1L
If SAYAC<5 Then
l=1
EndIf
If SAYAC>=5 Then
k=1
EndIf
GoTo basla
End
Merak ettim ve devreyi isisde kurdum. Program doğru çalışıyor.
İstersen PortB den TIMRL değerini görebilirsin.
basla:
SAYAC.BYTE1=TMR1H
SAYAC.BYTE0 =TMR1L
PORTB=TMR1L
şeklinde bir ilave yaparsan her basışta PortB den timer1 değerini görebilirsin.
Ben görüyorum ve programda doğru çalışıyor.
Bunu gerçek devrede deniyorsan tuşun debouncing denilen kusuru olabilir. Bunu önlemek için
GOTO BASLA satırından önce bir 200 ms lik bir gecikme koyuver. Böylece tuş ikilemiyecektir.
Dediğim gibi program doğru çalışıyor sende yada devrende bir kusur var.
Kusuru buldum sanırım. Data sheete bakarsan dışarıdan bağlanan clock palsi için "on rising edge" şeklinde bir ifade var. Yani PortC.0 normalde high da duracak low a çekilip tekrar high olurken sayac 1 sayacak demektir.
Tersini yaparsan senin dediğin olay meydana geliyor. yani
-1. basışta sayac=0
-2. basışta sayac=2
-3. basışta sayac=4
-4. basışta sayac=6
-5. basışta sayac=8
..
şeklinde 2 şer ikişer sayıyor. Yapılacak işi clock girişini düzelteceksin.
Ete