c18 ile seri port uygulaması

c18 ile seri port uygulaması

Uyarı: Bu yazı hazırlanması devam eden bir taslak halindedir. Bilgilerin doğruluğu ve bütünlüğü tamamlanana kadar garanti edilmemektedir.

Merhaba arkadaşlar, daha önce “Seriport hakkında herşey” adlı dökümanımı yazmıştım. Burdan ulaşabilirsiniz. Bu yazıda ise temel bilgilere sahip olduğunuzu düşünerek yazılım kısmını ağırlık vermek istedim. Kullanıcıya sorular sorup onları işlememiz çoğu zaman yapmak istediğimiz bir iştir.

Aşağıdaki programda bulunan “veri_iste” fonksiyonu bu işi otomatik hale getiriyor. Proje isiste ve gerçek ortamda 18f4685 ile denenmiştir. Frekansını kendi devrenize göre ayarlayınız. Şu an 25mhz kristale göre ayarlıdır.

#include <p18cxxx.h>
#include <stdio.h>
#include <delays.h>
#include <usart.h>

#pragma config OSC = HS, WDT = OFF, LVP = OFF

unsigned char adi[50]={0};
unsigned char soyadi[50]={0};

//void veri_iste(char soru[], char *cevap)
void veri_iste(rom char *soru, char *cevap)
{
unsigned char usart_ram[2]={0};

////////////////////////////////////////////////////////////////////////////////////////////
//bir diziye aktarma işlemi(şimdilik kullanmanıza gerek yoksa açıklama olarak bırakabilirsiniz)
////////////////////////////////////////////////////////////////////////////////////////////
int i=0;
unsigned char metin[50]={0}; //verileri aktaracağımız değişken
int strlength = 0; //*soru değişkeninde kaç tane karakter olduğunu tutar

////ölçme kısmı/////////////////////////////////////////////////////////////////
while (soru[strlength] != '\0'){ //*soru değişkeninin uzunluğunu hesaplayalım
//putrsUSART((rom char*)soru+strlength); //istersek tek tek te yazdırabiliriz
strlength++;
}
//kaynak: http://stackoverflow.com/questions/14540681/calculating-length-of-a-string-in-c?lq=1
////////////////////////////////////////////////////////////////////////////////

for(i=0;i<strlength;i++){ //i yi alınan verinin uzunluğu kadar döndermek gerek
metin[i]=*(soru+i);
}

putsUSART(metin);
////////////////////////////////////////////////////////////////////////////////////////////

//putrsUSART((rom char*)soru); //alınan veriyi direkt yazar

while(1)
{
while(BusyUSART()); // wait for input //while (!DataRdyUSART());
getsUSART(usart_ram, 1); //usart_ram değişkenine 1 karakterlik veri alıyoruz
putsUSART(usart_ram); //adam ne yazdığını bu kod sayesinde görüyor, eğer back spack tuşunuda enter gibi kontrol edersek silmesinide sağlayabiliriz, gerçi isiste backspack tuşu ile silebiliyoruz ama normalde oluyor mu bilmiyorum
if(usart_ram[0]==(char)13)
{
break;
}
*cevap=usart_ram[0];
cevap++;
}

*cevap=0;//yazdırdıktan sonra eskiden kalan daha önceki verileri siliyoruz
}

void main(void) {

ADCON1 = 0x0F;

TRISB = 0x07;
PORTB = 0;
TRISA=0x00; PORTA=0x00;
OpenUSART(USART_TX_INT_OFF &
USART_RX_INT_ON &
USART_ASYNCH_MODE &
USART_EIGHT_BIT &
USART_CONT_RX &
USART_BRGH_HIGH,
25 );
SPBRG = ((int)(25000000L/(16UL * 9600) -1)); //şuan 25mhz, 20mhz=20000000L

while(1){ //sürekli sorsun

putrsUSART("\r\n");
veri_iste("ADINIZ >> ", &adi); putrsUSART("\r\n");
veri_iste("SOYADINIZ >> ", &soyadi); putrsUSART("\r\n");

putrsUSART("Merhaba ");
putsUSART(adi);
putrsUSART(" ");
putsUSART(soyadi);
putrsUSART(" bey...");

}

while(1) {} //program sürekli başa sarmasın diye sonsuz döngüye sokuyoruz

}

dosyalar burda: http://gokhanbeken.com/dosyalar/c18-rs232-uygulamasi.rar

Not: Bu uygulama her ne kadar sorunsuz çalışsada, seriporttan gelen bilgileri kesmelerle okumak gerekir. Aksi halde program donar.

c18 öğrenebileceğiniz microchip’in hazırladığı kaynaklar

MPLAB®C18 C COMPILER USER’S GUIDE: ww1.microchip.com/downloads/en/devicedoc/51288f.pdf
MPLAB®C18 C COMPILER LIBRARIES: ww1.microchip.com/downloads/en/devicedoc/mplab_c18_libraries_51297f.pdf

Bir Cevap Yazın