LPC2138 ile Uart Denemesi

Başlatan pegassus, 13 Eylül 2010, 00:12:09

pegassus

Merhabalar,

ARM7 işlemciler ile ilgilenmeye başladım ve basit led yak led söndür denemelerinden sonra birde uart denemesi yapmak istedim. Proteus'da LPC2138 ile denemeler yapmaktayım. Birkaç gündür denemelerim sürüyor ama başarısız. Keil uvision4 kullanıyorum. Kullandığım kod aşağıdaki şekilde. Nerede bir yanlışım var bulamadım. Fikirlerinizi belirti misiniz?

Ayrıca elinizde 21 serisinden başka ARM işlemci modellerinde çalışan uart kodu varsa onları da inceleyebilirim.

/*****************************************************************************/
#include <LPC213x.h>
void  sistem_setup(void);
void  DLY_MS(long ms);
void  uart1_setup(void);
void  u1_karakter_gonder(char ch);
void  u1_string_gonder(char *ch);

char tolga[]={"ARM Uart1 ile DENEME"};

int
main(void){
sistem_setup();
SCS = 0x03;
uart1_setup();			// uart1,19200bps,1 stop bit, parity yok
while (1){
u1_string_gonder(tolga);
DLY_MS(100);
}
}

void uart1_setup(void){
PINSEL0 = 0x00050000;            // RxD1 ve TxD1 pinleri enable
U1LCR = 0x83;               	// 8 bits, Parity yok, 1 Stop bit
U1DLL = 96;                    // 19200 Baud Rate ,
U1LCR = 0x03;                 // baudrate ayarlandi
}

void u1_karakter_gonder (char ch){    	// Karakteri seri porta yaz
while (!(U1LSR & 0x20));
U1THR = ch;
}

void u1_string_gonder(char *ch){	   	// string yazilacak
while(*ch)					   		
u1_karakter_gonder(*ch++);
}

void sistem_setup(void){
PLLCFG=0x24;	 	// MSEL = 4(multiplier =5),PSEL(PLL divider) = 2
PLLFEED=0xAA;	 	// Feed process
PLLFEED=0x55;

PLLCON=0x1;  		// PLL'i enable	et
PLLFEED=0xAA;		// Feed process
PLLFEED=0x55;
while(!(PLLSTAT & 0x400)) ;   // PLL kitleninceye kadar bekle (5*12Mhz=60Mhz'e kitlenir)

PLLCON=0x3;	      	// PLL'i clock kaynagi gibi bagla
PLLFEED=0xAA;	 	// Feed process
PLLFEED=0x55;

MAMCR=0x2;	  		// MAM full Enable
MAMTIM=0x4;			// MAM fetch cycles = 4CCLK

VPBDIV=0x02;	 	// PCLK = 30 MHz (Pclk=Peripheral Clock)
}


void DLY_MS(long ms){  // CCLK=60MHz iken 1ms
long i;
unsigned int j;
for (i = 0; i < ms; i++ )
for (j = 0; j < 7500; j++ );
}

/*****************************************************************************/

fatihinanc

Kainat dediğimiz kitap, yazıldığı dil ve harfler öğrenilmedikçe anlaşılamaz.  (Galileo Galilei)

pegassus

Aslında benim sorunum şu şekilde. İlk mesajımdaki kodlar ile karakter katarının sadece ilk harfi gidiyor ve devamı gitmiyor. Sonuçta terminalde sadece "A" harfini görüyorum normalde "ARM Uart1 ile DENEME" görmem gerekir.

@fatihinanc

Gönderdiğiniz mesajdaki kodların seri haberleşme kısmıda benim yaptığımdan çok farklı değil diye gördüm.

RcALTIN

CCS C'e göre
const char str[] = "ABCDE...";
şeklinde tanımlamalısınız, sizin diliniz farklı ancak const olarak tanımlanmazsa CCS C'de de dediğiniz oluyor, bir deneyin...
KİMSEYİ ENGELLEDİĞİM YOK, ÖZEL İLETİ DEVRE DIŞI !

pegassus

Alıntı yapılan: RcALTIN - 13 Eylül 2010, 01:20:00
CCS C'e göre
const char str[] = "ABCDE...";
şeklinde tanımlamalısınız, sizin diliniz farklı ancak const olarak tanımlanmazsa CCS C'de de dediğiniz oluyor, bir deneyin...

const ile de denedim ancak sonuç değişmedi.

Brsmnc

Selam pegassus,
kodun doğru gibi yanlız FIFO ları aktif etmemişsin gibi gözüküyor. uart1setup içerisine  "U1FCR = 0x07;" satırını eklermisin? Alım ve gönderim için FIFO ları resetleyip etkinleştirmesi lazım.

pegassus

Alıntı yapılan: Brsmnc - 13 Eylül 2010, 03:02:38
Selam pegassus,
kodun doğru gibi yanlız FIFO ları aktif etmemişsin gibi gözüküyor. uart1setup içerisine  "U1FCR = 0x07;" satırını eklermisin? Alım ve gönderim için FIFO ları resetleyip etkinleştirmesi lazım.

"U1FCR = 0x07;" satırını "U1LCR = 0x03;" satırından sonraya ekleyerek tekrar denedim ancak sonuç değişmedi.

CLR

Alıntı yapılan: pegassus - 13 Eylül 2010, 00:12:09
Merhabalar,

ARM7 işlemciler ile ilgilenmeye başladım ve basit led yak led söndür denemelerinden sonra birde uart denemesi yapmak istedim. Proteus'da LPC2138 ile denemeler yapmaktayım. Birkaç gündür denemelerim sürüyor ama başarısız. Keil uvision4 kullanıyorum. Kullandığım kod aşağıdaki şekilde. Nerede bir yanlışım var bulamadım. Fikirlerinizi belirti misiniz?

Ayrıca elinizde 21 serisinden başka ARM işlemci modellerinde çalışan uart kodu varsa onları da inceleyebilirim.

/*****************************************************************************/
#include <LPC213x.h>
void  sistem_setup(void);
void  DLY_MS(long ms);
void  uart1_setup(void);
void  u1_karakter_gonder(char ch);
void  u1_string_gonder(char *ch);

char tolga[]={"ARM Uart1 ile DENEME"};

int
main(void){
sistem_setup();
SCS = 0x03;
uart1_setup();			// uart1,19200bps,1 stop bit, parity yok
while (1){
u1_string_gonder(tolga);
DLY_MS(100);
}
}

void uart1_setup(void){
PINSEL0 = 0x00050000;            // RxD1 ve TxD1 pinleri enable
U1LCR = 0x83;               	// 8 bits, Parity yok, 1 Stop bit
U1DLL = 96;                    // 19200 Baud Rate ,
U1LCR = 0x03;                 // baudrate ayarlandi
}

void u1_karakter_gonder (char ch){    	// Karakteri seri porta yaz
while (!(U1LSR & 0x20));
U1THR = ch;
}

void u1_string_gonder(char *ch){	   	// string yazilacak
while(*ch)					   		
u1_karakter_gonder(*ch++);
}

void sistem_setup(void){
PLLCFG=0x24;	 	// MSEL = 4(multiplier =5),PSEL(PLL divider) = 2
PLLFEED=0xAA;	 	// Feed process
PLLFEED=0x55;

PLLCON=0x1;  		// PLL'i enable	et
PLLFEED=0xAA;		// Feed process
PLLFEED=0x55;
while(!(PLLSTAT & 0x400)) ;   // PLL kitleninceye kadar bekle (5*12Mhz=60Mhz'e kitlenir)

PLLCON=0x3;	      	// PLL'i clock kaynagi gibi bagla
PLLFEED=0xAA;	 	// Feed process
PLLFEED=0x55;

MAMCR=0x2;	  		// MAM full Enable
MAMTIM=0x4;			// MAM fetch cycles = 4CCLK

VPBDIV=0x02;	 	// PCLK = 30 MHz (Pclk=Peripheral Clock)
}


void DLY_MS(long ms){  // CCLK=60MHz iken 1ms
long i;
unsigned int j;
for (i = 0; i < ms; i++ )
for (j = 0; j < 7500; j++ );
}

/*****************************************************************************/


Merhaba,

Benim sitedeki uygulama notunu referans alarak yazmışsın galiba, kodlar çalışıyor zaten orada çıktı sonucu resim olarak var. Bazı küçük değişiklikler yapmışsın, onları sitedekine göre düzeltirsen ve rs232 tester'da baudrate ayarını 19200 yaparsan çalışacaktır.

http://www.uicroarm.com/nxp-arm7-uart#more-58
Knowledge and Experience are Power

pegassus

Evet sizin sitenizdeki kodları kullandım. Mantık olarak oturtmaya çalışıyorum. Sizin kodlarınızda fonksiyonların "const" olmasından başka fark yok diye görüyorum.  Tabiki baudrate 19200 olarak test ediyorum.
Bir önceki mesajımda da dediğim gibi aslında sorun veri katarının sadece ilk elamanı geliyor ancak devamı gelmiyor. "ARM Uart1 ile DENEME" gelmesi gerekirken sadece "A" görüyorum terminalde. Eğer sizde kodları kendi bilgisayarınızda derleyip denerseniz göreceksiniz.

computerboy

Üstad buda benim düzenlediğim kodlar. 1 sene felan oldu ama lpc2138 için yapmıştım. sizin için arşivden çıkarttım.
ayrıca seri port kontrol programıda mevcut vb6.0 bilginiz varsa onuda modifiye edip kullanabilirsiniz.

http://www.4shared.com/file/xhV98gIP/LPC2138-Uart.html

Brsmnc

pegassus yazdığın kodda yanlışlık yok. uvisiona kopyalayıp yapıştırdım, uvision un simülasyonunda istediğini ardarda doğru bir şekilde yazıyor uart1 e. muhtemelen proteusa uyarlarken gözden kaçırdığın birşey var.

CLR

Alıntı yapılan: pegassus - 13 Eylül 2010, 13:20:04
Evet sizin sitenizdeki kodları kullandım. Mantık olarak oturtmaya çalışıyorum. Sizin kodlarınızda fonksiyonların "const" olmasından başka fark yok diye görüyorum.  Tabiki baudrate 19200 olarak test ediyorum.
Bir önceki mesajımda da dediğim gibi aslında sorun veri katarının sadece ilk elamanı geliyor ancak devamı gelmiyor. "ARM Uart1 ile DENEME" gelmesi gerekirken sadece "A" görüyorum terminalde. Eğer sizde kodları kendi bilgisayarınızda derleyip denerseniz göreceksiniz.

Merhaba,

Program, gerçek ortamda, lpc2148 boardu ile pc arasında test edildi, sanal ortamda değil(proteus) . Sitede rs232ye bastığı resimlerde de görülüyor zaten.

Knowledge and Experience are Power

pegassus

Proteus'u kaldırıp yeniden kurdum ve çalıştı. Kodda bir değişiklik yapmadım. Zaten sizinde dediğiniz gibi uvision'da uart#2'de verinin gittiği görünüyor.

Ancak dataoverrun hatası almaya başladım Proteus'ta. Veri düzgün gidiyor ama.

Yardımlar için herkese teşekkürler.

Saygılar...