1. Trang chủ
  2. » Luận Văn - Báo Cáo

Bài tập thực hành vi điều khiển H8SX1582

105 419 1

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

THÔNG TIN TÀI LIỆU

Thông tin cơ bản

Định dạng
Số trang 105
Dung lượng 3,12 MB

Các công cụ chuyển đổi và chỉnh sửa cho tài liệu này

Nội dung

Bài tập thực hành vi điều khiển H8SX1582

Trang 1

KHOA 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 2

Mụ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 3

Bà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 4

Bà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 5

Ví 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 6

Chọ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 7

1.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 11

1.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 12

HMon 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 13

Hộ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 14

Chú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 15

Chươ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 16

Chươ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 17

Việ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 18

1.5.3 Đoạn mã chính (main.c/ main.h)

Trang 19

Bà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 21

Thanh 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 22

2.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 24

Kiể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 25

Trong 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 27

Bà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 28

Lỗ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 29

3.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 30

3.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 31

3.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 32

2 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 33

IRQ15 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 34

củ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 35

1

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 36

Cấ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 37

trì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 38

1 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 39

phep

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 40

Bà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

Ngày đăng: 15/10/2015, 10:38

HÌNH ẢNH LIÊN QUAN

Hình 3.1 Cấu trúc của stack sau xảy ra trình xử lý ngoại lệ - Bài tập thực hành vi điều khiển H8SX1582
Hình 3.1 Cấu trúc của stack sau xảy ra trình xử lý ngoại lệ (Trang 27)
Bảng 3.1 Bảng vector ngắt - Bài tập thực hành vi điều khiển H8SX1582
Bảng 3.1 Bảng vector ngắt (Trang 28)
Bảng 3.2 Chế độ điều khiển ngắt quãng - Bài tập thực hành vi điều khiển H8SX1582
Bảng 3.2 Chế độ điều khiển ngắt quãng (Trang 29)
Bảng 3.3 Hàm thư viện cho CCR - Bài tập thực hành vi điều khiển H8SX1582
Bảng 3.3 Hàm thư viện cho CCR (Trang 30)
Hình 3.2 Thanh ghi điều khiển ngắt quãng (INTCR) - Bài tập thực hành vi điều khiển H8SX1582
Hình 3.2 Thanh ghi điều khiển ngắt quãng (INTCR) (Trang 30)
Bảng 3. 4 Nguồn ngắt quãng và IPR tương ứng - Bài tập thực hành vi điều khiển H8SX1582
Bảng 3. 4 Nguồn ngắt quãng và IPR tương ứng (Trang 37)
Bảng 3.6 Hàm thư viện cho EXR - Bài tập thực hành vi điều khiển H8SX1582
Bảng 3.6 Hàm thư viện cho EXR (Trang 38)
Hình 4.1: Thanh ghi TSTR - Bài tập thực hành vi điều khiển H8SX1582
Hình 4.1 Thanh ghi TSTR (Trang 40)
Hình 4.3 Thanh ghi TGR - Bài tập thực hành vi điều khiển H8SX1582
Hình 4.3 Thanh ghi TGR (Trang 41)
Hình 4.5: TSR cho kênh 0, 3 - Bài tập thực hành vi điều khiển H8SX1582
Hình 4.5 TSR cho kênh 0, 3 (Trang 41)
Hình 4.8: TIER cho kênh 1, 2, 4, 5 - Bài tập thực hành vi điều khiển H8SX1582
Hình 4.8 TIER cho kênh 1, 2, 4, 5 (Trang 42)
Hình 4.7: TIER cho kênh 0, 3 - Bài tập thực hành vi điều khiển H8SX1582
Hình 4.7 TIER cho kênh 0, 3 (Trang 42)
Hình 4.9: Thanh ghi TIOR - Bài tập thực hành vi điều khiển H8SX1582
Hình 4.9 Thanh ghi TIOR (Trang 43)

TỪ KHÓA LIÊN QUAN

TRÍCH ĐOẠN

TÀI LIỆU CÙNG NGƯỜI DÙNG

TÀI LIỆU LIÊN QUAN

🧩 Sản phẩm bạn có thể quan tâm

w