Haberler:

Forum kuralları güncellendi LÜTFEN  okuyunuz:  https://bit.ly/2IjR3ME

Ana Menü

Hi-Tech C Yazılımsal Usart

Başlatan serhat1990, 10 Mart 2012, 21:43:38

serhat1990

Merhaba arkadaşlar... Hi-Tech C 'ye 3 ay önce geçtim. Kendi çapımda birşeyler yapmaya başladım . Yalnız bir yerde takıldım. Bana 2 tane usart lazım. Yalnız kullandığım işlemcide tek usart var. Kendim yazılımsal usart yazdım. Gönderme tarafında hiç bir sorun yok . Testlerini bile yaptım fakat veri alamıyorum. Alakasız veriler alıyorum buda sıkıntı yaşatıyor. Baud rate içi sürelerin dogru olduguna eminim göndermede sıkıntı yasamadıgımdan bu görüşe vardım. Alma fonksiyonu için düşüncesi olan arkadaslar paylasırsa cok sevinirim. Alma fonksiyonum aşağıdaki gibidir...

Herkese iyi çalışmalar dilerim...


unsigned char usart_read(void)   //usarttan gelen veriyi okuma fonksiyonu...

{
packet=0;       //VERİ paketi her okuma fonksiyonunda temizlenir.
DelayUs(250);DelayUs(125);
   
   for(i=0;i<8;i++)      // işlem 8 kez tekrarlanacak.
   
   {
   
   packet=packet>>1;         //paketi 1 bit sağa kaydır...
   if(RX==1)packet=packet|0x80;      //rx pini 1 ise paket verisini 0x80 ile veyala. değilse işlem yapma.
   DelayUs(250);DelayUs(125);      //375 uS bekle. 2400 baud rate içi gerekli gecikme hesaplanır...
   
   }
      if(RX==1)               //stop biti geldimi kontrol edilir.
         
         {
            return packet;      //paket değişkeni ile geri dön...
         }

else {return 0;}      //stop biti veya baslangıc biti gelmediyse icerik 0 ile geri dön...
   
  }   

z

#1
Kodunda start bitini yakalayan bolumu goremedim.

unsigned char usart_read(void)   //usarttan gelen veriyi okuma fonksiyonu...
{
   DAT=0;                 // unsigned char
   Error=1;               // unsigned char

   if (!Rx) return(0);  // Start biti kacmis
   while(Rx);             // Start bitini bekle
   DelayUs(208);      // 2400 Baud icin gerekli Delay degerinin yarisi = 1E6/2400/2     
   DelayUs(416);      // 2400 Baud icin gerekli Delay degeri = 1E6/2400
   for(i=0;i<8;i++) 
      {
         Dat=Dat>>1;     
         if(Rx) Dat|=0x80;
         DelayUs(416);
      }
   if(!Rx) return(0);  //Stop biti olmaliydi (Start biti yanlis yerde yakalanmis vs)
   Error=0;
   Return(Dat);   
}   

Bana e^st de diyebilirsiniz.   www.cncdesigner.com

serhat1990

ana program USART'ta rcıf bitini gözler gibi bende start bitini gözlüyorum gördüğüm anda veri alma fonksiyonuna giriyorum. Aşağıda koydum şimdi...

  if(RX==0)
   {
      gelen=usart_read();
      PORTD=gelen;
    }
   


serhat1990

Teşekkür ederim sorun start bitini gözlemlememek değil sorun sürede göndermede sorun yasatmaması kafamı karıstırdı . Komut süreleri falan derken ben bekleme süresini biraz azalttım. Ama aklım bir türlü bu olayla uyusmadı .. Yani sürede problem varmıs sorun çözüldü ama gönderme kısmındada süre aynı neden burada bir hata olmuyor 2 işlemci arası ve pc ile 2400 baudda veri gönderme yaptım hiç bir sıkıntı oluşmadı... İyi çalışmalar...

sseedat

merhaba arkadaşlar 16f877a ile  rf uygulaması yapıyorumda bi türlü veri iletimini gerçekleştiremedim problem yazılım da mı donanımda mı bi türlü anlayamadım.Verici  ve alıcı kodları  bunlar yazılımda problem varmı yardımcı olursanız çok iyi olur.
#include <htc.h>
#include <delay.c>
#include <stdio.h>
#include <lcd.c>


#define   BAUD   192000
#define   FOSC    4000000L
#define   RX_PIN   TRISC7
#define   TX_PIN   TRISC6


extern  void  usart_kur(void);
extern  unsigned char  usart_al(void);
extern  void  usart_ilet(unsigned const char  *veri );

//.c dosyası
void usart_kur(void)
{
SPBRG=12;//baud hızı 19200 
BRGH=1;
SYNC=0;
SPEN=1;
CREN=1;
TX9=0;
RX9=0;
TXEN=1;
}

unsigned char usart_al(void)
{
  while(!RCIF);
  return  RCREG;
}
void  usart_ilet(unsigned const char  *veri)
{
//while(!TXIF);
while(*veri)
{
TXREG=(*veri++);
while(!TXIF);
}
TXIF=0;
}
void syncsend()
{
	unsigned char syn[6]={0x55,0x55,0x55,0x55,0x55};
	usart_ilet(syn);
	
}
void senkron()
{
	unsigned char snk[6]={0xFF,0xFF,0xFF,0xFF,0xFF};
	usart_ilet(snk);
}



 unsigned char sonuc[]="temp= ";
main(void)
{
	unsigned char a,b,i,h;
		TRISB=0;
		PORTB=0;
		TRISA=1;
	    TRISD=0x00;
	    PORTD=0x00;
	    TRISC=0xF0;
	    PORTC=0;
	   
	     lcd_init();
	     lcd_clear();
	     
	     usart_kur();
	     DelayMs(100);
	    
	     
	     	for(;;)
	     	{
	     		
	     	  syncsend();
	     	  DelayMs(250);
	     	 senkron();
	     	 for(i=0;i<100;i++)
	     	 {
	     		usart_ilet("abc");
	     		DelayMs(100);
	     		 
	     	 }     	
}
}


alıcı;
     	   h=usart_al();  //unsigned  char h;
	     	   sprintf(sonuc,"%d",h);
	     	   lcd_puts(sonuc);
	     	   usart_ilet(sonuc);
Görünmez bir mezarlıktır Zaman...

yamak

Bak şimdi sedat ilk olarak.Alıcı tarafta senkron bilgisine göre lcd'ye yazdırma kısmına geçmen lazım.Yani sen her alınan karakteri lcd'yazdırırsan lcd'de saçma sapan karakterler çıkar. Çünkü 5 byte preamble+senkron bilgisi gönderiyosun.Bunları da yazdırınca lcd'de saçma sapan karakterler çıkar.Bi de göndereceğin   paket şu şekilde olsun.5 byte preamble+2 byte senkron+data.Alıcı tarafta senkronu alana kadar bekle senkronu alınca aldığın karakterleri lcd'ye yazdır.

sseedat

slm arkadaşlar üzerinde çalıştığım bir RF uygulamasında şöyle bir problemle karşılaşıyorum "Alıcı ve verici devrelerini aynı gerilim kaynağıyla besleyince normal bilgi iletimi oluyor fakat variciyi farklı bir gerilim kaynağıyla beslediğimde bu sefer bilgi iletimi falan olmuyor."bunun neyden kaynaklandığını bilen varmı?
not:devrede RF aktif değil pic(16f877a)lerin bacakalrını iletim için birbirine bağladım
Görünmez bir mezarlıktır Zaman...

mozkan87


sseedat

gnd ortak yaptım fakat bişey değişmedi.zz
Görünmez bir mezarlıktır Zaman...

arslan74

Merhaba,

Yazılımsal Uart'da beklem rutinleri sürekli sabit uzunluklarda olmalıdır. Yani interrupt gecikmelerinden etkilenmemeli. O yüzden Bu gecikmeleri Timer registeyle yapmalısınız.
O zaman doğru birokuma yapmış olursun. Bende yazılımsal Uart yapmıştım bir zamanlar. Göndermeyi ve almayı Timer inter interruptu aldında yaptım sorunsuz çalıştı. Main altında düzgün çalışan soft uart yapılmiyor.

Kolay gelsin

serhat1990

Alıntı yapılan: arslan74 - 26 Mart 2012, 07:17:11
Merhaba,

Yazılımsal Uart'da beklem rutinleri sürekli sabit uzunluklarda olmalıdır. Yani interrupt gecikmelerinden etkilenmemeli. O yüzden Bu gecikmeleri Timer registeyle yapmalısınız.
O zaman doğru birokuma yapmış olursun. Bende yazılımsal Uart yapmıştım bir zamanlar. Göndermeyi ve almayı Timer inter interruptu aldında yaptım sorunsuz çalıştı. Main altında düzgün çalışan soft uart yapılmiyor.

Kolay gelsin

Teşekkürler Arslan Hocam o işi hallettim . Ama timerla yapmamıştım timer kullanarak yapayım birde timer kullanınca ayarlanabilir baud rate'li yapabilirim  :) :)

sseedat

#11
merhaba arkadaşlar şu RF ile bi türlü veri gönderemedim.normal pıc leri biririne bağladığımda sorunsuz devre çalışıyor fakat RF işin içine girince herşey kabusa dönüyor sorun RF lerdemi(çeşit çeşit RF denedim) yoksa yazılımda mı yardımcı olursanız sevinirim.
verici devre kodları:
#include <htc.h>
#include <delay.c>
#include <stdio.h>
#include <lcd.c>



//.h dosyası 

#define   BAUD   1200
#define   FOSC    4000000L
#define   RX_PIN   TRISC7
#define   TX_PIN   TRISC6


extern  void  usart_kur(void);
extern  unsigned char  usart_al(void);
extern  void  usart_ilet(unsigned const char  *veri );

//.c dosyası
void usart_kur(void)
{
SPBRG=207;//baud hızı 1200
BRGH=1;
SYNC=0;
SPEN=1;
CREN=1;
TX9=0;
RX9=0;
TXEN=1;
}

unsigned char usart_al(void)
{
  while(!RCIF);
  return  RCREG;
}
void  usart_ilet(unsigned const char  *veri)
{
//while(!TXIF);
while(*veri)
{
TXREG=(*veri++);
while(!TXIF);
}
TXIF=0;
}




main(void)
{
	unsigned char preamble[17]={0xAA,0xAA,0xAA,0xAA,0xAA,0x00,0x00,0x00,0x00,0xFF,0xFF,0xFF,0xFF,0xFF}; 
	unsigned char senkron[3]={0xCE,0xFE,}; 
	
	unsigned char sonuc[]=" ";
	unsigned char a,b,i,h;
   
		float gerilim,f1,f2;
		const float x=5.0/1024.0;
		TRISB=0;
		PORTB=0;
		TRISA=1;
	    TRISD=0x00;
	    PORTD=0x00;
	    TRISC=0xF0;
	    PORTC=0;
	      
	     PCFG3=0;
	     PCFG2=1;
	     PCFG1=0;
	     PCFG0=0;
         
	     CHS2=0;
	     CHS1=0;
	     CHS0=0;
	     
	     ADFM=1;
	     ADON=1;
	   
	     lcd_init();
	     lcd_clear();
	     
	     usart_kur();
	     DelayMs(100);
	    
	     
	     	for(;;)
	     	{
	     	
	     		ADGO=1;
	     		     		while(ADGO);			
	     		     		gerilim=ADRESH*256.0+ADRESL;
	     		     		nem=gerilim*x*100.0;
	     		     		a=(int)nem;
	     		     		sprintf(sonuc,"%dCs",a);
	     		     	
	     		     		
	     		     		//*********************************************************************
	     		     		usart_ilet(preamble);
	     		     		usart_ilet(senkron);
	     		     		     		usart_ilet(sonuc);
	     		     		     	
	     	
}
}

alıcı devre kodları:
#include <htc.h>
#include <delay.c>
#include <stdio.h>
#include <lcd.c>



//.h dosyası 

#define   BAUD   1200
#define   FOSC    4000000L
#define   RX_PIN   TRISC7
#define   TX_PIN   TRISC6


extern  void  usart_kur(void);
extern  unsigned char  usart_al(void);
extern  void  usart_ilet(unsigned const char  *veri );

//.c dosyası
void usart_kur(void)
{
SPBRG=207;//baud hızı 1200
BRGH=1;
SYNC=0;
SPEN=1;
CREN=1;
TX9=0;
RX9=0;
TXEN=1;
}

unsigned char usart_al(void)
{
  while(!RCIF);
  return  RCREG;
}
void  usart_ilet(unsigned const char  *veri)
{
//while(!TXIF);
while(*veri)
{
TXREG=(*veri++);
while(!TXIF);
}
TXIF=0;
}


unsigned char f[6]=" ";
 unsigned char sonuc[]=" ";
main(void)
{
	unsigned char a,b,i=0,h;
   
		float gerilim,f1,f2;
		const float x=5.0/1024.0;
		int w,q=0;
		
		
		TRISB=0;
		PORTB=0;
		TRISA=1;
	    TRISD=0x00;
	    PORTD=0x00;
	    TRISC=0xF0;
	    PORTC=0;
	      
	     PCFG3=0;
	     PCFG2=1;
	     PCFG1=0;
	     PCFG0=0;
         
	     CHS2=0;
	     CHS1=0;
	     CHS0=0;
	     
	     ADFM=1;
	     ADON=1;
	   
	     lcd_init();
	     lcd_clear();
	     
	     usart_kur();
	     DelayMs(100);
	     
	     	for(;;)
	     	{
	     		
	     		if(i==0)
	     		{
	     			if(usart_al()==0xCE)
	     				i=1;
	     			else i=0;
	     		}
	     		if(i==1)
	     		{
	     			if(usart_al()==0xFE)
	     				i=2;
	     			else
	     				i=0;
	     		}
	     		if(i==2)
	     		{
	     				h=usart_al();
	     				if(h=='s')
	     				{
	     					i=0;
	     					usart_ilet(f);
	     					lcd_goto(0x00);
	     					lcd_puts("Temp:");
	     					lcd_goto(0x06);
	     				    lcd_puts(f);
	     				   
	     				    q=0;
	     					continue;
	     				}
	     		        sprintf(sonuc+q,"%d",h);
	     				f[q]=h;
	     				
	     				q++;
	     	            
	     		       // DelayMs(100);
	     		        
	     		}
	     		}
	     	
}
Görünmez bir mezarlıktır Zaman...

arslan74