Timer0 ı sayıcı olarak kullanmak..

Başlatan FUNKY, 06 Ağustos 2010, 16:13:18

FUNKY


merhabalar.

yapmak istediğim  portA.0=1 olunca timer0 saymaya başlayacak ikinci defa portA.0=1 olana kadar.işlemin tamamlandığını görmek için portA.1 i high low yaptım .
sorunum ikinci  defa portA.0 ın 1 olmasını beklemeden cıkış veriyor 
Device=16F628A
   
   Config BOREN_OFF, CP_OFF, DATA_CP_OFF, PWRTE_OFF, WDT_OFF, LVP_OFF, MCLRE_OFF, INTRC_OSC_NOCLKOUT
   Xtal=4

   CMCON = 7
   
   Symbol gir =PORTA.0
   Symbol cik =PORTA.1

   TRISA = %00000001
   PORTA = 0 
   TRISB = %00000000
   PORTB=0

   OPTION_REG =%00000111
   tm0=TMR0
   
   while 1=1
    
   If gir=1 Then
       gir=0
       tm0=0
     endif
       While  gir =1
       If tm0 < 255 Then Inc tm0     '  max 255 say
       Wend

       cik=1
       DelayUS 500
       cik=0
wend

ete

Yazdığın kod da iki önemli hata görüyorum.
Birincisi giriş olarak ayarlanmış bir pini (GIR) yazılımla LOW yapamazsın. Bu giriş ancak donanımsal olarak LOW yapılabilir.
Giriş pini senin sisteminde LOW'a çekili (pull-Down) olmalı ve butona basılınca High olmalıdır. Butonu bırakıncada otomatikman Low olmalıdır.
İkincisi TMR0 geri planda çalışır ve Option registeri 5. biti LOW olduğu sürece sürekli sayar. Sen TMR0 değerini yazılımla artıramazsın. TMR0 değerini sıfırlayabilir, herhangi bir anda değeri okuyabilirsin ancak INC TMR0 komutu ile değeri artıramazsınız.

Diğer taraftan GIR=1 olma durumunu komutla yakalıyorsun ancak aynı girişin LOW olma durumunu hiç test etmiyorsun.
Bu durumda sistem yalnızca GIR=1 olduğunda TMR0 değerini sıfırlayıp anında değeri 255 yaptığı için CIK=1 oluyordur.

Ete
Bilgi hazinedir paylaştıkça büyür.            http://etepic.com