Khai báo Timer0 làm việc mode CTC tạo sóng ngõ ra chân OC0A đảo bit khi đạt kết quả so sánh, CLK_T0 = 8 µs. Nạp TCCR0B = $03. TCCR0A giá trị:
Trả lời:
Đáp án đúng: C
Phân tích bài toán:
1. **Yêu cầu**: Timer0 hoạt động ở chế độ CTC (Clear Timer on Compare Match) tạo sóng vuông ở chân OC0A, đảo bit khi có so sánh.
2. **CLK_T0 = 8 µs**: Chu kỳ xung clock của Timer0 là 8µs. Thông tin này có thể dùng để tính toán tần số (nếu cần), nhưng trong trường hợp này không cần thiết vì câu hỏi chỉ hỏi giá trị thanh ghi TCCR0A.
3. **TCCR0B = $03**: Giá trị này cho biết bộ chia tần số (prescaler) được sử dụng. Tra cứu bảng prescaler của Timer0 trong datasheet của vi điều khiển AVR (thường là ATmega328P hoặc tương tự), ta thấy $03 tương ứng với prescaler là 64. Như vậy, tần số xung clock đưa vào Timer0 sẽ giảm đi 64 lần so với tần số clock hệ thống.
4. **TCCR0A = ?**: Đây là thanh ghi điều khiển chính của Timer0. Để cấu hình Timer0 ở chế độ CTC và tạo sóng vuông ở chân OC0A, ta cần thiết lập các bit sau:
- **WGM01 = 1**: Chọn chế độ CTC (kết hợp với WGM00 trong TCCR0B).
- **COM0A1 = 1, COM0A0 = 0**: Chân OC0A đảo bit khi có so sánh (Toggle OC0A on Compare Match).
- Các bit còn lại (WGM00, COM0B1, COM0B0, WGM02) không ảnh hưởng đến yêu cầu bài toán và có thể để mặc định.
Từ các yêu cầu trên, ta xây dựng giá trị TCCR0A như sau:
- COM0A1 COM0A0 WGM01 WGM00 COM0B1 COM0B0 – –
- 1 0 1 0 0 0 0 0
Kết quả: TCCR0A = 0b10100000 = $A0. Tuy nhiên không có đáp án nào trùng khớp với kết quả tính toán, nên ta xét các đáp án khác.
- **A. TCCR0A = $82**: COM0A1 = 1, COM0A0 = 0, WGM01 = 0. Sai vì WGM01 phải bằng 1 để chọn chế độ CTC.
- **B. TCCR0A = $22**: COM0A1 = 0, COM0A0 = 1, WGM01 = 0. Sai vì COM0A1 phải bằng 1 và WGM01 phải bằng 1.
- **C. TCCR0A = $42**: COM0A1 = 0, COM0A0 = 1, WGM01 = 1. Sai vì COM0A1 phải bằng 1.
- **D. TCCR0A = $12**: COM0A1 = 0, COM0A0 = 0, WGM01 = 1. Sai vì COM0A1 phải bằng 1.
**Kết luận:** Không có đáp án nào đúng. Có thể có lỗi trong các phương án trả lời hoặc đề bài thiếu thông tin.