Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Daha fazla hız :)

Başlatan iguruz, 22 Haziran 2009, 01:26:59

iguruz

Merhaba  seri haberleşme ile ilgi bir uygulama geliştiriyorum .
uygulamam şöyle çalışmaktadır. PC den veriyi alıp başka bir cihaza veriyi gönderecek ve cihazda aldığı veriyi pc ye dönecek algoritmam çalışıyor fakat ,algotirmamı dahada hızlandırmak istiyorum 18F4620 pic kullanıyorum 20Mhz kristal:

PC den data alan algoritmam EXT_1 kesmede donuyor.
#int_EXT2
void  EXT2_isr(void)
{
 
  char Gelen[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,
    0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};// gelen datayı attığım dizi
  disable_interrupts(int_EXT2);// kesmeyi devre dışı bırakıyorum
 
   
  ZamanAsimiG=0;//
while(true)
 {
   
   
     if(kbhit(SAYAC2_1))
     {
       
       Gelen[ZamanAsimiG]=fgetc(SAYAC2_1);
       
     }
     else
     {
        Break;

     }
     ZamanAsimiG++;
       
}
 fprintf(MODEM,"%S",Gelen);
 Delay_ms(50);
 enable_interrupts(int_EXT2);
 
}// buradaki dönguyu daha nasıl hızlandırabilirim, yazılım olarak mı? yoksa picin kristalinde değişiklik yapmam lazım

elt42at

Gelen datayı aldığın dizi neden okadar uzun tanımlı?

Belli bir uzunlukta değer mi alıyorsun?

Dizinin her elemanına değer atama bence. Sadece dizinin boyutunu belirt.

Kristal değeri iyi sanırım.

Printf fonksiyonunun biraz gıcıklıkları var. Boyutu büyük ve performansı düşük.

HUB gibi bişi olmuş bu program.

elt42at

Peşisira mesaj yerine önceki mesajı editleyebilirsiniz.

Dikkat ederim

kadirbas

Selamlar iguruz.

Neden harici kesmeyi kullandığınızı anlamadım fakat yine de verdiğiniz koda göre bir kaç yorum yapmak istedim..

Öncelikle, "Gelen" isimli dizinizi global olarak da tanımlayabilirsiniz sanırım. Global olarak tanımlama, işleminizi hızlandırabilir. Eğer bütün işlemi buradaki gibi kesmenin içerisinde yapmayı sürdürecekseniz, sonsuz döngünüzden çıkmadan önce dizinizin bir sonraki elemanına '\0' karakterini atarak, dizinin bütün elemanlarını sıfırlamadan istediğiniz "string" yapısını kullanmaya devam edebilirsiniz...

Çalışmanızı tam olarak bilemediğim için anlamsız bir tavsiye olabilir fakat; kesmeyi sadece elemanları almak için kullanmanızda yarar var bence. Ana programınızda bir döngü oluşturarak diğer işlemleri kontrollü bir şekilde oluşturduğunuz bu döngü içerisinde yaparsanız, kesmeyi de engellememiş olursunuz..

Bu arada kesme içerisinde bekleme fonksiyonunu çağırmak da sizi istemediğiniz bir sonuca götürebilir. Sadece hatırlatma olması açısından söyleyeyim dedim...

Kolay gelsin...

ferdem

Kullandığınız mikroda UART donanımı olmasına rağmen gelen veriyi harici kesme ile alıyorsunuz, buna gerek var mı? UART pinleri başka yerlere lehimlenmiş ve board hazırlanmış olsa belki olabilir ancak böyle bir durum yoksa seri verileri almak için UART kesmesini kullanın. Kesmenin CCS C deki adı #INT_RDA. Forumda örnekleri var, "int_rda" diye aratmak örnekleri getirecektir. Seri veriyi en hızlı almanın yolu ilgili donanımı kullanarak kesme ile almaktır. 20MHz de desteklenen en yüksek baud rate ne bilmiyorum.

Her kesemede gelen veriyi kontrol edip dizinize atabilirsiniz. İyi çalışmalar.

iguruz

Tüm cevaplar için teşekkur ediyorum,

Pic18f4620 kullanmaktayım, evet uart kesmesini kullanamadığım için dış kesmeye bağladım, ve değişkenleri globalde tanımlayarak sorunu çözdüm böylece kesme sırasında değişken ve dizi tanımlama işlemiyle gereksiz zaman kaybı olmuyor gibi...