Hi Tech ile rs232 seri haberleşme interrupt

Başlatan egemenergun, 26 Kasım 2014, 10:39:08

egemenergun

Arkadaşlar öncelikle merhaba. Hi-tech ile seri haberleşme yapıyorum fakat şöyle bir sorunla karşılaştım. TX de yolladığım veriyi pic görüyor ancak tek karakter olarak algılıyor mesela virtuala 12 yazdığım zaman önce 1 sonra 2 olarak görüyor ben ise 12 (on iki) olarak görmesini istiyorum bunun için RX de interrupt yapmam gerekiyormuş ancak nasıl yapacağımı tam olarak bilmiyorum. Yani ben entere basana kadar yazdığım karakterleri toplayıp bastıktan sonra karakterin hepsini almasını istiyorum.

Gökhan BEKEN

Bir tampon(buffer) oluşturacaksınız.
örn:
char tampon[100];

Sonra kesme(interrupt) oluşturacaksınız
her gelen veriyi tampon değişkenine ekleyeceksiniz. Bunu yapabilmek için bir sayaç kullanacaksınız, her gelen veriden sonra sayac'ın değerini 1 artıracaksınız.
Eğer gelen veri, 13(enter) ise artık veriler tamamlanmış demektir, sayac'ı sıfırlayacaksınız ki bir daha kullanabilesiniz. Verileri işleyecek olan fonksiyona gönderebilirsiniz.
Verileri ilgili fonksiyon ile işledikten sonra tamponu temizlerseniz iyi edersiniz.
İşin özeti budur.
Özel mesaj okumuyorum, lütfen göndermeyin.

egemenergun

#2
Tamamdır interrupt yaptım kesme bölümüne yönlendirdim ancak Tampon[100] olayında her gelen karakteri nasıl atıp getch yapacağımı bilmiyorum Yardımcı olabilir misin kısa bir örnekle ?

Teşekkürler

Gökhan BEKEN

Kesmeye girdiğinde karakteri nasıl okuyacağın, kullandığın mcu'nun register'larına bağlı olarak değişir.
16f877a için bir örnek:
char UART_Read()
{
  while(!RCIF); //Waits for Reception to complete
  return RCREG; //Returns the 8 bit data
}


detaylar: https://electrosome.com/uart-pic-microcontroller-hi-tech-c/

kesmenin içinde
tampon[sayac]=UART_Read();
şeklinde çağırıp karakteri alabilirsiniz.
Özel mesaj okumuyorum, lütfen göndermeyin.

egemenergun

#4
static void interrupt isim (void)
{
   
   static int c = 0;

   if(RCIF)
   {
      UartBuff[c] = RCREG;
      c++;
      
      if(RCREG=='13')
      {
      RCREG=getch();
      c=0;
      RCIF=0;
      }
      
      
   }   
}   

Yapmak istediğim bu işte hani orda 13 enter karakteri ama nasıl yazdıracam nasıl yakalayacam bilemedim :/
(bu arada flagın interruptunu RCIE sini başka bir header de 1 yaptım yani asıl hedefim şuan burdan entere basana kadar karakterleri alıp enterle yollamak

Gökhan BEKEN

if(RCREG=='13')

yanlış olmuş '13' diye bir karakter olamaz, ascii kodu 13 olan bir karakter olur ancak.
Yani şöyle yapmalısınız:
if(RCREG==13)

veya
if(RCREG==0x0D)

Özel mesaj okumuyorum, lütfen göndermeyin.