N76E003 SoftUart Veri Transferi

Merhabalar, bu yazıda yazılım uart yöntemiyle N76E003’ün üzerinde bulunan Uart pinlerini kullanmadan veri gönderme işlemini gerçekleştireceğiz. Genelde ikiden fazla cihazla iletişim halinde ya da tek yol ile iletişim yapmanız gerektiğinde tercih edilen bir yöntemdir. Herhangi bir GPIO pinini seçerek basitçe veri gönderme işlemi yapabilirsiniz.

N76E003 ile iletişim yapabilmek için Nutiny-SDK-N76E003 seri haberleşme kartı ve seri port okuma programı kullanacağım.

SoftUart ile veri gönderirirken dikkat edilecek en önemli durum iletişimin başlaması iletişimin durdurulması ve veri gönderirken aralardaki bekleme süreledir. Bekleme süreleri baud rate hızı ve işlemcinin kullandığı frekans değeriyle ilgilidir. Veri gönderme fonksiyonunu yazarken bu 3 durum göz önünde bulundurulmalıdır. Baud hızı gönderilecek olan veri paketinin saniyede ne kadar değiştiğini gösterir. Hız ne kadar yüksekse veri gönderme işlemini o kadar hızlı olur. Mesela bunu eğer haberleşme kartınızın üzerinde veri aldığında ya da gönderdiğinde yanan RX TX ledleri vardır, iletişim sırasında ledlerin ne kadar hızlı yanıp sönmesi durumundan gözlemleyebilirsiniz.

Veri göndereceğiniz GPIO pinini çıkış olarak ayarlamalısınız. Ve bu pini her zaman yüksek olarak ayarlamalısınız. Veri göndermeye başlamadan önce bu bit düşüğe çekilir ve bu start bitini temsil eder. İletişimin başladığına bu şekilde karar verilir. Start bitinden sonra delta x değerinde bir bekleme süresi eklenmiştir. Verilen örnekte gönderme biti 8 olarak tanımlanmıştır. 8 tamamlanana kadar veri gönder anlamına gelir.

Bir takım denemeler sonucu aralardaki bekleme süresinin çok önemli olduğunu fark edeceksiniz. Bu yüzden alıcı ve verici için belirlenen baudrate hızının doğru bir şekilde ayarlanması gerekir. Örneğin karşı taraftaki baudrate hızını 9600 olarak ayarladıysanız yazılım uart fonksiyonu içerisindeki bekleme sürelerini 9600 baudrate hızına göre hesaplamalısınız.

1/9600= 104us değerinde beklemeye sahip olmalısınız.

İşlemcinin dahili veya ekleyeceğiniz harici osilatör ile bu süreyi doğru ayarlamanız gerekiyor.

#include "N76E003.h"
#include "SFR_Macro.h"
#include "Common.h"
#include "Delay.h"
#include "Function_define.h"


#define osc_freq_in_MHz    16
#define osc_scalar         (16 / osc_freq_in_MHz) 

void delay_us(unsigned int value);
#define DataBitCount      8

#define TX_pin           P11


unsigned int i;


void UART_Transmit(unsigned char);
void main (void)
{
	
	int a;
	P11_PushPull_Mode; 
        TX_pin=1;

		
    while(1)
		{

   Timer0_Delay1ms(1000);
	 for (a=0x00; a<0xFF; a++){
   UART_Transmit(a); 
   Timer0_Delay1ms(1000);}
}
}



  void UART_Transmit(unsigned char DataValue)
   {
	  TX_pin = 0;
	  delay_us(104);
	  for (  i = 0; i < DataBitCount; i++ )
    {
	  if (DataValue&0x01)  
    {
    TX_pin = 0xFF;
    }
    else 
    {
    TX_pin = 0x00;
    }
		DataValue >>= 1;
    delay_us(104);
    }
 
    TX_pin = 1;
   delay_us(104);
    }
   

void delay_us(unsigned int value)
{
  value = (value / osc_scalar);
  
  while(value > 0)
  {
		nop;
		value--;
  }
}

Delay_us benim kullandığım bir fonksiyon olup dilerseniz mevcut kütüphanelerde bulunan bekleme fonksiyonlarını kullanabilirsiniz.

Yazılımın doğru çalıştığında emin olmak için 255’e kadar tüm sayıları seri port programında görüntüleyebilirsiniz. Sonsuz döngü içerisinde gönderilecek olan kod eklenmiştir. Eğer tüm sayıları sırayla gönderebiliyor iseniz doğru baudrate hızında veri transferi işlemi sağlamış olursunuz.

Bu kodu denerken işlemcide ayarladığınız TX pinini haberleşme kartının RX pinine bağlamayı unutmayın 🙂 Okuduğunuz için teşekkürler, İyi çalışmalar.

Yorum yapın