MikroC PIC-UART veri yorumlama sorunu

Başlatan metaltrrocker, 10 Mart 2014, 15:19:32

LukeSkywalker

İlk olarak gelen verilerin tamamını belli bir süre gözlemleyin.  Büyük ihtimal ile veriler sizin beklediğiniz gibi gelmiyor. Bunu gözlemleyebilmek için Uarttan karakter okudukça, okunan karakterleri virtual terminale gönderip gözlemleyin...

metaltrrocker

O kısmı en başta dediğiniz şekilde denedim. Gelen verileri olduğu gibi terminale göndermede sıkıntım yok. O kısmı geçtikten sonra 7 segment kodlarını yazıp göndermek isteyince sorunlar oluştu.

LukeSkywalker

pc'den bize hangi veriler geliyor sürekli peki? ben dediğim gibi "=d123", "=d432" gibi veriler gönderince displayde gözleyebiliyorum 123,432 değerlerini.

metaltrrocker

Programın ekran görüntüsünü ekliyorum. Cycle yazan kısım ile oynayınca sonuç değişmiyor. Programdan gelen verileri seçebiliyorum. Veriyi "=bxxx" şeklinde seçtim kodları ilk etapta ona göre yazdım. Refresh time değişme olmaksızın 5 saniye( en düşük) de bir veriyi yolluyor. Flight Simulator'deki panelde değişiklik yaptığım zaman da anlık olarak veriyi yolluyor. Programın çalışma şekli bu şekilde. Programı yazan kişi normalde Arduino için yazmış. İnternette bu programı kullananlar da direk Arduino kitini alıp çalışmaya başlamışlar. Ben de oradaki Com port seçeneğini görüp uyanıklık yapıp. Sanal port açıp Terminalden veriyi okuyunca Arduino kite ihtiyacım olmadığını düşündüm.
Programdan gelen veriler bizim yolladığımız şekilde geliyor. Terminalden aynen yolladığımızdaki gibi okuyorum. Zaten program yollanan veriyi "to Card" kısmında da yazıyor değişme olunca.


LukeSkywalker

ben bu verileri başka bir picden gönderince veriler geliyor ve displayde gözlemleniyor. Siz doğrudan elinizle gönderip denediniz mi?

metaltrrocker

Evet el ile gönderince okuyorum. Ama veriler belirli bir sıklıkla düzenli gelince okumada sorun oluyor.El ile yolladığımdaki gibi okuma yapamıyorum.

LukeSkywalker

while (1)    // Sonsuz döngü
  {
  while(!UART1_Data_Ready())
  {
   heading();
  }
  veribuffer[i]=UART1_Read();
           if(veribuffer[0]=='=')
           {
              i++;
           }
           if(i==5)
           {
              i=0;
           }
   }
}


Aslında bu tür şeyleri kesmeyle yapmak lazım. Yukarıdaki kod çalışır ama yine de bir deneyin isterseniz...

metaltrrocker

Maaselef bunda da aynı hatayı verdi. Kesme ile kullanımı bir araştırayım. PIC16f877A' nın seri port kesmesi varmı onu bilmiyorum şuan ama , Sanal seri port kullanırken seri port kesmesini kullanabilirmiyim? Forumda bu konuyla ilgili bir yazı gördüm orada yazıyordu.

LukeSkywalker

Kesme var 877a.2da. Kullanabilirsiniz sanal seri port ile.

metaltrrocker

Yardımlarınız için teşekkürler keşke en baştan seri port kesmesine yönelseydim dedim. Şu an aşağıdaki kodlarla anlık ve belirli sıklıkta gelen veriyi okuyup 7 segmentlere yazdırıyorum. Verileri çoğaltıp, farklı verileri , farklı 7 segmentlerde göstermeye çalışacam. Z hocamın tavsiyesi üzerine 7 segment kodunu daha sonra ekleyeceğim. Kafamı karıştıran noktalar var.

char uart_rd,verix,xxt;
char veri[20],veribuffer[5];
const char yediseg[]={63,6,91,79,102,109,125,7,127,111};
int i=0;


void heading()
  {
  if(veribuffer[1]=='d')
              {
                /* 7 segment yazdırma kısmı */
                    /////////ilk hane
                    switch (veribuffer[2]) {
                    case '0': PORTB = yediseg[0];  break;
                    case '1': PORTB = yediseg[1];  break;
                    case '2': PORTB = yediseg[2];  break;
                    case '3': PORTB = yediseg[3];  break;
                    case '4': PORTB = yediseg[4];  break;
                    case '5': PORTB = yediseg[5];  break;
                    case '6': PORTB = yediseg[6];  break;
                    case '7': PORTB = yediseg[7];  break;
                    case '8': PORTB = yediseg[8];  break;
                    case '9': PORTB = yediseg[9];  break;
                    }
                    PORTD=0xFE;
                    Delay_ms(45);
                    //////////  ikinci hane
                    switch (veribuffer[3]) {
                    case '0': PORTB = yediseg[0];  break;
                    case '1': PORTB = yediseg[1];  break;
                    case '2': PORTB = yediseg[2];  break;
                    case '3': PORTB = yediseg[3];  break;
                    case '4': PORTB = yediseg[4];  break;
                    case '5': PORTB = yediseg[5];  break;
                    case '6': PORTB = yediseg[6];  break;
                    case '7': PORTB = yediseg[7];  break;
                    case '8': PORTB = yediseg[8];  break;
                    case '9': PORTB = yediseg[9];  break;
                    }
                    PORTD=0xFD;
                    Delay_ms(45);
                    ////////////  üçüncü hane
                    switch (veribuffer[4]) {
                    case '0': PORTB = yediseg[0];  break;
                    case '1': PORTB = yediseg[1];  break;
                    case '2': PORTB = yediseg[2];  break;
                    case '3': PORTB = yediseg[3];  break;
                    case '4': PORTB = yediseg[4];  break;
                    case '5': PORTB = yediseg[5];  break;
                    case '6': PORTB = yediseg[6];  break;
                    case '7': PORTB = yediseg[7];  break;
                    case '8': PORTB = yediseg[8];  break;
                    case '9': PORTB = yediseg[9];  break;
                    }
                    PORTD=0xFB;
                    Delay_ms(45);
              }
             }

void interrupt()
{
  if (RCIF_bit)
  {
    veribuffer[i]=UART1_Read();
    if(veribuffer[0]=='=')
           {
              i++;
           }
    if(i==5)
           {
              i=0; 
              UART1_Write(veribuffer[2]);
           }
     RCIF_bit = 0;
  }
}

void main() 
{
  GIE_bit = 1;                   // Genel kesmeler aktif
  RCIE_bit = 1;                  //Seri port kesmesi aktif
  PEIE_bit = 1;                  // Enable Peripheral interrupt

  ADCON1 = 0x0F;                 // Çıkışları dijital yapıyoruz.
  CMCON  |= 7;
  TRISD = 0x00;
  TRISB = 0x00;
  PORTB = 0x00;
  UART1_Init(115200);             // UART modülü için ayarlamaları yapıyoruz.
  Delay_ms(200);                  // UART modülünün stabilize olmasını bekliyoruz.
  PORTD=0xFF;
  i=0;
   while (1)    // Sonsuz döngü
   {
   heading();
   }
}

SpeedyX

switch (veribuffer[4]) {
                    case '0': PORTB = yediseg[0];  break;
                    case '1': PORTB = yediseg[1];  break;
                    case '2': PORTB = yediseg[2];  break;
                    case '3': PORTB = yediseg[3];  break;
                    case '4': PORTB = yediseg[4];  break;
                    case '5': PORTB = yediseg[5];  break;
                    case '6': PORTB = yediseg[6];  break;
                    case '7': PORTB = yediseg[7];  break;
                    case '8': PORTB = yediseg[8];  break;
                    case '9': PORTB = yediseg[9];  break;
                    }

yerine
PORTB = yediseg[veribuffer[4]-48];

metaltrrocker

Aynen o kodları z hocam da önerdi. Kodları şimdi denedim. Gerçekten işlemciyi yeterince yoruyormuş. Teşekkürler.

fighter_36

merhaba arkadaşlar ben derleme yaptığımda UART1_Data_Ready(); hata olarak raporlanıyor bunun sebebi ne şimdiden teşekürler :'(

ogy

View -> Library Manager bölümünde Uart kütüphanesinin işaretli olduğundan emin olun.

fighter_36

ccs c kullanıyorum o bölümü bulamadım yardımcı olursanız sevinirim