You are on page 1of 9

Người báo cáo:  Phạm Đức Mạnh  Tài liệu:  TUT03.

01 
Ngày:  2/9/2006  Trang:  1/9 

Tutorial no 03.02 
 
Gửi đến:  picvietnam@googlegroups.com  
Nội dung:  Kết nối PIC với EEPROM, DS1307 dùng I2C 
  MICROSOFT WORD
 
Tóm tắt: 
Trong  Tutorial  của  bạn  Ngô  Hải  Bắc  đã  có  phần  hướng  dẫn  về  cách  lập  trình  giao  tiếp  cổng  Com 
trong PC dùng VC++6.0. Hôm nay mình sẽ giới thiệu cho các bạn cách thức lập trình giao tiếp nối 
tiếp UART trên PIC: 

1. Giao tiếp nối tiếp dùng UART 

Viết  tắt  của  Universal  Asynchronous  Receiver  –  Transmitter  –  thường  là  một  mạch 
tích hợp được sử dụng trong việc truyền dẫn dữ liệu nối tiếp giữa máy tính và thiết bị 
ngoại vi thông qua cổng nối tiếp. Rất nhiều vi điều khiển hiện nay đã tích hợp UART. Để 
bắt  đầu  việc  truyền dữ  liệu  bằng  UART,  một  start  bit  được  gửi  đi,  sau  đó  là  5‐8  bit  dữ 
liệu, sau đó là stop bit. Start bit có trạng thái ngược với trạng thái bình thường của đường 
truyền dữ liệu. Stop bit có cùng trạng thái với trạng thái bình thường của đường truyền 
dữ  liệu.  Tốc  độ  của  UART  được  quy  định  bởi  tốc  độ  baud.  Một  số  interface  chuẩn  của 
UART là EIA, RS 232, RS 422 và RS 485.  

Như vậy để làm việc với UART chúng ta phải quan tâm đến các thông số sau: 

• Tốc độ Baud: thường là 9600 

• Số bít được dùng để truyền Data: từ 5 đến 8 ( thường là 8 ) 

• Bít Stop  1, hay 2  thường chọn 1 

• Bit chẵn lẻ  

2.  Giao tiếp UART trong PIC16F877A 

2.1. Các thanh ghi được sử dụng trong PIC16F877A 

Trong PIC16F877A có tất cả 5 thanh ghi cho qua trình điều khiển UART: Trong đó có 
2  thanh  ghi  chức  năng  TXSTA,  RCSTA,  2  thanh  ghi  dữ  liệu  RCREG,  TXREG.,  và  thanh 
ghi tốc độ Baud: SPBRG. 
Người báo cáo:  Phạm Đức Mạnh  Tài liệu:  TUT03.01 
Ngày:  2/9/2006  Trang:  2/9 

Thanh ghi TXSTA 

CSRC:  

TX9    :  chọn chế độ chuyền 9 bit: ( =1:  9 bit, =0: 8 bit ) 

TXEN   :  Cho phép truyền 

SYNC   :    Chọn  chế  độ  truyền  đồng  bộ  hay  không  đồng  bộ:  (  =1:  đồng  bộ,  =0: 
không đồng bộ ) 

BRGH  :  chọn chế dộ truyền cao hay thấp ( =1 HIGH,  =0:  LOW ) 

TRMT  :   bít báo trạng thái của  bộ đệm: =1:  TSR rỗng(  dữ  liệu đã đựoc  truyền 


xong ),  =0: TSR đầy (  dữ liệu còn trong bộ đệm của UART ) 

TX9D   :  giá trị của bít thứ 9 trong chế độ truyền 9 bit. Bit này có thể dùng để 
lưu bit Parity; 

Thanh ghi RCSTA 

SPEN    :   cho phép sử dụng bộ UART 

RX9    :   chấp nhận chế độ nhận 9 bit  

SREN   :   không dùng với trường hợp Asychoronous  

CREN    :   tiếp tục nhận dữ liệu  

ADDEN  :   dùng trong chế độ chọn 9 bit: ( master , slave ) 
Người báo cáo:  Phạm Đức Mạnh  Tài liệu:  TUT03.01 
Ngày:  2/9/2006  Trang:  3/9 

FERR    :   bít báo hiệu lỗi đường truyền 

OERR    :   báo hiệu lỗi đường truyền 

RX9D    :   giá trị bít thứ 9 trong quá trình Receive được lưu tại đây. 

Thanh ghi TXREG: dùng để chứa dữ liệu truyền đi trong quá trình Transmit 

Thanh ghi RCREG: dùng để lưu dữ liệu từ ngoài vào trong quá trình Receive 

Thanh ghi: SPBRG là thanh ghi  thiết lập  tốc độ baud của PIC 

Trong PIC16F877A có hai chế độ truyền High speed, và Low speed được quy định bởi 
bit BRGH của thanh ghi TXSTA. Việc phân chia hai mức tốc độ này để có sự chọn lựa cho 
trường hợp sai số với tốc độ baud chuẩn của PC:  Mà trong PC có các mức chuẩn: 300, 
2400, 9600, 19200, 28800.  Các bạn có thể tham khảo bảng 10‐3 ở trang 114 để biêt được các 
mức tốc độ : 

   

Hình 1: BAUD RATE FOR ASYNCHORONOUS MODE  ( BRGH=0 ) 
Người báo cáo:  Phạm Đức Mạnh  Tài liệu:  TUT03.01 
Ngày:  2/9/2006  Trang:  4/9 

Hình 2: BAUD RATE FOR ASYNCHRONOUS MODE ( BRGH=1 ) 

Thông qua bảng trên ta thấy ứng với tần số thạch anh là 4M để chọn cho tốc độ baud 
là 9600 ta có thể chọn  hai giá trị của thanh ghi SPBRG ở hai trường hợp : SPBRG = 25 ứng 
với BRGH =1 cói sai số là 0.15 và  SPBRG = 6 ứng với BRGH =0 có sai số 6.99. Rõ ràng là ta 
chọn gia trị nào có sai số bế nhất và ứng với VD trên ta nên chọn  SPBRG = 25 , BRGH= 1 
vì nó có sai số nhỏ hơn trường hợp kia. Như vậy ứng với trường hợp nào có sai số nhỏ 
hơn trong hai giá trị thì ta sẽ chọn cái đó. 

2.2. Quá trình truyền và nhận của PIC với PC 

Trong PIC16F877A có nhiều chế độ truyền nhận khác nhau: chế độ truyền nhận dùng 
bit  9  để  định  chẵn  lẻ,  hay  cho  mạng  VĐK  1  master  và  nhiều  slave.    Và  chế  độ  chuyền 
đồng bộ ứng dụng cho việc giao tiếp với A/D, D/A hay với các EEPRO. Và tất nhiên các 
chế dộ này sẽ được thiết lập bởi  các bit trong thanh ghi TXSTA, và TCSTA.  Tuy nhiên 
trong  tutorial  này  chỉ  xin  giới  thiệu  chế  độ  truyền  và  nhận    8  bit  giao  tiếp  với  PC  một 
trong các chức năng của bộ AUSART của PIC 

Quá trình nhận dữ liệu  

    Trong  PIC16F877A  để  nhận  biết  được  dữ  liệu  truyền  tới  người  ta  dùng  bit  cờ  RCIF  
trong thanh ghi PIR1. Như vậy khi thanh ghi đệm dữ liệu chứa dữ liệu thì RCIF sẽ được 
đưa  lên  1. Và  chính  cờ  này  cho  phép  PIC16F877A  có hai  phương  thức  để  nhận  biết  lúc 
nào có dữ liệu truyền tới. Sử dụng ngắt và sử dụng kiểu Polling ( quay vòng )  
Người báo cáo:  Phạm Đức Mạnh  Tài liệu:  TUT03.01 
Ngày:  2/9/2006  Trang:  5/9 

• Kiểu Polling: liên tục kiểm tra cờ RCIF nếu =1 thì đọc dữ liệu: Phương thức này có ưu 
điểm  dẽ lâp trình , phù hợp với những ứng dụng nhỏ.  

• Kiểu dùng ngăt: được thiết lập bằng cách cho RCIE= 1 để cho phép ngắt. Tức là mỗi 
khi có dữ liệu truyền tới RCREG thì sinh ra một ngắt và PIC sẽ tạm dừng chương trình 
hiện thời để xử lý dữ liệu vừa nhận được. Cách này chủ yếu được sử dụng 

Như vậy các bước cho quá trình nhận dữ liệu của quá trình sử dụng INTERUPT bao 
gồm: 

‐ 1. Khởi tạo tốc độ baud: ở thanh ghi SPBRG. Cho SPBRG = 25, BRGH =1 ứng với tốc  
độ 9600 ( thạch anh 4M) 
‐ 2. Cho phép quá trình truyền không đồng bộ bắng cách thiết lập SPEN = 1, SYNC= 0; 
‐ 3. Cho phép ngắt quá trình nhận dữ liệu: RCIE=1 
‐ 4  Cho phép nhận dữ liệu : CREN = 1 
‐ 5. Cho phép ngắt toàn cục băng việc GIE =1, PEIE = 1 ( GIE, PEIE trong thanh ghi 
INTCON ) 
‐ 6. Xử lý các phần khác chương trình khi có ngắt xảy ra thì xử lý dữ liệu  
VD  : nhận dữ liệu từ PC với tốc độ baud: 96000 sử dụng ngắt  

   

                BSF    TXSTA, BRGH  ;  Cho BRGH =1 


          MOVLW     Dʹ25ʹ                 ; Chon che do 9.600 
          MOVWF     SPBRG    
  BSF    RCSTA, SPEN ; SPEN = 1 
             BCF    TXSTA, SYNC   ; SYNC = 0 
  BSF    TXSTA, CREN 
  BSF    PIE, RCIE    ; RCIE = 1 
  BSF    INTCON, GIE 
  BSF    INTCON, PEIE 
             ........................ 
; Hàm ngắt xử lý dữ liệu: 
          MOVF      RCREG,W  ; Nhan du lieu tu RCREG chuyen cho thanh ghi W 
  MOVWF  PORTB      ; Dua du lieu ra PORTB 
                               ......................   
 
Người báo cáo:  Phạm Đức Mạnh  Tài liệu:  TUT03.01 
Ngày:  2/9/2006  Trang:  6/9 

2.2.2. Quá trình  truyền dữ liệu 

 Trong  quá  trình  truyền    dữ  liệu  cũng  có  hai  chế  độ  sử  dụng  ngắt  và  Polling  ,  tuy 
nhiên  quá  trình  truyền  dữ  liệu  lên  PC  không  phải  là  thời  diểm  bất  kỳ  mà  dặt  dưới  sự 
kiểm soát của chương trình cho nên người ta thưòng sử dụng kiểu polling khi cần truyền 
thì truyền đi. 

Như vậy các bước cho quá trình thiết lập ngắt: 

‐ 1. Khởi tạo tốc độ baud: ở thanh ghi SPBRG. Cho SPBRG = 25, BRGH =1 ứng với tốc 
độ 9600 ( thạch anh 4M) 
‐ 2. Cho phép quá trình truyền không đồng bộ bắng cách thiết lập SPEN = 1, SYNC= 0; 
‐ 3. Cho phép truyền dữ liệu bằng cách thiết lập bít TXEN = 1;  
‐ 4. Khi cần truyền dữ liệu chỉ cần Load dữ liệu đó lên  TXREG 
  VD:  

             BSF               TXSTA, BRGH  ;  Cho BRGH =1 


             MOVLW     Dʹ25ʹ                 ; Chon che do 9.600 
             MOVWF     SPBRG    
  BSF    RCSTA, SPEN ; 
  BCF    TXSTA, SYNC   ; 
  BSF    TXSTA, TXEN ; TXEN = 1 
  .................   
  MOVF                 DATA, W    ; Chuyen du lieu tu DATA qua W 
  MOVWF  TXREG    ; Truyen du lieu bang cach load du lieu len TXREG 
  ............. 
 
 

 Lưu ý: trư khi cho quá trình truyền và nhận dữ liệu ta phải thiết lập trạng thái chân 
của RC7, RC6 cho hợp lý. Cho RC7 là dạng in , RC6 là dạng out 

3. Một vi dụ đơn giản  

    Đây là một VD về quá trình truyền và nhận dữ liệu từ PC. PIC nhận dữ liệu tù PC 
chuyển qua PORTB ( hiển thị qua led ) rồi truyền trở lại PC 

 
Người báo cáo:  Phạm Đức Mạnh  Tài liệu:  TUT03.01 
Ngày:  2/9/2006  Trang:  7/9 

list    p=16f877A     
#include  <p16f877A.inc>     
 __CONFIG    0x393A 
errorlevel    ‐302      
w_temp          EQU     0x71         
status_temp     EQU     0x72         
pclath_temp   EQU     0x73         
ACC             EQU     0x74 
R2              EQU     0x7A 
R3              EQU     0x7B 
R4              EQU     0x7C 
 
;********************************************************************** 
      ORG       0x000                 ; processor reset vector 
      goto      main                  ; go to beginning of program 
      ORG       0x004                 ; interrupt vector location 
      movwf     w_temp                             ; save off current W register contents 
      movf                STATUS,w            ; move STATUS register into W register 
      movwf  status_temp          ; save off contents of STATUS register 
      movf                PCLATH,W          ; move PCLATH register into W register 
      movwf  pclath_temp         ; save off contents of PCLATH register 
;============================================================================= 
          BANKSEL   RCREG 
          MOVF      RCREG,W    ;  Nhan  du  lieu  tu  RCREG  chuyen  cho  thanh 
ghi W 
  MOVWF  PORTB        ; Dua du lieu ra PORTB 
  BANKSEL  TXREG 
               MOVWF  TXREG   ; Truyen du lieu do len PC 
;============================================================================== 
      movf      pclath_temp,w       ; retrieve copy of PCLATH register 
      movwf  PCLATH               ; restore pre‐isr PCLATH register contents 
      movf      status_temp,w       ; retrieve copy of STATUS register 
      movwf  STATUS                ; restore pre‐isr STATUS register contents 
      swapf     w_temp,f   
      swapf     w_temp,w            ; restore pre‐isr W register contents 
      retfie     
main 
  BANKSEL   ADCON1 
          MOVLW     0x06 
          MOVWF     ADCON1    ; Chọn chế độ Digital ở cac chan 
          CALL      Init_serialport 
          BANKSEL   TRISB 
  CLRF    TRISB        ; Cho dang PORTB la dang out 
          BSF                      INTCON,GIE                   ; Cho phep ngat  
          BSF                      INTCON,PEIE 
  GOTO    $ 
 
Init_serialport 
          BANKSEL   TXSTA 
Người báo cáo:  Phạm Đức Mạnh  Tài liệu:  TUT03.01 
Ngày:  2/9/2006  Trang:  8/9 

          BSF                      TRISC,7             ; Chon chan rb2 la dang in 


  BCF    TRISC,6 
          MOVLW     Bʹ00100100ʹ         ; Chon che do 8 bit, Hightbaudrate 
          MOVWF     TXSTA 
          MOVLW     Dʹ25ʹ                 ; Chon che do 9.600 
          MOVWF     SPBRG 
          BSF       PIE1,RCIE          ; Cho phep ngat ( receive ) 
          BANKSEL   RCSTA 
          MOVLW     Bʹ10010000ʹ         ;  
          MOVWF     RCSTA 
          RETURN 
 
            END      
 
 

Với sơ đồ kêt nối như hình vẽ:  

+5V

Mach TEST USART dung  PIC16F877A
16

MAX232
2 1
VCC

V+ C1+

6 3 U1
V- C1 1
4 2 MCLR/VPP 33
C2+ 3 RA0/AN0 RB0/INT 34
P1 4 RA1/AN1 RB1 35 U5
1 5 5 RA2/AN2 RB2 36 U6
6 C2- 6 RA3/AN3/VREF+ RB3 37 U7
2 14 11 7 RA4/TOCKI RB4 38 U8
7 T1out T1in RA5/AN4 RB5 39 U9
3 7 10 15 RB6 40
8 T2out T2in 16 RC0 RB7
4 17 RC1 19
9 13 12 18 RC2 RD0 20
5 R1in R1out 23 RC3/SCL RD1 21
GND

8 9 24 RC4/SDA RD2 22
R2in R2out 25 RC5 RD3 27
CONNECTOR DB9 26 RC6/TX RD4 28
RC7/RX RD5
15

29
RD6 30
13 RD7
OSC1/CLK1
8
RE0 9
14 RE1 10 +5V
OSC2/CLK0 RE2
11 12
32 VDD VSS 31
VDD VSS

PIC16F877A

Hình 3: Mạch test USART dung PIC16F877A

Lưu ý: ở sơ đồ trên sử dụng Max232 kết nối máy tính vì mức điện áp của PC và PIC là khác 
nhau và Max232 ở đây có tác dụng làm bộ chuyển đổi trung gian giữa PC và PIC 

‐ Cách thức test 
Người báo cáo:  Phạm Đức Mạnh  Tài liệu:  TUT03.01 
Ngày:  2/9/2006  Trang:  9/9 

‐ Sử dụng chương trình giao tiếp máy tính bất kỳ có chế độ truyền và nhận dữ liệu. ( 
dùng chương trình MSCOM của Ngohaibac ) 
‐ Soạn thảo code chương trình như trên tạo file Hex rồi nạp vào PIC16F877A.  
‐ Thiết lập phần cứng như trong hình vẽ. 
‐ Kết nối PIC với cổng com của máy tính như sơ đồ trên.  
‐ Mở chương trình giao tiếp máy tính qua cổng Com rồi chọn chế độ truyền 8 bit, tốc 
độ BAUD 9600.   
‐ Chọn connect rồi chuyền dữ liệu. Các bạn sẽ thấy dữ liệu nhận được sẽ như khi ta 
nối tắt hai chân 2, 3 của cổng com và bạn sẽ thấy dữ liệu hiển thị qua LED> VD 
truyền chữ ʺTʺ ứng với 0x54 hay 01010100 các bạn sẽ thấy có ba led sáng: led 6 và 
led 4 , led 2  sáng còn các Led còn lại tối 
‐ ( lưu ý là dữ liệu hiển thị ra led là dữ liệu cuối cùng của đoạn text, vì các dữ liệu kia 
chỉ xuất hiện trong thời gian rất ngắn nên không thể nhận ra được ) 
 

Hình 4: Giao diện mẫu 

4. Kết luận  

Trong tutorial này chỉ hướng dãn về cách thức truyền và nhận dữ liệu không đồng bộ  
qua PC  cơ chế sử dụng 8 bit. Để tìm hiểu thêm về cơ chế USART trong PIC các bạn có thể 
tham khảo Datasheet của PIC16F877A ( trang 111 ) 

Qua tutorial này các bạn sẽ biết được cách lập trình truyền nhận dữ liệu một cách đơn 
giản, cách sử dung chương trình kết nối máy tính hay sơ đô sử dụng Max232 kết nối máy 
tính.                                                                                                                                                          

You might also like