Haberler:

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

Ana Menü

5 Byte veriyi almak

Başlatan M_B, 29 Aralık 2015, 05:30:14

M_B

Merhaba arkadaslar.

Slave kartından göndermiş olduğum 5 Byte veriyi master kartım da dogru ve duzgun alamıyorum.
Nerde neyi kacırıyorum anlamadım.  Bu konuda yardımlarınıza ihtiyacım var.

Not: alıcı programı mikroC ile yazdığımda bire bir verileri alabiliyorum. en alt bolumde calısan mikroC kodu var.
CCS C ile malesef olmadı. Benim CCS C ile yapmam lazım :(

Gonderdiğim veriler:
0xFE 0x02 0x03 0x04 0xFF
Alıcı Program  bolumu aşağıdaki gibi. 
#include <18F2620.h>
#device  adc=16

#include <stdlib.h>
#include <string.h>


#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES H4                       //High speed osc with HW enabled 4X PLL
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)



#use delay(clock=40000000)
 


#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)    
                                                                     

#define rx_boyut 5 			//rs232 buffer boyutu

char RxBuffer[rx_boyut];   //rs232 seri data rx buffer
int index=0;               //rs232 rx datası indexi
char temp;
char reading=0;
char flag=0;



#INT_RDA
void interrupt_ISR(void)
{            
              temp=getc();   
              index=0;    // Dizi baslangic indexine aliniyor.
              if(temp==0xFE)
                          {
                           RxBuffer[0]=temp;
                            index=1;
                            reading=1;
                            }
                            else if(reading)
                                        { 
                                         RxBuffer[index]=getc();   // eger hata yoksa veri alinir.
                                          index++;
                                          if( index>=5)
                                                    {
                                                     index=0;
                                                     reading=0;
                                                     flag=1;
                                                    } // index>=5
                                         }// reading     
}// end.
/*************************************************************************************/



void main()
{
   set_tris_a(0x00);
   set_tris_b(0x00);
   set_tris_c(0x00);
      
  
    
    puts("**********************************");
    puts("  RS232 demo with CCS C compiler  ");
    puts("**********************************");
    
    /* start a new line (CR + LF) */
    putc('\n');
    putc('\r');
    enable_interrupts(int_rda);         // Rs-232 İnterrupt aktif
    enable_interrupts(GLOBAL);
      
      while(1)
      {
          delay_ms(250);
          delay_ms(250);

          if(flag){
                     if(RxBuffer[0]==0xFE&&RxBuffer[4]==0xFF)
                                    {
                                       flag=0;
                                        putc(RxBuffer[0]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                                        putc(RxBuffer[1]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                                        putc(RxBuffer[2]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                                        putc(RxBuffer[3]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                                        putc(RxBuffer[4]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                             
                                    }
                                       else{
               
                                           RxBuffer[0]=0x00;
                                           RxBuffer[1]=0x00;
                                           RxBuffer[2]=0x00;
                                           RxBuffer[3]=0x00;
                                           RxBuffer[4]=0x00;
                                           
                                           putc(RxBuffer[0]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                                           putc(RxBuffer[1]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                                           putc(RxBuffer[2]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                                           putc(RxBuffer[3]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                                           putc(RxBuffer[4]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                                           }
                  }
                    else{
                                    flag=0;
         
                                     RxBuffer[0]=0x00;
                                     RxBuffer[1]=0x00;
                                     RxBuffer[2]=0x00;
                                     RxBuffer[3]=0x00;
                                     RxBuffer[4]=0x00;
                             
                }
          }// while end.
} //end


Gonderici Bolum xc8 ile yazıldı.
void main(void) {
    Init_MCU();
    Init_UART();
    printf("Iletisim Test Uygulama Master bolum\r\n");
    RxBuffer[0]=0xFE;       // Baslangic degeri.
    RxBuffer[1]=0x02;
    RxBuffer[2]=0x03;
    RxBuffer[3]=0x04;
    RxBuffer[4]=0xFF;  // Bitis degeri.
  

  printf("Veriler Gonderilecek \r\n");
while(1)
     {   
      Delay_ms(500);
      UART_SendData(RxBuffer[0]);   //RxBuffer[0] icerigi  gonderiliyor.
      UART_SendData(RxBuffer[1]);
      UART_SendData(RxBuffer[2]);
      UART_SendData(RxBuffer[3]);
      UART_SendData(RxBuffer[4]);
     }// while end.
   
}// end.


mikroC ile test icin yazdığım calışan program.
char rxbuf;
char read=0;
char rxbuff[5];                    // Buffer variable for storing data sent from master
char rxidx;                         // Counter for data writen in buffer
char  flag=0;
char ch;


void interrupt (void)
{
    static char StrIdx;
   if(PIE1.RCIE&&PIR1.RCIF)
   {
       if(RCSTA.OERR)  // Ustune yazma hatasi olustu.
            {
            RCSTA.CREN=0;
            RCSTA.CREN=1;
            StrIdx=0;
            } else if(RCSTA.FERR)// Frame Hatasi
                        {
                            ch=RCREG;    //RCREG bufferi bosaltmak icin okunuyor.
                            StrIdx=0;    // Dizi baslangic indexine al?n?yor.
                        }
                    else
                        {  // Burdan sonra veriler alinmaya baslaniyor.
                                ch=RCREG;
                                if(ch==0xFE)
                                            {
                                             rxbuff[0]=ch;
                                             StrIdx=1;
                                             read=1;
                                            }
                                            else if(read)
                                                    {
                                                        rxbuff[StrIdx]=RCREG;   // eger hata yoksa veri alinir.
                                                        StrIdx++;
                                                        if(StrIdx>=5)
                                                            {
                                                                StrIdx=0;
                                                                read=0;
                                                                flag=1;
                                                            } //StrIdx>5
                                                    }// reading
                        }// else nin.
   } // RCIE &&RCIF nin End.
}// end.


void main() {
TRISA=0;
TRISB=0;
TRISC=0;

PORTA=0;
PORTB=0;
PORTC=0;


  rxidx  = 0;                       // Initialisation of variable


  UART1_Init(9600);                // Initialize UART module at 19200 bps
  Delay_ms(100);                    // Wait for UART module to stabilize

  UART1_Write_Text("Start");        // Send text
  UART1_Write(13);                  // ASCII carriage return
  UART1_Write(10);                  // ASCII line feed (new line)
  UART1_Write_Text("Master Test");        // Send text
  UART1_Write(10);                  // ASCII line feed (new line)
  UART1_Write(13);                  // ASCII carriage return

  RCIE_bit=1;
  RCIF_bit = 0;                    // Clear interrupt flag
  PEIE_bit  = 1;                    // Enable peripheral interrupts
  GIE_bit   = 1;                    // Enable GLOBAL interrupts

 
  while(1)  {
          Delay_ms(250);
          Delay_ms(250);

          if(flag){
          if(rxbuff[0]==0xFE&&rxbuff[4]==0xFF)
                    {
                     flag=0;
                    UART1_Write(rxbuff[0]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                    UART1_Write(rxbuff[1]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                    UART1_Write(rxbuff[2]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                    UART1_Write(rxbuff[3]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                    UART1_Write(rxbuff[4]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                    UART1_Write(13);                  // ASCII carriage return


                    }
                        else{

                            rxbuff[0]=0x00;
                            rxbuff[1]=0x00;
                            rxbuff[2]=0x00;
                            rxbuff[3]=0x00;
                            rxbuff[4]=0x00;


                            UART1_Write(rxbuff[0]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                            UART1_Write(rxbuff[1]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                            UART1_Write(rxbuff[2]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                            UART1_Write(rxbuff[3]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                            UART1_Write(rxbuff[4]); // kesme ile alm?? oldu?umuz veriye bak?yoruz.
                            }
          }
           else{
                           flag=0;

                            rxbuff[0]=0x00;
                            rxbuff[1]=0x00;
                            rxbuff[2]=0x00;
                            rxbuff[3]=0x00;
                            rxbuff[4]=0x00;
                }
          }// while end.
}
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

JKramer

1- index'i her kesmede sıfırlıyorsunuz.
2- Kesme başlangıcında zaten getc() ile veriyi temp'e atmışsınız, aşağıda tekrar getc() yerine temp'i kullanmanız lazım.

M_B

Alıntı yapılan: JKramer - 29 Aralık 2015, 08:33:45
1- index'i her kesmede sıfırlıyorsunuz.
2- Kesme başlangıcında zaten getc() ile veriyi temp'e atmışsınız, aşağıda tekrar getc() yerine temp'i kullanmanız lazım.
index ve getc() gozumden kacmıs ama degisen bir sey olmadı. :(
Bir yerde yanlışlık var ama nerede ?
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

JKramer

#3
Olmuyor derken nasıl olmuyor? index'in 5 olduğu yere bir breakpoint koyup RxBuffer içeriğine baktınız mı?

Bir de fastio diye bir şey vardı, tris ayarlarını her seferinde otomatik ayarlamayıp sizin belirttiğiniz şekilde giriş-çıkışlar sabit oluyordu. Uart için gerekli olabilir.

Ekleme:
#use fast_io(c)
...
set_tris_c(uart receive pini giriş olacak)

MrDarK

#4
Alıntı yapılan: M_B - 29 Aralık 2015, 09:06:31
index ve getc() gozumden kacmıs ama degisen bir sey olmadı. :(
Bir yerde yanlışlık var ama nerede ?

Ek notum;
- Define terimleri tanımlanırken tüm bilgi büyük harf ile yazılır. Bu şekilde yazan parametrenin sabit olduğu anlaşılır.

#include <18F2620.h>
#device  adc=16

#include <stdlib.h>
#include <string.h>


#FUSES NOWDT                    //No Watch Dog Timer
#FUSES WDT128                   //Watch Dog Timer uses 1:128 Postscale
#FUSES H4                       //High speed osc with HW enabled 4X PLL
#FUSES NOBROWNOUT               //No brownout reset
#FUSES NOLVP                    //No low voltage prgming, B3(PIC16) or B5(PIC18) used for I/O
#FUSES NOXINST                  //Extended set extension and Indexed Addressing mode disabled (Legacy mode)



#use delay(clock=40000000)
 


#use rs232 (baud=9600, xmit=pin_C6, rcv=pin_C7, parity=N, stop=1)    
                                                                     

#define RX_BOYUT 5 			//rs232 buffer boyutu

char RxBuffer[RX_BOYUT];   //rs232 seri data rx buffer
int index=0;               //rs232 rx datası indexi
char temp;
char reading=0;
char flag=0;



#INT_RDA
void interrupt_ISR(void)
{            
	RxBuffer[index] = getc();   
	index++;
	if( index >= 5)
	{
		index=0;
		flag = 1;	// 5 karakter geldiğinde ana program kontrol eder.
	}
}
/*************************************************************************************/

void main()
{
	set_tris_a(0x00);
	set_tris_b(0x00);
	set_tris_c(0x80);
      
    puts("**********************************");
    puts("  RS232 demo with CCS C compiler  ");
    puts("**********************************");
    
    /* start a new line (CR + LF) */
    putc('\n');
    putc('\r');
    enable_interrupts(int_rda);         // Rs-232 İnterrupt aktif
    enable_interrupts(GLOBAL);
      
	while(1)
	{
		delay_ms(250);
		delay_ms(250);

		if(flag)
		{
			if( (RxBuffer[0] == 0xFE) && (RxBuffer[4] == 0xFF) )
			{
				// Verini incele !!!
			}
			flag = 0; // kontrol bitiminde flag temizlenir.
		}// while end.
	}
} //end
Picproje Eğitim Gönüllüleri ~ MrDarK

M_B

@MrDarK  Hocam;
Bu CCS C beni delirtecek
verdiğiniz kodu derledim. ( duzenlediginiz )
Ekrana yansıtmaları yaptıktan sonra interrupları acma kısmına geldikten sonra herhangi bir haereketlenme yok.
Devreyi gercek ortamda deniyorum. (RS-232 icin Realterm kullanıyorum. )
18f2620 nin RX ucuna gelen verileri goruyorum hex olarak.
Tekrardan acaba kesme olmuyormu diye düsünüp
#INT_RDA
void interrupt_ISR(void)
{            
	RxBuffer[index] = getc();   
        putc(RxBuffer[index] );   // Eklemesini yaptım ne geliyorsa aynen dısarı veri cıkıyor. 
	index++;
	if( index >= 5)
	{
		index=0;
		flag = 1;	// 5 karakter geldiğinde ana program kontrol eder.
	}
}


Daha sonra kesme icine eklediğim    putc(RxBuffer[index] );   
kaldırıp istediğim sart altına bir tane Buzzer bagladım. ( Devrede var zaten aktif ettim )
değişen bir sey yok.
Bu seferde flag ters durumu icin test edeyim dedim.
yani
if(!flag)
		{
			if( (RxBuffer[0] == 0xFE) && (RxBuffer[4] == 0xFF) )
			{
				BipBip();// Verini incele !!!
			}
			flag = 0; // kontrol bitiminde flag temizlenir.

Gene olmadı.
Niye kesme icine
putc(RxBuffer[index] );   
ekledigimde kitlenmiyor calışıyor.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

MrDarK

#6
Şöyle dene, Ana programını boşveriyorum;

#INT_RDA
void interrupt_ISR(void)
{            
	RxBuffer[index] = getc();   
	index++;
	if( index >= 5)
	{
		int8 i;
		for(i=0; i<5; i++)
			putc(RxBuffer[i]);
		index=0;
		flag = 1;	// 5 karakter geldiğinde ana program kontrol eder.
	}
}


5 tane karakter Rx bufferına düştüğünden emin olalım önce. Sonra gerekirse usart interrupt'ını kapatıp ana programda kontrol sonrasında usart interrupt'ını tekrar aktif ettirebilirim.

Terminal programından gönderdiğin ve mcu'nun sana gönderdiği bilgileri de mümkünse resim olarak ekleyebilir misin ?
Picproje Eğitim Gönüllüleri ~ MrDarK

M_B

#7
Alıntı yapılan: JKramer - 29 Aralık 2015, 09:35:04
Olmuyor derken nasıl olmuyor? index'in 5 olduğu yere bir breakpoint koyup RxBuffer içeriğine baktınız mı?

Bir de fastio diye bir şey vardı, tris ayarlarını her seferinde otomatik ayarlamayıp sizin belirttiğiniz şekilde giriş-çıkışlar sabit oluyordu. Uart için gerekli olabilir.

Ekleme:
#use fast_io(c)
...
set_tris_c(uart receive pini giriş olacak)

Hocam RC7 (RX pin ) giriş olarak ta ayarladım
#use fast_io(c) 'leride ekledim olmadı.
Simulasyonda degil gercek devre üzerinde deniyorum.



mesaj birleştirme:: 29 Aralık 2015, 11:26:20

Gelen veri ( Masterin gonderdigi )


Buda bizim alıp ta dışarıya gonderdigimiz.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

M_B

@MrDarK hocam;
Resimlerden de gördüğünüz üzere veri siralamasi degismis. Niye boyle oluyor anlamis degilim.mikroc ile yaptigimda veri siralamasinda ve almasinda sikinti yok.
İmkanın sınırlarını görmek için imkansızı denemek lazım.                                                             Fatih Sultan Mehmet

MrDarK

Sadece böyle bir spesifik örnek için aşağıdaki gibi revizyon yapılabilir. Fakat pek tercih ettiğim bir method değil. İşini görecek cinsten.

#INT_RDA
void interrupt_ISR(void)
{
	int8 Data = getc();
	
	if(Data == 0xFE)
		index = 0;
		
	RxBuffer[index] = Data;
	index++;
	if( index >= 5)
	{
		int8 i;
		for(i=0; i<5; i++)
			putc(RxBuffer[i]);
		index=0;
		flag = 1;	// 5 karakter geldiğinde ana program kontrol eder.
	}
}
Picproje Eğitim Gönüllüleri ~ MrDarK