You are on page 1of 5

Giảng viên ra đề: (Ngày ra đề) Người phê duyệt: (Ngày duyệt đề)

(Chữ ký và Họ tên) (Chữ ký, Chức vụ và Họ tên)

Học kỳ/năm học 1 2023-2024


THI CUỐI KỲ Ngày thi 27/12/2023
Môn học Vi xử lý
TRƯỜNG ĐH BÁCH KHOA – ĐHQG-HCM Mã môn học EE2039
KHOA ĐIỆN-ĐIỆN TỬ
Thời lượng 90 phút Mã đề 1
Ghi - Sinh viên ĐƯỢC sử dụng tài liệu giấy. KHÔNG được sử dụng các phương tiện lưu trữ, thiết bị truyền thông.
chú: - Tất cả các lệnh MCU324P phải được viết bằng hợp ngữ (không sử dụng ngôn ngữ C).
- Đề thi gồm 04 trang và 01 trang Phụ lục hình. Sinh viên làm bài trực tiếp trên đề thi và nộp lại trang Phụ lục hình.

Lưu ý: Trong các câu hỏi liên quan đến tần số dao động, sử dụng Fosc = 8MHz, 1MC = 125ns.
Câu hỏi 1) (2.5đ) (L.O.2, L.O.5, L.O.6):
a. (0.5đ) Cho đoạn chương trình sau: Cho biết Timer1 đang được cấu hình ở mode nào? Tần số
LDI R16,$00 hoạt động của Timer1 được cấu hình là bao nhiêu?
STS TCCR1A,R16 ▪ Mode CTC4.
LDI R16,$0B ▪ fCLKT1 = Fosc/N = 8MHz/64 = 0.125MHz = 125KHz.
STS TCCR1B,R16 (TCCR1B = 0000_1011 → CS12:CS10 = 011 → N = 64)

b. (0.5đ) Sử dụng Timer1 như cấu hình ở câu a, hãy viết chương trình con DELAY50MS dùng để tạo
delay 50 ms.

▪ Td = 50ms = n x TCLKT1 (1) DELAY50MS: LP: SBIS TIFR1,OCF1A


▪ fCLKT1 = 125KHz LDI R16,HIGH(6249) RJMP LP
→ TCLKT1 = 0.008ms (2) STS OCR1AH,R16 SBI TIFR1,OCF1A
▪ (1), (2) → n = 6250 LDI R16,LOW(6249) LDI R16,$00
▪ Nạp cho OCR1AH: STS OCR1AL,R16 STS TCCR1B,R16
OCR1AL = 6249 (sử dụng LDI R16,$00 RET
mode CTC4). STS TCCR1A,R16
LDI R16,$0B
STS TCCR1B,R16

c. (0.5đ) Sử dụng chương trình con (CTC) DELAY50MS ở câu b (Sinh viên không cần viết lại CTC, chỉ
viết nhãn CTC và lệnh kết thúc), hãy viết chương trình hoàn chỉnh xuất 2 chuỗi xung vuông đồng thời ở 2
ngõ ra PD1 và PD2 như hình vẽ bên dưới.
50ms 50ms
CBI PORTD,1
SBI PORTD,2
PD1 CALL DELAY50MS
SBI PORTD,1
SBI PORTD,2
PD2 CALL DELAY50MS
CBI PORTD,1
.ORG 0 CBI PORTD,2
LDI R16,$06 CALL DELAY50MS
OUT DDRD,R16 RJMP LOOP
LOOP: SBI PORTD,1
SBI PORTD,2 DELAY50MS:
CALL DELAY50MS ….
CBI PORTD,1 ….
SBI PORTD,2 ….
CALL DELAY50MS RET
SBI PORTD,1
CBI PORTD,2
CALL DELAY50MS

MSSV: ....................................... Họ và tên SV:...................................................................................................... Trang 1/4


d. (1.0đ) Sử dụng ngắt Timer1 ở chế độ CTC4, viết lại chương trình thực hiện yêu cầu xuất 2 xung như ở
câu c.
.ORG 0 TIMER1_COMPA_ISR: CASE4: CPI R24,4
RJMP MAIN INC R24 BRNE CASE5
.ORG $1A CPI R24,1 CBI PORTD,1
RJMP TIMER1_COMPA_ISR BRNE CASE2 SBI PORTD,2
.ORG $40 CASE1: SBI PORTD,1 RJMP DONE
MAIN: LDI R16,$06 SBI PORTD,2 CASE5: CPI R24,5
OUT DDRD,R16 RJMP DONE BRNE CASE6
LDI R16,HIGH(6249) CASE2: CPI R24,2 SBI PORTD,1
STS OCR1AH,R16 BRNE CASE3 SBI PORTD,2
LDI R16,LOW(6249) CBI PORTD,1 RJMP DONE
STS OCR1AL,R16 SBI PORTD,2 CASE6: CBI PORTD,1
LDI R16,$00 RJMP DONE CBI PORTD,2
STS TCCR1A,R16 CASE3: CPI R24,3 LDI R24,0
LDI R16,$0B BRNE CASE4 DONE: RETI
STS TCCR1B,R16 SBI PORTD,1
LDI R16,1<<OCIE1A CBI PORTD,2
STS TIMSK1,R16 RJMP DONE
SEI
LDI R24,0
LOOP: RJMP LOOP

Câu hỏi 2) (2.5đ) (L.O.2, L.O.5, L.O.6): ▪ Cho phép phát, cấm thu UART1.
a. (0.5đ) Cho biết ý nghĩa của 4 câu lệnh bên dưới: ▪ 9 bit dữ liệu, 1 stop bit.
LDI R16,(1<<TXEN1)|(1<<UCSZ12) ▪ Kiểm tra chẵn lẻ: vì UPM11 = 0, nên
STS UCSR1B,R16 không sử dụng bit kiểm tra chẵn lẻ (hoặc
LDI R16, (1<<UPM10)|(1<<UCSZ11)|(1<<UCSZ10) SV có thể trả lời: UPM11:UPM10 = 01:
STS UCSR1C,R16 chưa được định nghĩa mode kiểm tra).

b. (0.5đ) Tính sai số tốc độ baud trong chế độ truyền nối tiếp bất đồng bộ USART1 ứng với tốc độ baud
mong muốn là 38400, U2X1 = 0.
▪ Giá trị nạp cho UBRR1: ▪ Sai số:
2U2X1 ×𝐹osc 20 ×8×106 𝑓baud thực tế 38461
X= − 1 = 16×38400 − 1 ≈ 12 ( − 1) × 100% = ( − 1) × 100%
16×𝑓baud 𝑓baud mong muốn 38400
▪ Baud rate thực tế:
𝑓 2U2X1 ×𝐹osc 20 ×8×106 = 0.16%
baud thực tế = = ≈ 38461
16×(𝑋+1) 16×(12+1)

c. (1.0đ) Viết chương trình phát liên tục 100 nội dung ô nhớ SRAM bắt đầu ở địa chỉ 0x100 ra cổng nối tiếp
USART1 sử dụng cấu hình khung truyền như câu a, tốc độ baud 38400. Hoạt động của hệ thống được mô
tả như sau:
▪ Nếu nội dung ô nhớ SRAM có giá trị bằng 0 thì bit phát thứ 9 sẽ bằng 0, ngược lại bit phát thứ 9
bằng 1.
▪ Sau khi phát đủ 100 nội dung ô nhớ SRAM thì lặp lại phát dữ liệu từ đầu.
.ORG 0x00 TRANS: CALL USART_TRANS_9BIT
RJMP MAIN INC R20
.ORG 0x40 CPI R20,100
MAIN: LDI R21,HIGH(RAMEND)
BREQ AGAIN
OUT SPH,R21
LDI R21,LOW(RAMEND) RJMP START
OUT SPL,R21
LDI R16,(1<<TXEN1)|(1<<UCSZ12) ;=================================
STS UCSR1B,R16 ;CTC phát dữ liệu 9 bit sử dụng USART1
LDI R16, (1<<UPM10)|(1<<UCSZ11)|(1<<UCSZ10) ;LSB của R17 lưu bit thứ 9
STS UCSR1C,R16 ;R16 lưu byte thấp
LDI R16,0x00 ;=================================
STS UBRR1H,R16
USART_TRANS_9BIT:
LDI R16,12
STS UBRR1L,R16 LDS R18, UCSR1A
AGAIN: LDI XH,0x01 SBRS R18, UDRE1
LDI XL,0x00 RJMP USART_TRANS_9BIT
LDI R20,0 ;đếm 100 byte data LDS R18,UCSR1B
START: LD R16,X+ BST R17,0
CPI R16,0 BLD R18,0
BREQ ZERO STS UCSR1B,R18
LDI R17,0x01
STS UDR1,R16
RJMP TRANS
ZERO: LDI R17,0x00 RET

MSSV: ....................................... Họ và tên SV:...................................................................................................... Trang 2/4


d. (0.5đ) Làm lại câu c sử dụng ngắt bộ đệm phát trống (USART1_UDRE).
.ORG 0x00 USART1_UDRE_ISR:
RJMP MAIN LD R16,X+
.ORG 0x003A CPI R16,0
RJMP USART1_UDRE_ISR
.ORG 0x40
BREQ ZERO
MAIN: LDI R21,HIGH(RAMEND) LDI R17,0x01
OUT SPH,R21 RJMP TRANS
LDI R21,LOW(RAMEND) ZERO: LDI R17,0x00
OUT SPL,R21 TRANS: LDS R18,UCSR1B
LDI R16,(1<<TXEN1) | (1<<UCSZ12) BST R17,0
STS UCSR1B,R16 BLD R18,0
LDI R16, (1<<UPM10) | (1<<UCSZ11) | (1<<UCSZ10) STS UCSR1B,R18
STS UCSR1C,R16
LDI R16,0x00
STS UDR1,R16
STS UBRR1H,R16 INC R20
LDI R16,12 CPI R20,100
STS UBRR1L,R16 BREQ AGAIN
LDI XH,0x01 RJMP EXIT
LDI XL,0x00 AGAIN: LDI XH,0x01
LDI R20,0 ;đếm 100 byte data LDI XL,0x00
SEI LDI R20,0 ;đếm 100 byte data
LDI R16,(1<<TXEN1) | (1<<UDRIE1)
STS UCSR1B,R16
EXIT: RETI
HERE: RJMP HERE

Câu hỏi 3) (2.0đ) (L.O.2, L.O.5, L.O.6):


Cho hệ thống điều khiển bật/tắt đèn LED theo sự thay đổi của mức độ sáng (độ rọi) sử dụng quang trở
(LDR) và MCU324P như Hình 1a. Sự thay đổi trở kháng của quang trở theo mức độ sáng được minh họa
ở Hình 1b. Hoạt động của hệ thống như sau: MCU liên tục đọc giá trị của điện áp ngõ vào ADC0 và
kiểm tra mức độ sáng tương ứng. Nếu mức độ sáng lớn hơn hoặc bằng 225 lux thì tắt đèn LED, ngược lại
thì bật đèn LED.

a. (0.5đ) Biết rằng trở kháng ngõ vào ADC0 rất b. (0.5đ) Tính giá trị ngõ ra bộ ADC (giá trị đã
lớn, viết phương trình điện áp ngõ vào ADC0. được chuyển đổi sang tín hiệu số) tương ứng với
Từ đó, cho biết tầm giá trị của điện áp này (làm mức độ sáng là 225 lux.
tròn đến 2 số lẻ thập phân) khi mức độ sáng tác
▪ Giá trị (10 bit) ngõ ra bộ ADC với ngõ vào đơn:
động lên quang trở (LDR) thay đổi từ 50 lux đến
400 lux. 𝑉in × 1024
𝐷out =
▪ Điện áp ngõ vào ADC0: 𝑉ref
100
𝑉in = 100+𝑅 × 5 (V) ▪ Với mức độ sáng là 225 lux → RLDR = 200Ω,
LDR
→Vin = 1.67V. Chọn Vref = 2.56V, ta có:
▪ Với độ rọi thay đổi từ 50 lux đến 400 lux → 𝑉in × 1024 1.67 × 1024
RLDR thay đổi từ 1100Ω đến 100Ω. 𝐷out = = = 668 = 0x29𝐶
𝑉ref 2.56
→ Vin thay đổi trong khoảng 0.42V đến 2.5V.

c. (0.5đ) Viết chương trình con ADC_INIT thực hiện khởi động ADC ở mode tự chạy (Free Run), ngõ
vào đơn (ngõ ADC0), hiệu chỉnh phải, Vref=2.56V (nguồn trong), fCKADC=125KHz.
ADC_INIT:
LDI R16,0B11000000
STS ADMUX,R16
LDI R16,0B11100110
STS ADCSRA,R16
RET

d. (0.5đ) Viết chương trình hoàn chỉnh thực hiện công việc như mô tả ở trên, sử dụng chương trình con
(CTC) ADC_INIT (ở câu c) và CTC COMPARE_16BIT cho sẵn. Biết rằng, CTC COMPARE_16BIT
thực hiện so sánh hai số 16 bit với số thứ nhất chứa trong R20_R19 (R20 chứa byte cao), số thứ hai chứa
trong R22_R21 (R22 chứa byte cao) và trả về kết quả chứa trong cờ T như sau:
▪ Nếu R20_R19 < R22_R21 thì cờ T = 0.
▪ Nếu R20_R19 ≥ R22_R21 thì cờ T = 1.
Lưu ý: Ngoài việc sử dụng các CTC trên, SV cần phải cấu hình port, khởi tạo các thông số khác phù hợp
trong chương trình chính. Khi viết các CTC chỉ cần ghi nhãn đầu vào và lệnh kết thúc.

MSSV: ....................................... Họ và tên SV:...................................................................................................... Trang 3/4


.EQU LCOMP = 668 WAIT: LDS R17,ADCSRA ADC_INIT:
.ORG 0 SBRS R17,ADIF …
RJMP MAIN RJMP WAIT …
STS ADCSRA,R17 …
.ORG 0x40
LDS R19,ADCL
MAIN: CBI DDRA,0 LDS R20,ADCH
RET
SBI DDRC,0 RCALL COMPARE_16BIT COMPARE_16BIT:
LDI R22,HIGH(LCOMP) BRTC LED_ON …
LDI R21,LOW(LCOMP) CBI PORTC,0 …
RCALL ADC_INIT RJMP WAIT …
LED_ON:SBI PORTC,0 RET
RJMP WAIT

Câu hỏi 4) (3.0đ) (L.O.2, L.O.5, L.O.6):


Cho mạch như Hình 2, chân T0 được nối với 1 cảm biến để đếm số sản phẩm đi qua 1 băng chuyền. Mỗi
lần có 1 sản phẩm đi ngang qua, cảm biến phát ra 1 xung cạnh xuống. Cho biết số lượng sản phẩm không
vượt quá 255. Chân RXD là chân nhận dữ liệu vào cổng nối tiếp USART0 của MCU. Khi nhấn SW0,
ngõ ra PORTA nối đến LED hiển thị số lượng sản phẩm đếm được ở ngõ vào chân T0. Khi nhấn SW1,
các LED hiển thị nội dung dữ liệu trong thanh ghi đệm cổng nối tiếp USART0 tại thời điểm truy cập. Khi
nhấn SW2, tất cả các đèn LED đều tắt. Bỏ qua việc chống rung phím.

a. (0.5đ) Viết chương trình con USART0_INIT d. (1.0đ) Viết các chương trình phục vụ ngắt
khởi động cổng nối tiếp USART0 bất đồng bộ, ngoài EXT0, EXT1, EXT2 khi nhấn SW0,
baudrate 9600, 8 bits dữ liệu, không sử dụng SW1, SW2 và chương trình con RXCI ngắt thu
kiểm tra chẵn lẻ, 1 stop bit. Cho phép thu và ngắt xong cổng nối tiếp USART0.
thu xong cổng USART0. EXT0: EXT2:
IN R17,TCNT0 LDI R16,0
USART0_INIT: OUT PORTA,R17 OUT PORTA, R16
LDI R16, (1<< RXEN0) | (1<<RXCIE0) RETI RETI
STS UCSR0B, R16 EXT1: RXCI:
LDI R16, (1<< UCSZ01) | (1<<UCSZ00) MOV R17, R18 LDS R18, UDR0
STS UCSR0C, R16 OUT PORTA, R17 RETI
LDI R16,0 RETI
STS UBRR0H,R16
LDI R16, 51 e. (0.5đ) Viết chương trình hoàn chỉnh thực hiện
STS UBRR0L,R16 các công việc như mô tả ở trên, xem như có sẵn
RET
các chương trình con câu a, b, c, d.
b. (0.5đ) Viết chương trình con TIMER0_INIT .ORG 0
khởi động Timer0, đếm sự kiện chân T0, mode RJMP
.ORG
MAIN
0x0002 ;vector ngắt ngoài 0
normal. RJMP EXT0
.ORG 0x0004 ;vector ngắt ngoài 1
TIMER0_INIT: RJMP EXT1
CBI DDRB,0 .ORG 0x0006 ;vector ngắt ngoài 2
SBI PORTB,0 RJMP EXT2
LDI R16,0 .ORG 0x0028 ;vector ngắt thu xong USART0
RJMP RXCI
OUT TCCR0A,R16 MAIN: RCALL USART0_INIT
OUT TCNT0,R16 RCALL TIMER0_INIT
LDI R16, (1<<CS02) | (1<<CS01) RCALL EXT_INIT
OUT TCCR0B,R16 SEI
RET HERE: RJMP HERE
USART0_INIT:….
c. (0.5đ) Viết chương trình con EXT_INIT cho RET
phép 3 chân ngắt ngoài INT0, INT1, INT2 tác TIMER0_INIT:….
động cạnh xuống. RET
EXT_INIT:….
RET
EXT_INIT: EXT0: ….
LDI R16, (1<<INT0) | (1<<INT1) | (1<<INT2) RETI
OUT EIMSK,R16 EXT1: ….
LDI R16, (1<<ISC01) | (1<<ISC11) | (1<<ISC21) RETI
STS EICRA, R16 EXT2: ….
RET RETI
RXCI: ….
RETI
MSSV: ....................................... Họ và tên SV:...................................................................................................... Trang 4/4
Lưu ý: Sinh viên xem hình ở trang Phụ lục hình.
Phụ lục hình
MSSV: ....................................... Họ và tên SV:......................................................................................................................

Lưu ý: SV ghi đầy đủ MSSV, họ và tên và nộp lại trang Phụ lục hình này kèm với đề thi.

Câu hỏi 3:

Trở kháng (Ω)


Hình 1b
1100
220Ω
PC0 900

700
PA0/ADC0 LED
100Ω 500

300

MCU324P 100
Hình 1a 50 100 150 200 250 300 350 400
Mức độ sáng (độ rọi) (lux)

Câu hỏi 4:

Hình 2

You might also like