Bài tập thực hành vi điều khiển H8SX1582
Trang 1KHOA KHOA HỌC VÀ KỸ THUẬT MÁY TÍNH
-W X -
BÀI TẬP THỰC HÀNH
VI ĐIỀU KHIỂN H8SX/1582
Trang 2Mục Lục
Bài 1: Biên dịch và debug một chương trình đơn giản 1
1.1 Nội dung 1
1.2 Project workspace 1
1.3 Build project tutorial 4
1.4 Download và chạy chương trình tutorial 9
1.5 Các file trong project 13
Bài 2: Khảo sát I/O port 16
2.1 Nội dung 16
2.2 Tóm tắt lý thuyết 16
2.3 Lập trình C 19
2.4 Bài tập 21
Bài 3: Xử lý ngoại lệ và ngắt quãng 24
3.1 Nội dung 24
3.2 Tóm tắt lý thuyết 24
3.3 Thực hành – Bài tập 36
Bài 4: Khảo sát các bộ định thời 37
4.1 Nội dung 37
4.2 Tổng quan về bộ định thời 16 bit (TPU) 37
4.3 Các thanh ghi của bộ định thời 37
4.4 Cách sử dụng interval timer 40
4.5 Cách sử dụng TPU làm bộ phát xung clock 41
4.6 Bài tập 42
Bài 5: Khảo sát kỹ thuật quét LED 43
5.1 Nội dung 43
5.2 Khảo sát kỹ thuật quét LED 43
5.3 Hiển thị ảnh trên ma trận LED 44
5.4 Bài tập 45
Bài 6: Khảo sát kỹ thuật quét phím, chống rung phím nhấn 47
6.1 Nội dung 47
6.2 Khảo sát kỹ thuật quét phím 47
6.3 Khảo sát kỹ thuật chống rung phím 49
6.4 Bài tập 53
Bài 7: Khảo sát bộ truyền nhận nối tiếp SCI của H8SX/1582 55
7.1 Nội dung 55
7.2 Tổng quan về bộ truyền nhận dữ liệu nối tiếp SCI 55
7.3 Các thanh ghi của bộ truyền nhận dữ liệu nối tiếp SCI 55
7.4 Các hoạt động của bộ giao tiếp nối tiếp SCI 60
7.5 Bài tập 64
Bài 8: Khảo sát module LCD của Starter Kit 66
Trang 3Bài 9: Khảo sát bộ A/D của H8SX/1582 70
9.1 Nội dung 70
9.2 Tổng quan về bộ A/D 70
9.3 Các thanh ghi của bộ A/D 70
9.4 Các hoạt động của bộ A/D 72
9.5 Bài tập 75
Bài 10: Khảo sát bộ truyền dữ liệu DTC (Data Tranfer Controller) 76
10.1 Nội dung bài thí nghiệm 76
10.2 Tổng quan về bộ truyền dữ liệu DTC 76
10.3 Các thanh ghi của DTC 76
10.4 Các chế độ hoạt động của DTC 80
10.5 Ví dụ sử dụng DTC 82
10.6 Bài tập 83
Bài 11: Khảo sát bộ điều khiển DMA 84
11.1 Nội dung 84
11.2 Tổng quan về bộ điều khiển DMA 84
11.3 Các thanh ghi của DMA 84
11.4 Các chế độ hoạt động của DMA 93
11.5 Ví dụ sử dụng DMA 94
11.6 Bài Tập 96
Bài 12: Khảo sát bộ phát sinh xung khả lập trình PPG 97
12.1 Nội dung 97
12.2 Tổng quan về bộ phát sinh khả lập trình PPG 97
12.3 Các thanh ghi của PPG 97
12.4 Các chế độ hoạt động 101
12.5 Ví dụ sử dụng PPG 101
Trang 4Bài 1: Biên dịch và debug một
chương trình đơn giản
1.1 Nội dung
Phần hướng dẫn này sẽ giải thích các vấn đề sau đây:
• Cách biên dịch, link, download và chạy một chương trình đơn giản trên
RSK
• Cách xây dựng một ứng dụng nhúng
• Cách sử dụng các công cụ của Renesas
Công cụ tạo project sẽ tạo ra một project tutorial với 2 cách build có thể chọn lựa
được:
• Debug: project được build để chạy với sự hỗ trợ của thiết bị debug
• Release: project được build thành sản phẩm, không cần thiết bị debug
1.2 Project workspace
1.2.1 Giới thiệu
HEW là một công cụ phát triển được tích hợp, cho phép người dùng viết, biên
dịch, lập trình và debug một phần mềm ứng dụng trên bất cứ vi điều khiển nào của
Renesas HEW sẽ được cài đặt khi cài đặt khi cài đặt phần mềm cho RSK
Để bắt đầu sử dụng RSK, phần hướng dẫn này sẽ mô tả các bước để tạo và debug
các ví dụ được cung cấp sẵn
1.2.2 Tạo một project workspace mới
Tạo một workspace mới từ menu File → New Workspace, hoặc chọn “Create a
new project workspace” khi hộp thoại “Welcome!” hiện lên
Trang 5Ví dụ trên cho thấy một hộp thoại New Project Workspace với các lựa chọn như
sau:
• Chọn họ CPU “H8S, H8/300” và Tool-chain “Hitachi H8S, H8/300
Standard”
• Chọn loại project là “RSKH8SX1582” trong danh sách project
• Nhập tên cho workspace, tất cả các file sẽ được lưu vào một thư mục có
cùng tên này
Vùng tên của project sẽ được tự động thêm vào để phù hợp với tên workspace đã
nhập Tên này cũng có thể thay đổi tùy theo người dùng Lưu ý là HEW cho phép
thêm nhiều project vào chung 1 workspace Có thể bạn sẽ thêm một project với các
code mẫu sau này, do đó nên chọn một tên phù hợp cho project tutorial
• Nhấn <OK> để bắt đầu tạo project
Hộp thoại sau sẽ hiện ra
Trang 6Chọn “Tutorial code” (sẽ giải thích sau trong phần hướng dẫn này) Phần
“Sample code” cung cấp một số ví dụ sử dụng các thiết bị ngoại vi Phần
“Application” dùng để xây dựng các ứng dụng với thiết bị debug đã được cấu hình
sẵn
Nhấn <Finish> để bắt đầu tạo project, một hộp thoại xác nhận sẽ hiện lên, chọn
<OK> để tạo project và thêm các file cần thiết cho project
Một cấu trúc cây sẽ cho thấy tất cả các file trong project, để xem file main.c,
double click vào tên file, một cửa sổ mới sẽ cho thấy code trong file đó
1.2.3 Thiết lập cơ chế build
Workspace đã được tạo ra có thể được build theo 2 cách Các cách build này cho
phép 1 project được build với nhiều chọn lựa khác nhau của trình biên dịch
Cách build chương trình được chọn từ drop list bên trái trên toolbar Có 2 lựa
chọn là “Debug” và “Release” Khi chọn “Debug”, chương trình sẽ được build để chạy
với sự hỗ trợ của thiết bị debug, ngược lại, khi chọn “Release”, chương trình sẽ được
build để có thể nạp thẳng vào ROM
Chọn cách build “Debug”
Sau đó chọn tiếp “Session_H8SX_1582_Hmon” trong droplist bên phải
Trang 71.3 Build project tutorial
1.3.1 Build mã nguồn
Có 3 cách để build mã nguồn nhanh:
• Chọn nút “Build All” trên toolbar Cách này sẽ build tất cả các mã
nguồn có trong project, kể cả thư viện chuẩn
• Chọn nút “Build” trên toolbar Cách này sẽ build tất cả các file có sự
thay đổi kể từ lần build trước đó Thư viện chuẩn sẽ không được build, trừ khi
có một sự thay đổi nào đó
• Nhấn <F7>, tương đương với nhấn nút “Build” trên toolbar
Hãy build project tutorial bằng cách nhấn <F7> hoặc một trong các nút build đã
nói trên Trong suốt quá trình build, mỗi trạng thái sẽ được báo trên cửa sổ thông báo
Quá trình build sẽ kết thúc với số lỗi và số warning gặp được
1.3.2 Kết nối thiết bị debug
Phần này mặc định là đã cài đặt driver cho thiết bị debug E8, đồng thời không
cần phải cấp nguồn cho board, nguồn sẽ được lấy từ cổng USB của máy tính
• Nối thiết bị debug với cổng USB trên máy tính
• Nối thiết bị debug với board mạch, chỗ kết nối được đánh dấu “E8” và nằm
gần với chỗ cắm nguồn
1.3.3 Kết nối với board bằng E8Direct và HMon
Phần này sẽ hướng dẫn cách kết nối với thiết bị, lập trình bộ nhớ Flash và thực thi
chương trình
E8 cung cấp một interface gọi là E8Direct, cho phép kết nối chương trình debug
HMon với board mạch chính
Để có thể lập trình bộ nhớ Flash, ta cần phải thiết lập cấu hình trước Việc cấu
hình này chỉ cần làm một lần cho mỗi project
• Chọn “FDT Wizard” từ thanh công cụ FDT
Nếu flash kernel đã được cấu hình trước thì một cửa sổ xác nhận sẽ được mở ra
với các thiết lập trước đó của kernel Để sửa lại cấu hình này chỉ cần double click vào
thành phần muốn sửa Nếu FDT đã được cấu hình sẵn thì có thể bỏ qua phần này và
đọc tiếp phần “Kết nối với HMon”
Bước đầu tiên là chọn thiết bị phù hợp từ các kernel đã được cài đặt sẵn, các
kernel này nằm sẵn trong drop list, người dùng chỉ cần chọn lựa đúng thiết bị Trong
trường hợp phải build lại kernel (ví dụ tần số của thạch anh trên board bị thay đổi) thì
Trang 8đường dẫn để cài đặt lại kernel là <FDT
Installation>\Kernels\ProtC\1582\Renesas\1_0_00.RSK>
• Chọn thiết bị từ drop list
• Nhấn <Next>
Nếu bạn copy kernel đến một vị trí khác để thay đổi tần số thạch anh thì thiết bị sẽ
không được liệt kê, trong trường hợp này:
• Nhấn <Other…> và đưa đường dẫn đến kernel bạn đã sửa
• Chọn “E8Direct” trong hộp thoại kế tiếp
• Nhấn <Next>
• Các thiết lập mặc định được sử dụng cho board RSK chuẩn
• Xác nhận tần số thạch anh sử dụng trên board
• Xác nhận hệ số nhân tần số cho clock chính
Trang 9• Xác nhận hệ số nhân tần số clock cho thiết bị ngoại vi
Trang 10• Hộp thoại warning sẽ hiện ra
• Chọn <OK>
• Nhấn <Next> trong hộp thoại kế tiếp
• Nhấn <OK> trong hộp thoại warning
• Nhấn <Finish> trong hộp thoại kế tiếp
• Save workspace File → Save Workspace
Trang 111.3.4 Kết nối với HMon
Bây giờ ta có thể kết nối với thiết bị như sau
• Nhấn nút “Connect” trên toolbar
HMon sẽ tự động nhận biết cấu hình của Flash bên trong
thiết bị thông qua FDT kernel ta đã thiết lập trước đó HMon
cũng cần phải biết thông tin về vị trí của các thanh ghi IO và
RAM nội/ngoại Các thông tin này được lưu trong một file
“.TCF”, file này được cung cấp chung với HEW Để cho phép
người dùng có thể thay đổi file TCF này, hộp thoại sau đây
được hiện ra để cho phép người dùng lựa chọn
• Chọn file TCF phù hợp với board RSK của bạn
• Nhấn <OK>
• Chọn Yes trong hộp thoại kế tiếp
Một hộp thoại khác sẽ xuất hiện, cho phép chọn tốc độ baud và phương pháp cấp
nguồn cho board mạch
• Thiết lập các thông số như trong hình rồi chọn <OK>
Trang 12HMon sẽ kết nối với board mạch, nếu thành công thì thông báo “Connected” sẽ
xuất hiện trong cửa sổ output
1.4 Download và chạy chương trình tutorial
Khi mã nguồn đã được build, cần phải dowwnload nó xuống board để thực thi
Sau khi đã kết nối thiết bị, một thành phần mới sẽ được thêm vào workspace, có
tên là “Download Modules”
• Click phải vào module được
liệt kê và chọn “Download
module”
Hộp thoại download sẽ xuất hiện
Trang 13Hộp thoại này cung cấp nhiều lựa chọn để download chương trình, đồng thời nó
cũng cho phép chỉnh sửa lại các thông số để kết nối HMon với thiết bị
HMon có một bộ đệm lưu lại chương trình hiện tại đang nạp trong trong thiết bị
Bộ đệm này cho phép giảm thời gian lập trình cho thiết bị bằng cách không ghi lên
những vùng trên thiết bị mà không có sự thay đổi giữa 2 lần biên dịch Trong lần kết
nối đầu tiên thì bộ đệm này sẽ rỗng Chọn “Upload and Compare” sẽ đọc lại chương
trình từ thiết bị và so sánh với bộ đệm của HMon
• Chọn bất kỳ một cách download và nhấn <OK>
Sau khi download xong, chương trình có thể được thực thi Để bắt đầu debug
chương trình, ta reset lại CPU và thiết bị debug
• Nhấn “Reset CPU” trên toolbar
Cửa sổ hiển thị mã sẽ hiển thị mã nguồn của project tutorial tại điểm bắt đầu Một
mũi tên cho biết vị trí hiện tại của program counter
Trang 14Chúng ta sẽ bỏ qua đoạn mã khởi động cho thiết bị và đi vào chương trình chính
• Mở file resetprg.c
• Đặt một breakpoint tại vị trí gọi hàm main() bằng cách double click vào cột
chứa mũi tên PC; hoặc chọn dòng và nhấn <F9>; hoặc click phải vào dòng và
chọn “Toggle breakpoint”
• Nhấn “Reset Go” trên toolbar
Chương trình sẽ thực thi tới điểm breakpoint Tại đây, tất cả các đoạn mã khởi
động cho thiết bị đã được thực thi
• Nhấn “Step In” trên toolbar
Cửa sổ hiển thị mã sẽ mở file “main.c” và hiển thị vị trí mới của
program counter
Mã nguồn của project tutorial đã bao gồm các đoạn mã dùng để hiển thị màn hình
LCD Trong phần này ta không cần quan tâm chi tiết về giao tiếp với LCD, ta chỉ cần
biết LCD là thiết bị write-only và do đó, việc có hay không có LCD cũng không ảnh
hưởng đến chương trình đang thực thi
• Đặt một điểm breakpoint tại vị trí gọi hàm “TimerADC();”
• Click phải vào hàm “FlashLEDs();” và chọn “Go to cursor”; hoặc
để con trỏ tại vị trí hàm “FlashLEDs()” và nhấn “Go to Cursor”
trên toolbar
Trang 15Chương trình sẽ chạy đến dòng được chọn và dừng lại tại đó Một điểm
breakpoint tạm thời được tự động đưa vào mã nguồn và sau đó sẽ được gỡ bỏ khi
chương trình dừng lại tại đó
• Nhấn vào nút “Step Over trên toolbar
Chương trình sẽ chạy tiếp tục và các đèn LED sẽ chớp 200 lần Chương trình sẽ
không dừng lại nếu đèn chưa chớp đủ 200 lần hoặc có một nút nhấn được nhấn
• Khi đèn đang chớp, nhấn nút SW1 trên board để thoát khỏi hàm FlashLEDs()
Chương trình sẽ chạy tới vị trí breakpoint ta đã thiết lập tại hàm Timer
Có nhiều phiên bản của hàm định thời, phụ thuộc vào các thiết bị ngoại vi có sẵn
trên board Hàm định thời mặc định là TimerADC
Hàm định thời thiết lập một ngắt quãng trên một bộ định thời bên trong thiết bị
Việc khởi động cho ngắt quãng được thực hiện trong lúc cài đặt phần cứng và được đặt
trong file “interrupts.c”
• Nhấn “Go” hoặc <F5> để chạy tiếp chương trình
Chương trình sẽ dừng tại vị trí hàm ngắt quãng Bây giờ ta có thể chạy bên trong
hàm ngắt quãng
• Xóa bỏ điểm breakpoint trong hàm ngắt quãng (double click lên nó)
• Nhấn “Step Over” để chạy qua lệnh đó và quan sát đèn LED tắt
• Nhấn “Go” để chạy tiếp chương trình
Chương trình sẽ chạy tiếp tục đến vòng lặp vô tận tại cuối hàm Main() Các đèn
• Đặt một điểm breakpoint tại hàm “StaticsTest();”
Hàm StaticsTest() dùng để minh họa việc sao chép thành công toàn bộ các biến
đã được khởi tạo từ bộ nhớ flash vào RAM
Trang 16Chương trình sẽ chạy đến điểm breakpoint (nhấn một nút bất kì trên board để
thoát khỏi đoạn chương trình chớp LED)
• Nhấn vào nút “Step In” trên toolbar
Chúng ta có thể xem các biến trong quá trình debug chương trình Để xem giá trị
của một biến, đưa chuột lên biến đó, nếu giá trị của biến đã có sẵn thì giá trị đó sẽ
được hiện lên phía trên biến (tool-tip text)
Đưa chuột lên phía trên biến “ucStr” để xem giá trị của biến này, sau đó click
phải lên biến và chọn “Instant Watch”
• Một hộp thoại khác sẽ hiện lên cho thấy tên biến đó và các giá trị chi tiết
khác Nhấn vào nút <Add>
Hộp thoại sẽ đóng lại và một cửa sổ khác được mở ra, trong đó có chứa biến cần
xem Ta sẽ thấy biền “ucStr” đã được khởi tạo giá trị “ STATIC ”
• Đặt một điểm breakpoint tại vị trí hàm “DisplayString()” bên trong vòng lặp
• Nhấn “Go” để tiếp tục chạy chương trình Khi chương trình dừng lại, bạn sẽ
thấy dòng thứ 2 trên LCD đã được thay đổi nội dung
Quan sát trong cửa sổ xem biến ta sẽ thấy kí tự đầu tiên của biến chuỗi đã được
thay thế bởi kí tự đầu tiên của chuỗi hằng
• Gỡ bỏ breakpoint
• Click phải trên hàm “DisplayString” nằm sau vòng lặp và chọn “Go to
cursor”
Quan sát lại ta sẽ thấy biến chuỗi đã được khởi tạo ở đầu chương trình và có thể
được sửa lại với nội dung “TESTTEST” Chuỗi kí tự mới cũng được hiển thị trên màn
hình LCD
1.5 Các file trong project
1.5.1 Đoạn mã khởi động chương trình (Resetprg.c/
resetprg.h)
Đây là điểm bắt đầu của chương trình chính Tùy thuộc vào trình biên dịch được
sử dụng, file này sẽ được dùng làm điểm bắt đầu thực sự của chương trình hoặc là sẽ
được gọi trong quá trình khởi động môi trường
Trang 17Việc khởi tạo các biến sử dụng trong trình biên dịch C và khởi tạo các con trỏ
stack được thực hiện trong hàm _INITSCT
Hàm “HardwareSetup()” sẽ khởi động phần cứng của thiết bị và các thiết bị ngoại
vi cần sử dụng
Sau đó hàm main() sẽ được gọi để thực thi chương trình chính
1.5.2 Đoạn mã khởi động phần cứng (Hwsetup.c/
hwsetup.h)
Có 4 bước chung để thiết lập ban đầu cho vi điều khiển, do đó đoạn mã thực hiện
quá trình này cũng được chia nhỏ thành 4 hàm tương ứng như sau:
Trang 181.5.3 Đoạn mã chính (main.c/ main.h)
Trang 19Bài 2: Khảo sát I/O port 2.1 Nội dung
• Khảo sát các thanh ghi của các port I/O
• Lập trình truy xuất các port I/O
2.2 Tóm tắt lý thuyết
Phần này sẽ giới thiệu sơ bộ cách sử dụng các port I/O của H8 Thông thường
mỗi port I/O được điều khiển bởi 3 thanh ghi
2.2.1 Thanh ghi chỉ chiều dữ liệu (PnDDR)
Đây là một thanh ghi 8 bit chỉ ghi, được dùng để xác định chiều dữ liệu của port
là ngõ nhập hay ngõ xuất (cho mỗi bit) Nếu được đọc ra thì thanh ghi này luôn có giá
trị không xác định
Khi một port hoạt động ở chế độ I/O, chân của port trở thành ngõ xuất nếu giá trị
của bit tương ứng trong thanh ghi DDR là 1; chân của port trở thành ngõ nhập nếu giá
trị của bit tương ứng trong thanh ghi DDR là 0
Chú ý: Đối với port B thì 3 bit thấp của thanh ghi này là hợp lệ còn 5 bit cao không
được sử dụng
Hình 2.1: Thanh ghi PnDDR
2.2.2 Thanh ghi dữ liệu (PnDR)
Đây là một thanh ghi 8 bit có thể đọc, ghi Thanh ghi này được dùng để chứa dữ
liệu xuất ra ngoài khi port dùng ở chế độ ngõ xuất
Chú ý: Đối với port B thì 3 bit thấp của thanh ghi này là hợp lệ còn 5 bit cao không
được sử dụng
Hình 2.2: Thanh ghi PnDR
2.2.3 Thanh ghi port (PORTn)
Đây là một thanh ghi 8 bit cho biết trạng thái (0 hay là 1) các chân của port Đây
là thanh ghi chỉ đọc
Trang 20• Nếu bit trong thanh ghi DDR = 1 thì bit tương ứng trong thanh ghi DR sẽ được
đọc
• Nếu bit trong thanh ghi DDR = 0 thì trạng thái của chân tương ứng được đọc
Chú ý: Đối với port B thì 3 bit thấp của thanh ghi này là hợp lệ còn 5 bit cao không
được sử dụng
Hình 2.3: Thanh ghi PORTn Bảng 2.1: Bảng các thanh ghi của các port I/O Tên thanh ghi Tên viết
tắt R/W Giá đầu trị ban Địa chỉ Số bit
Thanh ghi chiều dữ liệu
port 1
P1DDR W H’ 00 H’ FFFB80 8
Thanh ghi dữ liệu port 1 P1DR R/W H’ 00 H’ FFFF50 8
Thanh ghi port 1 PORT1 R Không xác
định
H’ FFFF40 8
Thanh ghi chiều dữ liệu
port 2 P2DDR W H’ 00 H’ FFFB81 8
Thanh ghi dữ liệu port 2 P2DR R/W H’ 00 H’ FFFF51 8
Thanh ghi port 2 PORT2 R Không xác
định H’ FFFF41 8
Thanh ghi chiều dữ liệu
port 3 P3DDR W H’ 00 H’ FFFB82 8
Thanh ghi dữ liệu port 3 P3DR R/W H’ 00 H’ FFFF52 8
Thanh ghi port 3 PORT3 R Không xác
Thanh ghi dữ liệu port 6 P6DR R/W H’ 00 H’ FFFF55 8
Thanh ghi port 6 PORT6 R Không xác
định
H’ FFFF45 8
Trang 21Thanh ghi chiều dữ liệu
port A PADDR W H’ 00 H’ FFFB89 8
Thanh ghi dữ liệu port A PADR R/W H’ 00 H’ FFFF59 8
Thanh ghi port A PORTA R Không xác
định H’ FFFF49 8
Thanh ghi chiều dữ liệu
port B
PBDDR W H’ 00 H’ FFFB8A 8
Thanh ghi dữ liệu port B PBDR R/W H’ 00 H’ FFFF5A 8
Thanh ghi port B PORTB R Không xác
định
H’ FFFF4A 8
Thanh ghi chiều dữ liệu
port D PDDDR W H’ 00 H’ FFFB8C 8
Thanh ghi dữ liệu port D PDDR R/W H’ 00 H’ FFFF5C 8
Thanh ghi port D PORTD R Không xác
định H’ FFFF4C 8
Thanh ghi chiều dữ liệu
port H
PHDDR W H’ 00 H’ FFFBA8 8
Thanh ghi dữ liệu port H PHDR R/W H’ 00 H’ FFFBA4 8
Thanh ghi port H PORTH R Không xác
định
H’ FFFBA0 8
Thanh ghi chiều dữ liệu
port I PIDDR W H’ 00 H’ FFFBA9 8
Thanh ghi dữ liệu port I PIDR R/W H’ 00 H’ FFFBA5 8
Thanh ghi port I PORTI R Không xác
định H’ FFFBA1 8
Thanh ghi chiều dữ liệu
port J PJHDDR W H’ 00 H’ FFFBAA 8
Thanh ghi dữ liệu port J PJDR R/W H’ 00 H’ FFFBA6 8
Thanh ghi port J PORTJ R Không xác
Thanh ghi dữ liệu port K PKDR R/W H’ 00 H’ FFFBA7 8
Thanh ghi port K PORTK R Không xác
định H’ FFFBA3 8
Trang 222.3 Lập trình C
Khi chúng ta lập trình để sử dụng các port I/O thì điều cần thiết là phải truy xuất
các thanh ghi của chúng Toàn bộ các thanh ghi chức năng ngoại vi, bao gồm cả I/O
port đều được “map” vào không gian bộ nhớ Chúng có thể được truy xuất dễ dàng
thông qua các con trỏ của C
Ví dụ về sử dụng input port
Ví dụ về sử dụng output port
Khi sử dụng các thanh ghi chức năng ngoại vi, chúng ta sử dụng các bit của nó sẽ
tiện lợi hơn Tuy nhiên, đôi khi chúng ta cũng cần phải truy xuất các thanh ghi này
theo đơn vị là byte Do đó, ta khai báo các thanh ghi này thành dạng cấu trúc struct sẽ
dễ sử dụng hơn Ví dụ sau cho thấy cách khai báo các thanh ghi theo dạng struct và sau
đó truy xuất các thanh ghi này theo đơn vị byte lẫn bit
Trang 24Kiểu định nghĩa như trên được tập hợp vào một file có tên là “iodefine.h” Môi
trường phát triển của Renesas cho phép bạn include file này vào chương trình của
mình để sử dụng như trong ví dụ sau đây
2.4 Bài tập
Tạo một workspace mới tên là “Exercises” cho các bài tập Workspace có dạng là
“Application”, mỗi bài tập sau này sẽ thành một project trong workspace này
2.4.1 Bài 1
Nội dung: làm quen với cách sử dụng port I/O bằng cách định nghĩa theo đơn vị
byte, xuất dữ liệu làm sáng/ tắt các đèn LED trên board
Tạo một project có tên là 01_port trong workspace “Exercises” vừa tạo
Trang 25Trong file “main.c” của project, định nghĩa các port như sau:
Trong hàm main sinh viên thêm vào các đoạn mã để thực hiện các công việc sau
đây
2.4.2 Bài 2
Nội dung: sử dụng các port I/O để nhận phím nhấn và xuất dữ liệu ra đèn LED
Các thông tin cần biết:
• Các đèn LED 0, 1, 2, 3 tương ứng với các port PI.0 – PI.3
• Các nút nhấn SW1, SW2 tương ứng với các port P2.0, P2.1, nút nhấn SW3
ứng với P1.7
• Nút nhấn và đèn LED đều tích cực mức 0
Sinh viên tự định nghĩa thêm các thanh ghi của port 1, port 2 và thực hiện các
công việc sau đây:
• Viết chương trình nhận vào các nút nhấn SW1, SW2, SW3 và mở các LED
tương ứng như sau: nếu SW1 được nhấn thì chỉ sáng LED0, nếu SW2 được
Trang 26• Viết chương trình nhận vào các nút nhấn SW1, SW2 và hiển thị các LED
như sau:
o Các LED hiển thị các giá trị nhị phân từ 0h đến Fh, giá trị ban đầu là
0h
o Nếu SW1 được nhấn thì giá trị hiển thị tăng lên 1 đơn vị (đếm vòng)
o Nếu SW2 được nhấn thì giá trị hiển thị giảm đi 1 đơn vị (đếm vòng)
Chạy chương trình và đưa ra nhận xét
2.4.3 Bài 3
Làm lại 2 bài trên sử dụng file “iodefine.h”
Tạo hiệu ứng lighriver trên 4 LED của board mạch starter kit Nhấn SW1 để
thay đổi chiều của lighriver
Cho biết:
• Các đèn LED 0, 1, 2, 3 tương ứng với các port PI.0 – PI.3
• Các nút nhấn SW1, SW2 tương ứng với các port P2.0, P2.1, nút nhấn SW3
ứng với P1.7
• Nút nhấn và đèn LED đều tích cực mức 0
Trang 27Bài 3: Xử lý ngoại lệ và ngắt quãng
3.1 Nội dung
• Ôn tập lý thuyết về ngắt và trình xử lý ngắt của H8SX/1582
• Khảo sát ngắt ngoài (IRQ) của H8SX/1582
• Sử dụng Starter Kit, lập trình điều khiển một số IRQ
3.2 Tóm tắt lý thuyết
3.2.1 Trình xử lý ngoại lệ
H8SX sử dụng phương pháp bảng vector để quản lý các ngoại lệ xảy ra, bao gồm
reset, lỗi CPU, yêu cầu ngắt quãng từ các module ngoại vi Khi có một yêu cầu xử lý
ngoại lệ, CPU sẽ đọc địa chỉ của chương trình xử lý ngoại lệ từ bộ nhớ (bảng vector
ngắt) và gán nó cho PC
Việc chuyển đổi ngữ cảnh khi có trình xử lý ngoại lệ được CPU thực hiện như
sau :
• Push PC, CCR, EXR vào Stack (Khi reset thi không có bước này)
• Set các bit cho phép(không cho phép) ngắt (bit I trong CCR, bit I2~I0 trong
EXR), xóa bit T trong EXR
• Đọc địa chỉ bắt đầu của trình xử lý ngoại lệ từ bảng vector ngắt vào trong PC
Sau khi địa chỉ bắt đầu của trình xử lý ngoại lệ được gán cho PC thì trình xử lý sẽ
được thực thi Lệnh RTE dùng để kết thúc trình xử lý ngoại lệ và trở về chương trình
chính, lệnh RTE sẽ pop PC, CCR, và EXR vào CPU
Hình 3.1 Cấu trúc của stack sau xảy ra trình xử lý ngoại lệ
SP tăng hoặc giảm theo đơn vị word Sự truy cập word hay long word phải bắt
đầu bằng một địa chỉ chẵn
Địa chỉ của các chương trình xử lý ngoại lệ sẽ được tính toán và đưa vào địa chỉ
các vector tương ứng Bảng 3.1 sẽ cho biết rõ địa chỉ của các vector
Trang 28Lỗi địa chỉ CPU 12 H’000030
Lỗi địa chỉ DMA 13 H’000034
Địa chỉ của vector ngắt được tính như sau :
Địa chỉ của vector ngắt = VBR + Vector table address Offset
Thông thường thì thanh ghi VBR = H’0
Trang 293.2.2 Chương trình xử lý ngắt quãng
Để định nghĩa một trình xử lý ngắt ta có thể khai báo một hàm như sau :
interrupt (vect = <vector number>) void <tên hàm> (void)
{
…
}
Ví dụ khai báo và hiện thực trình xử lý ngắt cho IRQ0
Trong hợp ngữ ta định nghĩa như sau
3.2.3 Điều khiển ngắt quãng chế độ 0
Bảng 3.2 cho biết các chế độ điều khiển ngắt quãng của CPU H8SX Chế độ 0
không hỗ trợ đa ngắt (không cho phép ngắt quãng lồng nhau), chế độ 2 có thể hỗ trợ 7
cấp độ ngắt quãng H8SX/1582 không hỗ trợ chế độ 1 và 3, và cũng không hỗ trợ ICR
Bảng 3.2 Chế độ điều khiển ngắt quãng
ưu tiên
Mask bit của ngắt quãng
Số cấp độ của đa ngắt
Trang 303.2.3.1.Thanh ghi điều khiển ngắt quãng
Thanh ghi này dùng để lựa chọn chế độ ngắt quãng Dùng 2 bit INTM0 và ITM1
để chọn chế độ trong 4 chế độ Bạn tham khảo thêm trong tài liệu bài giảng để biết chi
tiết về thanh ghi này
Hình 3.2 Thanh ghi điều khiển ngắt quãng (INTCR)
3.2.3.2.Chế độ ngắt quãng 0
Ngắt quãng IRQ và ngắt quãng của các thiết bị ngoại vi được cho phép hay bị vô
hiệu bởi bit I trong thanh ghi CCR Khi bit I=0 ngắt quãng được cho phép xảy ra,
ngược lại khi I=1 các ngắt quãng sẽ bị vô hiệu Chế độ ngắt quãng 0 cung cấp hai độ
ưu tiên ngắt quãng là cấp 0 và 1, nhưng không cho phép các ngắt lồng nhau ngoại trừ
ngắt quãng NMI (tức là các ngắt sẽ được xử lý tuần tự, hết ngắt quãng này rồi đến ngắt
quãng khác, ngoại trừ ngắt quãng NMI sẽ được xử lý ngay lập tức cho dù đang xử lý
ngắt quãng khác)
3.2.3.3.Thao tác với CCR
Trong HEW (High Performance Embedded Workshop) bạn có thể thiết lập mask
bit, hoặc những thao tác khác với thanh ghi CCR, tuy nhiên để sử dụng những hàm này
bạn cần include thư viện <machine.h>
Bảng 3.3 Hàm thư viện cho CCR
STT Đối
1 void set_imask_ccr (unsigned char); Thiết lập mask bit
2 unsigned char get_imask_ccr (void); Tham khảo mask bit
3 void set_ccr(unsigned char); Thiết lập CCR
4 unsigned char get_ccr (void); Tham khảo CCR
5 void and_ccr(unsigned char); AND cho CCR
6 void or_ccr(unsigned char); OR cho CCR
7
CCR
void xor_ccr(unsigned char); XOR cho CCR
Ví dụ cho phép ngắt xảy ra
Trang 313.2.4 Ngắt ngoài
Ngoại trừ NMI, những chân yêu cầu ngắt quãng (ngắt ngoài), IRQn, còn có
những chức năng khác Vì thế bạn phải lựa chọn chức năng của các chân này trước khi
sử dụng Nếu các chân này được chọn với chức năng là chân ngắt quãng, thì những
thanh ghi sau sẽ phải quan tâm tới
(1) Thanh ghi cho phép IRQ (IER)
Chức năng :
IER cho phép hoặc cấm các yêu cầu ngắt quãng IRQ15 tới IRQ0
Cấu hình thanh ghi :
Chú ý: YCNQ = Yêu cầu ngắt quãng
Bit Tên bit Giá trị
khởi đầu
15 IRQ15E 0 R/W Cho phép IRQ15
YCNQ IRQ15 được cho phép khi bit này bằng 1
14 IRQ14E 0 R/W Cho phép IRQ14
YCNQ IRQ14 được cho phép khi bit này bằng 1
13 IRQ13E 0 R/W Cho phép IRQ13
YCNQ IRQ13 được cho phép khi bit này bằng 1
12 IRQ12E 0 R/W Cho phép IRQ12
YCNQ IRQ12 được cho phép khi bit này bằng 1
11 IRQ11E 0 R/W Cho phép IRQ11
YCNQ IRQ11 được cho phép khi bit này bằng 1
10 IRQ10E 0 R/W Cho phép IRQ10
YCNQ IRQ10 được cho phép khi bit này bằng 1
9 IRQ9E 0 R/W Cho phép IRQ9
YCNQ IRQ9 được cho phép khi bit này bằng 1
8 IRQ8E 0 R/W Cho phép IRQ8
YCNQ IRQ8 được cho phép khi bit này bằng 1
7 IRQ7E 0 R/W Cho phép IRQ7
YCNQ IRQ7 được cho phép khi bit này bằng 1
6 IRQ6E 0 R/W Cho phép IRQ6
YCNQ IRQ6 được cho phép khi bit này bằng 1
5 IRQ5E 0 R/W Cho phép IRQ5
YCNQ IRQ5 được cho phép khi bit này bằng 1
4 IRQ4E 0 R/W Cho phép IRQ4
YCNQ IRQ4 được cho phép khi bit này bằng 1
3 IRQ3E 0 R/W Cho phép IRQ3
YCNQ IRQ3 được cho phép khi bit này bằng 1
Trang 322 IRQ2E 0 R/W Cho phép IRQ2
YCNQ IRQ2 được cho phép khi bit này bằng 1
1 IRQ1E 0 R/W Cho phép IRQ1
YCNQ IRQ1 được cho phép khi bit này bằng 1
0 IRQ0E 0 R/W Cho phép IRQ0
YCNQ IRQ0 được cho phép khi bit này bằng 1
(2) Thanh ghi điều khiển mức ngắt quãng (ISCRH, ISCRL)
Chức năng :
ISCRH và ISCRL chọn kiểu tạo ra yêu cầu ngắt quãng trên các chân IRQ15 tới
IRQ0
Bằng việc thay đổi thanh ghi ISCR, IRQnF (n = 15 tới 0) trong thanh ghi ISR
thường tình cờ được gán bằng 1 thông qua một tác vụ nội Trong trường hợp
này, một quá trình xử lý ngắt quãng sẽ được thực thi nếu có một yêu cầu ngắt
quãng IRQn được cho phép Để ngăn chặn một ngắt quãng không theo ý muốn
xảy ra, thanh ghi ISCR cần phải được thay đổi khi ngắt quãng IRQn bị cấm, và
IRQnF trong ISR đều bị xóa thành 0
Cấu hình thanh ghi :
14 IRQ15SR IRQ15SF 0 0 R/W R/W 00: YCNQ tạo ra bởi mức thấp của chân IRQ15
01: YCNQ tạo ra bởi cạnh xuống của chân IRQ15
10: YCNQ tạo ra bởi cạnh lên của chân
Trang 33IRQ15 11: YCNQ tạo ra bởi cả hai cạnh lên và xuống của IRQ15
13
12 IRQ14SR IRQ14SF 0 0 R/W R/W 00: YCNQ tạo ra bởi mức thấp của chân IRQ14
01: YCNQ tạo ra bởi cạnh xuống của chân IRQ14
10: YCNQ tạo ra bởi cạnh lên của chân IRQ14
11: YCNQ tạo ra bởi cả hai cạnh lên và xuống của IRQ14
11
10
IRQ13SR IRQ13SF
0
0
R/W R/W
00: YCNQ tạo ra bởi mức thấp của chân IRQ13
01: YCNQ tạo ra bởi cạnh xuống của chân IRQ13
10: YCNQ tạo ra bởi cạnh lên của chân IRQ13
11: YCNQ tạo ra bởi cả hai cạnh lên và xuống của IRQ13
9
8
IRQ12SR IRQ12SF
0
0
R/W R/W
00: YCNQ tạo ra bởi mức thấp của chân IRQ12
01: YCNQ tạo ra bởi cạnh xuống của chân IRQ12
10: YCNQ tạo ra bởi cạnh lên của chân IRQ12
11: YCNQ tạo ra bởi cả hai cạnh lên và xuống của IRQ12
7
6 IRQ11SR IRQ11SF 0 0 R/W R/W 00: YCNQ tạo ra bởi mức thấp của chân IRQ11
01: YCNQ tạo ra bởi cạnh xuống của chân IRQ11
10: YCNQ tạo ra bởi cạnh lên của chân IRQ11
11: YCNQ tạo ra bởi cả hai cạnh lên và xuống của IRQ11
5
4
IRQ10SR IRQ10SF
0
0
R/W R/W
00: YCNQ tạo ra bởi mức thấp của chân IRQ10
01: YCNQ tạo ra bởi cạnh xuống của chân IRQ10
10: YCNQ tạo ra bởi cạnh lên của chân IRQ10
11: YCNQ tạo ra bởi cả hai cạnh lên và xuống của IRQ10
3
2
IRQ9SR IRQ9SF
0
0
R/W R/W
00: YCNQ tạo ra bởi mức thấp của chân IRQ9
01: YCNQ tạo ra bởi cạnh xuống của chân IRQ9
10: YCNQ tạo ra bởi cạnh lên của chân IRQ9
Trang 34của IRQ9
1
0
IRQ8SR IRQ8SF
0
0
R/W R/W
00: YCNQ tạo ra bởi mức thấp của chân IRQ8
01: YCNQ tạo ra bởi cạnh xuống của chân IRQ8
10: YCNQ tạo ra bởi cạnh lên của chân IRQ8 11: YCNQ tạo ra bởi cả hai cạnh lên và xuống của IRQ8
• ISCRL
Bit Tên bit Giá trị
khởi đầu
15
14
IRQ7SR IRQ7SF
0
0
R/W R/W
00: YCNQ tạo ra bởi mức thấp của chân IRQ7 01: YCNQ tạo ra bởi cạnh xuống của chân IRQ7 10: YCNQ tạo ra bởi cạnh lên của chân IRQ7 11: YCNQ tạo ra bởi cả hai cạnh lên và xuống của IRQ7
13
12
IRQ6SR IRQ6SF
0
0
R/W R/W
00: YCNQ tạo ra bởi mức thấp của chân IRQ6 01: YCNQ tạo ra bởi cạnh xuống của chân IRQ6 10: YCNQ tạo ra bởi cạnh lên của chân IRQ6 11: YCNQ tạo ra bởi cả hai cạnh lên và xuống của IRQ6
11
10 IRQ5SR IRQ5SF 0 0 R/W R/W 00: YCNQ tạo ra bởi mức thấp của chân IRQ5 01: YCNQ tạo ra bởi cạnh xuống của chân IRQ5
10: YCNQ tạo ra bởi cạnh lên của chân IRQ5 11: YCNQ tạo ra bởi cả hai cạnh lên và xuống của IRQ5
9
8
IRQ4SR IRQ4SF
0
0
R/W R/W
00: YCNQ tạo ra bởi mức thấp của chân IRQ4 01: YCNQ tạo ra bởi cạnh xuống của chân IRQ4 10: YCNQ tạo ra bởi cạnh lên của chân IRQ4 11: YCNQ tạo ra bởi cả hai cạnh lên và xuống của IRQ4
7
6
IRQ3SR IRQ3SF
0
0
R/W R/W
00: YCNQ tạo ra bởi mức thấp của chân IRQ3 01: YCNQ tạo ra bởi cạnh xuống của chân IRQ3 10: YCNQ tạo ra bởi cạnh lên của chân IRQ3 11: YCNQ tạo ra bởi cả hai cạnh lên và xuống của IRQ3
5
4
IRQ2SR IRQ2SF
0
0
R/W R/W
00: YCNQ tạo ra bởi mức thấp của chân IRQ2 01: YCNQ tạo ra bởi cạnh xuống của chân IRQ2 10: YCNQ tạo ra bởi cạnh lên của chân IRQ2 11: YCNQ tạo ra bởi cả hai cạnh lên và xuống của IRQ2
3
2 IRQ1SR IRQ1SF 0 0 R/W R/W 00: YCNQ tạo ra bởi mức thấp của chân IRQ1 01: YCNQ tạo ra bởi cạnh xuống của chân IRQ1
10: YCNQ tạo ra bởi cạnh lên của chân IRQ1 11: YCNQ tạo ra bởi cả hai cạnh lên và xuống của IRQ1
Trang 351
0 IRQ0SR IRQ0SF 0 0 R/W R/W 00: YCNQ tạo ra bởi mức thấp của chân IRQ0 01: YCNQ tạo ra bởi cạnh xuống của chân IRQ0
10: YCNQ tạo ra bởi cạnh lên của chân IRQ0 11: YCNQ tạo ra bởi cả hai cạnh lên và xuống của IR0
Ghi chú: YCNQ = Yêu cầu ngắt quãng
(3) Thanh ghi trạng thái IRQ (ISR)
Chức năng :
ISR là một thanh ghi trạng thái cho các ngắt quãng từ IRQ15 đến IRQ0
Cấu hình thanh ghi :
Chú ý: * Chỉ có thể ghi 0 để xóa cờ Các câu lệnh xử lý bit hoặc tác vụ bộ nhớ nên
được dùng để xóa cờ
Bit Tên bit Giá trị
khởi đầu
[Điều kiện lập]
Khi có một ngắt quãng được chọn bởi ISCR
[Điều kiện xóa]
Ghi 0 sau khi đọc IRQnF = 1
Khi chọn chế độ phát sinh yêu cầu ngắt quãng ở mức thấp và chân IRQn ở mức cao
Khi chọn chế độ phát sinh yêu cầu ngắt quãng ở cạnh lên, cạnh xuống hoặc cả hai
Khi DTC được kích hoạt bởi một ngắt quãng IRQn, và bit DISEL trong MRB của DTC được xóa xuống 0
(4) Thanh ghi điều khiển bộ đệm ngõ nhập
Chức năng :
Thanh ghi ICR là một thanh ghi có thể đọc/ghi 8-bit nó điều khiển buffer cổng
Trang 36Cấu hình thanh ghi :
(5) Thanh ghi điều khiển chức năng Port
Chức năng :
Thanh ghi PFCR lựa chọn nhiều chức năng cho các chân xuất nhập
3.2.5 Ví dụ ngắt quãng mode 0
3.2.6 Điều khiển ngắt quãng chế độ 2
Ở chế độ này CPU điều khiển ngắt quãng với 7 cấp độ ưu tiên và cho phép các
ngắt được xử lý lồng nhau dựa trên độ ưu tiên của chúng (tức là khi CPU đang trong
Trang 37trình xử lý của một ngắt quãng mà ngắt quãng có độ ưu tiên cao hơn xuất hiện thì CPU
sẽ dừng công việc lại, vào trình xử lý ngắt quãng có độ ưu tiên cao hơn và khi xử lý
xong, CPU sẽ trở lại công việc của trình xử lý ngắt quãng đang thực hiện dang dở)
3.2.6.1.Thanh ghi thiết lập độ ưu tiên
Những thanh ghi IPRA ~ IPRG, IPRI, IPRK ~ IPRO, IPRR được sử dụng để thiết
lập độ ưu tiên cho các ngắt quãng (mức 7 ~ 0) ngoại trừ NMI (có độ ưu tiên cao nhất)
Độ ưu tiên được xác định bởi nhóm 3 bit : 14~12, 10~8, 6~4 và 2~0
Hình 3.3 Cấu hình thanh ghi độ ưu tiên Bảng 3 4 Nguồn ngắt quãng và IPR tương ứng
Bit 14 ~ 12 Bit 10 ~ 8 Bit 6 ~ 4 Bit 2 ~ 0 IPRA IRQ0 IRQ1 IRQ2 IRQ3
IPRB IRQ4 IRQ5 IRQ6 IRQ7
IPRC IRQ8 IRQ9 IRQ10 IRQ11
IPRD IRQ12 IRQ13 IRQ14 IRQ15
IPRE WDT
IPRF A/D0, A/D1 TPU0 TPU1
IPRG TPU2 TPU3 TPU4 TPU5
IPRI DMAC0 DMAC1 DMAC2 DMAC3
IPRK DMAC
IPRL SCI3 SCI4 TPU6(TGI)
IPRM TPU6(TCI) TPU7(TGI) TPU7(TCI) TPU8(TGI)
IPRN TPU8(TCI) TPU9(TGI) TPU9(TCI) TPU10(TGI)
IPRO TPU10(TCI) TPU11(TGI) TPU11(TCI)
IPRR SSU0 SSU0, SSU1 SSU1, SSU2
Khi một yêu cầu ngắt quãng xuất hiện, nó sẽ được so sánh với mask ngắt quãng
được thiết lập bởi mask bit (I2 ~ I0) trong thanh ghi EXR, nếu độ ưu tiên của ngắt
quãng được yêu cầu lớn hơn thì yêu cầu ngắt quãng đó sẽ được chuyển tới CPU
Bảng 3.5 Interrupt mask bit và độ ưu tiên
I2 I1 I0 Mask level Độ ưu tiên được chấp nhận
1 1 1 7 NMI
1 1 0 6 NMI, level 7
Trang 381 0 1 5 NMI, level 6 ~ level 7
1 0 0 4 NMI, level 5 ~ level 7
0 1 1 3 NMI, level 4 ~ level 7
0 1 0 2 NMI, level 3 ~ level 7
0 0 1 1 NMI, level 2 ~ level 7
0 0 0 0 NMI, level 1 ~ level 7
3.2.6.2.Thao tác với EXR
Trong HEW (High Performent Embedded Workshop) bạn có thể thiết lập mask
bit, hoặc những thao tác khác với thanh ghi EXR, tuy nhiên để sử dụng những hàm này
bạn cần include thư viện <machine.h>
Bảng 3.6 Hàm thư viện cho EXR STT Đối
8 void set_imask_exr (unsigned char); Thiết lập mask bit
9 unsigned char get_imask_exr (void); Tham khảo mask bit
10 void set_exr(unsigned char); Thiết lập EXR
11 unsigned char get_exr (void); Tham khảo EXR
12 void and_exr(unsigned char); AND cho EXR
13 void or_exr(unsigned char); OR cho EXR
IRQ0 ngat khi co canh xuong, do uu tien : 1
IRQ3 ngat khi co canh len, do uu tien : 2
Trang 39phep
INTC.ISCR.BIT.IRQ0SC = 1; //irq0 tich cuc canh xuong
INTC.ISR.BIT.IRQ0F = 0; //xoa co ngat cua iq0
INTC.IER.BIT.IRQ0E = 1; //cho phep ngat irq0
INTC.IPRA.BIT._IRQ0 = 1; // do uu tien : 1
P1.ICR.BIT.B3 = 1; //bo dem ngo nhap cua P13/IRQ3 duoc cho
phep
INTC.ISCR.BIT.IRQ3SC = 2; //irq3 tich cuc canh len
INTC.ISR.BIT.IRQ3F = 0; //xoa co ngat cua iq3
INTC.IER.BIT.IRQ3E = 1; //cho phep ngat irq3
Viết chương trình nhận vào các nút nhấn SW1, SW2 theo dạng interrupt và hiển thị
các LED như sau:
• Các LED hiển thị các giá trị nhị phân từ 0h đến Fh, giá trị ban đầu là 0h
• Nếu SW1 được nhấn thì giá trị hiển thị tăng lên 1 đơn vị (đếm vòng)
• Nếu SW2 được nhấn thì giá trị hiển thị giảm đi 1 đơn vị (đếm vòng) Chạy chương trình và đưa ra nhận xét so với chương trình ở bài thí nghiệm số 2
Cho biết:
• LED tích cực mức 0
• SW1 nối với IRQ8-A
• SW2 nối với IRQ9-A
Trang 40Bài 4: Khảo sát các bộ định thời
4.1 Nội dung
• Khảo sát các thanh ghi của bộ định thời
• Sử dụng các chức năng của bộ định thời
4.2 Tổng quan về bộ định thời 16 bit (TPU)
CPU H8SX/1582 có 2 bộ định thời 16 bit (TPU): bộ định thời 0 và 1 Mỗi bộ
định thời có 6 kênh định thời 16 bit, nghĩa là có tất cả 12 kênh định thời Các kênh
định thời này có thể được dùng độc lập hoặc dùng kết hợp với các chức năng như
interval timer, PWM timer, phase counting timer
TPU có thể tạo ra các ngắt quãng, xuất ra các xung để điều khiển động cơ một
cách hiệu quả
4.3 Các thanh ghi của bộ định thời
Các thanh ghi giới thiệu trong phần này là các thanh ghi cần thiết để sử dụng
trong chế độ interval timer
4.3.1 Timer start register (TSTR)
Đây là thanh ghi 8 bit, dùng để tắt/mở bộ đếm của timer cho mỗi kênh Nếu giá
trị của bit tương ứng là 1 thì bộ đếm của kênh tương ứng sẽ bắt đầu đếm từ giá trị hiện
hành chứa trong TCNT Nếu giá trị bit tương ứng là 0 thì bộ đếm sẽ dừng lại