UART işlemci durdurma sorunu!

Başlatan pisisik44, 08 Ekim 2010, 11:59:44

pisisik44

Merhaba arkadaşlar. LPC2368 in UART kısmı ile ilgili bir sıkıntım var. Sorunu çözmek için araştırmaya devam ediyorum, bir de buradan yardım alayım diye konu açtım. İşlemcinin UART0 modülünü kullanıyorum, fakat RS232 kablosu ile bilgisayara bağladığım zaman işlemci işlem yaptığı yerde takılıp kalıyor. Kabloyu çektikten sonra yaptığı işe devam ediyor. Kablo ile uğraşıp sök tak yaptığım vakit ise ekranda yazmak istediğim şeyi zaman zaman görebiliyorum, bazen de saçma sapan karakterler çıkıyor. Kodu buraya koyuyorum.

#include "LPC23xx.h"

#define TEMT (1<<6)
#define LINE_FEED 0xA
#define CARRIAGE_RET 0xD

int i;
const char c[] = "Philips LPC2368";

void PLL_Feed(void) 
{
	PLLFEED = 0xAA;
	PLLFEED = 0x55;
}

void InitFrequency(void)
{																						  
	if((PLLSTAT & 0x02000000) != 0 )	// If PLL is already connected, disconnect the PLL
	{
		PLLCON &= ~0x02;
		PLL_Feed();
	}

	PLLCON &= ~0x01; 			// Disable the PLL
	PLL_Feed();

	CLKSRCSEL = 0x01;			// PLL clock source is main oscillator (Fin = 12 MHz)
	PLLCFG = 0x0000000B;			// M=12, N=1 (2 x M x Fin) / N = Fcco = 288 MHz
	PLL_Feed();
	
	PLLCON = 0x01;				// Enable the PLL
	PLL_Feed();

	CCLKCFG = 0x03;				// CPU clock is 288 MHz / 4 = 72 MHz
	USBCLKCFG = 0x05;			// USB clock is 288 MHz / 6 = 48 MHz
	PCLKSEL0 = 0x000000C0;			// PCLK_UART0 is CCLK/8 clock

	while(!(PLLSTAT & 0x04000000));		// Wait for the PLL lock

	PLLCON |= 0x02;				// Connect the PLL
	PLL_Feed();
}

void InitGPIO(void)
{
	PINSEL0 = 0x00000050;

	PINSEL2  = 0x00000000;			// P1.0, P1.1, P1.4, P1.8, P1.9 and P1.10 are selected
	PINMODE2 = 0x002A020A;			// No pull-up or pull-down
	IODIR1   = 0x00000600;			// P1.9 and P1.10 are output, others are input.
	IOCLR1	 = 0x00000600;
}

void InitUART0(void)
{		
	U0FCR = 0x07;
	U0LCR = 0x83;
	U0DLL = 0x3A;
	U0DLM = 0x00;
	U0LCR = 0x03;
}

void Delay(unsigned int time)
{
	while(time--);
}

int main(void)
{
	InitFrequency();
	InitGPIO();
	InitUART0();

	while(1)
	{
		i=0;
		while(c[i])
		{
			U0THR = c[i];
			i++;
		}
		U0THR = LINE_FEED;
		U0THR = CARRIAGE_RET;
		while(!(U0LSR & TEMT)){}
		IOCLR1 = 0x0600;
		Delay(5000000);
		IOSET1 = 0x0600;
		Delay(5000000);
	}
}


Sorun çözüldü, yazılım veya işlemci ile alakalı bir sorun yokmuş. Kullandığım donanımla ilgili bir sorun varmış. Onu çözünce hiçbir sıkıntım kalmadı. :)
"Hikmet mü'minin yitik malıdır. Nerede bulursa alsın."  Sevgili Peygamberimiz Hz. Muhammed (S.A.V)