- Gereksinimler:
- UART İletişimi için PIC Mikrodenetleyicisinin Programlanması:
- Programımızı simüle etmek:
- Donanım Kurulumu ve Çıkışın Test Edilmesi:
Bu eğitimde PIC Mikroişlemci ile UART iletişimini etkinleştirmeyi ve Bilgisayarınıza ve bilgisayarınızdan veri aktarmayı öğreniyoruz. Şimdiye kadar ADC, Zamanlayıcılar, PWM gibi tüm temel modülleri ele aldık ve ayrıca LCD'ler ve 7 Segment ekranlar arasında nasıl arayüz oluşturacağımızı öğrendik. Şimdi, Mikroişlemci projelerinin çoğunda yaygın olarak kullanılan UART adlı yeni bir iletişim aracı ile kendimizi donatacağız. MPLAB ve XC8 kullanan eksiksiz PIC Mikrodenetleyici Öğreticilerimize buradan göz atın.
Burada PIC16F877A MCU kullandık, kısaca USART olarak bilinen “Adreslenebilir Evrensel Senkron Asenkron Alıcı ve Verici” adlı bir modüle sahiptir. USART, verilerin seri olarak aktığı iki kablolu bir iletişim sistemidir. USART aynı zamanda tam çift yönlü bir iletişimdir; bu, CRT terminalleri ve kişisel bilgisayarlar gibi çevresel cihazlarla iletişim kurmak için kullanılabilecek verileri aynı anda gönderip alabileceğiniz anlamına gelir.
USART aşağıdaki modlarda yapılandırılabilir:
- Eşzamansız (tam çift yönlü)
- Senkron - Ana (yarı çift yönlü)
- Senkron - Bağımlı (yarı çift yönlü)
Ayrıca 8-bit ve 9-bit mod olmak üzere iki farklı mod vardır, bu eğitimde USART modülünü Asenkron modda 8-bit iletişim sistemi ile çalışacak şekilde yapılandıracağız, çünkü en çok kullanılan iletişim türü. Asenkron olduğu için veri sinyalleri ile birlikte saat sinyali göndermesine gerek yoktur. UART, veri göndermek (Tx) ve almak (Rx) için iki veri hattı kullanır. Her iki cihazın da temeli ortak hale getirilmelidir. Bu tür bir iletişim ortak bir saati paylaşmaz, bu nedenle sistemin çalışması için ortak bir zemin çok önemlidir.
Bu eğitimin sonunda, bilgisayarınız ve PIC Mikroişlemciniz arasında bir iletişim (UART) kurabilecek ve dizüstü bilgisayarınızdan PIC kartındaki bir LED'e geçiş yapabileceksiniz. LED'in durumu, PIC MCU'dan dizüstü bilgisayarınıza gönderilecektir. Çıktıyı bilgisayarda Hyper Terminal kullanarak test edeceğiz. Ayrıntılı Video da bu eğitimin sonunda verilmektedir.
Gereksinimler:
Donanım:
- PIC16F877A Performans Kurulu
- RS232 - USB dönüştürücü Modülü
- Bilgisayar
- PICkit 3 Programcısı
Yazılım:
- MPLABX
- Hiperterminal
Seri verileri bilgisayarda okunabilir forma dönüştürmek için bir RS232 - USB dönüştürücü gereklidir. Kendi modülünüzü satın almak yerine kendi devrenizi tasarlamanın yolları vardır, ancak gürültüye maruz kaldıkları için güvenilir değildirler. Kullandığımız aşağıda gösterilmiştir
Not: Her RS232'den USB'ye dönüştürücü özel bir sürücünün kurulmasını gerektirir; çoğu, siz cihazı takar takmaz otomatik olarak kurulmalıdır. Ama rahatlamazsa !!! Yorum bölümünü kullanın, size yardımcı olacağım.
UART İletişimi için PIC Mikrodenetleyicisinin Programlanması:
Tüm modüller (ADC, Timer, PWM) gibi, PIC16F877A MCU'muzun USART modülümüzü de başlatmalı ve ona UART 8-bit iletişim modunda çalışması talimatını vermeliyiz. Yapılandırma bitlerini tanımlayalım ve UART başlatma işlevi ile başlayalım.
PIC Mikroişlemcinin UART modülünü başlatma:
Tx ve Rx pinleri fiziksel olarak RC6 ve RC7 pinlerinde bulunur. Veri sayfasına göre TX'i output ve RX'i input olarak belirleyelim.
// **** UART **** için I / O pinlerini ayarlama // TRISC6 = 0; // TX Pin çıkışı olarak ayarlanmış TRISC7 = 1; // RX Pin giriş olarak ayarlandı // ________ I / O pinleri set __________ //
Şimdi baud hızı ayarlanmalıdır. Baud hızı, bilginin bir iletişim kanalında aktarılma hızıdır. Bu, birçok varsayılan değerden biri olabilir, ancak bu programda en çok kullanılan baud hızı olan 9600 kullanıyoruz.
/ ** Gerekli baud hızı için SPBRG kaydını başlatın ve hızlı baud_rate için BRGH'yi ayarlayın ** / SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1; BRGH = 1; // yüksek baud_rate için // _________ Baud_rate ayarının sonu _________ //
Baud hızının değeri SPBRG yazmacı kullanılarak ayarlanmalıdır, değer Harici kristal frekansının değerine bağlıdır, baud hızını hesaplamak için formüller aşağıda gösterilmiştir:
SPBRG = ((_XTAL_FREQ / 16) / Baud_rate) - 1;
Yüksek hızlı bit oranını etkinleştirmek için BRGH bitinin yüksek yapılması gerekir. Veri sayfasına (sayfa 13) göre, iletişim sırasında hataları ortadan kaldırabildiğinden, onu etkinleştirmek her zaman avantajlıdır.
Daha önce belirtildiği gibi, Asenkron modda çalışacağız, bu nedenle seri pinleri (TRISC6 ve TRICSC5) etkinleştirmek için bit SYNC sıfır yapılmalı ve bit SPEM yüksek yapılmalıdır.
// **** Eşzamansız seri bağlantı noktasını etkinleştir ******* // SYNC = 0; // Eşzamansız SPEN = 1; // Seri bağlantı noktası pinlerini etkinleştirin // _____ Eşzamansız seri bağlantı noktası etkinleştirildi _______ //
Bu eğiticide, MCU ile bilgisayar arasında hem veri gönderip hem de alacağız, dolayısıyla hem TXEN hem de CREN bitlerini etkinleştirmemiz gerekiyor.
// ** İletim ve alım için hazırlanalım ** // TXEN = 1; // iletimi etkinleştir CREN = 1; // alımı etkinleştirin // __ UART modülü yukarı ve iletim ve alım için hazır __ //
Bit TX9 ve RX9 sıfır yapılmalıdır bu nedenle 8 bit modda çalışan. Yüksek güvenilirliğin sağlanması gerekiyorsa, 9-bit modu seçilebilir.
// ** 8 bit modu seçin ** // TX9 = 0; // 8 bit alım seçildi RX9 = 0; // 8 bit alım modu seçildi // __ 8 bit modu seçildi __ //
Bununla, başlatma kurulumumuzu tamamlıyoruz. ve çalışmaya hazırdır.
UART kullanarak veri iletimi:
Verileri UART modülü aracılığıyla iletmek için aşağıdaki işlev kullanılabilir:
// ** UART'a bir bayt tarih gönderme işlevi ** // void UART_send_char (char bt) {while (! TXIF); // TX arabelleği boş olana kadar programı tutun TXREG = bt; // Verici tamponunu alınan değerle yükle} // _____________ İşlev sonu ________________ //
Modül başlatıldıktan sonra, TXREG yazmacına yüklenen değer ne olursa olsun, UART aracılığıyla iletilecektir, ancak iletim çakışabilir. Bu nedenle, TXIF İletim Kesinti bayrağını her zaman kontrol etmeliyiz . Yalnızca bu bit düşükse, iletim için bir sonraki bit ile devam edebiliriz, aksi takdirde bu bayrağın düşmesini beklemeliyiz.
Bununla birlikte, yukarıdaki işlev yalnızca bir bayt veri göndermek için kullanılabilir, eksiksiz bir dizi göndermek için aşağıdaki işlev kullanılmalıdır
// ** Dizeyi bayta dönüştürme işlevi ** // void UART_send_string (char * st_pt) {while (* st_pt) // eğer bir karakter UART_send_char (* st_pt ++); // bir bayt verisi olarak işle} // ___________ Fonksiyonun sonu ______________ //
İşaretçileri olduğu için bu işlevi anlamak biraz zor olabilir, ancak bana güvenin işaretçiler harika ve programlamayı daha kolay hale getiriyorlar ve bu aynı şeyin güzel bir örneğidir.
Fark edebileceğiniz gibi, UART_send_char () 'ı yeniden çağırdık ama şimdi while döngüsünün içinde. Dizeyi ayrı karakterlere böldük, bu işlev her çağrıldığında, TXREG'e bir karakter gönderilecek ve iletilecektir.
UART kullanarak veri alma:
UART modülünden veri almak için aşağıdaki işlev kullanılabilir:
// ** UART'tan bir bayt tarih alma işlevi ** // char UART_get_char () {if (OERR) // Hata {CREN = 0; // Hata ise -> CREN'i Sıfırla = 1; // Hata ise -> Sıfırla} while (! RCIF); // programı RX tamponu serbest dönüş olana kadar basılı tutun RCREG; // değeri alın ve ana işleve gönderin} // _____________ İşlev sonu ________________ //
UART modülü tarafından bir veri alındığında, onu alır ve RCREG kaydında depolar. Değeri herhangi bir değişkene aktarabilir ve kullanabiliriz. Ancak çakışma hatası olabilir veya kullanıcı sürekli olarak veri gönderiyor olabilir ve bunları henüz bir değişkene aktarmadık.
Bu durumda Receive flag biti RCIF kurtarmaya gelir. Bu bit, bir veri alındığında ve henüz işlenmediğinde düşecektir. Bu nedenle, programı bu değerle başa çıkana kadar bekletmek için bir gecikme yaratarak while döngüsünde kullanırız.
PIC Microcontroller'ın UART modülünü kullanarak geçiş LED'i:
Şimdi Programın son kısmına, PIC ile bilgisayar arasındaki UART iletişimini kullanarak bilgisayardaki bir LED'i değiştireceğimiz void main (void) fonksiyonuna gelelim.
Bir "1" karakteri gönderdiğimizde (bilgisayardan) LED AÇIK olacak ve "KIRMIZI LED -> AÇIK" durum mesajı (PIC MCU'dan) bilgisayara geri gönderilecektir.
Benzer şekilde, "0" karakterini (bilgisayardan) gönderiyoruz, LED KAPALI olacak ve "KIRMIZI LED -> KAPALI" durum mesajı (PIC MCU'dan) bilgisayara geri gönderilecektir.
while (1) // Sonsuz döngü {get_value = UART_get_char (); if (get_value == '1') // Kullanıcı "1" gönderirse {RB3 = 1; // LED'i açın UART_send_string ("KIRMIZI LED -> AÇIK"); // Bilgisayara bildirim gönderin UART_send_char (10); // ASCII değeri 10, satırbaşı dönüşü için kullanılır (yeni satırda yazdırmak için)} if (get_value == '0') // Kullanıcı "0" gönderirse {RB3 = 0; // LED'i kapat UART_send_string ("RED -> OFF"); // Bilgisayara bildirim gönderin UART_send_char (10); // ASCII değeri 10, satır başı için kullanılır (yeni satırda yazdırmak için)}}
Programımızı simüle etmek:
Her zamanki gibi programımızı proteus kullanarak simüle edelim ve beklendiği gibi çalışıp çalışmadığını öğrenelim.
Yukarıdaki görüntü, bir karşılama mesajı ve LED'in durumunu gösteren sanal bir terminali gösterir. Kırmızı Renkli LED'in RB3 pinine bağlandığı fark edilebilir. Simülasyonun detaylı çalışma bulunabilir video sonunda.
Donanım Kurulumu ve Çıkışın Test Edilmesi:
Bu devrenin bağlantısı gerçekten basit, PIC Perf kartımızı kullanıyoruz ve sadece üç kabloyu RS232'ye USB dönüştürücüye bağlayıp modülü aşağıda gösterildiği gibi USB veri kablosunu kullanarak bilgisayarımıza bağlarız.
Daha sonra Hyper Terminal Uygulamasını kuruyoruz (buradan indirin) ve açıyoruz. Böyle bir şey göstermeli
Şimdi bilgisayarınızda Aygıt Yöneticisi'ni açın ve modülünüzün hangi Com bağlantı noktasına bağlı olduğunu kontrol edin, benimki aşağıda gösterildiği gibi COM bağlantı noktası 17'ye bağlı
Not: Modülünüzün COM bağlantı noktası adı satıcınıza göre değişebilir, bu bir problem değildir.
Şimdi Hyper Terminal Uygulamasına geri dönün ve Kurulum -> Bağlantı Noktası Yapılandırmasına gidin veya aşağıdaki açılır kutuyu açmak için Alt + C tuşlarına basın ve açılır pencerede istenen bağlantı noktasını (benim durumumda COM17) seçin ve bağlan'a tıklayın.
Bağlantı kurulduktan sonra PIC performans panonuzu açın ve aşağıda buna benzer bir şey görmelisiniz.
İmlecinizi Komut Penceresinde tutun ve 1 girin ve ardından enter tuşuna basın. LED açılacak ve durum aşağıda gösterildiği gibi görüntülenecektir.
Aynı şekilde, imlecinizi Komut Penceresinde tutun ve 0 girin ve ardından enter tuşuna basın. LED kapatılacak ve durum aşağıda gösterildiği gibi görüntülenecektir.
Aşağıda, LED'in "1" ve "0" için gerçek zamanlı olarak nasıl tepki verdiğini gösteren eksiksiz kod ve ayrıntılı video verilmiştir.
İşte bu çocuklar, PIC UART'ı bilgisayarımızla arayüzledik ve Hyper terminalini kullanarak LED'i değiştirmek için verileri aktardık. Umarım anlamışsınızdır, eğer anlamadıysanız, sorgunuzu sormak için yorum bölümünü kullanın. Bir sonraki eğitimimizde yine UART'ı kullanacağız, ancak bir Bluetooth modülü kullanarak ve verileri havadan yayınlayarak onu daha ilginç hale getireceğiz.
Ayrıca İki ATmega8 Mikrodenetleyici arasındaki UART İletişimini ve ATmega8 ile Arduino Uno arasındaki UART iletişimini kontrol edin.