T

ete hocam namınızı çok duydum inş yardımcı olursunuz

Başlatan tersoll, 16 Haziran 2014, 16:10:52

tersoll

#include "C:\Users\server\Desktop\aaaaa\main.h"





int16 a=0;

void main()
{

   setup_timer_0(RTCC_INTERNAL|RTCC_DIV_1);

   // TODO: USER CODE!!

basla:
output_high(PIN_b0);
output_high(pin_b2);
delay_ms(10000);
output_low(pin_b0);
output_low(pin_b2);
output_high(PIN_b1);
output_high(pin_b3);
delay_ms(10000);
output_low(pin_b1);
output_low(pin_b3);
 
goto basla;
a=0;


}


benim sorunum kesem yapmasını bilmiyorum ve saniyeler kayıyor bununla ilgili örnek verebilirmisiniz amacım 1 veya 1 den fazla çıkışı 10 sn çalışıtırıp durdurmak ve bunusürekli tekrar edilmesi gerek yardımlarınız bekliyorum tskr ederim

kartal_0689

kesme için hangi mikroişlemciyi ve hangi yazılım dilini kullanacaksın?
Çok önemli değilse; delay_ms(10000) çok doğru bir yaklaşım değil.
Bunun yerine 1ms aralıklarla bir değişkeni artırıp for döngüsü içerisinde işlerini yapman.(Bu bana göre diğer türlü sıkıntı yaşıyorum).
Çünkü 10 sn beklettiğinde program bekliyor. Ama for döngüsünde o işlem kadar orada kalmıyor.

Sen yine de mikroişlemcini bildir yeter. O zaman bir timer kurup değişkeni artırarak da sayıcı oluşturabiliriz.
TURKEY/ANK

tersoll

#include "C:\Users\server\Desktop\aaaaa\main.h"

#int_TIMER0
int8 i=0;
void TIMER0_isr(void)
{
set_timer0(60);
i++;
if (i==20){
output_toggle(pin_b0);
}

}


void main()
{
output_b(0x00);
setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // Timer0 ayarlar? yap?l?yor
set_timer0(60); // TMR0 deg(eri belirleniyor
enable_interrupts(INT_RTCC);
enable_interrupts(INT_TIMER0);
enable_interrupts(GLOBAL);

// TODO: USER CODE!!



}

şu şeklide yapmaya çalışıyorum  timer0 60  =1usx256x(256-60)=0.05sn bu durumda zaman=20x0.05=1sn eder şimdi 10 sn de bir bir çıkışı yakıp söndürmemde yardımcı olurmusun bu yöntem doğrumudur öncelikle onu sorim

ete

Namımı eksik duymuşsun. C dilinden anlamam maalesef. BAsic olsa anında çözerdim sorununu.
C den anlayanlar yardımcı olsunlar lütfen.
Ete

Mucit23

Yöntemin doğru.

Alıntı Yap.......if (i==20){
output_toggle(pin_b0);
}

Şimdi i Değişkeni 20 değerine ulaştığında 1 saniyelik gecikme oluyor değilmi? 1 Saniyelik gecikmeyi sağladıysan işin %90'ı bitmiştir zaten

Bundan sonra bir tane daha değişken tanımlaman gerekiyor, adı x olsun.

i şartının içeriğini aşağıdaki gibi yap

if (i==20){
  i=0; i' değerini sıfırladık
  x++; x değerini 1 arttırdık
  if(x==10);x değeri 10 ise 10 saniye geçmiş demektir
  {
     x=0;
     output_toggle(pin_b0);
  }
}

Bundan sonra dakika saat vs aynı mantıkla yaparsın.. Hepsi bundan ibaret.

Birde Timer zaman hesabını yaparken Preload değerini belirlemede PicMultiCalc programını kullanmanı tavsiye ederim. Forumda var.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

tersoll

tşekr ederim çok saolun timer ayarı demişsiniz konuyu acarmısınız biraz ete hocam sizede tşkr ederim :)

tersoll

#include "C:\Users\server\Desktop\aaaaa\main.h"

int i=0;
int x=0; // Tamsay? tipinde deg(is,ken tan?mlan?yor
#int_TIMER0
void  TIMER0_isr(void)
{


    set_timer0(60);   // TMR0 deg(eri belirleniyor
    i++;   //
       if (i==20){
  i=0;
  x++;
  if(x==10);
  {
     x=0;
     output_toggle(pin_b1);
  }
}
}



void main()
{
   set_tris_b(0x00);   // B portu komple ç?k?s,
   output_b(0x00);     // B portu ç?k?s,? ilk anda s?f?rlan?yor
   setup_timer_0(RTCC_INTERNAL | RTCC_DIV_256); // Timer0 ayarlar? yap?l?yor
   set_timer0(60);   // TMR0 deg(eri belirleniyor
   setup_timer_1(T1_DISABLED);
   setup_timer_2(T2_DISABLED,0,1);
   setup_comparator(NC_NC_NC_NC);
   setup_vref(FALSE);
   enable_interrupts(INT_TIMER0);
   enable_interrupts(GLOBAL);

   // TODO: USER CODE!!
  while(1);   // Sonsuz döngü
}

bu şekilde yaptım ama yine 1sn aralıklarla yanıp sönüyor

tersoll


Mucit23

Timer Preload değeri doğruysa çalışması gerekir. Kodun çalıştığından emin ol.
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/

tersoll

çalışıyo fakat saniyeler kayıyo bunu engellemem için ne yapmalıyım çözümü varmı

tersoll

hocam benim ayarlar bundan sizden rica etsem şu kayma olayının formülüünü açıklarmısınız nasıl ayar yapılıyor ben c compıler kullanıyorum size zahmet çok makbule geçer

tersoll


Mucit23

Oradaki ayarları ben bilmiyorum. Bende CCS kullanıyorum ama hiç kullanma gereği duymadım. Herneyse, Kaç Mhz osilatör kullanıyorsun bunu belirtmemişsin. Ben 4Mhz'e göre PicMulticalc programından uygun değerler seçtim.

Örneğin 20Ms aralıklarla kesme oluşturabilmen için Timer0'ın preload değerini 99, Bölücü oranınıda 1/128 Yapman gerekir. Bu durumda 20Ms aralıklarla kesme oluşur. 1Saniyeyi yakalamak için ise kesme alt programındaki i şartını 50 yapman gerekir.(50x20=1000ms=1sn)

Ama senin programda doğru olması gerekir. Sen bölücü oranını 1/256, preload değerini ise 60 yapmışsın. Buda 50ms'ye denk geliyor. İ şartıda 20 olduğu için 50x20'den 1000ms elde edersin.

Bana kalırsa senin başka bir sıkıntın var gibi. İlk önce Programda OSC ayarlarını 4Mhz'ye göre yapılandır. Sonra isiste test ediyorsan eğer Kullandığın MCU'nun özelliklerine Girip Çalışma frekansı 4Mhz olarak ayarlar. Frekans değişkse sana daha hızlı veya daha yavaş yanıyormuş gibi görünebilir.

Son olarak Eğer saat benzeri bir şey yapmaya çalışıyorsan Timer0 yerine Timer1 kullanmanı tavsiye ederim. Timer1, 8 bit yerine 16 Bit counter'e sahip olduğu için daha hassas zamanlamalar elde edebilirsin.

Bu dediklerimi test edip sonucu yaz lütfen..
Bir ulusu yok etmenin En iyi yolu o ulusun dilini yok etmektir.

www.arectron.com/


tersoll

1, ayar sırayla göndericem siz bakın bi zahmet çok tşkr ederim

Powered by EzPortal