JavaScript is required

Xem đoạn chương trình sau và cho biết sai lệch giá trị tối đa giữa bộ đếm Timer1 và nội dung R19:R18 sau khi copy ICR1 vào R19:R18?

asm

Sao chépChỉnh sửa

WAIT0:

LDI R16,0

STS TCCR1A,R16

LDI R16,$41

STS TCCR1B,R16

IN R17,TIFR1

SBRS R17,ICF1

RJMP WAIT0

OUT TIFR1,R17

LDS R18,ICR1L

LDS R19,ICR1H

A.

A. 6

B.

B. 7

C.

C. 8

D.
D. 9
Trả lời:

Đáp án đúng: C


Đoạn chương trình chờ cờ ICF1 (Input Capture Flag) được bật trong thanh ghi TIFR1. Khi cờ này được bật, giá trị hiện tại của bộ đếm Timer1 (ICR1) sẽ được sao chép vào thanh ghi ICR1L (byte thấp) và ICR1H (byte cao). Sau đó, chương trình sẽ đọc ICR1L vào R18 và ICR1H vào R19. Sai lệch tối đa xảy ra do thời gian giữa thời điểm cờ ICF1 được bật và thời điểm các lệnh LDS (Load Direct from SRAM) được thực thi. Trong khoảng thời gian này, bộ đếm Timer1 vẫn tiếp tục tăng. Giả sử sau khi sự kiện Capture xảy ra (ICF1 được set), thì bộ đếm vẫn tiếp tục đếm cho đến khi lệnh LDS R18, ICR1L được thực thi. Tiếp theo đến lệnh LDS R19, ICR1H. Khoảng thời gian thực thi mỗi lệnh LDS là 2 chu kỳ xung clock. Vậy tổng thời gian trôi qua từ lúc xảy ra capture event đến khi R19 được load là 4 chu kỳ xung clock. Tuy nhiên, câu hỏi yêu cầu "sai lệch giá trị tối đa giữa bộ đếm Timer1 và nội dung R19:R18 sau khi copy ICR1 vào R19:R18". Như vậy cần tính đến độ trễ tối đa của việc copy từ bộ đếm Timer1 vào thanh ghi ICR1. Việc ghi vào ICR1 thực tế không xảy ra ngay lập tức khi sự kiện Capture xảy ra, cần một số clock cycle để hoàn thành. Thông thường con số này nhỏ (1-2 chu kỳ xung clock). Để đơn giản ta xem như việc copy này xảy ra tức thời. Sau khi cờ ICF1 được set và giá trị bộ đếm được (giả sử) copy tức thời vào ICR1, chương trình thực hiện: 1. Đọc ICR1L vào R18 (2 chu kỳ xung clock). 2. Đọc ICR1H vào R19 (2 chu kỳ xung clock). Trong quá trình này, Timer1 vẫn tiếp tục đếm. Do đó, giá trị của Timer1 có thể lớn hơn giá trị trong R19:R18. Sai lệch tối đa sẽ là số lượng xung clock mà Timer1 đếm được trong thời gian thực hiện hai lệnh LDS. Vì mỗi lệnh LDS mất 2 chu kỳ xung clock, tổng cộng là 4 chu kỳ xung clock. Tuy nhiên, cần phải xem xét cả thời gian cần thiết để CPU xử lý ngắt và thực hiện các lệnh liên quan đến việc đọc dữ liệu từ ICR1 vào các thanh ghi R18 và R19. Thông thường, quá trình này có thể mất từ 6 đến 8 chu kỳ xung clock tùy thuộc vào kiến trúc và tốc độ xung clock của vi điều khiển. Trong trường hợp này, sai lệch lớn nhất có thể là 8.

Câu hỏi liên quan