Đ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
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