446 GÖMÜLÜ SİSTEM TASARIMI Lab 9 UART 9.1 Amaç Bu laboratuvarda LaunchPad ve bilgisayar arasında seri haberleşme gerçekleştirilecektir. Bunun için TExaSdisplay terminal programı kullanılacaktır. UART0 kullanılarak okunan sayılar ASCII karşılığına dönüştürülecek ve görüntülenecektir. PLL aracılığıyla sistem saatinin ayarlanması (80MHz) yapılacaktır. 9.2 Gerekli Malzeme ve Sistem: Bu lab için Tiva LaunchPad gereklidir. Gerekli Sistem: UART0 a karakter katarları (strings) ve işaretsiz sayı gönderen ve okuyan I/O programları yazılacaktır. Yazacağınız program kullanıcıdan iki tane işaretsiz sayı isteyecek ve sayıların toplamını bulup ekrana yazacaktır. Toplam 0 ile 999 arasında olmalıdır. Eğer değil ise seri porta *** gönderilmelidir. Örnek girdi/çıktı aşağıdadır. Birinci sayiyi giriniz: 2 İkinci sayiyi giriniz: 4 Sayilarin toplami = 6 Birinci sayiyi giriniz: 20 İkinci sayiyi giriniz: 990 Sayilarin toplami = *** Lab 9 39
9.3 Simülasyon: Başlangıç Projesi: // Daniel Valvano // August 3, 2013 /* This example accompanies the book "Embedded Systems: Introduction to ARM Cortex M Microcontrollers", ISBN: 978-1469998749, Jonathan Valvano, copyright (c) 2013 Copyright 2013 by Jonathan W. Valvano, valvano@mail.utexas.edu */ // Bu bağlantı USB derleme kablosunu kullanmaktadır // U0Rx (PA0) PC deki seri porta bağlı // U0Tx (PA1) PC deki seri porta bağlı // // standard ASCII sembolleri #define CR 0x0D #define LF 0x0A #define BS 0x08 #define ESC 0x1B #define SP 0x20 #define DEL 0x7F #include tm4c123gh6pm.h //fonksiyon tanimlari void PLL_Init(void); void UART_Init(void); void UART_KatarGonder (unsigned char []); //karakterleri gonderir void UART_KarakterGonder(unsigned char); //seri porta karakter gonderir unsigned long UART_SayiOku(void); //isaretsiz sayiyi UART tan okur unsigned char UART_KarakterOku(void); void UART_SayiGonder(unsigned long); //isaretsiz sayiyi UART a gonderir void UART_SayiCevir(unsigned long); //isaretsiz sayiyi karakter dizisine cevirir //global degisken unsigned char k_dizi[10]; int main(void){ unsigned long n,m,toplam; PLL_Init(); //PLL baslat UART_Init(); // UART baslat UART_KatarGonder("Sayilarin toplamini bulan program\n"); while(1){ UART_KatarGonder("\n\rBirinci sayiyi giriniz:"); n = UART_SayiOku(); UART_KatarGonder("\n\rikinci sayiyi giriniz:"); m = UART_SayiOku(); UART_KatarGonder("\n\rSayilarin toplami:"); toplam=n+m; UART_SayiGonder(toplam); // sizin fonksiyonuz //------------UART_Init------------ // UART 115200 baud rate icin ( 80 MHz UART saati)ayarlar, // 8 bit bilgi, no parity bits, bir stop biti, FIFOs etkin void UART_Init(void){ SYSCTL_RCGC1_R = SYSCTL_RCGC1_UART0; // UART0 aktif et SYSCTL_RCGC2_R = SYSCTL_RCGC2_GPIOA; // port A aktif et UART0_CTL_R &= ~UART_CTL_UARTEN; // UART pasif Lab 9 40
UART0_IBRD_R = 43; //IBRD=int(80,000,000/(16 * 115200)) =int(43.402778) UART0_FBRD_R = 26; // FBRD = round(0.402778 * 64) = 26 // 8 bit bilgi (no parity bits, bir stop bit, FIFOs) UART0_LCRH_R = (UART_LCRH_WLEN_8 UART_LCRH_FEN); UART0_CTL_R = UART_CTL_UARTEN; // UART etkin GPIO_PORTA_AFSEL_R = 0x03; // alt funct PA1,PA0 icin etkin GPIO_PORTA_DEN_R = 0x03; // PA1,PA0 digital I/O etkin // PA1,PA0 UART0 olarak ayarla GPIO_PORTA_PCTL_R = (GPIO_PORTA_PCTL_R&0xFFFFFF00)+0x00000011; GPIO_PORTA_AMSEL_R &= ~0x03; // PA1,PA0 icin analog pasif //------------UART_KatarGonder------------ // Karakter dizisini UART gonderir // (NULL ulastiginda biter) void UART_KatarGonder(unsigned char buffer[]){ unsigned long i=0; char Karakter; Karakter=buffer[i]; while(karakter!= 0){ UART_KarakterGonder(Karakter); i++; Karakter=buffer[i]; //------------UART_KarakterGonder------------ // ASCII Karakterini (8-bit) seri porta gonderir void UART_KarakterGonder(unsigned char data){ while((uart0_fr_r&uart_fr_txff)!= 0); UART0_DR_R = data; //------------UART_SayiOku------------ // ASCII giris unsigned decimal formatinda kabul eder ve // 32-bit isaretsiz sayiya donusturur // gecerli aralik 0-4294967295 (2^32-1)arasi // Backspace ile girilen son basamak silinebilir unsigned long UART_SayiOku(void){ unsigned long sayi=0, uzunluk=0; char karakter; karakter = UART_KarakterOku(); while(karakter!= CR){ // <enter> girilene kadar kabul et // girilen sayinin elmani (digit), 0-9 arasinda mi? // eger degilse unut ve yansitma (not echoed) if((karakter>='0') && (karakter<='9')) { sayi = 10*sayi+(karakter-'0'); uzunluk++; UART_KarakterGonder(karakter); // eger giris backspace ise, sayi degistirilir ve // backspace ekrana yansitilir else if((karakter==bs) && uzunluk){ nsayi /= 10; uzunluk--; UART_KarakterGonder(karakter); karakter = UART_KarakterOku(); return sayi; // sayi > 4294967295 ise yanlis Lab 9 41
//------------UART_KarakterOku------------ // yeni seri port girisi icin bekler // ASCII karakterini okur unsigned char UART_KarakterOku(void){ while((uart0_fr_r&uart_fr_rxfe)!= 0); return((unsigned char)(uart0_dr_r&0xff)); //-----------------------UART_SayiGonder----------------------- // 32-bit sayiyi isaretsiz decimal formatinda seri porta gonderir // sabit 3 basamakli, sayidan sonra bir bosluk, null bitirir void UART_SayiGonder(unsigned long sonuc){ UART_SayiCevir(sonuc); // Sayiyi karakter dizine cevir ve // k_dizi sinde sakla UART_KatarGonder(k_dizi); // seri porta gonder //-----------------------UART_SayiCevir----------------------- // 32-bit isaretsiz decimal sayiyi karakter dizisine donusturur // donusturme sonucu global degisken k_dizi[10] saklanir // sabit 3 basamakli, sayidan sonra bir bosluk, null bitirir // sayi (toplam) 999'dan buyukse *** verir // Ornek // 4 to " 4 " // 31 to " 31 " // 102 to "102 " // 2210 to "*** " //buna gore fonksiyonu tamamlayiniz void UART_SayiCevir(unsigned long t){ Part a) 1- Project->New uvision Project yeni proje oluşturunuz. Projenize bir isim veriniz. Gelen Select Device for Target penceresinden base\texas Instruments\TM4C123GH6PM seçiniz. Copy startup_tm4c123.s seçeneğine Hayır deyiniz. 2- Project penceresinden Target1\Source Group 1 üzerine sağ tıklayarak Add New Item tıklayınız. Açılan pencerden C File(.c) seçip main ismini veriniz. 3- Başlangıç programını kullanarak programınızı gerekli şartları sağlayacak şekilde tamamlayınız. 4- Project penceresinden Target1\Source Group 1 üzerine sağ tıklayarak Add Existing Files tıklayınız. Açılan pencereden startup_rvmdk.s asembler kaynak dosyasını programınıza ekleyiniz. 5- Project->Options For Target tıklayınız. Debug tabında, Use Simulator seçiniz. Dialog DLL Parameter kısmında -pcm4 yanına dlaunchpaddll yazınız. 6- Projenizi derleyiniz (Project->Build target) 7- UART penceresi görünmez ise View->SerialWindows->UART0 seçiniz. 8- Değişik girdiler girerek programın doğru çalışıp çalışmadığını gözlemleyiniz. Lab 9 42
9.4 Gerçek Sistemde Çalıştırılması: Part a) 1. Projenizi açınız. 2. Project->Options For Target tıklayınız. Debug tabında, Stellaris ICDI seçiniz. 3. Projenizi derleyininiz Project->B Build Target 4. Flash->Download menüsünden object kodu Flash EEPROM download ediniz. 5. Debug->Start/Stop Debugging Session menüsünden programı çalıştırınız. 6. Programı LauchPad te çalıştırmak için TExaSdisplay uygulaması başlatılmalıdır. \Keil\TExaSware\ TExaSdisplay.exe seçerek uygulamyı başlatınız. Bu uygulama mikrodenetleyici ile PC arasındaa seri port haberleşmey yi sağlar. Bunun yerine başka programlarda kullanılabilir. 7. Aşağıdaki iki adımı takip edip gerekli COM port ayarlamasını yapınız. 8. Programı çalıştırmak için COM-> >Open Port seçiniz. 9. LaunchPad deki reset düğmesine basınız. Programın çalışıp çalışmadığını test ediniz. Adım 1) Eğer bilgisayarınız birçok COM porta sahipse Aygıt yöneticindenn Stellaris Virtual Serial Port numarasını bulunuz. Lab 9 43
Adım 2) TExaSdisplay programında COM->Setting seçip açılann pencereden COM portu ayarlayınız. 9.5 Kaynaklar: 1- Embedded Systems - Shape The World https://www.edx.org/course/utaustinx/utaustinx-ut-6-01x-embedded-systems-1172 2- http://users..ece.utexas. edu/~valvano/ 3- http://users..ece.utexas. edu/~valvano/volume1/e-book/ Lab 9 44