2 .GIỚI THIỆU TỔNG QUÁT VỀ PIC16F877A
2.6 TRUYỀN THÔNG NỐI TIẾP EUART
2.6.1 Bộ EUSART hoạt động trong chế độ bất đồng bộ
Ở chế độ truyền này EUSART hoạt động theo chuẩn NRZ (None-Return-to- Zero), nghĩa là các bit truyền đi sẽ bao gồm 1 bit Start, 8 hay 9 bit dữ liệu (thông thường là 8 bit) và 1 bit Stop. Bit LSB sẽ được truyền đi trước. Các khối truyền và nhận data độc lập với nhau sẽ dùng chung tần số tương ứng với tốc độ baud cho quá trình dịch dữ liệu (tốc độ baud gấp 16 hay 64 lần tốc độ dịch dữ liệu tùy theo giá trị của bit BRGH), và để đảm bảo tính hiệu quả của dữ liệu thì hai khối truyền và nhận phải dùng chung một định dạng dữ liệu.
Bộ EUSART bất đồng bộ bao gồm các thành phần quan trọng sau: Bộ phát tốc độ baud ( BRG ) Mạch lấy mẫu Bộ phát bất đồng bộ. Bộ thu bất đồng bộ. 2.6.1.1 Bộ phát bất đồng bộ EUSART
Sơ đồ khối bộ phát EUSART bất đồng bộ được chỉ ra hình vẽ 2.12. Phần chính của nó là thanh ghi dịch nối tiếp phát (TSR). Nó nhận dữ liệu từ thanh ghi đệm phát TXREG. Thanh ghi TXREG được nạp dữ liệu bởi phần mềm.Thanh ghi TXR sẽ không được nạp dữ liệu cho đến khi stop bit đã được phát đi trong lần nạp trước đó. ngay khi stop bit được phát.TSR được nạp giá trị mới từ thanh ghi TXREG. Mỗi khi TXREG phát dữ liệu đến TSR.TXREG rỗng và cờ TXIF được bật.Ngắt này có thể được cho phép hoặc khơng cho phép bằng cách đặt hoặc xóa bit TXIE ( PIE<4>). Cờ TXIF sẽ được đặt bất chấp trạng thái của bit TXIE và khơng thể được xóa bởi phần mềm. Nó chỉ có thể được xóa khi dữ liệu mới được nạp vào thanh ghi TXREG. Trong khi bit TXIF chỉ ra trạng thái của thanh ghi TXREG thì bit TRMT lại chỉ ra trạng thái của thanh ghi TSR.Bit này chỉ có thể đọc, được đặt khi thanh ghi TSR rỗng.
Việc phát dữ liệu được phép bằng cách cho phép bit TXEN. Việc phát dữ liệu thực sư không xảy ra cho đến khi thanh ghi TXREG được nạp dữ liệu và bộ BRG tạo ra một clock dịch.Việc phát dữ liệu cũng có thể được bắt đầu bằng nạp thanh ghi TXREG và cho phép bit TXEN.
Để có thể phát 9 bit dữ liệu , bit TX9 được đặt và 9 bit dữ liệu được ghi đến bit TX9D.Bit thứ 9 phải được ghi trước khi ghi 8 bit dữ liệu đến TXREG.
Để thiết lập chế độ phát bất đồng bộ , các bước sau được thực hiện :
1) Thiết lập tốc độ Baud cho thanh ghi SPBRGH:SPBRG , nếu tốc độ baud được yêu cầu cao , đặt bit BRGH.
2) Set chân điều khiển RX/DT và TX/CK bằng “1”.
3) Cho phép port nối tiếp bất đồng bộ bằng cách xóa bit SYNC và bit SPEN. 4) Nếu cần phát 9 bit dữ liệu , đặt bit TX9.
5) Set bit điều khiển CKTXP nếu dữ liệu phát bị đảo ngược.
6) Cho phép phát dữ liệu bằng cách đặt bit điều khiển TXEN, có thể ngắt bit TXIF
7) Nếu ngắt được yêu cầu , cho phép bit TXIE. Trường hợp có sử dụng ngắt , phải bảo đảm rằng bit GIE và bit PEIE trong thanh ghi INTCON được đặt.
8) Nếu cần phát 9 bit dữ liệu , bit thứ 9 sẽ phụ thuộc vào bit dữ liệu TX9D 9) Nhận 8 bit dữ liệu từ thanh ghi TXREG. Có thể bắt đầu truyền dữ liệu.
Hình 2.12 Sơ đồ khối bộ truyền dữ liệu EUSART bất đồng bộ
Hình 2.13 Các thanh ghi liên quan đến quá trình truyền bất đồng bộ
2.6.1.2 Bộ thu bất đồng bộ EUSART
Sơ đồ khối của bộ thu được chỉ ra ở hình vẽ 2.14. Dữ liệu nhận trên chân RC7/RX/DT và dồn vào khối khôi phục dữ liệu. Khối khôi phục dữ liệu thật ra là dịch dữ liệu tốc độ cao, hoạt động nhanh gấp 16 lần tốc độ Baud. Một khi chế độ bất đồng bộ được chọn thì việc tiếp nhận được phép bằng cách đặt Bit CREN (RCSTA<4>).
Trung tâm của bộ nhận là thanh ghi dịch nhận RSR. Sau khi lấy mẫu Bit Stop dữ liệu nhận trong RSR được truyền đến thanh ghi RCREG. Nếu việc truyền hồn tất thì Bit Cờ RCIF lên 1. Ngắt thật sự cho phép hoặc không cho phép bằng cách đặt hoặc xóa Bit RCIE. Cờ RCIF chỉ là 1 Bit chỉ đọc và được xó bởi phần cứng. Nó được xóa khi thanh ghi RCREG được đọc và hồn tồn khơng có dữ liệu. RCREG là 1 thanh ghi bộ đệm đơi (Bởi vì nó cho 2 Byte dữ liệu có thể truyền và nhận đồng thời đến RCREG
FIFO và Byte thứ 3 bắt đầu được dịch chuyển đến thanh ghi RSR). Khi phát hiện ra Bit Stop của Byte thừ 3 này, Nếu thanh ghi RCREG vẫn cịn đầy thì Bit bào lỗi trànOERR(RCSTA<1>), sẽ lên 1. Những dữ liệu trong RSR sẽ mất đi. Và thanh ghi RCREG có thể được đọc 2 lần để lấy lại 2 Byte trong FIFO. Bit báo tràn OERR phải được xóa trong phần mềm.
Để thiết lập chế độ thu bất đồng bộ, các bước sau được yêu cầu :
1. Khởi tạo thanh ghi SPBRGH:SPBRG, BRGH và BRG16 bit cho việc chọn sai số tốc độ Baud.
2. Set chân điều khiển RX/DT và TX/CK bằng “1”.
3. Cho phép nhận qua Port nối tiếp bất đồng bộ bằng cách xóa Bit SYNC và cho Bit SPEN lên 1.
4. Nếu ngắt xảy ra thì set Bit RCIE và Nếu sử dụng ngắt thì set bit GIE và PEIE của thanh ghi INTCON.
5. Nếu nhận 9-Bit dữ liệu thì set Bit RX9 .
6. Set bit CKTXP nếu dữ liệu nhận bị đảo ngược. 7. Cho phép nhận dữ liệu bằng cách set Bit CREN.
8. Sau khi dữ liệu được nhận , Bit Cờ ngắt RCIF sẽ được set và cờ ngắt được kích hoạt (nếu bit RCIE được set).
9. Đọc nội dung thanh ghi RCSTA để nhận bit dữ liệu thứ 9 và xác định các lỗi xảy trong quá trình thu dữ liệu.
10. Nhận 8 bit dữ liệu thu được bằng cách đọc nội dung thanh ghi RCREG. 11. Nếu xuất hiện lỗi trong q trình nhận thì xóa lỗi bằng cách xóa BitCREN
Hình 2.15 Các thanh ghi liên quan đến quá trình nhận dữ liệu bất đồng bộ
2.6.1.3 Độ chính xác của xung clock với hoạt động khơng đồng bộ
Hình 2.16 Cấu tạo thanh ghi TXSTA
Bit 7 CSRC : bit chọn nguồn xung. Chế độ bất đồng bộ : không cần thiết Chế độ đồng bộ :
+ 1 = chế độ chủ (phát xung dao động nội từ BRG). + 0 = chế độ tớ ( xung dao dộng ngoại ).
Bit 6 TX9 : bit cho phép truyền 9 bit. + 1 = chọn chế độ truyền 9 bit. + 1 = chọn chế độ truyền 8 bit. Bit 5 TXEN : bit cho phép truyền.
+ 1 = cho phép truyền.
+ 0 = không cho phép truyền. Bit 4 SYNC : bit chọn chế độ USART.
+ 1 = chế độ đồng bộ. + 0 = chế độ bất đồng bộ. Bit 3 SEND8 : gửi bit ký tự bị mất. Chế độ bất đồng bộ :
+ 1 = truyền ký tự bị mất
+ 0 = quá trình truyền ký tự bị mất kết thúc Chế độ đồng bộ : không cần thiết
+ 1 = tốc độ nhanh. + 0 = tốc độ chậm.
Bit 1 TRMT : bit trạng thái dịch truyền thanh ghi. + 1 = TSR rỗng.
+ 0 = TSR đầy.
Bit 0 TX9D : bit thứ 9 của truyền dữ liệu, có thể là bit Parity.
Hình 2.17 Cấu tạo thanh ghi RCSTA
Bit 7 SPEN : bit cho phép Serial Port.
+ 1 = cho phép Serial Port (tức là cấu hình cho RC7/RX/DT và RC6/TX/CK như chân Serial Port).
+ 0 = không cho phép.
Bit 6 RX9 : bit cho phép nhận 9 bit. + 1 = cho phép nhận 9 bit. + 0 = cho phếp nhận 8 bit.
Bit 5 SREN : bit cho phep nhận đơn độc. Chế độ bất đồng bộ không dùng.
Chế độ đồng bộ - Master:
+ 1 = cho phép nhận đơn độc. + 0 = không cho phép.
Chế độ đồng bộ - Slave : không cần. Bit 4 CREN : bit cho phép nhận tiếp tục. Chế độ bất đồng bộ :
+ 1 = cho phép nhận tiếp tục. Chế độ bất đồng bộ :
+ 1 = cho phép nhận tiếp tục.
+ 0 = không cho phép nhận tiếp tuc. Chế độ đồng bộ :
Bit 3 ADDEN : bit cho phép phat hiện địa chỉ. Chế độ bất đồng bộ 9 bit (RX9 = 1):
+ 1 = cho phép phat hiện địa chỉ, cho phép nhắt và tải bộ đệm nhận khi RSR<8> được SET.
+ 0 = không cho phép phát hiện địa chỉ, tất cả các Bytes được nhận và bit thứ 9 có thể được sử dụng như là bit Parity.
Bit 2 FERR : bit báo lỗi khung truyền
+ 1 = lỗi khung truyền (có thể được chấp nhận bằng cách đọc thanh ghi RCREG và nhận Byte tiếp theo).
+ 0 = khơng xuất hiện lỗi trong q trình truyền nhận dữ liệu. Bit 1 OERR : bit báo lỗi tràn bộ nhớ.
+ 1 = lỗi tràn ( có thể xóa bằng cách xóa bit CREN). + 0 = không báo lỗi tràn.
Bit 0 RX9D : bit thứ 9 của dữ liệu nhận ( có thể là bit parity nhưng phải được tính tốn bởi người dùng).
2.6.2 Bộ EUSART hoạt động trong chế độ đồng bộ
Giao diện EUSART đồng bộ được kích hoạt bằng cách set bit SYNC. Cổng giao tiếp nối tiếp vẫn là hai chân RC7/RX/DT, RC6/TX/CK và được cho phép bằng cách set bit SPEN. EUART cho phép hai chế độ truyền nhận dữ liệu là Master mode và Slave mode. Master mode được kích hoạt bằng cách set bit CSRC (TXSTA<7>), Slave mode được kích hoạt bằng cách Clear bit CSRC. Điểm khác biệt duy nhất giữa hai chế độ này làMaster mode sẽ lấy xung clock đồng bộ từ bộ tạo xung baud BRG còn Slave mode lấy xung clock đồng bộ từ bên ngoài qua chân RC6/TX/CK. Điều này cho phép Slave mode hoạt động ngay cả khi vi điều khiển đang ở chế độ sleep.
2.7 HOẠT ĐỘNG ĐỊNH THỜI TIMER 2.7.1 Bộ định thời TIMER0 2.7.1 Bộ định thời TIMER0
Bộ định thời/bộ đếm Timer0 có các đặc tính sau : - Bộ định thời / bộ đếm 8 bit .
- Cho phép đọc và ghi .
- Bộ chia 8 bit lập trình được bằng phần mềm . - Chọn xung clock nội hoặc ngoại .
- Chọn cạnh cho xung clock ngoài
Bên dưới là sơ đồ khối của bộ định thời Timer 0 và bộ chia dùng chung với WDT. Chế độ định thời (Timer) được chọn bằng cách xóa bit T0CS ( OPTION_REG<5> ) Trong chế độ định thời , bộ định thời Timer 0 sẽ tăng dần sau mỗi chu kỳ lệnh ( khơng có bộ chia ) . Nếu thanh ghi TMR0 được ghi thì sự tăng sẽ bị ngăn lại sau hai chu kỳ lệnh .
Chế độ đếm(Counter) được chọn bằng cách set bit T0SC ( OPTION_REG<5> ). Trong chế độ đếm , Timer0 sẽ tăng dần ở mỗi cạnh lên hoặc cạnh xuống của chân RA4/T0CKI . Sự tăng cạnh được xác định bởi bit Timer0 Source Edge Select , T0SE (OPTION_REG<4> ) . Bộ chia chỉ được dùng chung qua lại giữa bộ định thời Timer0 và bộ định thời Watchdog . Bộ chia không cho phép đọc hoặc ghi .
Ngắt TMR0 được phát ra khi thanh ghi TMR0 tràn từ FFh đến 00h đối với 8 bit. Sự tràn này sẽ set bit TMR0IF(INTCON<2>). Ngắt này có thể được giấu đi bằng cách xóa đi bit TMR0IE (INTCON<5>) . Bit TMR0IF cần phải được xóa trong chương trình bởi thủ tục phục vụ ngắt của bộ định thời Timer0 trước khi ngắt này được cho phép lại.
Sơ đồ khối của Timer 0 như sau:
Hình 2.18 sơ đồ khối bộ định thời Timer0
Muốn Tmer 0 hoạt động ở chế độ Timer ta clear bit T0SC (OPTION_REG<5>), khi đó giá trị thanh ghi TMR0 sẽ tăng theo từng chu kỳ xung đồng hồ (tần số vào
Timer 0 bằng 1/4 tần số oscillator). Khi giá trị thanh ghi TMR0 từ FFh trở về 00h, ngắt Timer 0 sẽ xuất hiện.
Thanh ghi TMR0 cho phép ghi va xoa được giúp ta ấn định thời điểm ngắt Timer 0 xuất hiện một cách linh động . Muốn Timer 0 hoạt đọng o chế độ counter ta set bit T0CS (OPTION_REG<5>). Khi đó xung tác động lên bộ đếm được lấy từ chân RA4/T0CKI. Bit T0SE (OPTIN_REG<4>) cho phép lựa chọn cạnh tác động vào bộ đếm. Cạnh tác động sẽ là cạnh lên nếu T0SE = 0 và cạnh tác động sẽ là cạnh xuống nếu T0SE = 1.
Khi thanh ghi TMR0 bị tràn, bit TMR0IF (INTCON<2>) sẽ được set. Đây chính là cờ ngắt của Timer 0. Cờ ngắt này phải được xóa bằng chương trình trước khi bộ đếm bắt đầu thực hiện lại q trình đếm .NGắt Timer 0 khơng thể đánh thức vi điều khiển từ chế độ sleep
Bộ chia tần số (prescaler) được chia sẻ giữa Timer 0 và WDT (Watchdog Timer). Điều đó có nghĩa là nếu bộ chia tần số được sử dụng cho timer 0 thì WDT sẽ khơng có hỗ trợ của bộ chia tần số và ngược lại. Bộ chia tần số được điềi khiển bởi thanh ghi OPTION_REG. Bit PSA (OPTION_REG<3>) xác định đối tượng tác động của bộ chia tần số. Các bit PS2:PS0 (OPTION_REG<2:0>) xác định tỉ số của bộ chia tần số. Các lệnh tác động lên giá trị thanh ghi TMR0 sẽ xóa chế độ hoạt động của bộ chia tần số.
Các thanh ghi điều khiển liên quan đến Timer 0 bao gồm : TMR0 (địa chỉ 01h,101h) : chứa giá trị đếm của Timer 0. INTCON (địa chỉ 0Bh,8Bh,10Bh,18Bh)):cho phép ngắt hoạt . OPTION_REG (địa chỉ 81h,181h) : điều khiển bộ chia tần số.
Hình 2.19 Các thanh ghi liên quan đến bộ định thời Timer0
2.7.2 Bộ định thời TIMER1
Bộ định thời Timer1 là một bộ định thời/bộ đếm 16 bit gồm hai thanh ghi TMR1H ( byte cao ) và TMR1L ( byte thấp ) mà có thể đọc hoặc ghi . Cặp thanh ghi
này tăng số đếm từ 0000h đến FFFFh và một tràn sẽ xuất hiện khi có sự chuyển số đếm từ FFFFh xuống 0000h . Ngắt, nếu được phép có thể phát ra khi có số đếm tràn và được đặt ở bit cờ ngắt TMR1IF. Ngắt có thể được phép hoặc cấm bằng cách đặt hoặc xóa bit cho phép ngắt TMR1IE.
Bộ định thời Timer1 có thể được cấu hình để hoạt động một trong hai chế độ sau: - Định thời một khoảng thời gian ( Timer )
- Đếm sự kiện ( Counter )
Việc lựa chọn một trong hai chế độ được xác định bằng cách đặt hoặc xóa bit chọn clock TMR1CS. Trong chế độ định một khoảng thời gian, bộ định thời tăng số đếm lên sau mỗi chu kỳ lệnh. Trong chế độ đếm sự kiện, bộ định thời tăng sau mỗi cạnh lên của clock ngoài đặt vào. Bộ định thời 1 có thể được phép hoặc cấm bằng cách đặt hoặc xóa bit điều khiển TMR1ON.
Hình 2.20 T1CON: Thanh ghi điều khiển Timer1
Hình 2.21 Sơ đồ khối Timer1
Ngồi ra Timer 1 cịn có chức năng reset input bên trong được điều khiển bởi một trong hai khối CCP (Capture/Compare/PWM).Khi set bit T1OSCEN thì Timer 1 sẽ lấy xung clock từ hai chân RC/T1OSI/CCP2 và RC0/T1OSO/T1CKI làm xung đếm. Timer 1 sẽ bắt đầu đếm sau cạnh xuống đầu tiên của xung ngõ vào. Khi đó PORTC sẽ bỏ qua sự tác động của hai bit TRISC<1:0> và PORTC<2:1> được gán giá trị 0 . Khi
clear bit T1OSCEN Timer 1 sẽ lấy xung đếm từ oscillator hoặc từ chân RC0/T1OSO/T1CKI.
Timer 1 có hai chế độ đếm là đồng bộ (Synchronous) và bất đồng bộ (Asynchronous). Chế độ đếm được quyết định bởi bit điều khiển T1SYNC (T1CON<2>).
Khi T1SYNC = 1 xung đếm lấy từ bên ngoài sẽ khơng được đồng bọ hóa với xung clock bên trong, Timer 1 sẽ tiếp tục quá trình đếm vi điều khiển đang ở chế độ sleep và ngắt do Timer tạo ra khi bi tràn có khả năng đánh thức vi điều khiển. Ở chế độ đếm bất địng bộ, Timer 1 khơng thể được sử dụng để làm nguồn xung clock cho khói CCP (Capture/Compare/Pulse width modulation).
Khi T1SYNC = 0 xung đếm vào Timer 1 sẽ được đồng bộ hóa với xung clock bên trong. Ở chế độ này Timer 1 sẽ không hoat động khi vi điều khiẻn đang ở chế độ sleep.
Các thanh ghi liên quan đến Timer 1 bao gồm:
INTCON (địa chỉ 0Bh, 8Bh,10Bh, 18Bh) : cho phép ngắt hoạt động. PIR1 (địa chỉ 0Ch): chứa cờ ngắt Timer 1 (TMR1IF).
PIE1 (địa chỉ 8Ch): cho phép ngắt Timer 1 (TMR1IE).
TMR1L (địa chỉ 0Eh): chứa giá trị 8 bít thấp của bộ đếm Timer 1. TMR1H (địa chỉ 0Fh): chứa giá trị 8 bít cao của bộ đếm Timer 1. T1CON (địa chỉ 10h): xác lập các thông số cho Timer 1.
Hình 2.22 Các thanh ghi liên quan đến bộ định thời Timer1
2.7.3 Bộ định thời TIMER2
Bộ định thời Timer2 là bộ định thời 8 bit với một bộ chia và một bộ Postscaler. Nó thường được dùng chung với bộ CCP trong chế độ PWM ( sẽ được đề cập ở phần
sau ). Thanh ghi TMR2 có thể đọc hoặc ghi và được xóa khi có bất kỳ tín hiệu reset