JavaScript is required

Đoạn lệnh sau tạo sóng ngõ ra chân nào, độ rộng xung Tp (CKNV) và chu kỳ T bao nhiêu (Cho Fosc = 8Mhz, 1MC = 125ns)?

asm

Sao chépChỉnh sửa

EQU TF=499

SBI DDRD,4

LDI R16,HIGH(TF)

STS OCR1AH,R16

LDI R16,LOW(TF)

STS OCR1AL,R16

LDI R16,HIGH(TF-300)

STS OCR1BH,R16

LDI R16,LOW(TF-300)

STS OCR1BL,R16

LDI R16,$23

STS TCCR1A,R16

LDI R16,$1A

STS TCCR1B,R16

A.

A. OC1A, Tp=400µs, T=1000µs

B.

B. OC1A, Tp=200µs, T=500µs

C.

C. OC1B, Tp=200µs, T=500µs

D.
D. OC1B, Tp=400µs, T=1000µs
Trả lời:

Đáp án đúng: D


Phân tích đoạn code: * `EQU TF=499`: Định nghĩa hằng số TF = 499. * `SBI DDRD,4`: Thiết lập chân D4 là chân xuất (output). * `STS OCR1AH,R16; STS OCR1AL,R16`: Ghi giá trị TF vào thanh ghi OCR1A. OCR1A là thanh ghi so sánh cho Timer1 kênh A. Nó xác định giá trị mà Timer1 sẽ so sánh với giá trị hiện tại của nó. Khi giá trị của Timer1 bằng với giá trị trong OCR1A, một sự kiện so sánh (compare match) sẽ xảy ra. * `STS OCR1BH,R16; STS OCR1BL,R16`: Ghi giá trị TF-300 vào thanh ghi OCR1B. * `STS TCCR1A,R16`: Cấu hình Timer1 kênh A và B. Giá trị $23 = 00100011. Với COM1A1:COM1A0 = 10, kênh A sẽ hoạt động ở chế độ non-inverting PWM. Với COM1B1:COM1B0 = 00, kênh B sẽ bị ngắt kết nối. * `STS TCCR1B,R16`: Cấu hình Timer1 để hoạt động ở chế độ PWM, Phase and Frequency Correct, Top = ICR1. Giá trị $1A = 00011010. CS12:CS10 = 010, prescaler = 8. Tần số PWM = F_CPU / (prescaler * TOP * 2) = 8000000 / (8 * 499 * 2) = 1001.002 Hz => T = 1/f = 0.000999 s = 1000 us Vì COM1A được cấu hình PWM, non-inverting, khi Timer1 < OCR1A thì chân OC1A ở mức cao, ngược lại thì ở mức thấp. Duty cycle = OCR1B/OCR1A = (TF-300)/TF = (499-300)/499 = 199/499. Độ rộng xung Tp = duty cycle * T = (199/499) * 1000us = 398.797 us ~ 400us Chân OC1A tương ứng với PD5 (chân số 5 của PORTD, hoặc chân 11 trên chip DIP28 của ATmega328P). Tuy nhiên, theo đề bài, đoạn code này tạo sóng ngõ ra chân OC1A (PD5). Vậy, đáp án đúng là OC1A, Tp=400µs, T=1000µs

Câu hỏi liên quan