getch(); komutundan çıkabilir miyim?

Başlatan nocturnal, 17 Nisan 2011, 05:07:07

nocturnal

Arkadaşlar merhaba, öncelikle bu kaliteli siteye üye olduğum için mutlu olduğumu belirtmek isterim.
Amatör ile profesyonel seviye arasında PIC programlıyorum. Derleyici olarak HI TECH C kullanıyorum. Benim merak ettiğim ve internette araştırarak yanıtını bulamadığım bir soru var:

getch(); komutundan çıkabilir miyim bunu merak ediyorum. Şöyle düşünün:

İşlemci eğer USART pinlerini dinliyor ve 5 saniye boyunca buradan veri gelmiyorsa, portu dinlemeyi bırakıp gerekli hata(); işlemlerini gerçekleştirsin..

16F628A kullanıyorum.  TIMER'la RCIF'yi '1' yapmayı denedim fakat RCIF bayrağı read-only olduğu için bunu gerçekleştiremedim haliyle. getch(); alt programı ise aşağıdaki gibi standart:

unsigned char getch(void)
{
while(!RCIF);
return RCREG;
}


sizce buradan nasıl çıkabilirim? Böyle bir şey mümkün müdür?

scaemteitn

unsigned char getch(void)
{
unsigned int x ;

for(x=0;x>50;x++)
           while(!RCIF);
return RCREG;
}

for döngüsü ile yapsan olur mu diye düşündündüm ama emin değilim.

mozkan87

Bu şekilde yapacağınıza usart interrupt kullanın veri geldiğinde interrupt oluşur sorun çözülür yada illa belli bir süre veri geldi mi diye bakıp sonra yolunuza devam etmek istiyorsanız internette ararken yanına bide timeout kelimesini ekleyin mutlaka kazır bir kod bulursunuz.

nocturnal

Sayın scaemteitn; Dediğiniz şekilde yapmak bir şey değiştirmiyor. Çünkü while(!RCIF); dediğiniz yerde iş bitiyor. Yine de teşekkür ederim yanıtınız için..

Sayın mozkan87; Önerdiğiniz çözümleri araştıracağım. Teşekkür ederim.

Bu arada bilgisayarımın formatı geldiğinden midir bilinmez, iletimi tekrar düzenleyemedim. Yükleniyor diyor, kalıyor öyle.. Mesajımdaki "Amatör ile profesyonel seviye arası" ifadelerini değiştirecektim. Zira buradaki çoğu üstada haksızlık yapmış olabilirim. Sürç-i lisan ettiysem affola..

XX_CİHAN_XX

@nocturnol,
öncelikle aramıza hoş geldin  :)

Aradığın cevap aslında ccs in helpinde mevcut. Anahtar kelime ise kbhit. Örnek kod ise şu şekilde:

char timed_getc() {
   long timeout;
   timeout_error=FALSE;
   timeout=0;
   while(!kbhit()&&(++timeout<50000)) // 1/2 second
          delay_us(10);
   if(kbhit())
          return(getc());
   else {
          timeout_error=TRUE;
          return(0);
   }
}
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.

nocturnal

Hoşbuldum XX_CİHAN_XX  :)
mozkan87 arkadaşımın da önerdiği üzere yaptığım araştırmaların çoğunda kbhit ile karşılaştım. ANSI C standartlarında yazdığım için X-Fi arkadaşımdan aldığım tavsiye doğrultusunda getch()'i interrupt olarak kullanıp, 64byte'lık bir buffer'a atamayı düşünüyorum. Bu arada ilgileriniz için teşekkürü borç bilirim.

XX_CİHAN_XX

Kusura bakmayın Hi Tech C kullandığınız gözümden kaçmış.
Haklısınız en güzeli bu işi kesme kullanarak halletmektir.
PIC in kendi donanımsal UART modülünü kullanarak çözüme gitmek  en sağlıklı yöntem.

Kolay gelsin.
Yirmi yaşındaki bir insan, dünyayı değiştirmek ister . Yetmiş yaşına gelince , yine dünyayı değiştirmek ister, ama yapamayacağını bilir.