Professional Documents
Culture Documents
Tài liệu ôn tập lý thuyết Vi xử lý PDF
Tài liệu ôn tập lý thuyết Vi xử lý PDF
Số ô nhớ tối đa
trên thành ghi
Kiến trúc CPU Memory
Clock [A0÷A15]
Address bus 0000 H
OSC PC MAR ROM
黎海潮
Bằng cách nào CPU có thể truy nhập tới các phần tử khác nhau thông qua các địa chỉ khác nhau:
Các địa chỉ được biên dịch sang mã máy, được truyền dẫn thông qua bus địa chỉ và nhờ 1 hệ thống mạch logic tổ hợp
làm hệ thống giải mã địa chỉ mà xác định đường đến phần tử tương ứng.
Các lệnh khi đưa vào sẽ qua bộ giải mã (thuộc BIU - Bus Interface Unit: Đơn vị giao tiếp bus) để decode sang mã máy, từ
đó qua data bus đi vào stack. CPU sẽ phát tín hiệu điều khiển đến khối giải mã, từ địa chỉ của lệnh nằm trong stack được
xác định bởi 2 thanh ghi CS:IP để đọc lệnh từ stack. Lệnh được đọc sẽ qua bus dữ liệu đưa vào ALU để thực thi.
Nêu cơ chế mà nhờ đó CPU có thể thực hiện lệnh một cách tuần tự:
Là nhờ bộ đếm chương trình PC. Thanh ghi PC chứa địa chỉ của ô nhớ có nội dung là mã lệnh tiếp theo sẽ được thực
hiện. Khi CPU tìm được mã lệnh thứ n thì PC tự động tăng lên 1 để trỏ vào ô nhớ chứa mã lệnh n+1.
- CPU gồm 3 phần: CU (đơn vị điều khiển, đọc, giải mã, thực hiện lệnh), ALU (khối xử lý toán học & logic) và thanh ghi
(nơi lưu trữ dữ liệu tạm thời). Thực hiện 2 thao tác: tìm nạp lệnh và thực thi lệnh.
- Bộ nhớ lưu chương trình và dữ liệu, chứa các lệnh. Trong cấu trúc Von neuman thì bộ nhớ dữ liệu và bộ nhớ chương trình
có chung không gian nhớ.
黎海潮
Nguyên lý mà nhờ đó CPU có thể thực hiện rẽ nhánh có điều kiện: Vì sao CPU có thể truy cập theo địa chỉ:
Đầu tiên vi xử lý sẽ kiểm tra điều kiện. Nếu điều kiện không thỏa mãn CPU có thể truy nhập theo địa chỉ vì dữ
thì PC tăng lên 1 và thực hiện lệnh tiếp theo. Nếu điều kiện thỏa mãn liệu, chương trình và các IO đều chia sẻ
thì chương trình sẽ nhảy đến nhãn. Lệnh rẽ nhánh có điều kiện xác chung 1 không gian địa chỉ và được đánh
định địa chỉ đích bằng cách định địa chỉ tương đối, tức là xác định địa địa chỉ cụ thể. Nhờ bộ giải mã địa chỉ, CPU
chỉ đích trừ địa chỉ hiện tại được bao nhiêu cộng vào PC. Giới hạn có thể truy nhập đến ô nhớ hay I/O có địa
khoảng cách nhảy từ -128 đến +127 byte kể từ lệnh sau lệnh nhảy có chỉ mong muốn thông qua D_bus.
điều kiện.
Bạn hiểu thế nào khi CPU truy nhập vào ra như 1 ô nhớ hay truy nhập ô nhớ nhờ cổng vào ra:
+ CPU truy nhập cổng vào ra như 1 ô nhớ là: Khi đó các ô nhớ và các cổng vào ra sử dụng chung 1 bộ giải mã địa chỉ
do đó khi CPU truy nhập cổng vào ra thì các cổng vào ra này có địa chỉ như là các ô nhớ, mà theo nguyên lí Von
Neuman thì CPU trao đổi dữ liệu theo nguyên tắc địa chỉ, do đó CPU truy nhập cổng vào ra cũng như là các ô nhớ.
+ Khi truy nhập ô nhớ nhờ cổng vào ra thì lúc này sẽ có 2 bộ giải mã địa chỉ, 1 bộ giải mã địa chỉ cho các ô nhớ, 1 bộ
giải mã địa chỉ cho các Port
黎海潮
Mô tả chi tiết hoạt động thực hiện 1 lệnh của CPU
Gồm 3 bước
• Bước 1: Đọc lệnh
- PC → MAR đặt ADDRESS BUS → trỏ đến ô nhớ trên ROM có địa chỉ tương ứng với MAR (ô nhớ chứa mã
lệnh)
(PC có thể thay đổi được)
- Tín hiệu Read trên CONTROL BUS sẽ tích cực, mã lệnh sẽ được đưa về qua DATA BUS đến thanh ghi IR.
PC++
- VD: PC truy xuất đến ô nhớ chữa mã lệnh 31H (ban đầu PC = 02) → 31H được tuyền qua DATA_BUS sang
IR ở CPU thì lúc đó PC++
• Bước 2: Giải mã lệnh
- Mã lệnh trong thanh ghi IR được đưa vào bộ giải mã lệnh DEC, đầu ra là những giá trị nhị phân (tín hiệu
điều khiển) tương ứng với mã lệnh đầu vào
• Bước 3: Thực hiện lệnh
- Tùy vào tập tín hiệu điều khiển sau khi ra khỏi DEC thì CPU làm công việc tương ứng với mã lệnh đầu
vào.
- VD: MOV A,#50H. Sau khi giải mã lệnh PC=03 → giá trị 50H không chuyển vào DEC và ADDRESS mà
chuyển vào MDR.
Địa chỉ bộ nhớ đánh từ 0000H đến FFFFH, riêng RAM lại đánh địa chỉ từ 00H đến FFH.
黎海潮
→ FF00H thì FF là địa chỉ tuyệt đối còn 00 là địa chỉ tương đối.
F D E F D E F D E CISC Muốn nhiều luồng hơn thì chia nhỏ thời gian thực hiện lệnh ra
RISC không có lệnh nhân, phức tạp, chỉ có lệnh đơn giản mới có đường ống.
黎海潮
Minh họa truy nhập trực tiếp MOV R0, 50H (50H là địa chỉ ô nhớ trong RAM)
(lấy nội dung của ô nhớ 50 (địa chỉ là 50H) trong RAM, cấp vào thanh ghi R0)
• Encoding: 1 0 1 0 1 r r r (dành cho từ R0 đến R7) (4 bit cao là mã lệnh, 4 bit thấp là địa chỉ/toán hạng)
• Lệnh này: chiếm 2 byte (1 byte là byte lệnh, 1 byte nội dung), thời gian thực hiện là 2 chu kỳ
• Nội dung: Lấy ô nhớ 50H ở RAM để truy xuất.
Chi tiết:
• Đầu tiên con trỏ PC sẽ có nội dung là địa chỉ ô nhớ chứa mã lệnh của lệnh MOV R0, Addr là A8, con trỏ PC sẽ thông qua
mạch giải mã địa chỉ để đưa đến ô nhớ có nội dung là A8 (ở đây mình ví dụ là ô nhớ 15).
• Nội dung của ô nhớ đó (A8) được đưa vào bộ nhớ đệm Buffer. CPU gửi tín hiệu OE cho phép dữ liệu đi từ Buffer đi vào
thanh ghi lệnh IR và bộ giải mã lệnh DEC.
• Tại bộ giải mã lệnh DEC nó sẽ giải mã và biết lệnh này là 2 byte, có tác dụng là chuyển nội dung ở ô nhớ 50H vào thanh
ghi R0 (Có thể tra các điều này trong tập lệnh của MCS- 51).
• Do lệnh này 2 byte nên nó sẽ chờ byte tiếp theo. Lúc này con trỏ PC tăng lên 1, nhờ mạch giải mã địa chỉ trỏ đến ô nhớ
tiếp theo (ô nhớ 16). Tại ô nhớ này sẽ có nội dung là 50H.
• Dữ liệu từ ô nhớ đó (ô số 16) sẽ được đưa vào bộ buffer, sau đó khi có tín hiệu OE sẽ được đưa lên D_bus và đi vào khối
MAR.
• Dữ liệu từ khối MAR (ở đây là 50H) sẽ lại được đưa vào bộ giải mã địa chỉ DEC để trỏ đến ô nhớ 50H.
• Dữ liệu từ ô 50H sẽ lại được đưa xuống Buffer đưa lên D_bus và sau đó sẽ được di chuyển vào thanh ghi R0.
黎海潮
Minh họa trường hợp đọc toán hạng ở chế độ gián tiếp qua thanh ghi (ADD A, @R0)
• Mã lệnh: 0 0 1 0 0 1 1 i (chỉ R0 và R1)
• Lệnh này chiếm 1 byte, thời gian thực hiện lệnh là 01 chu kỳ máy.
• Nội dung: Cộng nội dung của ô nhớ có địa chỉ chứa trong thanh ghi Ri với thanh ghi A. Kết quả lưu
trữ trên thanh ghi A.
• Đầu tiên con trỏ PC có nội dung là ô nhớ chứa mã lệnh này (mã lệnh này là 26H). Con trỏ PC sẽ thông
qua mạch giải mã địa chỉ trỏ đến ô nhớ chứa nội dung 26H.
• Dữ liệu này sẽ được đưa xuống bộ nhớ đệm Buffer, sau đó CPU sẽ thông qua CONTROL BUS truyền
tín hiệu OE cho phép dữ liệu đi từ Buffer qua DATA BUS về thanh ghi lệnh IR và vào bộ giải mã lệnh
DEC.
• Tại bộ giải mã lệnh DEC nó sẽ giải mã lệnh (26H) và biết rằng lệnh này 1 byte, thực hiện nhiệm vụ
cộng nội dung của ngăn nhớ RAM, có địa chỉ được cất trong R0 vào thanh ghi A.
(Ví dụ: Thanh ghi R0 có nội dung là A1 và ô nhớ A1 có nội dung là 12H thì lệnh này có tác dụng cộng
nội dung của ô nhớ A1 hay cộng 12H vào thanh ghi A, kết quả cất ở thanh ghi A)
• Tiếp theo nó sẽ lấy nội dung của thanh ghi R0 đi qua MAR và được đưa vào bộ giải mã địa chỉ. Bộ giải
mã địa chỉ sẽ trỏ đến ô nhớ có địa chỉ là nội dung thanh ghi R0 và đưa dữ liệu ô nhớ đó vào Buffer.
CPU lại đưa tín hiệu OE để cho phép dữ liệu từ Buffer lên DATA BUS đi vào OP2 của khối ALU. Nội
dung thanh ghi A sẽ được đưa vào OP1.
• Khối ALU sẽ thực hiện phép cộng OP1 và OP2 sau đó kết quả được đưa trả về thanh ghi A.
黎海潮
Minh họa trường hợp đọc toán hạng ở chế độ tức thì (MOV A,#50H)
• Mã lệnh: 0111 0 1 0 0
• Lệnh này chiếm 2 byte, thời gian thực hiện lệnh là 1 chu kỳ máy.
• Nội dung: Nạp giá trị 50H vào thanh ghi A.
Mô tả:
• Đầu tiên con trỏ PC sẽ có nội dung là địa chỉ ô nhớ chứa mã lệnh lệnh 74H, con trỏ PC sẽ thông qua
mạch giải mã địa chỉ để đưa đến ô nhớ có nội dung là 74H
• Nội dung của ô nhớ đó (74H) được đưa vào bộ nhớ đệm Buffer. CPU gửi tín hiệu OE cho phép dữ liệu
đi từ Buffer đi vào thanh ghi lệnh IR và bộ giải mã lệnh DEC.
• Tại bộ giải mã lệnh DEC nó sẽ giải mã và biết lệnh này là 2 byte, có tác dụng là chuyển giá trị 50H vào
thanh ghi A .
• Do lệnh này 2 byte nên nó sẽ chờ byte tiếp theo. Lúc này con trỏ PC tăng lên 1, nhờ bộ giải mã địa chỉ
để thiết lập giá trị cho thanh ghi A là 50H
• Dữ liệu sẽ được đưa vào bộ buffer, sau đó khi có tín hiệu OE sẽ được đưa lên D_bus và di chuyển vào
thanh ghi A
• Lưu ý: Ở đây lệnh này là 2 byte, bộ giải mã lệnh DEC sẽ không biết được đâu là mã lệnh (74H) và đâu
là dữ liệu (50H) nó chỉ có thể phân biệt nhờ thứ tự. Nghĩa là 74H đến trước thì nó là mã lệnh và nó có
2 byte nên cái tiếp theo sẽ là nội dung thực hiện lệnh để phân biệt với mã lệnh 50H
黎海潮
Minh hoạ trường hợp đọc toán hạng ở chế độ thanh ghi (SUBB A,R7)
• Encoding: 1 0 0 1 1 r r r (1 0 0 1 1 1 1 1)
• Lệnh này chiếm 1 byte, thời gian thực hiện lệnh là 1 chu kỳ máy.
• Nội dung: Lấy giá trị thanh ghi A trừ đi thanh ghi R7 và trừ cho cờ Carry, kết quả lưu trong thanh ghi A.
Mô tả:
• Đầu tiên con trỏ PC có nội dung là ô nhớ chứa mã lệnh này (mã lệnh này là 9FH). Con trỏ PC sẽ thông qua
mạch giải mã địa chỉ trỏ đến ô nhớ chứa nội dung 9FH(10011111)
• Dữ liệu này sẽ được đưa xuống bộ nhớ đệm Buffer, sau đó CPU sẽ thông qua CONTROL BUS truyền tín
hiệu OE cho phép dữ liệu đi từ Buffer qua DATA BUS về thanh ghi lệnh IR và vào bộ giải mã lệnh DEC.
• Tại bộ giải mã lệnh DEC nó sẽ giải mã lệnh (9FH) và biết rằng lệnh này 1 byte, thực hiện nhiệm vụ trừ nội
dung của thanh ghi A cho thanh ghi R7
• CPU lại đưa tín hiệu OE để cho phép nội dung thanh ghi R7 từ Buffer lên DATA BUS đi vào OP2 của khối
ALU. Nội dung thanh ghi A sẽ được đưa vào OP1 và truy xuất vào bit PSW.7 lưu cờ nhớ C của thanh ghi
PSW
• Khối ALU sẽ thực hiện phép trừ OP1 cho OP2 và trừ đi cờ C lưu trong thanh ghi PSW sau đó kết quả
được đưa trả về thanh ghi A.
黎海潮
Nêu cơ chế ngắt trong hệ vi xử lý, mục đích ?
Ngắt là sự kiện xảy ra trong quá trinh thực hiện chương trình VXL, yêu cầu là
VXL dừng lại việc đang làm và thực hiện lập tức lệnh đó.
‘’1’’
[C ] Cờ báo ngắt (D-FF) kết nối trực tiếp với CPU (là 01 bit)
D
Q
INT 1 C CPU VXL có nhiều nguồn, loại báo ngắt, tổng hợp vào thanh ghi
Về mặt thực hiện lệnh, có 1 khoảng thời gian để CPU kiểm tra cờ báo ngắt.
Ngắt che được/ngắt không che được
• RESET tích cực → VXL sẽ nạp lại từ đầu (PC nạp địa chỉ 0000H) dù CPU đang ở bất kỳ trạng thái nào
• Sự kiện ngắt bắt CPU thực hiện ngay gọi là ngắt không che được VCC
5V
+ Bộ dao động lỗi → ngắt không che được ‘’1’’
+ Tính toán chia → ngắt không che được D [C ]
R Q
Ngắt che được: là ngắt CPU thấy nhưng không thực hiện C
• Ngắt không nối với phần cứng thì không quan tâm ‘’1’’
• Có thể lập trình được ngắt/không ngắt [C ] CPU
D
Khi có nhiều lệnh ngắt cùng lúc, không che được ưu tiên Q
cao hơn, nên thực hiện lệnh trước. C
Khi có nhiều lệnh ngắt che được cùng lúc thì thực hiện Reset
黎海潮
theo mức ưu tiên. Mạch so sánh
INT 2
INT 1
黎海潮
Giải pháp để cất giữ và khôi phục trạng thái ?
Để cất giữ và khôi phục trạng thái thì ta cần phải cất các cờ, con trò PC hiện tại, các thanh ghi có liên quan đến
chương trình phục vụ ngắt vào ngăn xếp để trong quá trình vxl thực hiện chương trình phục vụ ngắt, các thông
tin này sẽ không bị thay đổi. Sau khi chương trình phục vụ ngắt thực hiện xong ta lại lấy các cờ, PC thanh ghi ra,
khôi phục lại trạng thái, tiếp tục thực hiện chương trình chính.
Ưu điểm và khuyết điểm của cơ chế ngắt trong VXL
• Ưu: giúp chương trình không phải kiểm tra liên tục cờ ngắt nên có thể thoải mái thực hiện các công việc khác
khi không có ngắt xảy ra, không tốn thời gian hỏi vòng, do đó CPU sẽ đỡ tốn năng lượng hơn, chạy nhanh hơn.
• Nhược: Nếu như I/O nào đó trao đổi dữ liệu với số lượng lớn thì các I/O khác ít có cơ hội trao đổi dữ liệu. Qúa
trình lưu và khôi phục trạng thái dễ gây ra lỗi, đặc biệt nếu trong chương trình phục vụ ngắt có tác động đến
ngăn xếp. Chương trình có sử dụng ngắt có hoạt động phức tạp, gây khăn nhầm lẫn cho người dùng.
Liệu có tồn tại hệ VXL hoạt động mà không cần ngăn xếp không cần ngăn xếp không? Giải thích?
• Về lý thuyết thì có thể tồn tại 1 hệ VXL hoạt động mà không cần ngăn xếp nếu như hệ VXL đó chỉ thực hiện
chương trình đơn giản không nhớ, không có nhảy, không rẽ nhánh. Tuy nhiên thực tế 1 hệ VXL được ứng
dụng để thực hiện những việc phức tạp, do đó trên thực tế không bao giờ tồn tại VXL hoạt động không cần
ngăn xếp.
• Theo kiến trúc Von Newmann, tại 1 thời điểm VXL chỉ thực hiện được 1 công việc. Để có thể thực hiện được
các lệnh gọi chương trình con hoặc chương trinh ngắt thì bắt buộc phải có ngăn xếp hoặc 1 cơ chế nào đó
tương tự ngăn xếp để lưu trạng thái làm việc.
黎海潮
Trình bày cách xác định nguồn báo bằng ngắt phần cứng
黎海潮
Vai trò và hoạt động của ngăn xếp
• Ngăn xếp (stack) là một phần của bộ nhớ RAM, dung để lưu địa chỉ của câu lệnh tiếp theo trong chương trình chính khi
xảy ra ngắt.
ROM RAM 1 địa chỉ 16 bit Truy xuất: ngăn xếp
0000H → 1 địa chỉ 2 ô nhớ
1 ô nhớ 8 bit
0050H Con trỏ ngăn xếp SP: các giá trị của SP thể hiện con trỏ đang đầy
0210H đến đâu rồi
Cất vào CTC
ngăn xếp 0211H Stack có thể có nhiều địa chỉ, giới hạn stack là số ngắt lồng nhau
0300H có thể đạt được.
CALL Add – ROM
0600H Stack
RET
Stack hoạt động theo cơ chế Last In First Out (LIFO): những dữ liệu nào được cất vào stack trước thì lấy ra sau, thực hiện
theo nguyên tắc này nhờ vào con trỏ SP (Stack Pointer)
PUSH ACC: giá trị của ACC sẽ được cất vào ngăn xếp và SP++ để trỏ tới ngăn xếp tiếp theo.
POP ACC: lấy ô nhớ mà SP đang trỏ cất vào ACC, SP–
Lưu ý: có bao nhiêu lệnh PUSH thì có bấy nhiêu lệnh POP, PUSH trước thì POP sau.
con trỏ SP mặc định trỏ đến 07H (tức là lệnh cất đầu tiên sẽ cất vào ô nhớ 08H).
Nhiều thanh ghi sử dụng trong cả CTC, CT ngắt thì khi vào CT ngắt, phải cất nó đi, để nó không bị thay đổi khi thực hiện
CT ngắt.
黎海潮
Khi chương trình đang thực hiện câu lệnh, có sự kiện ngắt xảy ra,
Reset
cờ báo ngắt báo với CPU nhưng cờ báo ngắt chưa phải điều kiện Lược đồ hoạt động của VXL khi có
đủ. RESET
Khi cấp nguồn cho VXL → có điện áp
Về mặt thực hiện lệnh, CPU cần 1 khoảng thời gian để kiểm tra cờ Khởi tạo giá trị → Tín hiệu đưa vào chân RESET
mặc định của
báo ngắt, xem bit điều khiển có cho CPU thực hiện hay không. ↔ Bấm nút RESET
thanh ghi
Nếu CPU được thực hiện thì VXL lưu trữ địa chỉ của các câu lệnh
tiếp theo trong chương trính vào ngăn xếp (Stack). Sau đó thực
hiện chương trình con (ngắt). Kiểm tra YES
ngắt không Thực hiện
Sau đó dựa vào loại vecto ngắt là loại gì, rồi chương trình nhảy đến che được
1 vùng khác, thực hiện từ địa chỉ mà PC đang trở đến ngắt đó.
NO
CPU thực hiện chương trình ngắt đến khi gặp lệnh RETURN (RETI)
– nạp lại cho PC các địa chỉ của câu lệnh tiếp theo trong chương Kiểm tra YES
trình chính đã lưu ở trong ngăn xếp, sau đó VXL tiếp tục thực hiện Cho YES
ngắt che
chương trình chính. phép
được
Thực hiện
Lưu ý: nếu có nhiều ngắt thì sẽ dựa vào mức ưu tiên ngắt theo thứ NO NO
tự: ngắt không che được, ngắt che được (có thể lập trình được).
Thường ưu tiên ngắt truyền thông hơn ngắt ngoại vi. Khi có nhiều
lệnh ngắt che được thì thực hiện theo mức ưu tiên, tất cả phải có
Thực hiện Chương
thực tự (kể cả trong cùng mức ưu tiên hoặc khác mức ưu tiên) lệnh
黎海潮 trình chính
Vecto RESET và vecto ngắt có thể trùng nhau không ? Giải thích?
Vecto RESET và vecto ngắt có thể trùng nhau. Bởi vì RESET chính là 1 vecto ngắt. RESET tích cực → VXL sẽ
nạp lại từ đầu (PC nạp địa chỉ 0000H) dù CPU đang ở bất kỳ trạng thái nào. Tra bảng thì vecto RESET có số
hiệu là 00H và là 1 vecto ngắt.
黎海潮
Kiến trúc phần cứng của hệ vi xử lý (MCS-51)
• 8 bit, có thể thao tác từng bit
• 6 nguồn/ 5 vecto ngắt → có 2 nguồn báo ngắt dung
chung 1 vecto ngắt → phải dựa vào cờ báo ngắt để trỏ
đến Ct ngắt phù hợp.
• Kiến trúc Harvad
• 4 I/O Ports:
+ P0&P2: ghép nối với bộ nhớ ngoài(ADDRESS /DATA)
+ Truyền tin hoặc tạo mức 0 – 5V
• 2 Timer/counter 16 bit
Cách 1:Xử lý tuần tự. Các I/O Cách 2: Sau khi XL I/O nào thì quay
bình đẳng trở lại I/O 1 → I/O 1 được quét nhiều
黎海潮
nhất
Nêu ưu, khuyết điểm của phương thức điều khiển vào ra bằng
chương trình.
Ưu điểm:
IO1: JB P1.0, XL-IO1 (xử lý IO1)
• Tổ chức chương trình theo lưu đồ trên tương đối dễ.
• Dễ cho người viết chương trình kiểm soát lỗi. XL IO1
• Thay đổi mức độ ưu tiên do có thể thay đổi vị trí I/O. LJMP IO2
Nhược điểm: IO2: JB P1.1, XL-IO2 ( xử lý IO2)
• Việc xử lý 1 RQ tiếp theo phải chờ xử lý xong I/O trước đó. XL IO2
• Nếu RQ2 tồn tại trong khoảng thời gian ngắn hơn chương trình xử lý LJMP IO3
I/O1 thì khi xử lý xong I/O1 thì RQ2 không còn → dẫn đến sót dữ liệu.
• Vấn đề càng lớn khi I/O càng nhiều (quản lý càng nhiều, càng nhiều IO3: JB P1.2, XL-IO3 ( xử lý IO2)
I/O thì xác suất xử lý đầu tiên càng thấp). XL IO3
• Có thể chấp nhận xử lý Delay khi chờ xử lý I/O trước. LJMP IO4
• Tốn thời gian hỏi ngoại vi không có nhu cầu trao đổi dữ liệu, làm cho
CPU bị chậm, hoạt động liên tục, tốn năng lượng. ……………….
• Nếu ngoại vi thứ k bị lỗi và luôn tích cực thì các ngoại vi ưu tiên thấp ION: JB P1.N-1, XL-ION ( xử lý
hơn không thể trao đổi dữ liệu. ION)
→ nảy sinh các vấn đề: không ngắt được chương trình I/O, có thể bị trễ SJMP IO1
và thiếu sót dữ liệu.
黎海潮
Trình bày phương thức điều khiển vào ra bằng ngắt
Mỗi tín hiệu RQ sẽ được đưa vào 1 tín hiệu ngắt ngoài và chúng ta sẽ cho phép ngắt ngoài đó xảy ra, khi
có 1 ngắt xảy ra → cờ báo ngắt tự động bật lên, trạng thái cờ duy trì đến khi nào mà
→ tự động xóa cờ báo ngắt đó đi.
vecto PC ấy được nhảy vào vecto ngắt tương ứng.
INT Mỗi ngắt xảy ra tương ứng với chuyện 1 IO có tín hiệu RQ.
Start Mỗi tín hiệu RQ phát sinh ra 1 ngắt, chương trình tương
IO1
ứng trong IO ấy sẽ được xử lý trong CT ngắt
Khởi Cho phép ngắt Mỗi ngắt xảy ra tương ứng với chuyện 1 IO có tín hiệu
tạo các theo kiểu sườn XL IO1 RQ. Mỗi tín hiệu RQ phát sinh ra 1 ngắt, chương trình
xuống, lên, vv tương ứng trong IO ấy sẽ được xử lý trong CT ngắt.
ngắt
Về mặt lý thuyết, mỗi ngắt ngoài tương ứng với 1 IO và
CTC cho phép INT xảy ra và chờ ngắt.
Chờ RETI
Xử lý các IO sẽ đưa các ngắt ngoài tương ứng tại các
ngắt vecto ngắt tương ứng.
Lưu đồ tương tự với IO2, …, IO n
Lưu đồ của chương trình ngắt tương ứng.
黎海潮
Trong xử lý ngắt, xác định tín hiệu RQ bằng cách đọc trạng thái IO đó, xem tín hiệu nào lên mức
1 (thực chất là kiểm tra theo chương trình)
INT
Kiểm tra theo CT, kiểm tra lần lượt tín hiệu nào lên 1 → RQ
Xử lý IO = Xác định xem tín hiệu nào lên 1 thì cái IO đó đang RQ
chương trình
ADDRESS
DATA
黎海潮
Trong CTC có chờ ngắt nhưng cái ngắt đó thì ta lại kiểm tra xử lý chương trình → có một sự kết hợp giữa
vào ra bằng ngắt và vào ra bằng chương trình → hợp lại gọi là ngắt mềm (vừa có ngắt, vừa có xử lý)
ADDRESS
DATA
黎海潮
Sự giống nhau và khác nhau giữa điều khiển vào ra bằng ngắt với điều khiển vào ra bằng
chương trình?
Giống nhau:
• Việc trao đổi dữ liệu đều phải thông qua CPU, đều điều khiển bằng các câu lệnh do người lập trình
viết ra.
Khác nhau:
• Vào ra bằng ngắt thì cái nào có nhu cầu trao đổi thì mới ngắt, trao đổi ngoại vi còn ở vào ra bằng
chương trình thì nó phải kiểm tra tất cả các ngoại vi theo thứ tự ưu tiên mà không cần biết nó có
nhu cầu trao đổi dữ liệu hay không.
• Vào ra bằng ngắt thì các lệnh điều khiển nằm ở chương trình phục vụ ngắt và CPU gọi nó như 1
chương trình con còn ở vào ra bằng chương trình thì các lệnh điều kiện nằm trong than chương
trình chính.
黎海潮
Trình bày phương thức điều khiển vào ra bằng truy nhập trực tiếp bộ nhớ
CPU A
D
C
Memory
Khi IO nào đó muốn cất dữ liệu thì nó đi thẳng vào Memory, DMAC sẽ mở kênh truy cập trực tiếp, không
cần thông qua CPU ↔ tức là việc của DMAC là chỉ cần định ra xem là sẽ cất dữ liệu ấy vào địa chỉ nào.
黎海潮
Để làm việc cất dữ liệu từ IO vào Memory hoặc lấy dữ liệu từ Memory đưa ra IO mà không thông qua CPU
thì CPU phải nhường quyền điều khiển BUS cho DMA để DMA lái dữ liệu đẩy vào hoặc lấy ra.
Để dành quyền sử dụng BUS khi có 1 IO nào đó có chế độ giao tiếp với DMA, thông qua hệ thống BUS điều
khiển, nó sẽ yêu cầu DMA là nó muốn cất dữ liệu vào Memory thì DMA phát ra tín hiệu BR gửi tới CPU.
• BR ở mức cao nghĩa là DMA yêu cầu CPU nhường hệ thống BUS cho DMA. Khi đó CPU sẽ thực hiện xong
lệnh cuối cùng, xong rồi thì phát BG set lên mức cao, đưa các đường bus A,D,C lên trạng thái cao trở.
Nhường quyền điều khiển hệ thống cho DMA
(hiểu là OK xong việc dở rồi đó, nhường quyền cho đó).
• DMAC gửi tín hiệu đến IO cho phép IO trao đổi trực tiếp với Memory.
• Sau khi thực hiện xong thì BR chuyển về mức thấp → khi đó CPU sẽ hiểu DMAC đã xong → CPU lấy lại
quyền điều khiển, đưa các đường bus A, D, C về trạng thái bình thường. BG về mức thấp.
Nêu ưu khuyết điểm của phương thức này, điểm khác chính so với hai phương pháp kia là gì?
Ưu điểm: Tốc độ trao đổi dữ liệu nhanh, đáp ứng được việc trao đổi dữ liệu với số liệu lớn.
Nhược điểm: Phức tạp về mặt phần cứng, giá thành lớn do giá thành DMAC cao.
Điểm khác chính so với 2 phương pháp kia là: cho phép trao đổi trực tiếp giữa IO và Memory mà không
cần thông qua CPU, quá trình trao đổi do DMAC điều khiển chứ không phải CPU điều khiển (CPU không
tham gia quá trình truyền dữ liệu).
黎海潮
Trình bày nguyên lý hoạt động của cổng vào không đối thoại, có đối thoại
• Cổng vào không đối thoại
黎海潮
• Cổng vào có đối thoại
Data
Latch Buffer
I/O D0
ALE OE VXL
Address
IBE
INT
“1” CLR
D Q Control
Q
CLK
MUX
黎海潮
I/O đẩy dữ liệu vào Latch, có tín hiệu báo để thể hiện dữ liệu đẩy ra, tín hiệu báo D0 nối với D-FF làm chân
CLK. (Ví dụ I/O là phần tử ADC, thể hiện dữ liệu từ tương tự sang số). Báo VXL là có dữ liệu rồi đấy
Đầu ra Q nối với ALE của Latch để cho phép dữ liệu đi vào bộ đệm, đồng thời cũng là tín hiệu ngắt của VXL,
VXL thấy có ngắt của I/O nào → I/O đó đẩy dữ liệu ra rồi.
Muốn đọc thì mở OE thông qua địa chỉ được gắn tương ứng với I/O đó.
Address nối với bộ giải mã địa chỉ MUX, đầu ra địa chỉ I/O tương ứng kết hợp với tín hiệu Control → set OE,
mở Buffer → dữ liệu đi vào VXL (VXL đọc dữ liệu thông qua địa chỉ tương ứng).
Lưu ý: tất cả phải thông qua địa chỉ.
Khi OE tích cực rồi thì có nghĩa là mã dữ liệu chuyển vào VXL rồi, đồng thời OE báo với IO là dữ liệu đã
được đọc bằng cách tác động vào chân CLR của D-FF → đầu ra Q tích cực, báo cho I/O qua chân IBE.
黎海潮
Vẽ biểu đồ thời gian của các tín hiệu handshaking STB, IBF
Tinh thần của ghép nối theo kênh là VXL ghép nối với nhiều I/O cùng sử dụng chung 1 kênh song song và mỗi một
I/O có 1 địa chỉ riêng.
黎海潮
Trình bày nguyên lý hoạt động của cổng ra đơn giản, có đối thoại
Cổng ra đơn giản Nguyên lý hoạt động của cổng ra đơn giản
Latch I/O
CPU E
Địa chỉ
Decoder
n bit C
WR
黎海潮
Cổng ra song song có đối thoại
“1”
CLR
Write (WR) Q
Control
CLK
ALE OBF
Data Latch Buffer I/O
VXL OE RD
INT Address
Decoder
黎海潮
Vào ra nối tiếp: định nghĩa, mục đích, nguyên lý, chế độ, phương thức, nhịp truyền.
• Định nghĩa: truyền tin nối tiếp là các bit dữ liệu được truyền lần lượt trên 1 đường truyền.
• Mục đích: Truyền dữ liệu đi xa được, dựa trên 2 yếu tố là độ trễ từng bit dữ liệu là như nhau và đóng
gói được dữ liệu, dễ dàng bóc tách. Tiết kiệm đường truyền
• Chế độ: Có 3 chế độ truyền tin nối tiếp
+ Đơn công: dữ liệu truyền theo 1 chiều, dữ liệu truyền từ A đến B, A chỉ truyền, B chỉ nhận.
(giao tiếp chuột/bàn phím với máy tinh). TX TX
TX RX A B
A B RX RX
công tắc chuyển mạch lựa chọn
+ Bán song công: chỉ có 1 đường truyền nhưng có 2 công tắc. A và B có thể truyền hoặc nhận nhưng tại 1
thời điểm có 1 bên truyền và 1 bên nhận.
+ Song công: A&B có thể vừa truyền vừa nhận đồng thời. 8051 cho phép truyền song công.
TX TX
A RX RX B
GD
黎海潮
• Nguyên lý: nguyên lý của truyền tin nối tiếp là sử dụng thanh ghi dịch.
Đầu ra nối tiếp
DATA DATA Thay vì đưa dữ liệu // ra thì đưa
dữ liệu ra thanh ghi dịch → nối
tiếp.
NT
TGD TGD
CLK
黎海潮
+ Truyền dị bộ: UART, không dùng chung xung CLK Truyền dị bộ thì phải có đóng gói, nhịp
truyền và tốc độ truyền.
Start bit Stop bit
Trong chế độ truyền có thể truyền thêm
1 bit (bit kiểm tra chẵn lẻ). Bit thứ 9 có
TX RX thể là kiểm tra chẵn lẻ theo nghĩa so lại
A B tất cả các bit dữ liệu của 8 bit Data.
Chẵn thì 0, lẻ thì 1
Đây là cách truyền tin thô sơ nhất.
CLK A CLK B
OSC_A OSC_B
Yếu tố đầu tiên để A truyền 1 bit, B nhận 1 bit cùng lúc là tần số phải giống nhau: f_OSC_A = f_OSC_B
Để truyền nhận cùng lúc thì có giải pháp TX luôn ở mức cao, khi truyền TX xuống mức thấp, mức thấp này là
báo B là bên A truyền dữ liệu.
B thấy mức 0 thì hiểu truyền dữ liệu và sẽ chờ qua 1 khoảng thời gian của bit này thì bắt đầu nhận tín hiệu bit
tiếp theo, quy định với nhau là truyền bao bit thì sẽ kết thúc.
Khung truyền (cách đóng gói bản tin):
1 bit – Start bit (tạo sườn xuống, B là có dữ liệu rồi, bật xung CLK lên đi để nhận (không tính vào dữ liệu))
8 bit – Data bit
黎海潮
1 bit – Stop bit (chuyển từ mức thấp lên mức cao)
Có thể dùng cổng song song để vào ra nối tiếp được không? Giải thích?
Đối với cổng vào ra nối tiếp thì cần có thanh ghi dịch 8 bit để tách byte dữ liệu thanh 8 bit nối
tiếp. Tuy nhiên ở cổng vào ra song song thì thường không có thanh ghi dịch do đó không thể sử
dụng cổng song song để truyền tin nối tiếp.
Nêu mặt hạn chế của chuẩn RS232C, các khắc phục
• Hạn chế:
+ Trong RS232 thì mức logic “1” được biểu diễn từ “3V - 12V” còn mức “0” được biểu diễn từ “-12V - -3V”.
Mức điện áp này không phù hợp với các chip TTL phổ biến vì vậy cần có giải pháp.
+ Không thể truyền dữ liệu ở khoảng cách xa vì dễ bị nhiễu tín hiệu.
• Giải pháp:
+ Dùng mạch trung gian MAX232 để chuyển đổi các mức điện áp RS232 về các điện áp TTL được chấp
nhận bởi các chân TxD và RxD của 8051. Các IC MAX232 nhìn chung được coi như các bộ điều khiển
đường truyền.
+ Có thể sử dụng các chuẩn khác như RS485, RS422… hoặc phải có các biện pháp chống nhiễu phù hợp.
黎海潮
Trình bày về cổng vào ra nối tiếp trong hệ MCS-51
• Cổng nối tiếp 8051 thực hiện chuyển đổi dữ liệu từ song song → nối tiếp khi phát và từ nối tiếp →
song song khi thu.
• Hoạt động theo chế độ song công
• Chuyển đổi dữ liệu qua phần cứng: thanh ghi dịch.
• TxD (P3.0) – phát dữ liệu, RxD (P3.1) – thu dữ liệu, SCON, SBUF dung để truy xuất.
SCON gồm: → bit trạng thái – báo sự kết thúc thu – phát 1 ký tự.
bit điều khiển – thiết lập chế độ hoạt động.
SBUF như 1 bộ đệm, muốn byte dữ liệu truyền qua TxD thì nó cần đặt dữ liệu trong SBUF. Tương tự
SBUF lưu 1 byte dữ liệu khi nó được nhận qua đường RxD của 8051. Byte dữ liệu khi được ghi vào
SBUF thì nó sẽ được định khung với bit Start và bit STOP rồi truyền qua TxD. Khi SBUF nhận được các
bit dữ liệu từ RxD thì nó sẽ mở khung loại trừ các bit start, Stop.
黎海潮
Bit thứ 9 (Mode 2 or
3 truyền được)
Bit thứ 9 (Mode 2 or
3 nhận được)
Cờ truyền
Cờ nhận
Cho phép nhận
黎海潮
SM0 SM1 Mode Mô tả Tốc độ truyền (baud rate)
0 0 0 Dữ liệu nối tiếp vào và đưa ra qua RXD. TXD đưa ra xung Cố định (1/12 tần số dao động)
CLK dịch. 8 bit dữ liệu được truyền/nhận (bit đầu là LSB)
0 1 1 10 bit được truyền (qua TXD) hoặc nhận (qua RXD): bit Thay đổi
Start (0), 8 bit dữ liệu (bit đầu LSB) và bit Stop (1). Khi
nhận, bit Stop đi vào RB8 trong Special Function Register
SCON
(UART – 8 bit).
1 0 2 11 bit được truyền (TXD) hoặc nhận (RXD): bit Start (0), 8 Cố định (1/32 hoặc 1/64 tần số dao
bit dữ liệu (bit đầu LSB), bit dữ liệu thứ 9và bit Stop (1). động).
On Transmit, the 9th data bit (TB8 in SCON) can be
assigned the value of 0 or 1. Or, for example, the parity (P,
in the PSW) could be moved into TB8. On receive the 9th
data bit goes into RB8 in Special Function Register SCON,
while the stop bit is ignored. (UART 9 – bit )
1 1 3 11 bit are transmitted (through TXD) or receive (through In fact, Mode 3 is the same as Mode 2
RXD): a start bit (0), 8 data bits (LSB first), a in all respects except the baud rate.
programmable 9 data bit and a stop bit (1)
th The baud rate in Mode 3 is variable.
(UART 9 – bit)
黎海潮
Trình bày rõ cách sử dụng bit Parity trong trường hợp này.
• Bit Parity (P) là bit kiểm tra tính chẵn lẻ, nằm trong thanh ghi đặc biệt PSW. Bit này được nạp vào
bit TB8 ở thanh ghi SCON bằng phần mềm. Bit có giá trị 1 khi số lượng các bit 1 trong một nhóm
bit là lẻ, còn bit P có giá trị 0 khi số lượng các bit 1 trong một nhóm bit là chẵn.
• Ta định sẵn byte dữ liệu có bit P là bit chẵn mà ở bên thu lại là lẻ thì kết luận dữ liệu đã bị truyền
sai, nhưng nếu ở bên thu là chẵn thì chưa kết luận.
• Ví dụ để kiểm tra chẵn lẻ ta dùng đoạn lệnh:
MOV C,P
CPL C
MOV TB8, C
MOV SBUF, A
黎海潮
Vào ra nối tiếp dị bộ: định nghĩa, mục đích, phương pháp đồng bộ
• Định nghĩa: Vào ra nối tiếp dị bộ là phương pháp truyền mỗi lần 1 byte thay vì truyền mỗi lần 1
khối dữ liệu. Xung CLK riêng rẽ ở từng bộ phận truyền và nhận
• Mục đích: Là khi phát tín hiệu không phải phát theo xung CLK đồng bộ, giảm mức độ phức tạp của
mạch
• Phương pháp đồng bộ: Đóng gói bản tin thanh khung truyền, thêm các bit khởi đầu và kết thúc,
ngoài ra còn có các bit kiểm tra chẵn lẻ
f_OSC_A = f_OSC_B
Start bit Stop bit Khung truyền (cách đóng gói bản tin):
1 bit – Start bit (tạo sườn xuống, B là có dữ
liệu rồi, bật xung CLK lên đi để nhận (không
TX RX
A B tính vào dữ liệu))
8 bit – Data bit
1 bit – Stop bit (chuyển từ mức thấp lên mức
cao)
CLK A CLK B
OSC_A OSC_B
黎海潮
Hãy trình bày về tổ chức bộ nhớ trong hệ MCS-51
Kiến trúc bộ nhớ của 8051 là kiến trúc Harvard
Bộ nhớ trong hệ MCS-51 chia làm 2 phần: Bộ nhớ chương trình và bộ nhớ dữ liệu (tách rời nhau)
Program Memory (Read Only – ROM)
FFFFH
• Nếu có những câu lệnh mà địa chỉ cao hơn thì sử dụng ROM
ngoài.
• Chương trình chính cần đặt 2 địa chỉ ngoài vùng thực hiện
chương trình ngắt để tranh việc bị ghi đè (vecto ngắt).
Chương trình chính Chương trình ngắt
ORG 0003H
00FFH …..........
RETI
0000H
Đặt chương trình chính sau 0050H để tránh bị trùng với vecto ngắt.
EA = 1: sử dụng bộ nhớ trong
EA = 0: sử dụng bộ nhớ ngoài. 黎海潮
Địa chỉ > 4K (VD: 1FFFH thì khi truy xuất ở bộ nhớ ngoài nối tiếp ROM)
4K bộ nhớ
+ 0003H: ngắt ngoài 1
0FFFH + 001BH: ngắt Timer 1
………..
05FFH Đặt chương trình chính sau 0050H để tránh bị trùng với vecto ngắt.
CTN: ORG 0003H (CT ở thanh ghi 0003H < 8 byte thì
…………. không bị đè 001BH)
0050H
RETI
ORG 0000H Reset PC về 0000H
0003H LJMP 0050H Nạp PC 0050H để PC bắt đầu
RESET 0000H CTC: ORG 0050H (để bỏ qua QT ngắt)
……….
END
P đưa 8 bit thấp Vừa là bit dữ liệu CONTROL_BUS: ALE và PSEN
P đưa 8 bit cao vừa là bit địa chỉ
黎海潮
Sau khi khởi động, CPU bắt đầu thực hiện chương trinh ở vị trí 0000H.
Mỗi khi xảy ra ngắt, con trỏ của CPU sẽ nhảy đến đúng địa chỉ ngắt tương ứng và thực thi chương
trình tại đó.
Ví dụ: ngắt ngoài 0 sẽ có địa chỉ 0003H, khi xảy ra ngắt ngoài 0 thì con trỏ chương trình sẽ nhảy
đến đúng địa chỉ 0003H để thực thi chương trình tại đó. Nếu trong chương trình ứng dụng không
sử dụng đến ngắt ngoài 0 thì địa chỉ 0003H vẫn có thể dùng cho mục đích khác (sử dụng cho bộ
nhớ chương trình)
黎海潮
Data Memory (Read/Write - RAM)
00FFH
0000H
CPU sẽ dùng đến các chân
RD và WR khi truy cập
đến bộ nhớ dữ liệu ngoài
Cấu trúc bộ nhớ dữ liệu trong và bộ nhớ dữ liệu ngoài
黎海潮
Truy xuất địa chỉ theo byte (không thể truy xuất
từng bit)
16 ô nhớ = 128 bit → truy xuất định địa chỉ theo bit
20H: 00 → 07H; 2FH: 78H → 7FH
(128 bit thấp của bộ nhớ dữ liệu của MCS-51)
黎海潮
黎海潮
• 8051 chứa 210 vị trí bit được định địa chỉ trong đó 128 bit
chứa trong các byte ở địa chỉ từ 20H đến 2FH (16 byte x 8
bit = 128 bit) và phần còn lại chứa trong các thanh ghi đặc
biệt. Ngoài ra 8051 còn có các port xuất/nhập có thể định
địa chỉ từng bit, điều này làm đơn giản việc giao tiếp bằng
phần mềm với các thiết bị xuất/nhập đơn bit.
• Vùng RAM đa mục đích có 80 byte đặt ở địa chỉ từ 30H
đến 7FH, bên dưới vùng này từ địa chỉ 00H đến 2FH là
vùng nhớ có thể được sử dụng tương tự. Bất kỳ vị trí nhớ
nào trong vùng RAM đa mục đích đều có thể được truy
xuất tự do bằng cách sử dụng các kiểu định địa chỉ trực
tiếp hoặc gián tiếp.
• Bất kỳ vị trí nhớ nào trong vùng RAM đa mục đích đều có thể được truy xuất tự do bằng cách sử dụng
các kiểu định địa chỉ trực tiếp hoặc gián tiếp.
• Cũng như các thanh ghi từ R0 đến R7, ta có 21 thanh ghi chức năng đặc biệt SFR chiếm phần trên của
Ram nội từ địa chỉ 80H đến FFH. Cần lưu ý là không phải tất cả 128 địa chỉ từ 80H đến FFH đều được
định nghĩa mà chỉ có 21 địa chỉ được định nghĩa.
黎海潮
Bằng cách nào hệ 8051 truy nhập được nhiều ô nhớ có chung địa chỉ? (trong/ngoài/SFR)
• Có thể truy nhập nhiều ô nhớ có chung địa chỉ vì các vùng không gian nhớ (trong/ ngoài/ SFR) tách
biệt nhau, do đó có thể trùng địa chỉ với nhau. Để truy nhập nhiều ô nhớ có chung địa chỉ, ta có thể
dựa vào tín hiệu điều khiển, hay nói đúng hơn là phân biệt dựa vào câu lệnh.
• VD: MOV dùng với RAM trong, MOVX dùng với RAM ngoài, PSEN dùng với ROM.
黎海潮
Hãy trình bày về bus của hệ vi xử lý
• Hệ thống bus của vi xử lý: VXL có 3 hệ thống bus: Data, Address và Control.
+ Bus là các đường tín hiệu có chức năng liên kết CPU với bộ nhớ và các I/O.
+ A_bus: Khi đọc/ghi bộ nhớ hoặc địa chỉ cổng vào/ra, CPU sẽ đưa ra trên bus này địa chỉ ô nhớ liên
quan/địa chỉ cổng tương ứng. A_bus có chức năng truyền địa chỉ tham chiếu tới các khu vực bộ nhớ và chỉ
ra dữ liệu được lưu trữ ở đâu trong không gian nhớ. Số lượng đường bus liên quan đến không gian nhớ.
+, D_bus: là bus 2 chiều, chức năng là truyền tải thông tin theo 2 chiều giữa CPU và bộ nhớ hoặc các
I/O. Độ rộng bus sẽ xác định được lượng dữ liệu có thể trao đổi trên bus. Các đầu ra nối thẳng với D_bus
đều phải trang bị Buffer để có thể ghép nối và hoạt động với bus này.
+, C_bus: Mỗi tín hiệu điều khiển có 1 chiều nhất định vì khi hoạt động CPU đưa tín hiệu tới các khối
trong hệ, đồng thời CPU cũng nhận tín hiệu từ khối trong hệ để phối hợp hoạt động. Phục vụ truyền tải các
thông tin dữ liệu để điều khiển hoạt động của hệ thống. Biểu hiện là đường mũi tên 2 chiều để chỉ tính 2
chiều của 1 nhôm tín hiệu chứ không phải 1 tín hiệu.
• Điểm khác nhau giữa ghép nối MCS-51 theo cổng và bus là:
+ Ghép nối MCS-51 theo cổng thì không cần có bộ giải mã địa chỉ DEC vì ngoại vi được ghép nối trực
tiếp với các cổng của vi xử lý và các cổng này đã có sẵn địa chỉ. CPU sẽ biết sẵn địa chỉ của ngoại vi cần trao
đổi dữ liệu.
+ Ghép nối MCS-51 theo bus thì cần có mạch giải mã địa chỉ vì ghép nối theo bus thì ghéo nối với nhiều
ngọa vi nên cần DEC để biết I/O nào cần trao đổi dữ liệu khi có nhu cầu.
黎海潮
Hãy cho biết những kiến trúc bus mà bạn biết?
Có 4 kiểu kiến trúc bus là kiểu vòng, dạng đường thẳng, dạng sao và dạng cây.
+ Bus dạng đường thẳng
B C Thanh ghi
A B
Các phần tử bình đẳng. Mỗi phần tử có 1 khoảng
thời gian
Ví dụ 1s cho 4 phần tử → có 4 khe, mỗi khe 250ms
A muốn truyền cho D thì phải chờ qua B,C
→ lãng phí thời gian, hiệu suất không cao.
D C
黎海潮
+ Bus dạng sao: Có 1 vấn đề là nếu M hỏng → không truyền được dữ liệu nhưng có hiệu suất cao hơn.
A B
D C
A D
B C A
E F
黎海潮
Trình bày kỹ thuật quét để giải mã phím.
5V
1 2 3 A
4 5 6 B
7 8 9 C
P1.0 * 0 # D
4 bit làm đầu ra P1.1
xuất mức logic P1.2 Ta nhấn phím số 4 có tọa độ (2;1), các đầu
P1.3 P1.4 đến P1.7 được thiết lập sẵn ở mức tích
VXL cực “1”.
Các đầu ra xuất mức logic từ 0000 đến 1111
P1.4
P1.5 lần lượt và thời gian xuất ra mỗi mức cỡ 2 us,
Đầu vào rất nhỏ so với thời gian giữ phim (cỡ ms) ,
P1.6
P1.7 khi đầu ra xuất tín hiệu 1011 trong lúc giữ
INT
phím số 5 → đầu P1.4 có mức tín hiệu 0, VXL
nhận tín hiệu đầu vào là 0111
→ VXL hiểu là phím số 4 được ấn → trên Led
hiển thị số 4
黎海潮
Có thể dùng kỹ thuật này để xác định mã của hai phím cùng nhấn không? Giải thích?
• Kỹ thuật này có thể xác định mã của 2 phím cùng nhấn.
+ Giả sử ta nhấn đồng thời 2 phím số 4 và số 8
+ P1.4 ÷ P1.7 là đầu vào ở mức “1”.
+ Giả sử lúc đó P1.0 ÷ P1.3 xuất mức 1001 → VXL thu được tín hiệu ở P1.4 ÷ P1.7 là 0011 → hiểu là
có nhấn có phím ở cột 1 và ở cột 2 được nhấn; thuộc hàng 2 và hàng 4. (khoanh vùng được 4 phím số
4,5,7,8)
+ Sau đó P1.0 ÷ P1.3 xuất ra mức logic 1011 → VXL thu được tín hiệu ở P1.4 ÷ P1.7 là 0111 → hiểu
là có nhấn có phím ở cột 1 và phím đó thuộc hàng 2 → phát hiện được phím số 4 được nhấn.
+ Tương tự P1.0 ÷ P1.3 xuất ra mức logic 1101 → VXL thu được tín hiệu ở P1.4 ÷ P1.7 là 1011 →
phát hiện được phím số 8 được nhấn.
Nếu dùng kỹ thuật này theo cách điều khiển bằng ngắt có được không? Giải thích?
Kỹ thuât này có thể dùng theo cách điều khiển bằng ngắt (Thực ra nó giống với cái sơ đồ trên nhưng
khác cái là 4 tín hiệu ở Px.4- Px.7 sẽ đươc gom đưa vào 1 cổng AND, đầu ra của cổng AND sẽ được đưa
vào INT ).
黎海潮
Trình bày kỹ thuật đảo dây giải mã phím
1 2 3 A 5V
4 5 6 B Đảo dây là đảo vai trò đầu ra, đầu vào cho nhau.
7 8 9 C Ban đầu P1.4 ÷ P1.7 là đầu vào ở mức “1”. Giả sử
lúc đó P1.0 ÷ P1.3 xuất mức 1011, nếu ta ấn phím
* 0 # D số 6 thì VXL thu được tín hiệu ở P1.4 ÷ P1.7 là
1101 → hiểu là có nhấn 1 phím ở cột 3.
P1.0
Đảo vai trò, P1.0 ÷ P1.3 thành đầu vào ở mức “1”.
4 bit làm đầu ra P1.1 P1.4 ÷ P1.7 trở thành đầu ra xuất mức 1101, lúc đó
xuất mức logic P1.2 vẫn giữ phím số 6 thì VXL thu được tín hiệu ở P1.0
÷ P1.3 là 1011 → hiểu là có nhấn 1 phím ở hàng 2
P1.3
VXL → kết hợp 2 dữ kiện, VXL sẽ hiểu ở hàng 2 – cột 3 có
phím được nhấn → VXL sẽ hiển thị số 6.
P1.4
P1.5
Đầu vào
P1.6
INT P1.7
黎海潮
Có thể dùng kỹ thuật này để xác định mã của hai phím cùng nhấn không ? Giải thích ?
• Kỹ thuật này không thể xác định được mã của hai phím cùng nhấn.
+ Giả sử ta nhấn đồng thời 2 phím số 4 và số 8
+ P1.4 ÷ P1.7 là đầu vào ở mức “1”.
+ Giả sử lúc đó P1.0 ÷ P1.3 xuất mức 1001 → VXL thu được tín hiệu ở P1.4 ÷ P1.7 là 0011 → hiểu là có
nhấn có phím ở cột 1 và ở cột 2 được nhấn.
+ Đảo lại, P1.0 ÷ P1.3 là đầu vào ở mức “1”. Lúc đó P1.4 ÷ P1.7 xuất mức 1001 → VXL thu được tín
hiệu ở P1.0 ÷ P1.3 là 1101 → hiểu là có phím ở hàng 3 được nhấn.
→ VXL hiểu có phím số 7, số 8 được nhấn → sai với thực tế.
Kỹ thuật này thích hợp với phương thức điều khiển nào ? Giải thích ?
• Kỹ thuật này thích hợp với phương thức điều khiển bằng ngắt vì việc điều khiển vào ra bằng ngắt cho
phép CPU có thời gian nghỉ, chỉ khi nào có phím ấn lúc đó mới kiểm tra, khác với khi điều khiển bằng
chương trình thì ngay cả khi không có phím nào ấn vẫn kiểm tra.
黎海潮
Nêu các phương pháp có thể để ghép nối giữa vi xử lý và hiển thị LED 7 thanh nhiều chữ số.
• Phương pháp quét LED
Tất cả các led 7 thanh đều được nối chung vào 1 cổng của VXL, mỗi led có 1 nguồn riêng.
Việc cấp nguồn cho các led sẽ được điều khiển bằng chương trình thông qua các transitor
Các led sang luân phiên nhau, tại 1 thời điểm chỉ có 1
led sáng, trong 1s 1 led sáng ≥ 24 lần để xảy ra hiện
tượng lưu ảnh trong mắt
Nhược điểm: nếu số lượng led lớn thì số lần sáng của
mỗi led trong khoảng thời gian sẽ ít → led sẽ căng mờ
(led tăng → độ sáng giảm) Giải pháp: giảm điện trở
hạn dông,
黎海潮
Sử dụng thanh ghi dịch, độ nhấp nháy > 24 lần/s.
TGD là thanh ghi vào nt ra // hoặc vào // ra nt,…, gồm tập hợp nhiều D-FF.
5V
PNP
P2.0 P2.1 P2.2
74595 AC
MCS -51
黎海潮
• Phương pháp chốt led 7 thanh (ghép nối theo kênh, đầu ra //)
• Hệ nhiều LED có đường dữ liệu nối trực tiếp với cổng MOVX @DPTR, A - lệnh chung của led hiển
thị
Ở hệ này các cổng ra của vi xử lý được nối trực tiếp với 8
anot (hoặc catot tùy vào cách mắc của LED) của LED 7 DPTR – địa chỉ của con led (00XXH) với 00
thanh thông qua 1 con điện trở để hạn dòng. thuộc P2, còn XX thuộc P0.
Nhược điểm của hệ này là rất tốn cổng của vi xử lý, do đó A – mã led 7 thanh của số cần hiện.
chỉ sử dụng với những hệ cần ít LED
黎海潮
Bằng cách nào ta có thể điều khiển để LED hay bóng sợi đốt sáng dần hay tối dần.
Xét 1 LED đơn, để LED sáng thì tùy thuộc vào điện áp đặt lên LED và dòng điện chạy qua LED
Giả sử điện áp định mức của led là 2V, ta có xung vuông điện áp với biên độ là 3V với độ rộng xung
T_ON=50%.T → điện áp trung bình đặt lên led là 1,5V thì led chưa sáng đúng định mức, muốn tăng
giảm độ sáng của led thì ta thay đổi điện áp trung bình đặt lên led → thay đổi độ rộng xung → dựa vào
chương trình trong VXL để thay đổi
Trước hết ta phải lập trình được 1 chương trình tạo xung vuông điện áp có điều chế được độ rộng xung
sau đó mới thay đổi dựa trên thông số tinh toán.
Hoặc cách khác là ta thay đổi điện trở hạn dòng chạy qua led sao cho phù hợp với yêu cầu cần làm.
黎海潮
Hãy mô tả các cách ghép nối giữa VXL và ADC để điều khiển bằng chương trình và bằng ngắt
• Dùng ngắt
- Nối các cổng D0, D1, D2, D3, D4, D5, D6, D7 của ADC vào P0,
- Nối chân WR(SOC) của ADC với chân P2.0
- Nối chân RD(EOC) của ADC với chân P2.1
- Nối chân INTR của ADC vào chân P3.2(INT0) external interrupt
(trong code phải thực hiện : cho phép ngắt toàn cục, cho phép ngắt ngoài, cho phép ngắt theo mức thấp,
code hàm ngắt(chức năng của hàm ấy set RD tích cực , WR không tích cực để đọc dữ liệu từ ADC và
ngưng quá trình chuyển đổi )
- Nối chân CS với đất (CS = 0) hoặc nối CS với P2.2 để để chọn chip nếu sửa dùng nhiều model
ADC(P2.2 có mức logic bằng 0)
• Không dùng ngắt:
Ghép nối cũng tương tự như khi dùng ngắt nhưng code thì không cần cấu hình ngắt và viết hàm ngắt.
Thay vì đó ta phải check liên tục mức logic ở chân INTR của ADC trong chương trình chính để kiểm tra
khi nào quá trình chuyển đổi kết thúc thì ta thực hiện clear WR và set RD tích cực để đọc data.
黎海潮
U2
U1 20 1
VCC CS
19 39 18 2
XTAL1 P0.0/AD0 DB0(LSB) RD
38 17 3
P0.1/AD1 DB1 WR
37 16 4
P0.2/AD2 DB2 CLK IN
18 36 15 5
XTAL2 P0.3/AD3 DB3 INTR
35 14 8
P0.4/AD4 DB4 A GND
34 13 10
P0.5/AD5 DB5 D GND
33 12 9
P0.6/AD6 DB6 VREF/2
9 32 11 19
RST P0.7/AD7 DB7(MSB) CLK R
21 6
P2.0/A8 VIN+
22 7
P2.1/A9 VIN-
23
P2.2/A10
29 24 ADC0804
PSEN P2.3/A11
30 25
ALE P2.4/A12
31 26
EA P2.5/A13
27
P2.6/A14
28
P2.7/A15
1 10
P1.0 P3.0/RXD
2 11
P1.1 P3.1/TXD
3 12
P1.2 P3.2/INT0
4 13
P1.3 P3.3/INT1
5 14
P1.4 P3.4/T0
6 15
P1.5 P3.5/T1
7 16
P1.6 P3.6/WR
8 17
P1.7 P3.7/RD
AT89C51
黎海潮
Hãy trình bày các bước cần thiết để một yêu cầu về ngắt từ INT0 của hệ MCS-51 có thể xảy ra
Hệ MCS-51 có 2 ngắt phần cứng ở bên ngoài là chân P3.2 (INT0) và chân P3.3 (INT1) điều khiển bởi thanh ghi
IE. Có 2 mức hoạt động ngắt cho các ngắt phần cứng là : Ngắt theo mức và ngắt theo sườn.
• Ngắt theo mức
Chân INT0 bình thường ở mức cao và nếu có 1 tín hiệu mức thấp được cấp tới thì chúng ghi nhãn ngắt. Sau đó
bộ VĐK dừng tất cả mọi công việc nó đang thực hiện và nhảy đến bảng vecto ngắt để phục vụ ngắt, sau đó IO
phải gửi tín hiệu xóa cờ tràn .
Chú ý : chân ngắt phải được giữ ở mức thấp cho đến khi bắt đầu thực hiện trình phục vụ ngắt ISR. Nếu chân
INT0 được đưa trở lại mức cao trước khi bắt đầu thực hiện ISR thì sẽ chẳng có ngắt nào xảy ra. Do vậy, để bảo
đảm việc kích hoạt ngắt phần cứng tại các chân INT0 phải đảm bảo rằng thời gian tồn tại tín hiệu mức thấp là
khoảng 4 chu trình máy
Tín hiệu mức thấp tại chân INT0 phải được lấy đi trước khi thực hiện lệnh cuối cùng của chương trình phục vụ
ngắt, nếu không một ngắt khác sẽ lại được tạo ra, và vi điều khiển sẽ thực hiện ngắt liên tục.
Tuy nhiên trong quá trình kích hoạt ngắt theo mức thấp nên nó lại phải đưa lên mức cao trước khi ISR thực
hiện lệnh cuối cùng và lại theo bảng dữ liệu từ nhà sản xuất thì “nếu chân INT0 vẫn ở mức thấp sau lệnh cuối
cùng của trình phục vụ ngắt thì một ngắt khác lại sẽ được kích hoạt”. Điều này do một thực tế là ngắt theo mức
không được chốt
黎海潮
• Ngắt theo sườn xuống
Ngắt theo sườn là ngắt sẽ xảy ra khi có một sườn xuống xuất hiện trên các chân ngắt của vi điều khiển. Điều
này làm cho ngắt theo sườn khắc phục được nhược điểm của ngắt theo mức như ta đã thấy ở trên
Thanh ghi TCON: TF1 TR1 TF0 TR0 IE1 IT1 IE0 IT0
Các bit TCON.0 và TCON.2 được coi như là các bit IT0 và IT1 tương ứng. Đây là các bit xác định kiểu ngắt theo
sườn xung hay theo mức xung của các ngắt phần cứng trên chân INT0 và INT1 tương ứng.
Khi bật lại nguồn cả 2 bit này đều có mức 0 để biến chúng thành ngắt theo tín hiệu mức thấp.
Có thể điều khiển một trong số chúng lên cao để chuyển ngắt phần cứng bên ngoài thành ngắt theo sườn.
Các bit TCON.1 và TCON.3 còn được gọi là IE0 và IE1 tương ứng. Các bit này được 8051 dùng để bám kiểu
ngắt theo sườn xung, nếu các bit IT0 và IT1 bằng 0 thì có nghĩa là các ngắt phần cứng là ngắt theo mức thấp và
các bit IE0 và IE1 sẽ không dùng đến.
Khi có chuyển dịch sườn xung trên chân INT0 (hay INT1) thì 8051 đánh dấu (bật lên cao) các bit IEx trên
thanh ghi TCON và nhảy đến bảng vector ngắt và bắt đầu thực hiện trình phục vụ ngắt ISR
Chỉ trong khi thực hiện lệnh cuối của trình phục vụ ngắt ISR thì các bit IEx mới được 8051 tự động xóa, và các
chân ngắt lại hoạt động bình thường.
黎海潮
Hãy lập trình để ngắt T0 có mức ưu tiên cao hơn INT0
• Mặc định thứ tự ưu tiên ngắt lần lượt là
INT0 (ngắt ngoài 0); TF0 (ngắt timer 0); INT1(ngắt ngoài 1); TF1(ngắt timer1 ); RI + TI (ngắt
truyền thông nối tiếp)
Khi INT0, TF0, INT1, TF1, RI(TI) được kích hoạt cùng một lúc. 8051 thực hiện theo thứ tự INT0
TF0 INT1 TF1 RI(TI)
• Chúng ta có thế thay thế trình tự mức ưu tiên trên bằng cách gán mức ưu tiên cao hơn cho bất kỳ
một trong các ngắt. Điều này được thực hiện bằng cách lập trình cho thanh ghi IP( Interrupt
Priority)
IP có địa chỉ tại by B8H IP.4 là bit mức ưu tiên cho truyền thông nối tiếp
IP.3 là bit mức ưu tiên cho timer1 IP.2 là bit mức ưu tiên cho ngắt ngoài 1
IP.1 là bit mức ưu tiên cho ngắt timer0 IP.0 là bit mức ưu tiên cho ngắt ngoài 0
Set bit = 1 thì ngắt đó có mức ưu tiên cao, set bit = 0 thì ngắt đó có ưu tiên mức thấp
• Để lập trình ngắt T0 có mức ưu tiên cao hơn ngắt INT0
Thì chỉ cần dùng lệnh SETB IP.1 hoặc lệnh MOV IP, #00000010B
(Khi đó IP.1 = 1, IP.0 = 0 thì ngắt timer 0 có mức ưu tiên cao hơn ngắt ngoài 0)
黎海潮
Mạch thời gian trong hệ MCS-51 của Intel: mô tả các thanh ghi liên quan
Các chế độ hoạt động và ứng dụng của các chế độ đó.
Sử dụng ngắt với mạch thời gian thế nào ?
8051 có 2 bộ Timer/Counter 16 bit: Timer 0 và Timer 1 với 4 chế độ hoạt động.
Trong hàm Timer, thanh ghi được tăng thêm sau mỗi chu kỳ máy. Do đó có thể coi như đếm chu kỳ máy. Do chu
kỳ máy = 12 chu kỳ dao động → Timer có tốc độ đếm = 1/12 tần số dao động.
8051 có 2 thanh ghi TMOD và TCON.
THn: thanh ghi 8 bit chứa byte cao của bộ đếm. TLn: thanh ghi 8 bit chứa byte thấp của bộ đếm.
TRn: bit cho phép Timer hoạt động: TRn = 0 → Timer ngừng hoạt động
TRn = 1 → Timer được phép hoạt động
M1, M0: 2 bit xác định 4 mode của Timer. TFn: bit cờ báo tràn bộ đếm.
C/Tn: bit thiết lập Timer hoặc Counter: C/T = 0 → Timer lấy xung Clock từ on-chip oscillator (xung của VXL)
C/T = 1 → Timer lấy xung từ bên ngoài qua Port Tn (chế độ Counter)
GATE: kết hợp với TRn để điều khiển bộ đếm: GATE = 0 → Timer chỉ hoạt động khi TRn = 1 và INTn HIGH
GATE = 1 → Timer hoạt động khi TRn = 1
黎海潮
• Thanh ghi TMOD
黎海潮
• Bit GATE nhận 2 giá trị là 0 hoặc 1, nó dùng để lựa chọn chế độ điều khiển. GATE= 0 chỉ chạy khi bit
TRx = 1. Khi đó Timer chọn chế độ điều khiển bằng phần mềm. Bit GATE= 1, khi đó Timer chọn chế
độ điều khiển bằng phần cứng → điều khiển bằng ngắt
• Bit C/T cho phép lựa chọn chế độ Timer hay Counter.
• 2 bit M1 và M0 dùng để lựa chọn chế đô cho Timer
• Mode 0: chế độ 13 bit trong đó 5 bit cao được đặt trước. (tìm hiểu 5 bit đặt trước này là thế nào,
thầy cô có thể hỏi)
• Mode 1: chế độ 16 bit sử dụng cả THx và TLx đếm từ 0000H đến FFFFH
• Mode 2: chế đồ Auto reload là bộ định thời 8 bit do đó chỉ có thể đếm từ 00H đến FFH vào thanh
ghi THx của bộ định thời còn TLx là thanh ghi đếm. Ở đây TLx sẽ chứa giá trị bắt đầu nghĩa là khi
TLx đếm đến giá trị max thì bộ đếm sẽ tự động đếm lại bắt đầu từ giá trị nằm ở thanh ghi TLx.
• Mode 3: 2 thanh ghi THx, TLx là 2 bộ đếm độc lập 8 bit (chế độ này ít dùng).
黎海潮
• Thanh ghi TCON
- TF1/ TF0: báo tràn cho T/C1 và T/C0. TR1 TR0: khời chạy cho T/C1 T/C0.
黎海潮
• Mode 0
黎海潮
黎海潮
Ứng dụng của các Mode trong Timer
Quét led, tạo xung pwm, đo tần số, định thời…
• Do mạch sử dụng thạch anh có tần số 12MHz => tần số xung nhịp cấp cho bộ timer/counter là
(1/12)*12=1MHz (Mỗi xung clock mất 1us).
• Do yêu cầu xung có tần số f = 2KHz =>T = 1/f = 0.5ms = 500us. =>Cần cho bộ timer/counter đếm 500
lần.
• Độ rộng mức 1 chiếm 70% => mình sẽ set chân P2.0 lên 1 timer/counter và cho đếm 350 lần.
• Độ rộng mức 0 chiếm 30% => tiếp theo, clear chân P2.0 về 0 và cho timer/counter đếm 150 lần.
• Ở đây sẽ chọn timer/counter 0, để thực hiện bài toán này. Do giá trị gán cho thanh ghi đếm vượt quá
255 nên mình sẽ sử dụng timer/counter 0 ở mode 黎海潮16 bit (TMOD = 0x01)
Sử dụng ngắt với mạch thời gian như thế nào:
• Để sử dụng ngắt với mạch thời gian, ta sử dụng 4 bit IE1/0 IT1/0 của thanh ghi
TCON
• Các bit IT1/0 là các bit xác định mức ngắt phần cứng cho 2 chân INT1 và INT0. Khi
Reset thi 2 bit này bằng 0 nghĩa là ngắt mức thấp.
• IE0 và IE1 dùng để xác định kiểu ngắt kích sườn phát xung. Nếu IT1 và IT0 bằng
không thì IE1 và IE0 không có tác dụng. Các bit IE1 và IE0 dùng để chốt sường phát
xung từ cao xuống thấp trên INT1 và INT0
• Khi có chuyển trang thái sườn xung trên INT1 và INT0 thì 8051 chuyển các bit IE1
IE0 từ 0 lên 1.
黎海潮