16F873 ile TIMER1 'i harici sayıcı olarak kullanma...

Başlatan bahadir01, 01 Şubat 2008, 17:14:06

bahadir01

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...

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

bahadir01

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..

bahadir01

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?

bahadir01

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 ?

karbal656

Bahadır
if sayac>=5 then
high k
yada k=1
yaparsan düzelir sanırım


karbal656

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com

bahadir01

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

ete

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
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com