//Logo Image
作者:洪永杰 (2002-04-11);推薦:徐業良(2002-04-15)

單晶片實習-PIC與電腦之非同步串列通訊

UARTUniversal Asynchronous Receiver Transmitter,非同步串列傳輸)是微處理器常用的通訊界面,如RS-232RS-485等。目前市售的許多微處理器就內嵌了UART的模組,本文對非同步串列通訊的基本原理以及PIC16F877的內嵌USART做介紹,同時對VBRS-232之應用做一有系統的闡述。

1.     RS-232之通訊格式

在數位傳輸中,有串列(serial)傳輸與並列(parallel)傳輸兩類。如圖1所示,以由A端傳送一個Byte資料到B端為例,串列傳輸僅有一條傳送資料的資料線,如此傳完8bits,花費了8clock的時間。而並列傳輸的做法簡單來說,則是利用8條線,每一條線負責傳送1bit,如此1clock時間即可傳完8bits了。串列傳輸的優點在於傳輸線少,配線簡單,傳送距離可以較遠,而並列傳輸的優點則為傳輸速度較快。

                     

1. 串列傳輸(左)與並列傳輸(右)

電腦上RS232為一串列傳輸介面,如圖2及表1所示,RS-2329支腳位各有其功用和訊號流動方向,RS-232設計之初是用來連接數據機做傳輸之用,也因此它的腳位意義通常也和數據機傳輸有關。

3. RS-232腳位方向

1. 腳位編號及其意義

腳位

簡寫

意義

Pin1

CD

載波偵測(Carrier Detect)

Pin2

RXD

接收字元(Receive)

Pin3

TXD

傳送字元(Transmit)

Pin4

DTR

資料端備妥(Data Terminal Ready)

Pin5

GND

地線(Ground)

Pin6

DSR

資料備妥(Data Set Ready)

Pin7

RTS

要求傳送(Request To Send)

Pin8

CTS

清除以傳送(Clear To Send)

Pin9

RI

響鈴偵測(Ring Indicator)

由於RS-232在傳送資料時,並不需要另外使用一條傳輸線來傳送同步訊號,就能正確的將資料順利傳送到對方,因此叫做「非同步傳輸」,簡稱UART(Universal Asynchronous Receiver Transmitter),比起「同步傳輸」的方式,如SPI(串列週邊介面)或I2C(積體電路間通訊)等,可以節省一條傳輸線。不過節省一條傳輸線的代價,是必須在每一筆資料的前後都加上同步訊號,把同步訊號與資料混和之後,使用同一條傳輸線來傳輸。例如圖3中的資料11001010被傳輸時,資料的前後就加入Start(Low)以及Stop(High)等兩個位元,因此,傳送11001010這樣一個Byte資料,實際上是需要10clock的時間才能完成。值得注意的是,Start訊號固定為一個位元,但Stop位元則可以是11.5或者是2位元,由使用RS-232的傳送與接收兩方面自行選擇,但需注意傳送與接受兩者的選擇必須一致。此外由於RS-232在每一筆資料的前後都加了同步訊號,因此每筆資料的真正長度就不一定都是非8個位元不可,也因此RS-232的資料長度是可以由使用者在5~8之間自行選擇。

3. RS-232之非同步傳輸

在非同步、串列傳輸中,傳送與接收兩端除事先設定好如圖4相同的傳輸格式之外,還必須事先雙方設定好位元傳送的速度,如每秒鐘傳送幾個bits,這樣接收端才知道每隔多久時間就該去取下一個bit的邏輯位準。而這個“每秒鐘傳送幾個bits”的規格,就是所謂的“Baud Rate(鮑率),例如Baud Rate=9600的意思就是每秒傳送9600個位元。

一般序列通訊阜所傳送的資料是字元型態,若用來傳輸檔案,則會使用二進位制的資料型態。目前常用的資料長度,除了上述的8個位元之外,由於國際通用的標準字元碼(ASCII)只使用了7個位元,因此也有許多人選用7位元的資料長度來做RS-232傳輸,而將不用的第8個位元拿來作為除錯之用,稱為「同位元(Parity)」。除錯的方式是計算整筆資料中,1的個數為奇數或偶數。如果為奇數,則稱為「奇同位(Odd Parity)」;反之,如果是偶數,就叫做「偶同位(Even Parity)」。如果使用者選擇資料長度為8位元,則因為沒有多餘的位元可被用來作為同位元,因此就叫做「無位元(Non Parity)」。

綜合上述說明,RS-232的通訊格式可表示如“9600, N, 8, 1”,表示該系統的Baud Rate9600,而且該系統沒有使用同位元,資料長度為8個位元,最後的1”代表使用者把停止位元長度定為1個位元。

2.     PIC16F877串列通訊模組

PIC16F877中存在兩個串列I/O模組,一為MSSP(主控同步串列阜,Master Synchronous Serial Port)模組,另一為USART(泛用同步非同步接收傳送器,Universal Synchronous Asynchronous Receiver Transmitter)模組,或可稱為SCI(串列通訊介面,Serial Communication Interface)。前者主要提供PIC本身與其他週邊單元或其它微控器,例如串列EEPROMs、位移暫存器、顯示驅動器、ADC等彼此間之串列通訊,後者則多應用在整個電路板與外部,如PC等之通訊。

8051微處理器中,負責序列傳輸的是UART模組,PIC16F877USARTUART功能更廣,一般來說,有以下兩種工作模式:

(1)   非同步、全雙工:用於與周邊裝置,如CRT終端機、PC之通訊。

(2)   同步、半雙工:用於與周邊裝置,如ADCDAC、串列EEPROMs等之通訊。

所謂的雙工(Duplex)係指A可以傳訊號給BB可以傳訊號給A,可雙向溝通。全雙工(Full Duplex)允許AB同時雙向溝通,而半雙工(Half Duplex)則不允許同時雙向溝通。本文中探討的PICPC間的串列傳輸,其兩者間介面為RS-232PIC內部應用的是USART模組,此時工作在「全雙工」、「非同步」模式。

以下以數位轉速計訊號擷取為例,介紹使用RS-232的通訊格式來做PIC16F877微處理器和PC的連接,將PIC擷取到數位轉速計的訊號,透過RS-232傳至PC端,並VB介面做數值顯示。

3.     數位式轉速計與訊號擷取程式說明

本實驗所使用的轉速計為泰儀電子公司出品的數位式轉速計RM-1501,是一款接觸式∕非接觸式二用的轉速計(如圖4),在非接觸式的情況下,轉速計透過反光貼紙的反射光線而達到量測的目的。RM-1501轉速計的串列介面通道位於轉速計的正下方處,其腳位定義及其和RS-232之間的連線方式如圖5所示。

4. 數位式轉速計

5. RS-232接線圖

由上圖可以看出轉速計使用其腳位上的第4腳位傳送資料,而以第3腳位接收資料,此外還有可控制與接收外界訊息的數位輸出入腳位,這些輸出入腳位是該轉速計的進階功能,實驗時只要如上述的方式將線材接好即可。同時本轉速計所使用的預設通訊參數為“9600, N, 8, 1”且不使用流量管制,通訊時只要使用這些通訊參數即可。

由於RM-1501轉速計的輸出訊號為類比訊號,因此必須借助PIC16F877類比數位轉換功能來擷取所需的訊號。PIC16F877內建之數位類比轉換器(ADC, Analog to Digital Converter)可以提供8channel的類比訊號輸入,同一時間只能輸入一組,輸入範圍為0~5V,精確度為10位元,可解析至4.9mV,輸入類比信號經過轉換後可得0~1023的數值,透過式(1)即可得正確電壓。輸入的類比信號的參考準位電壓可以從暫存器的設定來選擇是以單晶片的供應電壓VDD為準,或是從RA2/AN2/VREF-RA3/AN3/VREF+接腳輸入外部提供的電壓準位。

        (V)                                                                             (1)

PIC16F877中可以作為類比訊號的輸入來源有8個選擇(PORTARA0~RA3RA5PORTERE0~RE2),本實驗是以PORTARA0來作為訊號的輸入端,圖6為數位轉速計訊號擷取的程式碼。

6. 數位轉速計訊號擷取的程式碼

6程式中利用CCS Compiler內建的函式數指令“#device ADC=10”將解析度設定為10 bit,同時規劃RA0~RA3RA5RE0~RE28個腳位為類比輸入。藉由CCS Compiler內建的函式數指令“set_adc_channel(0)”,可以由括號內之數值來設定read_adc()所傳回來的數值與腳位的對應關係。最後利用“RA0=read_adc()”的指令與上述式(1)的公式即可將所得之值換算成一般電壓。所得的電壓值若需完整顯示於VB介面上則必須結合VB接收程式方能達成。

4. VB接收程式說明

以下說明用VB撰寫PC端接收程式的過程,首先進入VB,在建立新專案中,選擇建立∕標準執行檔,由於寫VB程式就像堆積木一樣,把所要的控制項放入表單中,再寫表單及控制元件程式即可。圖7為簡單的VB接收程式表單,使用的控制項有控制鈕Command1(Caption屬性=“接收”)、文字方塊Text1、及通訊控制項MSComm1。通訊控制項MSComm1的引用步驟如圖8所示,只要設定好MSComm後,就可以輕易的利用PCRS-232做串列傳輸了。

7. VB接收程式表單

8. MSComm控制項的引用步驟

MSComm控制項引用完成後,還必須設定一些基礎屬性。利用滑鼠點選如圖8中的電話盒後,按下滑鼠右鍵,選取彈出式功能表中的“屬性”叫出屬性頁,如圖9本程式以設定2代表COM2為傳輸埠,此數值最大值號碼為16同時將通訊格式設定為“9600, n, 8, 1

9. 屬性頁設定視窗

在設定完相關屬性之後,便可以開始著手撰寫PICRS-232的通訊程式。圖10之程式碼的意義為PIC在擷取到數位轉速計的訊號後,透過RS-232傳輸至PC端,以VB介面做數值顯示。其中Form_Load()副程式是VB專案程式最先被執行的部分,本例中Form_Load()副程式的主要目的在設定專案開始執行後,第一步先開啟通訊阜MSComm1。而Command1_Click()副程式,是在使用者用滑鼠點選圖11中標示「接收」的控制鈕後才會被執行。程式重點在利用MSComm1.Input指令,存取PC內部串列接收Buffer內的資料,並將它顯示在圖11的文字方塊內。

10. 通訊程式原始碼

11. VB接收程式顯示介面

參考資料

*盧春林編著,PIC16F877微處理器技術精解,標高電腦,2001

*何信龍、李雪銀編著,PIC16F877快速上手,全華科技,2000

*趙春棠編著,PIC單晶片學習秘笈,全威圖書,2001

*范逸之、陳立元編著,Visual Basic RS-232 串列通訊控制最新版,文魁資訊,2001