lpc2365 + keil c,c++

Başlatan armsistem, 11 Haziran 2011, 11:50:26

armsistem

Arkadaşlar selam aşağıdaki lpc2365 çalışan uart var var keil ile yazılmıştır , anlamadığım bir kaç satır var yardımlarınızı bekliyorum şimdiden teşekkür ederim.
Not: kodların yanına yazdım hata varsa düzeltirsiniz


#include "LPC23xx.h"    //kullanacağız işlemcinin kütüphanesi
#define TEMT (1<<6)   // ön tanım
#define LINE_FEED 0xA//ön tanım  ondalık 10
#define CARRIAGE_RET 0xD//tanım ondalık 14

int i; // integer deger
const char c[] = "Philips LPC2368";//const ;değişmez char string deger [] dizi olduğunu gösteri yani c[0]=p ,c[1]=h şeklinde gidiyor

void PLL_Feed(void)  // alt program
{
PLLFEED = 0xAA;  // standart pll için gerekmektedir
PLLFEED = 0x55; //kayıt için gerekmektedir
}
// burada işler biraz karışıyor.(benim için)
void InitFrequency(void) // alt program
{
if((PLLSTAT & 0x02000000) != 0 ) // If PLL is already connected, disconnect the PLL// eğer ki pll baglandıysa pll bağlansı kes anlamadım
{
PLLCON &= ~0x02; // & - ve işareti ~-değil işareti  //pllcon &=~0x02 değerini ne yapyor ???????????????????????????????????????????
PLL_Feed(); // her ne yaptıysa kaydet.
}

PLLCON &= ~0x01; // Disable the PLL // aynı şekilde anlamadım  &= ~0x01;
PLL_Feed();// her ne yaptıysa kaydet.

CLKSRCSEL = 0x01; // PLL clock source is main oscillator (Fin = 12 MHz)// giriş neyse onu kullan osilatör olarak
PLLCFG = 0x2; // M=12, N=1 (2 x M x Fin) / N = Fcco = 288 MHz // çarp böl hırpala sonucu yaz
PLL_Feed();//kaydet

PLLCON = 0x01; // Enable the PLL // burasını anlamadın
PLL_Feed();//kaydet

CCLKCFG = 0x03; // CPU clock is 288 MHz / 4 = 72 MHz// çarp böl hırpala sonucu yaz
USBCLKCFG = 0x05; // USB clock is 288 MHz / 6 = 48 MHz// çarp böl hırpala sonucu yaz
PCLKSEL0 = 0x000000C0; // PCLK_UART0 is CCLK/8 clock// çarp böl hırpala sonucu yaz
while(!(PLLSTAT & 0x04000000)); // Wait for the PLL lock//// çarp böl hırpala sonucu yaz
PLLCON |= 0x03; // Connect the PLL//| veya işareti anlamı mantığı nedir.
PLL_Feed();//kaydet
}

void InitGPIO(void)  ////// basit giriş çıkış işlemleri
{
PINSEL0 = 0x00000050;
PINSEL2 = 0x00000000; // P1.0, P1.1, P1.4, P1.8, P1.9 and P1.10 are selected
IODIR1 = 0x00000600; // P1.9 and P1.10 are output, others are input.
IOCLR1 = 0x00000600;
}

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

void Delay(unsigned int time) // zamanla ilgili
{
while(time--);//time süreli düş sıfır olduğunda döngüden çık
}

int main(void)  // artık ana program
{
InitFrequency(); //rekansı ayarla
InitGPIO(); // giriş çıkış işlemlerini
InitUART0();// uartı ayarla

while(1)//sonsun döngü
{
i=0;//ilk değer 0
while(c)             köşeli parantez içerisinde i var forumda çıkarmadım         ///////////////BURASI KAFAMI KARIŞTIRDI C++ OPERATÖRLERİ OKUDUM DAHA ACEMİ OLDUĞUM İÇİN ??????????
//////////////////////////BURADA TEKER TEKER KARAKTERLERİ BASIYOR.C0,C1,C2,C15 OLDUĞUNDA DÖNGÜDEN ÇIKIYOR??????
{
U0THR = c;                  köşeli parantez içerisinde i var forumda çıkarmadım                                                 // BU KOMUT 8 BİTLİK YAZMAÇ REG.MAP. ÖYLE DİYOR,YANİ UART TEKER TEKER HARFLERİ GÖNDERİYORUZ.
i++;//i1,i2,i3,i4....................
}
U0THR = LINE_FEED;//  while(c) // döngüsünden çıktıktan sonra u0thr ondalık 10 onaltılı 0X0a ,ondalık 14 onaltı 0x0d //mantığı nedir
U0THR = CARRIAGE_RET;while(c) // döngüsünden çıktıktan sonra u0thr ondalık 10 onaltılı 0X0a ,ondalık 14 onaltı 0x0d //mantığı nedir

///////////////////uothr alt alta basmasının mantığı nedir.


while(!(U0LSR & TEMT)){}  //u0lsr reg.map inceledir.transmittir empty.TEMT hem U1THR ve U1TSR boş zaman ayarlanır; TEMT olduğunu
U1TSR veya U1THR geçerli veriler içeren zaman ya temizlenir//biz bunu 1 yapıyoruz neden

IOCLR1 = 0x0600;
Delay(5000000);
IOSET1 = 0x0600;
Delay(5000000);
}
}




İyi bilen arkadaşlara selam ;
- char = uzun bir şey girdiğimde hyper terminal veya docklight niye sapıtıyor ,yukarıdaki programda satır satır yazarken bir karakter uzasa aptallıyor neden ?
- mesala işlemden çıkan sonucu toplama olarak nasıl girerim ? =int x,y,zz;x=2;y=3;zz=x+y;        zz nasıl basarım




http://www.nxp.com/documents/application_note/AN10369.pdf

Burak B

0xA ve 0xD değerleri ASCII  satır başı ve enter değerlerini ifade eder. Yani UART ile yolladığın metnin bittiğini ve bir sonraki satırbaşında cursorun beklemesini işlemciye söylemenin bir yoludur.
While döngüsü ile teker teker tüm karakterler gönderiliyor. While her dönüşünde i değeri 1 arttırılarak metnin bir sonraki karakterine konumlanıyor ve sonra bu konumdaki değer U0THR e aktarılıyor yani uart üzerinde belirliyor.

Ayrıca forum mesaj editörünü kullanırken '#' ile belirtilen buton yardımıyla kodlarını eklersen istediğin tüm sembolleri çıkaraiblirsin.
"... a healthy dose of paranoia leads to better systems." Jack Ganssle

z

#2
if((PLLSTAT & 0x02000000) != 0 )

PLLSTAT registerini oku 0x02000000 ile and yap. Sonuc ya sifirdir ya da sifirdan farkli olacaktir. (Sifir ise 25. bit 0 değilse 25. bit 1 demektir.)

Eger 25.bit 0 değilse asagidaki iki satiri isle demek istemis.
{
PLLCON &= ~0x02;
PLL_Feed();
}

Gelelim PLLCON &= ~0x02 satirina.

Bir registerin bazi bitlerini, registerin sakladigi diger bitlere dokunmadan silmek iste.

Ne yaparsin? Degismemesi istenen  bitleri 1, 0 olmasi istenen bitleri de 0 olan bir maske degeri ile, register degerini AND yaparsin.

Ornegin 8 bitlik bir registerin 0. bitini 0 yapmak istersek

Reg = Reg and 0xFE yapariz.

Buradaki 0xFE, 0. bit degeri 0 olan ozel bir maske degeridir. Dikkat edersen bu 1 in inversidir.

O halde, PLLCON &= ~0x02 satirinda PLLCON registerinin 1. biti sifir yapilmak isteniyor. yani 0xFFFFFFFD ile and leniyor.
while(!(PLLSTAT & 0x04000000)); //  PLLSTAT registerinde 26. bit 1 oluncaya kadar bekle.

PLLCON |= 0x03;  Bir baska deyisle PLLCON = PLLCON OR 0x03;

PLLCON registerinin 0. ve 1. bitlerini bir yaparken diger bitler ne ise aynen kalsin demek.

while(c)
{
     U0THR = c [ i ];
     i++;
}

C bir karakter dizisi ve sonu 0 ile sonlandirilmis. Son karakteri buluncaya kadar dizinin karakterlerini tek tek yolla demek.

0x0D    Carriage return demek. Eski elektromekanik daktilolarda yazici kafayi en sola al anlamina gelen kod.
0x0A    Line Feed demek.  Bir alt satira gec demek. (Daha dogrusu kagidi ilerlet)

0x0A ve 0x0D yollamak bir alt satirin en soluna gec demek.

while(!(U0LSR & TEMT)){} 

Burada #define TEMT (1<<6)   idi. Yani Tempin 6. bit 1 demek. 0x40

UOLSR nin 6.biti 1 olana kadar bekle demek. Cip dokumanina bakmak lazim. Muhtemelen bu bit, gonderilmek istenen karakter gitti yenisini gonderme islemine baslayabilirsin
anlamina geliyordur.



Bana e^st de diyebilirsiniz.   www.cncdesigner.com