zaman kayıyo bana öğreten bin yıl yaşasın

Başlatan tersoll, 19 Haziran 2014, 15:35:52

tersoll

#include <16f628a.h>
#FUSES NOWDT
#FUSES INTRC_IO
#FUSES NOBROWNOUT
#FUSES NOLVP

#use delay(int=4000000)

#use fast_io(a)
#use fast_io(b)


unsigned int i=0,z=0;

#int_timer1 // timer0 kesmesi
void timer1_kesme()
{
set_timer1(55543);
i++;
if(i==100)
{
output_toggle(pin_b0);
i=0;z++;
if(z==10)
{
output_toggle(pin_b1);
z=0;
  }
}
  clear_interrupt(int_timer1);
  }
 
 
  void main()
 
  {
  set_tris_a(0x00);
  set_tris_b(0x00);
  output_a(0x00);
  output_b(0x00);
 
 
  setup_ccp1(CCP_OFF);
  setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
  set_timer1(55543);
  enable_interrupts(INT_TIMER1);
  enable_interrupts(GLOBAL);
 
  while(1)
{
output_high(pin_b7);
}
}

timer1 kullandım ama zaman kayıyo nasıl önlücem

Kabil ATICI

Timer kesmesi içine o kadar meşgul ediyorsun ki;
kesme içindekileri bir bayrak kullanarak ana çevrim içine taşı.
bayrak tanımla
insigned int bayrak=0;

kesme için
set_timer1(55543);
bayrak=1;
kadar olsun.

ana çevrim içinde
if(bayrak==1)
{
bayrak=0;
//geri kalan kodlar.
}
ambar7

tersoll

#2
sizin dedğinizi yaptığımda peki zaman kaymıcak mı?

mesaj birleştirme:: 19 Haziran 2014, 20:31:52

yeni öğrenmeye başladığım için siz teknik olarak çok güzel açıklamışsınız tşkr ederim fakat program üzerinden değiştirebilirmisiniz zahmet olmazsa tşkr ederim

Kabil ATICI

#include <16f628a.h>
#FUSES NOWDT
#FUSES INTRC_IO
#FUSES NOBROWNOUT
#FUSES NOLVP
#use delay(int=4000000)

#use fast_io(a)
#use fast_io(b)

unsigned int i=0,z=0;
insigned int bayrak=0;

#int_timer1 // timer0 kesmesi
void timer1_kesme()
{
set_timer1(55543);
bayrak=1;
  clear_interrupt(int_timer1);
  }
    
  void main()
   {
  set_tris_a(0x00);
  set_tris_b(0x00);
  output_a(0x00);
  output_b(0x00);
  
    setup_ccp1(CCP_OFF);
  setup_timer_1(T1_INTERNAL|T1_DIV_BY_1);
  set_timer1(55543);
  enable_interrupts(INT_TIMER1);
  enable_interrupts(GLOBAL);
  
  while(1)
 {
 output_high(pin_b7);
if(bayrak==1)
{
bayrak=0;
//geri kalan kodlar.
i++;
if(i==100)
{
output_toggle(pin_b0);
i=0;z++;
if(z==10)
 {
output_toggle(pin_b1);
z=0;
  }
}
 }
 }
}


Normalde C kesme içine ne kadar kod ekleyeceğini kestirmek zor, ama timer kesmesi içini (parantez) mümkün olduğu kadar az tutmak aşırı kaymaları önleyecektir.
ambar7

tersoll


tersoll

insigned int bayrak=0; bu yazdığınız kod derlerken hatalar veriyor bu kod insignet mi yoksa unsignet mi olucak acaba

tersoll

benim anlamadığım nokta bu 10 sn yi denerken ben dijital zaman rölesinide 10 sn ye ayarlıyorum 0-9 arası sayıyor ve 9 dediğinde herseferinde çıkış veriyor tm yerinde kararlı ama benim yaptığım bizim yaptığımız programda aynı anda başlatıyorum saydırmaya benim pic ileri kayıyo
1 bu kayma zamanda oynamaya sebep olurmu yani ben şöyle düşünüyorum doğruysa eğer bir tren hareket halinde ve benim zamanımda 0-9 bir vagon, vagon içinde hep 10 sn mi sayar tren hareket ettikçe sonuç ne olur ve o kadar şey denedim bu kayma olayını ben çözemedim ve gerçekten takıntı haline geldi eğer bir çözümü varsa sizden rica ediyorum öğretin bana tşkr ederim

Kabil ATICI

pardon klavyemde i ve u yanyana. elim bazen kayabiliyor,

timer değerini hesaplarken, timer kesmesi içindeki bekleme zamanını da göz önüne almak gerekir. (tam zamanlama istendiğinde) Bu konuda değer için saatler için kullanılan programları inceleyebilirsin.

Hızlı bir taşın içindeki zaman kaymasını ölçmeye çalışıyorsan, bu konuyu bir daha düşün. Dünyanın dönüş hızı, dünyanın güneş etrafındaki dönüş hızı, güneşin samanyolu içindeki dönüş hızı ve samanyolunun Andromeda galaksisine doğru hareket hızı yanında trenin hızı nedir ki?
ambar7

FEHMİ_ASM

  ambar7 hocamıza ek olarak aşağıdakileri açıklamak isterim.

   Timer'lardaki uzayan hatalı gecikmeler çoğunlukla timer'lara update edilen start değerleri ile olur. Her yüklenişte birkaç saykıllık zaman geçecektir. O halde bayrak sayılarını tutan registerin değerine - bir anlamda sapmanın katsayısı denilebilir. Dolayısı ile özellikle uzun sürelerde hata artacaktır.

    16 bitlik yerine 8 bitlik timer kullanabilirsiniz. Timer'ı hiç kapatmaz ve yeni değer yüklemezseniz bu donanım timeriniz sürekli çalışacak ve bayraklar arasında hiç zaman kaybınız olmayacaktır. Bundan sonra, timer'ınızın bayrak sayısını tutan registere en uygun değeri yüklemek kalıyor. Total'da tutturmak istediğiniz süre net olarak karşılanmıyorsa, donanımsal prescaler fonksiyonunu kullanabilirsiniz.

   *CCP1 özelliğini inceleyiniz. Size fikir verebilir.
   
   *Eğer hiç zaman kayıbı yaşanmasın istiyorsanız rtc kullanabilirsiniz.
Hz.Hamza'nın Belinde İki Kılıç Duruyor ! Attığı Her Adım Bir Kalbi Durduruyor ! Ey Hamza ! Gördüğün Hiçbir Şeyden Korkmazsın , Bu Doğru Ama Heybetini Gizli Tut , Yürüyüşün Ölümü Korkutuyor !  İşte Hz.Ömer ve Hz.Ali , Biri Hattaboğlu , Biri Haydâr-ı Kerrar ! Ve Kolkola Ölümün Ağzına Giriyorlar !  Azrai

sadogan

INTRC_IO  rc osilator kullanıyorsun kaymanın bir kısmı burda. Kristal kullanırsan çok keskin zamanlar elde edebilirsin.
#int_timer1 // timer0 kesmesi
void timer1_kesme()
{
      set_timer1(3036);// tmr1 62.5 msn 
      i++;
     if(i==16)
    {
         output_toggle(pin_b0);
         i=0;z++;
        if(z==10)
       {
           output_toggle(pin_b1);
           z=0;
       }
    }
     clear_interrupt(int_timer1);
  }

int rutini bu şekilde daha az interrupt a girer

tersoll

KRİSTAL AYARLARINI SÖYLERMİSİNİZ TŞKR EDERİM

tersoll

timer1 e harici osilatör nasıl koyucam kodu ne acaba 32khz bide öyle deniim

tersoll

bana yardım eden herkeze çok teşekkür ederim

JOKERAS

Selam,
Ne yaparsanız yapın zaman kayar,ortam sıcaklığı vs.
Saat yapacaksanız harici 32khz kristal kullanın ama oda kayacaktır.
Kullanacağınız kristalin load kapasitesi düşük olanını bulun,kayma onlarda daha az oluyor.
Yukarıda arkadaşın yazdığı gibi Compare modülü ile çok güzel saat olur.
Ama  zaman yine kayar +- günde bir saniye vs.

Cemre.

Hocam bu soru benim bir zaman sorduğum zener ile regülasyondaki ripple'lar soruma döndü biraz sanırım. Binlerce liralık doğrultma devrelerinde güç kaynaklarında dahi bu ripple'ın olacağı söylenmişti ki haklılardı da zaten..

Bende şöyle bir örnekle kapatayım ozaman, http://www.gercekbilim.com/dunyanin-en-hassas-atom-saati-stronsiyumdan-yapildi/

Alıntı YapStrontiyumdan üretilen Dünya'nın en hassas saati o kadar stabil ki, 5 milyar yılda sadece 1 saniye hata yapıyor....

Tabi ki elinizdekinden daha hassas bir saat tasarlayabilirsiniz ancak sapmayanını yapmak oldukça güç..