Title: MikroC ile PIC Programlama
1MikroC ile PIC Programlama
10.Hafta
2USART Evrensel Senkron-Asenkron Alici Verici
Modülü
3- USART modül verilerin senkron veya asenkron
iletimi için kullanilan ve belli bir protokol
dahilinde islem yapan bir birimdir. Bu modül
dahilinde - Verinin seriden paralele dönüstürülmesi ve
paralelden seriye dönüstürülmesi, - Eslik bitlerini eklemek ve bu bitleri kontrol
etmek suretiyle hata bulmak, - Baslatma ve durdurma bitlerini eklemek ve
bulmak, gibi islemler yapilabilir. -
- Islevsel açidan, USART alici ve verici olarak
iki kisma ayrilir. Her iki yönde de veri
aktarmadan önce USART denetim kaydedicisine,
verinin niteligini gösterecek bir denetim sözcügü
programlanmalidir. Örnegin veri bitlerinin
sayisi , eslik kullanilip kullanilmadigi, eger
eslik kullanilmis ise, bunun tek eslik mi yoksa
çift eslik mi oldugu ve durdurma bitlerinin
sayisi gibi. Temel olarak, baslatma biti istege
bagli olmayan tek bittir ve her zaman yalnizca
bir baslatma biti vardir. Bir baslatma durumu
için bu bitin mantiksal 0 seviyesinde olmasi
gerekmektedir.
4- PIC 16F877de USART modülünün kontrolü için
TXSTA ve RCSTA kaydedicileri mevcuttur. RSCTA ve
Baud hiz kaynagi SPBRG yazmacidir. SPBRG 8
bitlik zamanlayicidir. Veri tablolarini
incelenerek gerekli baud hizi seçilir.
Asenkron çalistirilacaksa BRGH(TXSTAlt2gt) biti de
baud hizlarini kontrol edebilir. BRGH senkron
moda gerekmez.Baud hizi ile ilgili üç tane
yazmaç vardir. Bunlar TXSTA, RCSTA, SPBRG? dir.
- USART asenkron modunda en çok kullanilan
biçimler - standart 1 baslama(start) biti ,
- 8 veya 9 veri biti,
- 1 bitis(stop) bitidir.
USART modülü veri iletisiminde önce en düsük
öncelikli biti seçer. Parite biti donanim
tarafindan yakalanamaz, ancak istendigi
takdirde yazilim tarafindan yakalanabilir.
USART uyuma (sleep) modunda çalismaz.
USART?in 4 önemli elemani vardir. Bunlar
Baud hiz kaynagi, Örnekleme devresi,
Asenkron iletim ve Asenkron alicidir.
Asenkron iletim yazmaçlari ise PIR, RCSTA,
TXREG, PIE, TXTA, SPBRG?dir.
5TXSTA Kaydedicisi
- TX9D Iletilen verinin 9. Bitini olusturur. Bu
bit bir parite biti olarak düsünülebilir. - TRMT Transmit shift register (TSR Iletim
kaydirmal i kaydedicisi) durum bitidir. TRMT1
ise TSR bos tur. TRMT0 ise TSR dolu
vaziyettedir. - BRGH Yüksek baud orani seçim bitidir. BRGH1
ise yüksek hiz, BRGH0 ise yavas hiz seçilmis
olur. - SYNC USART modülünde mod seçim bitidir. SYNC1
ise senkron (e s zamanli ) çalisma modu, SYNC0
ise asenkron (es zamanli olmayan) çalisma modu
seçilir. - TXEN USART modülünde iletim gerçeklestirmek
için yetkilendirme bitidir. TXEN1 ise iletim
yetkisi verilir. TXEN0 ise iletim yetkisi
verilmez. - TX9 9 bitlik iletim yetkilendirme bitidir.
TX91 ise 9 bitlik iletim seçilir. TX90 ise 8
bitlik iletim durumu seçilir. - CSRC Clock kaynagi seçim bitidir. USART e s
zamanli çalisma modunda iken CSRC1 ise master
mod seçilmis olur ve clock kaynagi dahilidir,
CSRC0 ise slave mod seçilmistir ve clock kaynagi
olarak harici kaynak kullanilir.
6RCSTA Kaydedicisi
- RX9D Alinan verinin 9. Bitini olusturur. Bu bit
bir parite biti olarak düsünülebilir. - OERR Bitis süresi hata bitidir. OERR1 ise
bilgi aliminda belli bir süre içerisinde veri
alinamamistir. OERR0 ise herhangi bir süre asimi
söz konusu degildir. - FERR Çerçeve hata bitidir. FERR1 ise çerçeve
hatasi vardi r, FERR0 ise çerçeve hatasi
yoktur. - ADDEN Adres ortaya çikarma durumunu
etkinlestirme bitidir. ADDEN1 ise adres ortaya
çikarma durumu etkinlestirilir, ilgili kesme
aktif hale getirilir ve RSRlt8gt biti1 oldugunda
alis tamponu yüklenir. ADDEN0 ise adres ortaya
çikarma durumu etkin degildir ve 9. bit parite
biti olarak kullanilabilir. - CREN Sürekli alis yetkilendirme bitidir.
Asenkron modda CREN1 ise sürekli alis etkindir,
CREN0 ise sürekli veri alimi kullanim disidir.
Senkron modda CREN1 ise CREN biti temizlenene
kadar sürekli veri al i m i etkin olur, CREN0
ise sürekli veri alimi kullanim disidir. - SREN Tek veri alimi yetkilendirme bitidir.
Master senkron modda SREN1 ise tek veri alimi
etkindir. Bu durumda islem tamamlandiginda bu
bitin tekrar sifirlanmasi gerekir. SREN0 ise
tek veri alimi kullanim disidir. - RX9 Veri alma durumu yetkilendirme bitidir.
RX91 ise 9 bitlik veri alimi formati seçilir.
RX90 ise 8 bitlik veri alimi formati seçilir. - SPEN Seri port yetkilendirme bitidir. SPEN1
ise seri port aktif yapilir. Bu durumda RC7/RX/DT
ve RC6/TX/CK pinleri seri port pinleri olarak
tahsis edilir. SPEN0 ise seri port kullanim
disidir.
7USART Baud Oran Jeneratörü (BRG)
- USART modülde clockun frekansini belirleyen
aygittir. USART baud jeneratörü USARTin
senkronize ve Senkronize modlarini
desteklemektedir. BRG 8 bitlik bir jeneratördür.
Bu cihaz 8 bitlik serbest zamanli bir clock
ile kontrol edilir. Asenkron modda bit BRGH
(TXSTAlt2gt) ile kontrol edilir. Senkronize modda
ise bit BRGH istenmez. Verilen ve istenilen baud
rate ve Fosc SPBRG (register) degerleri asagidaki
formül ile ayarlanabilir ve hesaplanabilir. - Istenen Baud orani Fosc / (64 (X 1))
- 9600 16000000 /(64
(X 1)) - X 25.042
25 - Hesaplanan Baud orani 16000000 / (64 (25 1))
- 9615
-
- Hata (Hesaplanan Baud Orani -Istenen Baud Orani
) / Istenen Baud Orani - (9615 -
9600) / 9600 - 0.16
8USART Asenkronize Durumu
- Asenkron iletimde genellikle 8 bitlik iletim
formati kullanilmaktadir. PIC 16F877de datalar
denetleyici üzerinde bulunan osilatörden standart
baudun frekans oranina göre iletilir. USART
gönderici ve alicidan alinan ve iletilen ilk bit
LSBdir. USART iletici ve kaydedici fonksiyonel
olarak bagimsiz fakat ayni data formati seklinde
ve baud oraninda kullanilir. Baud jeneratörü saat
gibi çalisir veya x16 yada x64 lük bitlerin orani
seklinde üretim yapar ve BRGH biti ile kontrol
edilir. (TXSTAXZ) Bu oranlar hiçbir zaman donanim
tarafindan desteklenmez fakat sistem içerisinde 9
bitlik veriler halinde sistemde kullanilir.
Asenkronize modda islemi durdurmak için
denetleyici uyku moduna sokulur. Asenkronize mod
SYNC bitinin durumuna göre seçilir (TXSTA lt4gt).
9USART Asenkronize
- USART ileticinin kalbi TSRdir. TSR ileticiye
okuma/yazma islemleri için gereken veriler tampon
tarafindan iletilir.(TXREG) TXREG kaydedicisi TSR
ileticiye veri ile beraber yüklenir. Iletilecek
olan veriler TSRnin yüklenmesinden sonra TXREG
kaydinin tamamlanmasi ile baslar. TXREGde ise
veri iletimi TXIF (PIRlt4gt) bitinin izni ile olur.
Yani bilgi transferi için daha önceki iletim
isleminin tamamlanmis ve tamponun bosalmis
olmasi gerekmektedir. Yeni veri iletimine
baslanmadan evvel TXIFin mutlaka temizlenmesi
gerekmektedir. Bu bitin temizlenmesi ile birlikte
yeni veriler TXREG yüklenir ve baslatma biti ile
beraber veriler iletilmis olur.
10USART Blok Diyagrami
11- Asenkronize ileticinin kümelenmesi asagida adim
adim açiklanmistir. - SPBRG kaydedicisi baud ratein durumuna göre
harekete geçer. - 2. Kullanilabilir asenkronize seri
baglantilarinin temizlenebilmesi için SYNC
bitinin temizlenmesi ve SPEN bitinin
yetkilendirilmesi gerekir. - 3. Iletim için hazir vaziyete gelinmis ise TXIE
bitinin yetkilendirilmesi gerekir. - 4. Eger 9 bitlik çevirici kullaniliyorsa, kümede
TX9 biti seçilmelidir. - Bu çeviricinin kullanilabilmesi için TXEN bitinin
yetkilenmesi ve de TXIF bitinin kümede yer almasi
gerekmektedir. - 6. Eger 9 bitlik çeviri seçilmis ise TXD bitine
9 bitlik veri yüklenmelidir. - 7. TXREG kaydedicisine bilgi yüklenir ve iletim
baslar.
12USART Blok Diagrami
13ASCII kod tablosu
14MikroC USART Komutlari
- UARTx_Init
- UARTx_Data_Ready
- UARTx_Tx_Idle
- UARTx_Read
- UARTx_Read_Text
- UARTx_Write
- UARTx_Write_Text
- UART_Set_Active
- UARTx_Init Seri iletisimi istenilen hiz için
baslangiç ayarlarini yapar. UART1_Init(9600) //
9.6 kbps hizi için modül ayarlanir. - UARTx_Data_Ready Okunacak verinin hazir
oldugunu gösterir. 1 veri hazir, 0 veri hazir
degil. - // veri hazir ise okuma yapilir.
- if (UART1_Data_Ready() 1) receive
UART1_Read()
15MikroC USART Komutlari
- UARTx_Tx_Idle Gönderilmis olan veri gittiyse
yeni veri gönderimi için transmiter port unun
mesgul olup olmadigini test edilir. 1 veri
gönderildi, 0 mesgul. - if (UART1_Tx_Idle() 1) UART1_Write(_data)
- UARTx_Read Seri porttan 1 byte lik veri okur.
- if (UART1_Data_Ready() 1) receive
UART1_Read() - UARTx_Read_Text Seri porttan karakter dizisi
okur. - UARTx_Write Seri porta 1 byte lik veri yazar.
- UARTx_Write_Text Seri portta karakter dizisi
yazar. - UART_Set_Active Birden fazla UART
kullaniliyorsa aktif modülü belirler.
16MikroC ile Seri Port Uygulama
char uart_rd // EUSART
biriminden alinacak olan veri için tanimlanan
degisken sbit LCD_RS at RD2_bit // LCD
display baglantilari sbit LCD_EN at RD3_bit sbit
LCD_D4 at RD4_bit sbit LCD_D5 at RD5_bit sbit
LCD_D6 at RD6_bit sbit LCD_D7 at RD7_bit sbit
LCD_RS_Direction at TRISD2_bit sbit
LCD_EN_Direction at TRISD3_bit sbit
LCD_D4_Direction at TRISD4_bit sbit
LCD_D5_Direction at TRISD5_bit sbit
LCD_D6_Direction at TRISD6_bit sbit
LCD_D7_Direction at TRISD7_bit void main()
ADCON1 0x07 // AN
pinleri dijital I/O yapilandirildi CMCON 0
// Comparators
(karsilastiricilar) pasif edildi Lcd_Init()
// LCD display
yapilandirildi Lcd_Cmd(_LCD_CURSOR_OFF)
// LCD ekranindan imleç kaldirildi
Lcd_Cmd(_LCD_CLEAR) // LCD
ekrani silindi Lcd_Out(1, 3, " Seri
iletisim") // 1. satir, 3. sütun'a
text yazdirildi Lcd_Out(2, 1, " Uygulamasi")
// 2. satir, 1. sütun'a text yazdirildi
UART1_Init(57600) // USART
donanimi yapilandirildi Delay_ms(100)
// Baud hizi 57600 belirlendi
UART1_Write_Text("PIC16F877A USART
uygulamasi") UART1_Write(13)
// USART ile ENTER gönderildi
UART1_Write_Text("Protocol 57600, 8, N, 1")
UART1_Write(13) // USART
ile ENTER gönderildi for( ) if
(UART1_Data_Ready()) // Sayet USART'dan
veri geldi ise, uart_rd UART1_Read()
// Alinan veriyi oku, uart_rd'ye al,
UART1_Write(uart_rd) // ve USART'a
veriyi yaz Lcd_Chr_Cp(uart_rd)
// Alinan veriyi LCD ekranina gönder if
(uart_rd 27) Lcd_Cmd(_LCD_CLEAR) //
ESC display ekranini sil if (uart_rd 13)
Lcd_Cmd(_LCD_SECOND_ROW) // ENTER display 2.
satir