Hoạt động cổng nối tiếp.
• Giới thiệu.
8051 có một cổng nối tiếp trong chip có thể hoạt động ở nhiều chế độ, trên một dải tần số rộng. Chức năng chủ yếu của cổng nối tiếp là thực hiện chuyển đổi song song sang nối tiếp đối với dữ liệu xuất, và chuyển đổi nối tiếp sang song song với dữ liệu nhập.
Việc truy xuất phần cứng qua cổng nối tiếp được thực hiện bằng các chân TXD và RXD. Các chân này là hai bit của cổng 3, P3.1 (TXD) và P3.0 (RXD).
Cổng nối tiếp cho phép hoạt động song công (full duplex), và bộ đệm thu (receiver buffering) cho phép một ký tự sẽ đã thu giữ trong bộ đệm, trong khi ký tự thứ hai được nhận. Nếu CPU đọc ký tự thứ nhất trước khi ký tự thứ hai được thu đầy đủ, thì dữ liệu sẽ không bị mất.
Hai thanh ghi chức năng đặc biệt cho phép phần mềm truy xuất đến cổng nối tiếp là: SBUF và SCON. Bộ đệm cổng nối tiếp (SBUF) có địa chỉ 99H thực chất bao gồm hai bộ đệm. Dữ liệu ghi vào SBUF sẽ được truyền ra thiết bị bên ngoài, và đọc SBUF để truy xuất dữ liệu thu được. Đây là hai thanh ghi riêng biệt (một thanh ghi chỉ ghi để phát và một thanh ghi chỉ đọc để thu).
Thanh ghi điều khiển cổng nối tiếp (SCON) có địa chỉ 98H là thanh ghi địa chỉ hoá theo bit, nó chứa các bit trạng thái và các bit điều khiển. Các bit điều khiển cho phép thiết lập các chế độ hoạt động cho cổng nối tiếp, và các bit trạng thái chỉ thị việc kết thúc phát hoặc thu ký tự. Các bit trạng thái có thể được kiểm tra bằng phần mềm hoặc có thể được lập trình để tạo ngắt.
Tần số làm việc của cổng nối tiếp, còn gọi là tốc độ baud có thể cố định (lấy từ bộ dao động trên chip). Khi muốn tốc độ baud thay đổi, cần lập trình Timer 1.
• Thanh ghi điều khiển cổng nối tiếp.
Chế độ hoạt động của cổng nối tiếp được thiết lập bằng cách ghi dữ liệu vào thanh ghi điều khiển cổng nối tiếp (SCON). Ý nghĩa các bit của SCON được mô tả trong bảng sau:
Bit Ký hiệu Địa chỉ Chức năng
7
6
5
4
3
2
1
0 SM0
SM1
SM2
REN
TB8
RB8
TI
RI 9FH
9EH
9DH
9CH
9BH
9AH
99H
98H Bit chọn chế độ.
Bit chọn chế độ.
Bit chọn chế độ, cho phép truyền thông tin trong chế độ đa xử lý trong chế độ 2 và 3; RI sẽ không tác động nếu nhận được bit thứ 9 bằng 0.
Cần được lập để cho phép nhận dữ liệu.
Khi được lập bit thứ 9 sẽ được truyền trong chế độ 3; bit này có thể lập xoá bằng phần mềm.
Khi được lập, bit thứ 9 sẽ được nhận.
Được lập khi kết thúc truyền 1 byte dữ liệu, bit này có thể xoá bằng phần mềm.
Được lập khi nhận xong một byte dữ liệu, có thể xoá bằng phần mềm.
Các chế độ truyền cổng nối tiếp với thiết bị bên ngoài được định nghĩa bằng các bit SM1 và SM0 như mô tả trong bảng sau:
SM0 SM1 Chế độ Chức năng Tốc độ baud
0
0
1
1 0
1
0
1 0
1
2
3 Thanh ghi dịch.
8bit UART
9bit UART
9bit UART Cố định (tần số dao động/12).
Thay đổi (theo giá trị của timer).
Cố định (tần số dao động/12 hoặc 64.
Thay đổi (theo giá trị của timer).
Trước khi sử dụng cổng nối tiếp, phải khởi động SCON để chọn chế độ thích hợp. Ví dụ, lệnh: MOV SCON, #01010010B
Sẽ khởi động cổng nối tiếp ở chế độ 1 (SM0/SM1 = 0/1), cho phép bộ thu (REN=1) và đặt cờ ngắt phát (TI=1) để chỉ bộ phát sẵn sàng hoạt động.
55 trang |
Chia sẻ: trungkhoi17 | Lượt xem: 505 | Lượt tải: 0
Bạn đang xem trước 20 trang tài liệu Giáo trình Vi điều khiển (Microcontroller), để xem tài liệu hoàn chỉnh bạn click vào nút DOWNLOAD ở trên
g nối tiếp có 4 chế độ hoạt động, có thể chọn được bằng cách viết các số 1 hay 0 vào các bit SM0 và SM1 trong SCON. Có ba chế độ cho phép truyền đồng bộ (UART), trong chế độ này, mỗi ký tự được thu (nhận) hoặc phát đều nằm trong một khung có một bit start và 1 bit stop. Ở chế độ 0, cổng nối tiếp hoạt động như một thanh ghi dịch thông thường.
S1
S2
S3
S4
S5
S6
P1
P2
P1
P2
P1
P2
P1
P2
P1
P2
P1
P2
D1
D0
D2
D3
D4
D5
D6
D7
a) Định thời phát nối tiếp trong chế độ 0
Một chu kỳ máy
Osc
ALE
Data out
Shift clock
S3P1
S6P1
ALE
Data out
RXD
Shift clock
TXD
b) Định thời nhận nối tiếp trong chế độ 0
ALE
Data in
RXD
Shift clock
TXD
D0
D1
D2
D3
D4
D5
D6
D7
Hình 8.13: Định thời thu phát dữ liệu trên cổng nối tiếp ở chế độ 0
Chế độ 0: (Thanh ghi dịch 8 bit): Chế độ 0 được chọn bằng cách ghi các bit 0 vào SM1 và SM0 của SCON. Trong chế độ này, cổng nối tiếp hoạt động giống như một thanh ghi dịch 8 bit. Dữ liệu nối tiếp vào và ra qua RXD và TXD theo xung nhịp. 8 bit được phát hoặc thu với bit đầu tiên là LSB. Tốc độ baud cố định ở 1/12 tần số dao động trên chip.
Việc phát được khởi động bằng một lệnh ghi dữ liệu vào SBUF. Dữ liệu được dịch ra ngoài trên đường RXD (P3.0), với các xung nhịp dịch được gửi ra đường TXD (P3.1). Mỗi bit được phát đi (trên RXD) trong một chu kỳ máy. Trong mỗi chu kỳ máy, tín hiệu xung nhịp dịch xuống thấp ở S3P1 và trở về mức cao ở S6P1. Định thời dữ liệu phát biểu diễn trên hình 8.13a.
Việc thu được khởi động khi bit cho phép bộ thu (REN) là 1, và bit ngắt thu (RI) là 0. Qui tắc chung là lập REN khi bắt đầu chương trình để khởi động cổng nối tiếp, rồi xóa RI để bắt đầu nhận dữ liệu. Khi RI bị xóa, các xung nhịp được đưa ra đường TXD khi bắt đầu chu kỳ máy kế tiếp, và dữ liệu được đưa ra đường RXD theo xung nhịp. Mỗi bit dữ liệu được nhận vào cổng nối tiếp ở cạnh lên của xung nhịp trên đường TXD như biểu diễn trên hình 8.13b.
Một ứng dụng của chế độ thanh ghi dịch là mở rộng khả năng xuất dữ liệu của 8051. IC thanh ghi dịch nối tiếp ra song song có thể được nối vào các đường TXD và RXD của 8051 để cung cấp thêm 8 đường ra như trên hình 8.14. Có thể nối nối tiếp thêm các thanh ghi dịch để mở rộng thêm nhiều cổng vào ra khác nữa.
8051
Thanh ghi dịch
DATA
CLOCK
TXD
RXD
Hình 8.14: Tăng thêm cổng vào ra song song sử dụng cổng nối tiếp ở chế độ 0
Chế độ 1 (Truyền bất đồng bộ 8 bit với tốc độ baud thay đổi được): Ở chế độ 1, cổng nối tiếp của 8051 làm việc như một bộ truyền nhận nối tiếp bất đồng bộ (UART-Universal Asynchronous Receiver/Transmitter) 8 bit với tốc độ baud thay đổi được. UART thực hiện thu phát dữ liệu nối tiếp với mỗi ký tự dữ liệu đi trước là bit start ở mức thấp, theo sau là bit stop ở mức cao. ngoài ra có thể chèn thêm bit kiểm tra chẵn lẻ giữa bit dữ liệu cuối cùng và bit stop.
Trong chế độ 1, mỗi ký tự dữ liệu bao gồm 10 bit được phát trên TXD hoặc thu trên RXD bao gồm: 1 bit start (luôn là 0), 8 bit dữ liệu (LSB đầu tiên) và1 bit stop (luôn là 1). Khi thu, bit stop được đưa vào RB8 trong SCON. Trong 8051 chế độ baud được đặt bằng tốc độ báo tràn của Timer 1.
Tạo xung nhịp và đồng bộ hoá các thanh ghi dịch của cổng nối tiếp trong các chế độ 1, 2 và 3 được thiết lập bằng bộ đếm 4 bit (chia cho 16), ngõ ra của bộ đếm cung cấp xung nhịp xác định tốc độ baud. Ngõ vào của bộ đếm này được chọn qua phần mềm.
Việc truyền dữ liệu (phát) được khởi động bằng cách ghi vào SBUF, nhưng quá trình phát dữ liệu sẽ vẫn chưa thật sự bắt đầu cho đến khi vòng quay kế tiếp của bộ đếm chia cho 16 cung cấp tốc độ baud cho cổng nối tiếp. Dữ liệu được dịch ra ngoài trên đường TXD bắt đầu bằng bit start, theo sau là 8 bit dữ liệu và sau cùng là bit stop. Độ rộng (theo thời gian của mỗi bit) là nghịch đảo của tốc độ baud được lập trình trong timer. Cờ ngắt phát (TI) được đặt lên 1 khi bit stop xuất hiện trên TXD.
Việc thu dữ liệu được khởi động khi có sự chuyển trạng thái từ 1 xuống 0 trên đường RXD. Bộ chia 16 tức thời được xóa để đồng bộ số đếm với luồng bit đến (bit kế tiếp sẽ đến ở vòng đếm 16 kế tiếp ). Luồng bit đến được lấy mẫu giữa các vòng đếm16.
Bộ thu sẽ kiểm tra lại bit start ở lần đếm sau khi có chuyển trạng thái từ 1 xuống 0 đầu tiên trên RXD. Nếu ở thời điểm này RXD không còn giữ trạng thái 0, thì bộ thu sẽ xem như tín hiệu start không hợp lệ (do nhiễu chứ không phải do một ký tự hợp lệ). Bộ thu được reset và quay về trạng thái nghỉ (idle), đợi sự chuyển trạng thái từ 1 xuống 0 kế tiếp.
Khi đã phát hiện được bit start hợp lệ, các bit của ký tự sẽ tiếp tục được thu. Bit start được bỏ qua và 8 bit dữ liệu được đưa vào thanh ghi dịch cổng nối tiếp. Khi tất cả 8 bit dữ liệu đã được nhận, các bước tiếp theo sẽ xảy ra:
Bit thứ 9 (bit stop) được nạp vào RB8 trong SCON.
SBUF được nạp với 8 bit dữ liệu.
Cờ ngắt bộ thu (RI) được lập lên 1.
Tuy nhiên, các bước trên chỉ xảy ra nếu đã có những điều kiện sau:
RI = 0.
SM2 = 1 và bit stop thu được là 1, hoặc SM2 = 0.
Yêu cầu RI = 0 để bảo đảm là chương trình đã đọc ký tự trước (và RI được xóa). Điều kiện thứ hai chỉ áp dụng trong chế độ truyền thông đa xử lý. Điều đó hàm ý là “không đặt RI lên 1 trong chế độ truyền thông đa xử lý khi bit dữ liệu thứ 9 là 0).
Chế độ 2 (UART 9 bit với tốc độ baud cố định): Khi SM1 = 1 và SM0 = 0, cổng nối tiếp làm việc ở chế độ 2, như một UART 9 bit có tốc độ baud cố định. 11 bit sẽ được phát hoặc thu: 1 bit start, 8 bit dữ liệu, bit dữ liệu thứ 9 có thể lập trình được và 1 bit stop. Khi phát, bit thứ 9 là bất cứ gì đã được đưa vào TB8 trong SCON (có thể là bit parity). Khi thu, bit thứ 9 thu được sẽ ở trong RB8. Tốc độ baud ở chế độ 2 là 1/32 hoặc 1/16 tần số dao động trên chip.
Chế độ 3 (UART 9 bit với tốc độ baud thay đổi được): Chế độ này giống như chế độ 2 ngoại trừ tốc độ baud có thể lập trình được trong timer. Thật ra, các chế độ 1, 2 và 3 rất giống nhau. Khác biệt giữa chúng là ở tốc độ baud (cố định trong chế độ 2, thay đổi trong các chế độ 1 và 3) và ở số bit dữ liệu (8 trong chế độ 1, 9 trong các chế độ 2 và 3).
Khởi động và truy xuất các thanh ghi cổng nối tiếp.
Cho phép thu: bit cho phép bộ thu (REN = Receiver Enable) trong SCON phải được lập lên 1 bằng phần mềm để cho phép thu các ký tự. Thông thường việc này được thực hiện ở đầu chương trình khi khởi động cổng nối tiếp, timer,... Có thể thực hiện việc này theo hai cách. Lệnh:
SETB REN
Sẽ lập REN lên 1, hoặc lệnh:
MOV SCON, #xxx1xxxxB
Sẽ lập REN lên 1 và lập hoặc xóa các bit khác trong SCON tuỳ theo các yêu cầu khác nhau (Các x phải là 0 hoặc 1 để khởi động các chế độ hoạt động).
Bit dữ liệu thứ 9: bit dữ liệu thứ 9 cần phát trong các chế độ 2 và 3 phải được nạp vào trong TB8 bằng phần mềm. Khi thu bit dữ liệu dữ liệu thứ 9 được nạp vào RB8. Phần mềm có thể yêu cầu hoặc không yêu cầu bit dữ liệu thứ 9, tuỳ thuộc vào đặc tính kỹ thuật của thiết bị nối tiếp sử dụng. Bit dữ liệu thứ 9 cũng đóng một vai trò quan trọng trong truyền thông tin đa xử lý.
Thêm 1 bit parity: Bit dữ liệu thứ 9 thường sử dụng để thêm parity vào ký tự truyền nhận. Bit P trong từ trạng thái chương trình (PSW) được lập lên 1 hoặc bị xóa về 0 sau mỗi chu kỳ máy để thiết lập kiểm tra chẵn lẻ cho 8 bit trong thanh ghi tích lũy. Ví dụ, khi cần truyền 8 bit dữ liệu cộng thêm kiểm tra chẵn, có thể sử dụng các lệnh sau:
MOV C, P ; nạp bit parity vào cờ C
MOV TB8, C ; nó trở thành bit dữ liệu thứ 9
MOV SBUF, A ; Chuyển 8 bit từ ACC vào SBUF.
Nếu cần parity lẻ thì sửa các lệnh lại như sau:
MOV C, P ; Nạp bit parity chẵn vào cờ C
CPL C ; Chuyển sang parity lẻ
MOV TB8, C
MOV SBUF, A
Dĩ nhiên, việc sử dụng parity không bị giới hạn ở các chế độ 2 và 3. Ở chế độ 1, 8 bit dữ liệu được truyền đi có thể bao gồm 7 bit dữ liệu cộng thêm bit parity. Để truyền mã ASCII 7 bit với parity chẵn ở bit 8, có thể sử dụng các lệnh sau:
CLR ACC.7 ; xóa MSB, parity chẵn ở trong P
MOV C, P ; chuyển vào cờ nhớ C
MOV ACC.7, C ; Đặt parity chẵn vào MSB
MOV SBUF, A ; Gửi ký tự đi với 7 bit dữ liệu cộng parity chẵn.
Các cờ ngắt: Hai cờ ngắt thu và phát (RI và TI) trong SCON đóng một vai trò quan trọng trong truyền thông tin nối tiếp dùng 8051. Cả hai bit được lập lên 1 bằng phần cứng, nhưng phải được xóa bằng phần mềm.
Ví dụ, thường RI được đặt lên 1 khi kết thúc việc thu một ký tự và báo “bộ đệm đã có dữ liệu”. Điều kiện này có thể được kiểm tra trong phần mềm, hoặc có thể được lập trình để gây ra một ngắt. Nếu phần mềm muốn nhận một ký tự từ thiết bị được nối vào cổng, nó phải đợi cho đến khi RI được lập lên 1, rồi xóa RI và đọc ký tự từ SBUF. Đoạn chương trình như sau:
WAIT: JNB RI, WAIT ; Kiểm tra RI cho đến khi nó = 1
CLR RI ; Xóa RI
MOV A, SBUF ; Đọc ký tự
TI được lập lên 1 khi bit cuối của ký tự được phát và báo “bộ đệm phát trống”. Nếu phần mềm muốn gửi một ký tự đến một thiết bị được nối vào cổng nối tiếp, trước hết nó phải kiểm tra xem cổng nối tiếp sẵn sàng chưa. Nói cách khác, nếu ký tự trước đã được ghi tới bộ đệm truyền để gửi đi, thì phải đợi cho đến khi việc truyền ký tự này hoàn tất, mới được gửi ký tự kế tiếp. Các lệnh sau sẽ truyền ký tự trong thanh ghi tích lũy:
WAIT: JNB TI, WAIT ; Kiểm tra TI cho đến khi nó bằng 1
CLR TI ; Xóa TI
MOV SBUF, A ; Gửi ký tự đi.
Các đoạn chương trình trên là một phần của các hàm nhập và xuất ký tự chuẩn.
Truyền thông tin trong hệ thống đa xử lý.
Các chế độ 2 và 3 cung cấp khả năng truyền dữ liệu trong hệ thống đa xử lý. Trong các chế độ này bit dữ liệu thứ 9 khi thu sẽ được nạp vào RB8. Cổng nối tiếp có thể lập trình để sau khi đã nhận được bit stop, thì ngắt cổng nối tiếp chỉ tích cực khi RB8 = 1. Đặc tính hoạt động này có thể thiết lập bằng cách lập bit SM2 trong SCON. Một ví dụ cho việc ứng dụng chế độ hoạt động này mô tả trên hình 8.15.
Matter 8051
TXD
8051 Slave 1
RXD
P0
P1
P2
P3
32 đường vào ra
8051 Slave 2
RXD
P0
P1
P2
P3
32 đường vào ra
Hình 8.15: Truyền thông tin nối tiếp trong hệ thống đa xử lý.
Khi 8051 chủ (matter) muốn truyền một khối dữ liệu tới 8051 tới (slaver) nào đó, trước tiên nó gửi ra ngoài một byte địa chỉ xác định 8051 tớ cần nhận dữ liệu. Byte địa chỉ sẽ khác với các byte dữ liệu khác là có bit thứ 9 là 1. Tất cả các 8051 tớ được ngắt và nhận lấy byte địa chỉ này, nhưng chỉ có 8051 tớ nào có địa chỉ đúng mới xoá bit SM2 của nó đi để chuẩn bị nhận dữ liệu từ 8051 chủ, còn tất cả các 8051 tớ khác sẽ lập SM2 và bỏ qua các byte dữ liệu kế tiếp. Các 8051 tớ sẽ được ngắt trở lại khi có byte địa chỉ tiếp theo được gửi đến. Sơ đồ này có thể mở rộng để các 8051 tớ có thể truyền dữ liệu tới 8051 chủ. Khi này không được sử dụng bit dữ liệu thứ 9, nếu không một 8051 tớ khác có thể tình cờ được chọn.
SM2 không bị tác động trong chế độ 0, và trong chế độ 1 nó có thể sử dụng để kiểm tra sự hợp lệ của stop bit. Trong chế độ 1, khi nhận nếu SM2 =1, ngắt nhận sẽ không tích cực khi không có stop bit hợp lệ.
Tốc độ baud cổng nối tiếp.
Như đã giới thiệu, tốc độ baud cổng nối tiếp là cố định ở các chế độ 0 và 2. Trong chế độ 0, nó luôn là tần số dao động trên chip được chia cho 12. Thông thường thạch anh ấn định tần số dao động trên chip của 8051, nhưng cũng có thể sử dụng nguồn xung nhịp khác. Giả sử với tần số dao động danh định là 12MHz, thì tốc độ baud chế độ 0 sẽ là 1 MHz (hình 5.16a).
¸12
Tốc độ baud
Dao động trên chip
¸64
¸32
Dao động trên chip
Tốc độ baud
¸32
¸16
Dao động trên chip
Tốc độ baud
SMOD = 0
SMOD = 1
SMOD = 0
SMOD = 1
a) chế độ 0
b) chế độ 2
c) chế độ 1 và 3
Hình 8.16: Nguồn cung cấp xung nhịp xác định tốc độ baud cho cổng nối tiếp
Sau khi reset hệ thống, tốc độ baud được mặc định là trong chế độ 2, nó chính là tần số bộ dao động chia cho 64. Tốc độ baud còn được quyết định bởi một bit trong thanh ghi điều khiển nguồn cung cấp (PCON). Bit 7 của PCON là bit SMOD. Nếu lập bit SMOD lên 1 sẽ làm gấp đôi tốc độ baud trong các chế độ 1, 2 và 3. Trong chế độ 2, tốc độ baud mặc định là 1/64 tần số dao động khi bit SMOD=0, nó sẽ được nhân đôi lên thành 1/32 tần số dao động khi SMOD=1 (hình 8.16b).
Vì PCON không được định địa chỉ theo bit, nên để lập bit SMOD lên 1 cần thực hiện các lệnh sau:
MOV A, PCON ; Lấy giá trị hiện thời của PCON
SETB ACC.7 ; Đặt bit 7 (SMOD) lên 1
MOV PCON, A ; Ghi giá trị ngược về PCON.
Tốc độ baud trong các chế độ 1 và 3 được xác định bằng tốc độ tràn của Timer 1. Vì timer hoạt động ở tần số tương đối cao, tốc độ baud cho cổng nối tiếp sẽ bằng tốc độ tràn timer được chia thêm cho 32 khi SMOD = 0 (chia16 nếu SMOD = 1).
Sử dụng Timer 1 làm xung nhịp tốc độ baud: cách thông dụng để tạo tốc độ baud là khởi động TMOD với chế độ 8 bit tự động nạp lại (chế độ 2), và nạp giá trị thích hợp vào TH1, để cho tốc độ tràn đúng với tốc độ baud mong muốn. TMOD được khởi động như sau: MOV TMOD, #0010xxxxB
Các bit x là 1 hoặc 0 tương ứng cho timer.
Cũng có thể đạt được các tốc độ baud thấp bằng cách sử dụng timer chế độ 2 với TMOD = 0001xxxxB. Tuy nhiên, khi đó chương trình phần mềm sẽ phức tạp thêm, vì các thanh ghi TH1/TL1 phải được khởi động lại sau mỗi lần tràn. Việc này có thể thực hiện trong chương trình phục vụ ngắt. Một cách khác là cấp xung nhịp cho Timer 1 từ ngoài dùng T1 (P3.5). Và tốc độ baud luôn là tốc độ tràn của Timer 1 được chia cho 32 (hoặc cho 16, nếu SMOD = 1).
Công thức xác định tốc độ baud trong các chế độ 1 và 3 là:
Tốc độ baud = Tốc độ tràn của Timer 1 ¸ 32.
Ví dụ, muốn làm việc với tốc độ baud là 1200 baud, thì tốc độ tràn của Timer 1 phải là: 1200 ´ 32 = 38.4 KHz.
Nếu dùng thạch anh 12 MHz, Timer 1 được cấp xung nhịp 1 MHz hay 1000 KHz. Vì tốc độ tràn của Timer 1 là 38.4 KHz và timer được cấp xung nhịp 1000 KHz, thì cần tràn sau 1000 ¸ 38.4 = 26.04 xung nhịp (làm tròn là 26). Vì timer đếm lên và tràn xảy ra khi có sự thay đổi từ FFH xuống 00H ở số đếm. Như vậy giá trị đúng cần nạp vào TH1 là –26. Cách dễ nhất để nạp giá trị vào TH1 là: MOV TH1, # –26
Trình hợp dịch sẽ thực hiện chuyển đổi cần thiết cho lệnh. Trong trường hợp này –26 được chuyển thành 0E6H. Như vậy, lệnh trên hoàn toàn giống với lệnh: MOV TH1, # 0E6H
Do việc làm tròn nên có sai số nhỏ trong tốc độ baud. Tổng quát thì cho phép dung sai 5% trong truyền thông bất đồng bộ (start/stop). Có thể có được tốc độ baud chính xác nếu dùng thạch anh 11.059 MHz. Bảng sau đây tóm tắt các giá trị nạp vào TH1 cho các tốc độ baud thông dụng nhất, dùng thạch anh 12 MHZ hoặc 11.059 MHz:
Tốc độ baud
Tần số thạch anh
SMOD
Giá trị nạp cho TH1
Tốc độ baud thực sự
Sai số
9600
2400
1200
19200
9600
2400
1200
12 MHz
12 MHz
12 MHz
11,059 MHz
11,059 MHz
11,059 MHz
11,059 MHz
1
0
0
1
0
0
0
-7 (F9H)
-13 (F3H)
-26 (E6H)
-3 (FDH)
-3 (FDH)
-12 (F4H)
-24 (E8H)
8923
2404
1202
19200
9600
2400
1200
7%
0,16%
0,16%
0
0
0
0
Ngắt của 8051 (interrupt).
Giới thiệu.
Một ngắt là sự xảy ra một điều kiện - một sự kiện - làm tạm thời ngưng chương trình hiện hành, để điều kiện đó được phục vụ bằng một chương trình khác. Các ngắt đóng một vai trò quan trọng trong thiết kế các ứng dụng vi điều khiển. Chúng cho phép hệ thống đáp ứng bất đồng bộ với một sự kiện và giải quyết sự kiện đó trong khi một chương trình khác đang thực thi.
Một hệ thống được điều khiển bằng ngắt làm người sử dụng cảm giác như hệ thống thực hiện nhiều công việc một cách đồng thời. Dĩ nhiên CPU mỗi lần không thể thực thi nhiều hơn một lệnh. Nhưng nó có thể tạm ngưng việc thực hiện một chương trình này, để thực hiện chương trình khác, rồi quay về chương trình thứ nhất. Việc phục vụ ngắt giống như việc gọi một chương trình con, CPU chuyển qua thực hiện chương trình con, sau đó quay trở lại chương trình chính. Khác biệt là trong hệ thống điều khiển bằng ngắt, thì sự ngắt quãng không xảy ra như kết quả của một lệnh (lệnh CALL subroutine), mà là đáp ứng với một “sự kiện” xảy ra bất đồng bộ với chương trình chính. Hệ thống sẽ không xác định chương trình chính sẽ bị ngắt quãng tại đâu.
Chương trình giải quyết ngắt được gọi là chương trình phục vụ ngắt (ISR: Interrupt Service Routine) hoặc chương trình xử lý ngắt. ISR thực thi khi đáp ứng một ngắt, và thông thường là để thực hiện tác vụ xuất nhập dữ liệu với một thiết bị. Khi ngắt xảy ra, chương trình chính tạm thời dừng hoạt động và rẽ nhánh đến ISR: ISR thực thi và kết thúc bằng lệnh trở về từ ngắt, lúc này chương trình chính tiếp tục thực hiện ở chỗ mà nó tạm dừng. Thường người ta xem chương trình chính như thực thi ở mức cơ sở (base - level), và các ISR thực thi ở mức ngắt (interrupt - level). Người ta cũng dùng các thuật ngữ foreground chỉ mức cơ sở và background chỉ mức ngắt. Hình ảnh khái quát của các ngắt được mô tả trong hình 8.17:
Main
ISR
Main
ISR
Main
ISR
Main
Đáp ứng ngắt
Quay về
Hình 8.17: Việc thực hiện chương trình với đáp ứng ngắt.
Tổ chức ngắt của 8051.
Có 5 nguồn yêu cầu ngắt trong hệ thống 8051: 2 ngắt ngoài, 2 ngắt từ timer và 1 ngắt cổng nối tiếp. Tất cả các ngắt đều được mặc định bị cấm sau khi reset hệ thống, và được cho phép từng nguồn riêng biệt bằng phần mềm.
Khi có hai hoặc nhiều yêu cầu ngắt đồng thời, hoặc một ngắt xảy ra trong khi một ngắt khác đang được phục vụ, hệ thống sẽ đáp ứng bằng cách xét theo vòng tuần tự và theo mức ưu tiên để định trình cho việc thực hiện các ngắt. Vòng tuần tự thì cố định, nhưng ưu tiên ngắt thì có thể lập trình được.
Cho phép và cấm các ngắt: Mỗi nguồn ngắt được cho phép hoặc cấm một cách riêng biệt qua thanh ghi cho phép ngắt (IE - Interrupt Enable) có định địa chỉ theo bit ở địa chỉ A8H. Mỗi nguồn ngắt sẽ có 1 bit trong thanh ghi IE để có thể lập trình cho phép riêng biệt, ngoài ra còn có một bit cho phép/cấm toàn bộ các ngắt (khi được xóa sẽ cấm tất cả các ngắt), như trình bày trong bảng sau:
Bit
Ký hiệu
Địa chỉ
Chức năng (1: cho phép; 0: cấm)
IE7
IE6
IE5
IE4
IE3
IE2
IE1
IE0
EA
-
-
ES
ET1
EX1
ET0
EX0
AFH
AEH
ADH
ACH
ABH
AAH
A9H
A8H
Cho phép/cấm toàn bộ các ngắt.
Không định nghĩa.
Dự phòng cho thế hệ kế tiếp.
Cho phép ngắt cổng nối tiếp.
Cho phép ngắt timer 1.
Cho phép ngắt ngoài cấp từ INT1.
Cho phép ngắt timer 0
Cho phép ngắt ngoài INT0
Như vậy khi muốn cho phép bất kỳ ngắt nào cần phải lập hai bit: bit cho phép riêng và bit cho phép toàn bộ. Ví dụ, các ngắt từ Timer 1 được cho phép như sau: SETB ET1 ; Cho phép ngắt từ Timer 1
SETB EA ; Đặt bit cho phép toàn bộ.
Cũng có thể sử dụng lệnh sau: MOV IE, # 10001000B
Mặc dù hai cách này có cùng kết quả sau khi reset hệ thống, nhưng chúng sẽ có kết quả sẽ khác nếu IE được ghi ở giữa chương trình. Cách thứ nhất không ảnh hưởng đến 5 bit khác trong thanh ghi IE, trái lại cách thứ hai sẽ xóa các bit khác. Nên khởi trị IE theo cách thứ hai thường sử dụng ở đầu chương trình (nghĩa là sau khi mở máy hoặc reset hệ thống), còn khi muốn cho phép và cấm các ngắt ngay trong chương trình thì nên dùng cách thứ nhất, để tránh ảnh hưởng đến các bit khác trong thanh ghi IE.
Ưu tiên ngắt: Mỗi nguồn ngắt được lập trình riêng vào một trong hai mức ưu tiên qua thanh ghi ưu tiên ngắt IP (Interrupt Priority) được địa chỉ theo bit ở địa chỉ B8H. Chức năng các bit của IP được mô tả trong bảng sau:
Bit
Ký hiệu
Địa chỉ
Chức năng (1: mức ưu tiên cao; 0: mức ưu tiên thấp)
IP7
IP6
IP5
IP4
IP3
IP2
IP1
IP0
-
-
-
PS
PT1
PX1
PT0
PX0
-
-
BDH
BCH
BBH
BAH
B9H
B8H
Không định nghĩa.
Không định nghĩa.
Dự phòng.
Ưu tiên cho ngắt cổng nối tiếp.
Ưu tiên cho ngắt timer 1.
Ưu tiên cho ngắt ngoài INT1.
Ưu tiên cho ngắt timer 0.
Ưu tiên cho ngắt ngoài INT0.
IP mặc định bị xóa sau khi reset hệ thống để đặt tất cả các ngắt ở mức ưu tiên thấp. Việc “ưu tiên” cho phép một ISR sẽ bị ngắt bởi một ngắt khác, nếu ngắt này có độ ưu tiên cao hơn ngắt đang phục vụ. Điều này thực hiện dễ dàng trên 8051, vì chỉ có hai mức ưu tiên. Nếu một ISR có ưu tiên thấp đang thực thi, khi một ngắt có ưu tiên cao xảy ra thì ISR hiện hành sẽ bị ngắt. ISR có ưu tiên cao không thể bị ngắt.
Chương trình chính thực hiện ở mức cơ sở và không liên hệ với bất cứ ngắt nào, nó có thể luôn bị ngắt, bất chấp ưu tiên của ngắt. Nếu hai ngắt có độ ưu tiên khác nhau xảy ra đồng thời, thì ngắt có độ ưu tiên cao hơn sẽ được phục vụ trước.
Hỏi vòng tuần tự: Nếu hai ngắt cùng độ ưu tiên xảy ra đồng thời, vòng tuần tự sẽ xác định ngắt nào được phục vụ trước. Vòng tuần tự được qui định là: INT 0, Timer 0, INT 1, Timer 1, cổng nối tiếp.
Hình 8.18 minh họa các cơ chế phục vụ của 5 nguồn ngắt,. Trạng thái của tất cả các nguồn ngắt khả dụng qua các bit cờ tương ứng trong các SFR. Dĩ nhiên, nếu có bất kỳ ngắt nào bị cấm, ngắt không xảy ra, nhưng phần mềm vẫn có thể kiểm tra cờ ngắt.
IE0
IE1
INT0
TF0
INT1
TF1
RI
TI
IT0
IT1
IE
IP
High Priority
Low Priority
Interrupt polling sequence
Interrupt Enable
Global Enable
Hình 8.18: Cơ chế ngắt của 8051.
Các ví dụ timer và cổng nối tiếp trong các mục trước đã sử dụng các cờ ngắt, mà không gây ra ngắt thật sự.
Ngắt cổng nối tiếp có từ logic OR của ngắt thu (RI) và ngắt phát (TI). Các bit cờ tạo các ngắt được tóm tắt ở bảng sau:
Ngắt
Cờ
SFR và vị trí bit
INT0
INT1
Timer 1
Timer 0
Serial port
Serial port
IE0
IE1
TF1
TF0
TI
RI
TCON.1
TCON.3
TCON.7
TCON.5
SCON.1
SCON.0
Các vector xử lý ngắt.
Khi một ngắt xảy ra và được CPU chấp nhận, chương trình chính sẽ bị ngắt quãng và những hoạt động sau xảy ra:
Hoàn tất việc thực thi lệnh hiện hành.
Cất PC vào ngăn xếp.
Trạng thái ngắt hiện hành được cất bên trong.
Các ngắt bị chặn ở mức ngắt.
Nạp vào PC địa chỉ vector của ISR.
ISR thực thi.
ISR thực thi và đáp ứng các yêu cầu của ngắt. ISR hoàn tất bằng lệnh RETI (quay về từ ngắt). Điều này làm lấy lại giá trị cũ của PC từ đỉnh ngăn. Việc thực hiện chương trình chính tiếp tục ở chỗ mà nó đã bị dừng.
Các vector ngắt.
Khi chấp nhận ngắt, giá trị được nạp vào PC được gọi là vector ngắt. Nó là địa chỉ bắt đầu của ISR cho nguồn tạo ngắt. Các vector ngắt được cho ở bảng sau:
Ngắt
Cờ
Địa chỉ vector ngắt
Reset
INT0
Timer 0
INT1
Timer 1
Serial port
RST
IE0
TF0
IE1
TF1
RI hoặc TI
0000H
0003H
000BH
0013H
001BH
0023H
Vector res
Các file đính kèm theo tài liệu này:
- giao_trinh_vi_dieu_khien_microcontroller.doc