Tải bản đầy đủ (.docx) (18 trang)

THIẾT KẾ MACH NỐI GHÉP 1 LED ĐƠN VỚI CHÂN P1.3 VIẾT CHƯƠNG TRÌNH CHO PHÉP TIMER 0 XẢY RA SAU KHOẢNG THỜI GIAN 1 GIÂY, MỖI KHI CÓ NGẮT XẢY RA THÌ BẬT LED TẠI CHÂN P1.3

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (615.51 KB, 18 trang )

BÁO CÁO LẬP TRÌNH NHÚNG
THIẾT KẾ MACH NỐI GHÉP 1 LED ĐƠN VỚI CHÂN P1.3 VIẾT
CHƯƠNG TRÌNH CHO PHÉP TIMER 0 XẢY RA SAU KHOẢNG
THỜI GIAN 1 GIÂY, MỖI KHI CÓ NGẮT XẢY RA THÌ BẬT
LED TẠI CHÂN P1.3
(FULL DOME BÁO CÁO )

MÔN HỌC: Lập Trình Nhúng
GV: XXX

I.
I.1.

Thành viên nhóm:
1.
2.
3.
4.
5.
6.

Nguyễn Văn Ban
Hoàng Thị Hải Yến
Bùi Minh Ngọc
Tô Thành Đồng
Hoàng Thị Huyền
Nguyễn Thị Mỹ Hạnh

Ngắt trong 8051.
Ngắt là gì?
Ngắt (Interrupt) - như tên của nó, là một số sự kiện khẩn cấp bên



trong hoặc bên ngoài bộ vi điều khiển xảy ra, buộc vi điều khiển tạm dừng
thực hiện chương trình hiện tại, phục vụ ngay lập tức nhiệm vụ mà ngắt yêu
cầu – nhiệm vụ này gọi là trình phục vụ ngắt (ISR: Interrupt Service
Routine).
I.2. Phương pháp sử dụng ngắt.
Mỗi khi có một thiết bị bất kỳ cần được phục vụ thì nó báo cho bộ vi
điều khiển bằng cách gửi một tín hiệu ngắt. Khi nhận được tín hiệu ngắt thì
bộ vi điều khiển ngừng tất cả những gì nó đang thực hiện để chuyển sang
phục vụ thiết bị gọi ngắt. Chương trình ngắt được gọi là trình phục vụ


ngắt ISR (Interrupt Service Routine) hay còn gọi là trình quản lý ngắt
(Interrupt handler). Sau khi phục vụ ngắt xong, bộ vi xử lý lại quay trở lại
điểm bị ngắt trước đó và tiếp tục thực hiện công việc.
I.3. Điểm mạnh của phương pháp ngắt.
 Bộ vi điều khiển có thể phục vụ được rất nhiều thiết bị (tất nhiên là
không tại cùng một thời điểm). Mỗi thiết bị có thể nhận được sự chú ý
của bộ vi điều khiển dựa trên mức ưu tiên được gán cho nó.
 Quan trọng hơn, trong phương pháp ngắt thì bộ vi điều khiển còn có
thể che (làm lơ) một yêu cầu phục vụ của thiết bị.
 Lý do quan trọng nhất mà phương pháp ngắt được ưu chuộng là vì nó
không lãng phí thời gian cho các thiết bị không cần phục vụ.
I.4. Các ngắt trong 8051.
Có sáu loại ngắt trong 8051.
1.

RESET: Khi chân RESET được kích hoạt từ 8051, bộ đếm

chương trình nhảy về địa chỉ 0000H. Đây là địa chỉ bật lại nguồn.

2.

2 ngắt dành cho các bộ định thời: 1 cho Timer0 và 1

cho Timer1.

Địa

chỉ

tương

ứng

của

các

ngắt

này

là 000BH và 001BH.
3.

2 ngắt dành cho các ngắt phần cứng bên ngoài: chân 12

(P3.2) và 13 (P3.3) của cổng P3 là các ngắt phần cứng bên
ngoài INT0 và INT1 tương ứng. Địa chỉ tương ứng của các ngắt
ngoài này là 0003H và 0013H.

4.

Truyền thông nối tiếp: có 1 ngắt chung cho cả nhận và truyền

dữ liệu nối tiếp. Địa chỉ của ngắt này trong bảng vector ngắt
là 0023H.

I.5.

Trình phục vụ ngắt.


Đối với mỗi ngắt thì phải có một trình phục vụ ngắt (ISR) hay trình quản
lý ngắt để đưa ra nhiệm vụ cho bộ vi điều khiển khi được gọi ngắt. Khi một
ngắt được gọi thì bộ vi điều khiển sẽ chạy trình phục vụ ngắt. Đối với mỗi ngắt
thì có một vị trí cố định trong bộ nhớ để giữ địa chỉ ISR của nó. Nhóm vị trí bộ
nhớ được dành riêng để lưu giữ địa chỉ của các ISR được gọi là bảng vector
ngắt.

Hình 1: Mức ưu tiên các ngắt trong khi cấp lại nguồn.
I.6.

Quy trình thực hiện một ngắt.

Khi kích hoạt một ngắt bộ vi điều khiển thực hiện các bước sau:
1.

Nó hoàn thành nốt lệnh đang thực hiện và lưu địa chỉ của lệnh kế

2.

3.

tiếp vào ngăn xếp.
Nó cũng lưu tình trạng hiện tại của tất cả các ngắt.
Nó nhảy đến một vị trí cố định trong bộ nhớ được gọi là bảng vector

4.

ngắt, nơi lưu giữ địa chỉ của một trình phục vụ ngắt.
Bộ vi điều khiển nhận địa chỉ ISR từ bảng vector ngắt và nhảy tới đó. Nó
bắt đầu thực hiện trình phục vụ ngắt cho đến lệnh cuối cùng của ISR và

5.

trở về chương trình chính từ ngắt.
Khi bộ vi điều khiển quay trở về nơi nó đã bị ngắt. Trước hết nó nhận địa
chỉ của bộ đếm chương trình PC từ ngăn xếp bằng cách kéo 02 byte trên


đỉnh của ngăn xếp vào PC. Sau đó bắt đầu thực hiện tiếp các lệnh từ địa
I.7.

chỉ đó.
Các bước cho phép và cấm ngắt.
Khi bật lại nguồn thì tất cả mọi ngắt đều bị cấm (bị che), có nghĩa là
không có ngắt nào được bộ vi điều khiển đáp ứng trừ khi chúng được
kích hoạt.
Các ngắt phải được kích hoạt bằng phần mềm để bộ vi điều khiển đáp
ứng chúng. Có một thanh ghi được gọi là thanh ghi cho phép
ngắt IE (Interrupt Enable) – ở địa chỉ A8H chịu trách nhiệm về việc cho

phép và cấm các ngắt.

Hình 2: Thanh ghi cho phép ngắt IE.
Để cho phép một ngắt ta phải thực hiện các bước sau:


 Nếu EA = 0 thì không có ngắt nào được đáp ứng cho dù bit
tương ứng của nó trong IEcó giá trị cao. Bit D7 - EA của thanh
ghi IE phải được bật lên cao để cho phép các bit còn lại của
thanh ghi hoạt động được.
 Nếu EA = 1 thì tất cả mọi ngắt đều được phép và sẽ được đáp
ứng nếu các bit tương ứng của chúng trong IE có mức cao.


• TF0(1) là các cờ báo tràn timer, khi sự kiện tràn timer xảy ra, cờ
sẽ được tự động đặt lên mức logic 1 và nếu ngắt tràn timer đang bật,


ngắt sẽ xảy ra. Khi CPU xử lý ngắt tràn timer0(1), cờ ngắt TF0(1)
tương ứng sẽ tự động được xóa về 0.
• TR0(1) = 1, timer0(1) sẽ đếm, ngược lại khi TR0(1) = 0, timerx sẽ
không đếm . Khi dừng không đếm, giá trị của timer được giữ nguyên
Chúng ta đã biết rằng cờ bộ định thời TF được bật lên cao khi bộ định
thời đạt giá trị cực đại và quay về 0 (Roll - over). Trong các bài trước chúng
ta cũng chỉ ra cách kiểm tra cờ TF bằng một vòng lặp. Trong khi thăm dò
cờ TF thì ta phải đợi cho đến khi cờ TF được bật lên. Vấn đề với phương
pháp này là bộ vi điều khiển bị trói buộc trong khi chờ cờ TF được bật và
không thể làm được bất kỳ việc gì khác.
Sử dụng các ngắt sẽ giải quyết được vấn đề này và tránh được sự trói
buộc bộ vi điều khiển. Nếu bộ ngắt định thời trong thanh ghi IE được phép

thì mỗi khi nó quay trở về 0 bộ vi điều khiển sẽ bị ngắt, bất chấp nó đang
thực hiện việc gì và nhảy tới bảng vector ngắt để phục vụ ISR. Bằng cách
này thì bộ vi điều khiển có thể làm những công việc khác cho đến khi nó
được thông báo rằng bộ định thời đã quay về 0.
II.

Bộ định thời
8051 có 2 Timer tên là Timer0 và Timer1. Các Timer này đều là Timer 16
bit, giá trị đếm max do đó bằng 2^16 = 65536 (đếm từ 0 đến 65535). Hai
Timer có nguyên lý hoạt động hoàn toàn giống nhau và độc lập.
Sau khi cho phép chạy, mỗi khi có thêm một xung tại đầu vào đếm, giá trị
của Timer sẽ tự động được tăng lên 1 đơn vị, cứ như vậy cho đến khi giá trị
tăng lên vượt quá giá trị max mà thanh ghi đếm có thể biểu diễn thì giá trị
đếm lại được đưa trở về giá trị min (thông thường min = 0). Khi đó xảy ra
tràn Timer (overflow) và có thể gây ra ngắt nếu ngắt tràn Timer được cho


phép (bit ETx trong thanh ghi IE=1). Việc cho Timer chạy/dừng được thực
hiện bởi các bit TR trong thanh ghi TCON (đánh địa chỉ đến từng bit).
Thanh ghi 16 bit của bộ Timer 0 (hay Timer 1) được truy cập như
byte thấp và byte cao:
II.1. Các thanh ghi cơ sở của bộ định thời
Cả hai bộ định thời Timer 0 và Timer 1 đều có độ dài 16 bit được truy cập
như hai thanh ghi tách biệt byte thấp và byte cao. Chúng ta sẽ bàn riêng về từng
thanh ghi.
II.1.1.Các thanh ghi của bộ Timer 0
Thanh ghi 16 bit của bộ Timer 0 được truy cập như byte thấp và byte cao:
 Thanh ghi byte thấp được gọi là TL0 (Timer0 Low byte).
 Thanh ghi byte cao được gọi là TH0 (Timer0 High byte).
Các thanh ghi này có thể được truy cập, hoặc được đọc như mọi thanh ghi khác

chẳng hạn như A, B, R0, R1, R2 v.v...

Hình 1: Các thanh ghi của bộ Timer 0
II.1.2. Các thanh ghi của bộ Timer 1
Giống như timer 0, bộ định thời gian Timer 1 cũng dài 16 bit và thanh ghi
16 bit của nó cũng được chia ra thành hai byte là TL1 và TH1. Các thanh ghi này
được truy cập và đọc giống như các thanh ghi của bộ Timer 0 ở trên.

Hình 2: Các thanh ghi của bộ Timer 1.


II.1.3. Thanh ghi TMOD
Cả hai bộ định thời Timer 0 và Timer 1 đều dùng chung một thanh ghi được
gọi là TMOD: để thiết lập các chế độ làm việc khác nhau của bộ định thời.
Thanh ghi TMOD là thanh ghi 8 bit gồm có:
 4 bit thấp để thiết lập cho bộ Timer 0.
 4 bit cao để thiết lập cho Timer 1.
Trong đó:
 2 bit thấp của chúng dùng để thiết lập chế độ của bộ định thời.
 2 bit cao dùng để xác định phép toán.

Hình 3: Thanh ghi TMOD.
a. Các bit M1, M0
Là các bit chế độ của các bộ Timer 0 và Timer 1. Chúng chọn chế độ của
các bộ định thời: 0, 1, 2 và 3 như bảng dưới. Chúng ta chỉ tập chung vào các chế
độ thường được sử dụng rộng rãi nhất là chế độ 1 và chế độ 2. Chúng ta sẽ sớm
khám phá ra các đặc tính của các chế độ này sau khi khám phần còn lại của thanh
ghi TMOD. Các chế độ được thiết lập theo trạng thái của M1 và M0 như sau:
M1 M0 Chế độ


Chế độ hoạt động

0

0

0

Bộ định thời 13 bit:8 bit là bộ định thời/bộ đếm, 5 bit đặt
trước.

0

1

1

Bộ định thời 16 bit: không có đặt trước.


1

0

2

Bộ định thời 8 bit: tự nạp lại.

1


1

3

Chế độ bộ định thời chia tách.

Bảng 1: Các chế độ hoạt động của bộ đếm/bộ định thời
b. Bit C/T (Counter/Timer)
Bit này trong thanh ghi TMOD được dùng để quyết định xem bộ định thời
được dùng như một máy tạo độ trễ hay bộ đếm sự kiện. Nếu bit C/T = 0 thì nó
được dùng như một bộ định thời tạo độ trễ thời gian.
Nguồn đồng hồ cho chế độ trễ thời gian là tần số thạch anh của 8051. Điều
đó có nghĩa là độ lớn của tần số thạch anh đi kèm với 8051 quyết định tốc độ nhịp
của các bộ định thời trên 8051. Tần số của bộ định thời luôn bằng 1/12 tần số của
thạch anh gắn với 8051.

Hình 4: Tần số của bộ đếm/bộ định thời
Tần số thạch
anh

Tần số bộ định thời

Chu kỳ bộ định thời

20MHz

20MHz/12=1,6666MHz

1/1,6666MHz=0,6us


12MHz

12MHz/12=1MHz

1/1MHz=1us

11,0592MHz

11,0592MHz/12=0,9216MHz

1/0,9216MHz=1,085us

Bảng 2: Một số tần số thông dụng
Mặc dù các hệ thống 8051 có thể sử dụng tần số thạch anh từ 10 đến
40MHz, song ta chỉ tập trung vào tần số thạch anh 11,0592MHz. Lý do đằng sau
một số lẻ như vậy là tốc độ baud đối với truyền thông nối tiếp của 8051. Tần số


XTAL = 11,0592MHz cho phép hệ thống 8051 truyền thông với PC mà không có
lỗi.
c. GATE
Bit GATE quy định việc cho phép Timer đếm (run Timer). Nếu
GATE =0, Timer sẽ đếm khi bit TR bằng 1, dừng khi bit bằng 0. Nếu
GATE =1, Timer sẽ chỉ đếm khi bit TR = 1 và tín hiệu tại chân INT = 1,
dừng khi một trong hai điều kiện trên không còn thỏa mãn. Thông thường
người ta dùng Timer với GATE = 0, chỉ dùng timer với GATE = 1 trong
trường hợp muốn đo độ rộng xung vì lúc đó Timer sẽ chỉ đếm thời gian khi
xung đưa vào chân INT ở mức cao.
d. M0 và M1
Hai bit còn lại (M0 và M1) dùng để chọn chế độ timer

M
1

Chế
M0

độ

Chế độ hoạt động
Bộ Timer 13 bit: 8 bit là bộ Timer/bộ đếm, 5 bit

0

0

0

đặt trước.

0

1

1

Bộ Timer 16 bit: không có đặt trước.

1

0


2

Bộ Timer 8 bit: tự nạp lại.

1

1

3

Chế độ bộ tách Timer

II.2. Các chế độ
* Để sử dụng timer của 8051, chúng ta cần thực hiện các bước sau:
- Quy định chế độ hoạt động cho timer bằng cách tính toán và ghi giá trị
cho các bit trong thanh ghi TMOD.


- Ghi giá trị đếm khởi đầu mong muốn vào 2 thanh ghi đếm THx và TLx.
Đôi khi ta không muốn timer/counter bắt đầu đếm từ 0 mà từ một giá trị nào
đó để thời điểm tràn gần hơn, hoặc chẵn hơn trong tính toán sau này. Ví
dụ nếu cho timer đếm từ 15535 thì sau 50000 xung nhịp (tức 50000 ms với
thạch anh 12MHz) timer sẽ tràn, và thời gian một giây có thể dễ dàng tính ra
khá chính xác = 20 lần tràn của timer (đương nhiên mỗi lần tràn lại phải nạp
lại giá trị 15535).
- Dùng bit TRx trong thanh ghi TCON để cho timer chạy hay dừng theo
ý muốn.

Hình 2.1: Timer ở chế độ 0.



Hình 2.2: Timer ở chế độ 1.

Hình 2.3: Timer ở chế độ 2.


Hình 2.4: Timer ở chế độ 3.



II.2.1.Lập trình cho chế độ 1
Dưới đây là những bước hoạt động của timer ở chế độ 1:
 Đây là bộ định thời 16 bit, do vậy nó cho phép các giá trị 0000 đến FFFFHđược
nạp vào các thanh ghi TL và TH của bộ định thời.


 Sau khi TL và TH được nạp một giá trị khởi tạo 16 bit thì bộ định thời phải
được khởi động. Điều này được thực hiện bởi việc SET bit TR0 đối vớiTimer
0 và SET bit TR1 đối với Timer 1.
 Sau khi bộ định thời được khởi động, nó bắt đầu đếm lên. Nó đếm lên cho đến khi
đạt được giới hạn FFFFH của nó. Sau đó, khi nó quay từ FFFFHvề 0000 thì nó
bật lên bit cờ TF được gọi là cờ bộ định thời. Cờ bộ định thời này có thể được
hiển thị. Khi cờ bộ định thời này được thiết lập, để dừng bộ định thời: ta thực
hiện xóa các bit TR0 đối với Timer 0 hoặc TR1đối với Timer 1. Ở đây cũng cần
phải nhắc lại là đối với mỗi bộ định thời đều có cờ TF riêng của mình: TF0 đối
với Timer 0 và TF1 đối với Timer 1.
 Sau khi bộ định thời đạt được giới hạn của nó là giá trị FFFFH, muốn lặp lại quá
trình thì các thanh ghi TH và TL phải được nạp lại với giá trị ban đầu và
cờ TF phải được xóa về 0.


Hình 5: Timer/counter chế độ 1
*Các bước lập trình cho Timer ở chế độ 1:
• Nạp giá trị TMOD cho thanh ghi báo độ định thời nào( Timer 0 hay Timer1)







được sử dụng và chế độ nào được chọn.
Nạp các thanh ghi TL và TH.
Khởi động bộ định thời: TRx=1;
Duy trì kiểm tra cờ bộ định thời TF. Thoát vòng lặp khi TF được lên cao.
Dừng bộ định thời.
Xóa cờ TF cho vòng kế tiếp.
Quay trở lại bước 2 để nạp lại cho TL và TH.

*Công thức tính các giá trị nạp vào cho thanh ghi THx và TLx:
 Chia thời gian trễ cần thiết(us) cho chu kì T. Với T= T(thạch anh)/12.


 Thực hiện 65536-n với n là giá trị thập phân nhận được từ bước 1
 Chuyển đối kết quả ở bước 2 sang số Hex: ta có XXYY là giá trị Hexa ban
đầu nạp vào các thanh ghi bộ định thời.
 Đặt TH=XX và TL= YY.
Ví dụ: thiết kế mạch ghép nối 1 LED đơn với chân P1.3. Viết chương trình
cho phép ngắt Timer0 xảy ra sau khoảng thời gian 1ms. Mỗi khi có ngắt thì bật
LED tại chân P1.3.

Bài làm:
Giả sử ta sử dụng tần số XTAL = 11,0592MHZ
f(đt) = f(thạch anh)/12 = 11.0952/12 = 0,9216MHZ
 Chu kỳ bộ định thời là T(đt) = 1/0,9216 = 1,0852 µs (mỗi xung nhịp mất 1
µs)
Thời gian cần định thời là 1ms = 1000 µs
Vậy cứ: 1 nhịp = 1,085 µs
? nhịp = 1000 µs
Vậy số nhịp là 1000/1,085 = 922
Vậy giá trị cần nạp cho thanh ghi TH0 và TL0 là
65536-922=64614=FC66(Hex)



×