16f877A ile PIC C kullanarak RS232'den integer veri alma

Başlatan zeratul, 28 Şubat 2011, 14:48:08

zeratul

Herkese merhaba,
Bu konu üzerinde kaç gündür internetin altını üstüne getirmeme rağmen doğru düzgün bilgiye rastlayamadım.
Yapmaya çalıştığım şey temel olarak C# üzerinden servo sürmek.
Bunu C#'tan 0-180 arası byte göndererek zaten yapabiliyoruz.
Ama ben pulse süresini (650-2350 arasında bir değer) mikrosaniye cinsinden göndermek istiyorum. Yani,
      output_high(PIN_C0);
      delay_us(d);
      output_low(PIN_C0);
      delay_us(20000-d);

d değerini integer olarak göndermek istiyorum.
Bunu şu şekilde çözdüm aslında ama çok uzadı kod:

C# kısmının ilgili bölümü:
            if (tBar_ServoHR.Value >= 650 && tBar_ServoHR.Value < 895)
            {
                send(248);
                send(Byte.Parse((tBar_ServoHR.Value - 650).ToString()));
            }
            else if (tBar_ServoHR.Value >= 895 && tBar_ServoHR.Value < 1140)
            {
                send(249);
                send(Byte.Parse((tBar_ServoHR.Value - 895).ToString()));
            }
            else if (tBar_ServoHR.Value >= 1140 && tBar_ServoHR.Value < 1385)
            {
                send(250);
                send(Byte.Parse((tBar_ServoHR.Value - 1140).ToString()));
            }
            else if (tBar_ServoHR.Value >= 1385 && tBar_ServoHR.Value < 1630)
            {
                send(251);
                send(Byte.Parse((tBar_ServoHR.Value - 1385).ToString()));
            }
            else if (tBar_ServoHR.Value >= 1630 && tBar_ServoHR.Value < 1875)
            {
                send(252);
                send(Byte.Parse((tBar_ServoHR.Value - 1630).ToString()));
            }
            else if (tBar_ServoHR.Value >= 1875 && tBar_ServoHR.Value < 2120)
            {
                send(253);
                send(Byte.Parse((tBar_ServoHR.Value - 1875).ToString()));
            }
            else if (tBar_ServoHR.Value >= 2120 && tBar_ServoHR.Value < 2350)
            {
                send(254);
                send(Byte.Parse((tBar_ServoHR.Value - 2120).ToString()));
            }


C#taki send de şöyle bir şey
public void send(byte outdata)
{
         byte[] buffer = { 0 };
         buffer[0] = outdata;
         serialPort1.Write(buffer, 0, 1);
}


şimdi de PICC kodu:
#int_rda
void bgetc() {
   
   c=getc();


   
   if(c>=248) aralik=c-247;
   if(c<248)
   {
   c=getc();
   if (aralik==1) d=c+650;
   if (aralik==2) d=c+895;
   if (aralik==3) d=c+1140;
   if (aralik==4) d=c+1385;
   if (aralik==5) d=c+1630;
   if (aralik==6) d=c+1875;
   if (aralik==7) d=c+2120;
   }
}

Daha kompakt ve pratik bir yol olabilir mi acaba? mesela gets() kullanılır?
ya da direk C#'tan int aktarma.

Teşekkürler.