Xem đoạn chương trình sau và tính chu kỳ xung ngõ ra PB1 (cho PB1 là output). Cho Fck = 8 MHz, 1MC = 125 ns:
asm
Sao chépChỉnh sửa
LDI R16,49
STS OCR2A,R16
LDI R16,2
STS TCCR2A,R16
STS TCCR2B,R16
WAIT: SBIS TIFR2,OCF2A
RJMP WAIT
SBI TIFR2,OCF2A
IN R17,PORTB
EOR R17,R16
OUT PORTB,R17
RJMP WAIT
Trả lời:
Đáp án đúng: D
Đầu tiên, ta cần xác định chế độ hoạt động của Timer2. Các lệnh STS TCCR2A,R16 và STS TCCR2B,R16 với R16 = 2 (0b00000010) cho thấy Timer2 đang ở chế độ CTC (Clear Timer on Compare Match) với bộ chia tần số là 8 (CS22:0 = 010).
Giá trị OCR2A được đặt là 49. Điều này có nghĩa là Timer2 sẽ đếm từ 0 đến 49, sau đó so sánh với OCR2A và tạo ra một ngắt (OCF2A được set lên 1).
Chu kỳ của xung ngõ ra PB1 (giả sử PB1 được cấu hình là output toggle khi có so sánh bằng) sẽ là thời gian cần thiết để Timer2 đếm từ 0 đến 49, sau đó quay lại 0.
Thời gian một chu kỳ máy (1MC) là 125ns.
Thời gian để Timer2 đếm từ 0 đến 49 là (49 + 1) * (1MC * 8) = 50 * 125ns * 8 = 50 * 1μs = 50 μs.
Tuy nhiên, vì PB1 được toggle trong ngắt, thời gian giữa hai lần toggle (tức là một chu kỳ đầy đủ của xung vuông) sẽ là gấp đôi thời gian đếm từ 0 đến 49. Do đó, chu kỳ của xung ngõ ra PB1 là 2 * 50 μs = 100 μs.
Vậy đáp án đúng là B. 100 μs