Picproje Elektronik Sitesi

DERLEYİCİLER => Microchip XC Serisi => Microchip XC16 => Konuyu başlatan: serhat1990 - 20 Ekim 2015, 23:47:20

Başlık: PIC24FJ128GA006 Uart Uygulaması
Gönderen: serhat1990 - 20 Ekim 2015, 23:47:20
Merhaba arkadaşlar, foruma artık hiç vakit bulamıyorum. Fakat bloğumda paylaştığım bir yazıyı sizlerle de paylaşmak istedim. İşinize yarayacağını düşündüğüm bir uygulama. PIC24FJ128GA006 ile basit bir uart uygulaması. Uygulamada terminal üzerinden gönderilen ascii karakterlere göre ledlerin lojik durumu değiştiriliyor. Ayrıca butonlara basıldığında terminal ekranı üzerinde hangi butona basıldığı bilgisi gözüküyor. Umarım işinize yarar.

Uygulamayı ait tüm dökümanları aşağıdaki linkten indirebilirsiniz.
http://www.serhatevcim.com/2015/10/20/xc16-derleyicisi-ile-pic24f-serisi-programlama-uart-uygulamasi/ (http://www.serhatevcim.com/2015/10/20/xc16-derleyicisi-ile-pic24f-serisi-programlama-uart-uygulamasi/)

İyi çalışmalar dilerim.


/*
FREQ = 32MHZ

Butona basılınca ledleri yakar söndürür ve hangi butona basıldığı bilgisi uart'tan gönderilir.
Seriport üzerinden gelen ascii 1 – 2 – 3 – 4 karakterleriyle ledlerin durumu terslenir.

*/

#include // İşlemci Header Dosyası yüklenir.

_CONFIG1 ( JTAGEN_OFF & FWDTEN_OFF & GCP_OFF & BKBUG_OFF & COE_OFF ) // Config Ayarları Yükleniyor ...
_CONFIG2 ( POSCMOD_HS & FNOSC_PRI & OSCIOFNC_OFF & FCKSM_CSDCMD & IESO_OFF ) // Config Ayarları Yükleniyor ...

/* ________________ Global Değişkenler __________________ */

unsigned char i=0; // işaretsiz i değişkeni tanımladık ( 0-255 )

/* ________________ Sistem Tanımlamaları ________________ */

#define LED1 _LATB8 // RB8 ' e led1 ismini atadık.
#define LED2 _LATB9 // RB9 ' e led2 ismini atadık.
#define LED3 _LATB10 // RB10 ' e led3 ismini atadık.
#define LED4 _LATB11 // RB11 ' e led4 ismini atadık.

#define ButtonPressed_1 _RB2 // RB2 ' ye ButtonPressed_1 ismini atadık.
#define ButtonPressed_2 _RB3 // RB3 ' e ButtonPressed_2 ismini atadık.
#define ButtonPressed_3 _RB4 // RB4 ' e ButtonPressed_3 ismini atadık.
#define ButtonPressed_4 _RB5 // RB5 ' e ButtonPressed_4 ismini atadık.

/* ___________ Bu fonksiyonlar Seri Haberleşme Fonksiyonlarıdır _________ */

void uart_init(); // Bu fonksiyon uart ayarlarını yapar .
void uart_send(unsigned char data); // Bu fonksiyon ile 1 BYTE veri gönderilir.
unsigned char uart_read(void); // Bu fonksiyon ile Uart rx buffer içeriği okunur
void uart_write(const unsigned char * s); // Bu fonksiyon ile string ifade gönderilebilir...

/* _______________________________________________________________________ */

unsigned char alinan_veri=0; // uart üzerinden alınan veri burada tutulur.

void port_setup(void) // Giriş – Çıkış Port ayarlarını yapar...

{

_TRISB2 = 1 ; // TRISB2 ' yi giriş olarak ayarladık...
_TRISB3 = 1 ; // TRISB3 ' ü giriş olarak ayarladık...
_TRISB4 = 1 ; // TRISB4 ' ü giriş olarak ayarladık...
_TRISB5 = 1 ; // TRISB5 ' ü giriş olarak ayarladık...
_TRISB8 = 0 ; // TRISB8 ' i çıkış olarak ayarladık...
_TRISB9 = 0 ; // TRISB9 ' u çıkış olarak ayarladık...
_TRISB10 = 0 ; // TRISB10 ' u çıkış olarak ayarladık...
_TRISB11 = 0 ; // TRISB11 ' i çıkış olarak ayarladık...

LED1 = LED2 = LED3 = LED4 = 0; // çıkış portu temizlenir..

}

void uart_init(void) // uart ayarlarının yüklendiği fonksiyondur...

{

U1BRG=12;_BRGH=0; // 19200 Bps

//_________________________________________________________________

_UARTEN=1; // Hardware TX pini aktif edildi...
_USIDL=0; // Hat boştayken operasyona devam edelim ...
_IREN=0; // irDa kodlayıcı ve kod çözücü pasif ettik.
_RTSMD=0; // Akış kontrolünde RTS
_UEN1=0; // u1tx , u1rx pinleri aktif. RTS , CTS isteğe göre.
_UEN0=0; // u1tx , u1rx pinleri aktif. RTS , CTS isteğe göre.
_WAKE=0; // START biti gelince uykudaysa uyanma modu kapalı. // Bu Kısım UARTx Mode Register ile ilgili ayarları içerir.
_LPBACK=0; // Geri Dönüş Modu Kapalı.
_ABAUD=0; // Otomatik baudrate devredışı ...
_RXINV=0; // U1RX hat boşta iken 1 konumunda olacak...
_PDSEL1=0; // 8 bit data , eşlik biti yok...
_PDSEL0=0; // 8 bit data , eşlik biti yok...
_STSEL=0; // Stop biti 1 ...

//_________________________________________________________________

_UTXISEL1=1; // İletim tamponu boş olunca
_UTXISEL0=0; // İletim tamponu boş olunca
_UTXINV=0; // U1TX hat boşta iken 1 konumunda olacak ...
_UTXBRK=0; // Yaptık .. Ama biraz araştır ... ?
_UTXEN=1; // Uart1 göndericisi ayarlanır... // Bu kısım UARTx Status and Control Register
_URXISEL1=0; // 1 karakter alınca veri alma bayrağı kurulsun.
_URXISEL0=0; // 1 karakter alınca veri alma bayrağı kurulsun.
_ADDEN=0; // Adres kontrolü devre dışı ( 8 bit data modunda kullanılmaz. )

}

void uart_send(unsigned char data) // 1 byte veri gönderen fonksiyondur...

{
while(!_U1TXIF); // gönderilen veri varsa bekleyelim...
U1TXREG=data; // Gönderilmek istenen data buffer'a eklenir...
_U1TXIF=0; // Datasheet'te belirttiği için ekledik . back to back tx modunda txif bayrağı yazılımsal temizlenmelidir diyor...
}

void uart_write(const unsigned char * s)

{
while(*s) // 0 ' olana kadar gönder...
uart_send(*s++);
}

unsigned char uart_read(void) // 1 byte veri ile geri döner...

{
if(_U1RXIF)return U1RXREG; // Eğer veri geldi kesmesi var ise veri ile geri döner.
else return 0; // Yok ise 0 ile geri döner...
}

void Process(void) // İşlemler Bu fonksiyonda olur 😉

{

if(!ButtonPressed_1){while(!ButtonPressed_1);LED1=!LED1;uart_write("Buton1'e basildi\r\n");} // Buton1′ e basılıysa el çekilene kadar bekle ve butona basıldığı mesajını ilet.
else if(!ButtonPressed_2){while(!ButtonPressed_2);LED2=!LED2;uart_write("Buton-2'ye basildi\r\n");} // Buton2′ ye basılıysa el çekilene kadar bekle ve butona basıldığı mesajını ilet.
else if(!ButtonPressed_3){while(!ButtonPressed_3);LED3=!LED3;uart_write("Buton-3'e basildi\r\n");} // Buton3′ e basılıysa el çekilene kadar bekle ve butona basıldığı mesajını ilet.
else if(!ButtonPressed_4){while(!ButtonPressed_4);LED4=!LED4;uart_write("Buton-4'e basildi\r\n");} // Buton4′ e basılıysa el çekilene kadar bekle ve butona basıldığı mesajını ilet.

}

void data_oku(void) // Data okuyalım...
{
alinan_veri=uart_read(); // uart üzerinden gelen veriyi okuyalım...

if(alinan_veri=='1′){LED1=!LED1;} // alınan veri ascii 1 ise led1'i tersle.
else if(alinan_veri=='2′){LED2=!LED2;} // alınan veri ascii 2 ise led2'i tersle.
else if(alinan_veri=='3′){LED3=!LED3;} // alınan veri ascii 3 ise led3'i tersle.
else if(alinan_veri=='4'){LED4=!LED4;} // alınan veri ascii 4 ise led4'i tersle.

alinan_veri=0; // uart üzerinden veri işlendikten sonra buffer temizlenir...
}

int main() // Ana fonksiyon...

{
port_setup(); // Port ayarlarını yükleriz...
uart_init(); // uart ayarlarını yükleriz... ( 19200 bps olarak ayarlanır )
uart_write("16 Bit Pic MikroDenetleyici Uart Uygulamasi\r\n"); // açılış mesajı gönderilir.

while(1)
{

if(_U1RXIF) // uart üzerinden gelen veri mi var _
{
data_oku(); // veriyi alıp kontrol edelim...
_U1RXIF=0; // Rx veri var bayrağını temizle...
}

ClrWdt();
Process(); // Sürekli butonları okur ve ledlere yansıtır Durumu ...
}
}