Giảng viên ra đề: (Chữ ký và Họ tên) Ngày ra đề: …/… Người phê duyệt: (Chữ ký, Chức vụ và Họ tên) Ngày duyệt đề: …/… (phần phía trên cần che đi khi in sao đề thi) THI CUỐI KỲ TRƯỜNG ĐH BÁCH KHOA – ĐHQG-HCM KHOA ĐIỆN – ĐIỆN TỬ Môn học Vi xử lý Mã môn học EE2039 Thời lượng 90 phút Học kỳ/năm học Ngày thi 2 2024-2025 17/05/2025 Mã đề 2 Ghi chú: - 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. - 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 05 câu hỏi, 08 trang. Sinh viên làm bài trực tiếp trên đề thi. CBCT 1: CBCT 2: 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. ĐÁP ÁN Câu 1. (L.O.2, L.O.5, L.O.6): (2.5 điểm) Cho hệ vi xử lý sử dụng vi điều khiển ATmega324P (MCU324P) như sơ đồ và chương trình điều khiển bên dưới. Chương trình điều khiển: .ORG 0 ;===================== ;THIET LAP I/O PORT ;===================== LDI R16,0 OUT DDRA,R16 LDI R16,$FF OUT PORTA,R16 OUT DDRB,R16 SBI DDRC,0 SBI DDRC,1 SBI DDRD,6 CBI PORTC,0 CBI PORTC,1 ;===================== ;KHOI DONG TIMER ;===================== LDI R16,199 STS OCR2A,R16 LDI R16,0B00100011 STS TCCR2A,R16 LDI R16,0B00001010 STS TCCR2B,R16 MAIN: RCALL PULSE_OCn RCALL BIN8_BCD RCALL DISPLAY RJMP MAIN PULSE_OCn: IN R17,PINA MOV R18,R17 DEC R17 STS OCR2B,R17 RET BIN8_BCD: … RET DISPLAY: … RET MSSV: ................................. Họ và tên SV:....................................................................................... Mã đề: 2 - Trang 1/8 Cho trước các chương trình con BIN8_BCD và DISPLAY có chức năng như sau: ▪ BIN8_BCD: có chức năng chuyển đổi từ số nhị phân 8 bit (được cất trong R18) sang số BCD 3 decade: trăm, chục và đơn vị. ▪ DISPLAY: có chức năng hiển thị giá trị BCD 3 decade (trăm, chục và đơn vị) có được từ chương trình con BIN8_BCD lên các LED 7 đoạn tương ứng. DIPSW-8 dùng để nhập logic ngõ vào PortA. Biết rằng giá trị DIPSW-8 có thể thay đổi từ 1 đến 255. 1. (0.5đ) Hãy cho biết chương trình điều khiển trên sử dụng Timer nào, hoạt động ở chế độ (mode) nào và thực hiện chức năng gì? ▪ Chương trình sử dụng Timer2 thực hiện chức năng tạo sóng bằng phần cứng trên chân OC2B (PD6). Mode FPWM7 (WGM22: WGM20 = 111). ▪ COM2B1:COM2B0 = 10: tín hiệu sóng dạng không đảo. 2. (0.5đ) Cho biết tần số xung ngõ ra chân OC2B (PD6)? Giá trị nhập từ DIPSW-8 dùng để làm gì? ▪ Mode FPWM7: Tần số fOC2B = fosc/[N.(TOP + 1)], với TOP = OCR2A, N: hệ số chia bộ prescaler ▪ OCR2A = 199, N = 8 (CS22:CS20 = 010) fOC2B = 8.106/[8.(199 + 1)] = 5KHz. ▪ Giá trị nhập từ DIPSW-8 dùng để thay đổi độ rộng xung ngõ ra chân OC2B (PD6). 3. (0.75đ) Giả sử DIPSW-8 cấp các mức logic 10010110 tương ứng vào các pin của PortA, thì chu kỳ nhiệm vụ (CKNV) của xung ngõ ra chân OC2B là bao nhiêu và các LED 7 đoạn hiển thị nội dung gì? Cho biết nội dung hiển thị trên LED 7 đoạn thể hiện thông số nào của xung? ▪ DIPSW = 100101102 = 15010 → OCR2B = 149 → CKNV (sóng không đảo) = [(OCR2B + 1)/(TOP + 1)] x 100% = [149 + 1)/(199 + 1)] x 100% (mode FPWM7 → TOP = OCR2A) = 75% ▪ DIPSW = 100101102 = 15010 → LED 7 đoạn hiển thị 150 (nội dung nhận được từ DIPSW). ▪ Nội dung hiển thị trên LED 7 đoạn chính là độ rộng xung tính theo µs (N = 8 → CLKT2 = 1µs). 4. (0.25đ) Với chế độ hoạt động như chương trình điều khiển đã cho, giá trị lớn nhất mà người dùng có thể nhập từ DIPSW-8 (biểu diễn dạng số thập phân) là bao nhiêu? Giải thích? ▪ TOP = OCR2A = 199, nội dung OCR2B là giá trị nhập từ DIPSW trừ 1. Để tạo được xung ngõ ra như chương trình điều khiển đã cho, thì OCR2B < OCR2A, hay giá trị nhập từ DIPSW < 200 → giá trị lớn nhất mà người dùng có thể nhập từ DIPSW là 199. 5. (0.5đ) Nếu vẫn sử dụng chương trình trên với cùng Timer và mode hoạt động không đổi, để tạo thêm xung ở ngõ ra OC2A (PD7) có tần số 5KHz, CKNV = 50%, không làm thay đổi xung ở OC2B (PD6) thì có được không? Nếu được thì cần thêm hay thay đổi câu lệnh nào trong chương trình điều khiển? Nếu không thì giải thích tại sao? ▪ Trường hợp COM2A[1:0] = 01: Không thể tạo thêm xung ở ngõ ra OC2A (PD7) như yêu cầu trên. Vì yêu cầu xung ở ngõ ra OC2A (PD7) có CKNV = 50%, tức là mỗi khi nội dung bộ đếm TCNT2 = OCR2A ở chu kỳ clock timer tiếp theo thì ngõ ra OC2A (PD7) sẽ bị đảo trạng thái. Vì OCR2A giữ không đổi là 199, do đó xung ở ngõ ra OC2A (PD7) có tần số là 2.5KHz thay vì 5KHz. ▪ Trường hợp COM2A[1:0] = 10 hay 11: Không thể tạo thêm xung ở ngõ ra OC2A (PD7) như yêu cầu trên. Ở mode FPWM7 → TOP = OCR2A, do đó: o Nếu COM2A[1:0] = 10 (ngõ ra trạng thái không đảo), thì ngõ ra OC2A được giữ mức logic 1 và có 1 gai xung hẹp khi bộ đếm ở BOTTOM. o Nếu COM2A[1:0] = 11 (ngõ ra trạng thái đảo), thì ngõ ra OC2A giữ mức logic 0 và có 1 gai xung hẹp khi bộ đếm ở BOTTOM. MSSV: ................................. Họ và tên SV: ....................................................................................... Mã đề: 2 - Trang 2/8 Câu 2. (L.O.2, L.O.5, L.O.6): (2.5 điểm) 1. (1.0đ) Cho chương trình con khởi động UART như sau: UART_INIT: LDI R16,1<<U2X0 STS UCSR0A,R16 LDI R16,(1<<RXEN0) | (1<<UCSZ02) STS UCSR0B,R16 LDI R16,(1<<UCSZ01) | (1<<UCSZ00) | (1<<UPM01) STS UCSR0C,R16 LDI R16,0 STS UBRR0H,R16 LDI R16,103 STS UBRR0L,R16 RET Sinh viên trả lời các câu hỏi bên dưới. ▪ Tốc độ baud thực tế (trình bày công thức tính và kết quả): 2. (0.75đ) Viết chương trình hoàn chỉnh (không sử dụng ngắt cổng nối tiếp) liên tục nhận dữ liệu từ cổng nối tiếp như cấu hình ở câu 1 và thực hiện các chức năng sau: ▪ Kiểm tra dữ liệu thu được có bị lỗi bit kiểm tra chẵn lẻ không. Nếu bị lỗi thì set PA0 = 1. Ngược lại, thì xóa PA0 = 0 và phát dữ liệu thu được ra PORTB hoặc PORTC tùy theo giá trị của bit thu thứ 9: o Nếu bit thu thứ 9 bằng 0: phát 8 bit thấp của dữ liệu thu được ra PORTB. o Nếu bit thu thứ 9 bằng 1: phát 8 bit thấp của dữ liệu thu được ra PORTC. ▪ Thực hiện lại quá trình thu dữ liệu mới. Nếu sử dụng lại CTC ở câu 1 thì sinh viên chỉ cần viết lại tên CTC và lệnh RET kết thúc CTC. 3. (0.75đ) Thực hiện lại câu 2 sử dụng ngắt thu hoàn thành (USART0_RX). .ORG 0x00 SBI DDRA,0 LDI R16,0xFF OUT DDRB,R16 OUT DDRC,R16 RCALL USART_INIT AGAIN: LDS R18,UCSR0A SBRS R18,RXC0 ; cờ RXC0 = 1? RJMP AGAIN LDS R17,UCSR0B ; đọc bit thu thứ 9 trước LDS R16,UDR0 ; đọc 8 bit data thấp sau ANDI R18, 1<<UPE0 ; xử lý bit UPE0 BREQ USART_REC_NO_UPE SBI PORTA,0 RJMP AGAIN USART_REC_NO_UPE: CBI PORTA,0 SBRC R17, RXB80 ; kiểm tra bit thu thứ 9 RJMP RB8_1 ;==================== OUT PORTB,R16 USART_INIT: RJMP AGAIN … RB8_1: OUT PORTC,R16 … RJMP AGAIN RET 2U2X0 × 𝐹osc 16 × (UBRR0 + 1) 21 × 8 × 106 = 16 × (103 + 1) = 9615 (thực tế) BR = ▪ Kích thước dữ liệu (5/6/7/8/9 bit): 9 ▪ Parity bit (chẵn/lẻ/không dùng): chẵn ▪ Cho phép phát/thu/phát và thu: thu .ORG 0x00 RJMP MAIN .ORG 0x28 RJMP USART0_RX_ISR .ORG 0x40 MAIN: SBI DDRA,0 LDI R16,0xFF OUT DDRB,R16 OUT DDRC,R16 RCALL USART_INIT SEI LDS R16,UCSR0B SBR R16,1<< RXCIE0 STS UCSR0B,R16 HERE: RJMP HERE ;=============================== USART0_RX_ISR: LDS R18,UCSR0A LDS R17,UCSR0B LDS R16,UDR0 ANDI R18, 1<<UPE0 BREQ USART_REC_NO_UPE SBI PORTA,0 RJMP EXIT USART_REC_NO_UPE: CBI PORTA,0 SBRC R17, RXB80 RJMP RB8_1 OUT PORTB,R16 RJMP EXIT RB8_1: OUT PORTC,R16 EXIT: RETI ;=============================== USART_INIT: … … RET MSSV: ................................. Họ và tên SV: ....................................................................................... Mã đề: 2 - Trang 3/8 Câu 3. (L.O.2, L.O.5, L.O.6): (2.0 điểm) 1. (0.25đ) ADC trong vi điều khiển ATmega324P có độ phân giải bao nhiêu bit. Với điện áp tham chiếu Vref = 2.56V, điện áp tương ứng của 1 LSB là bao nhiêu Volt? ▪ ADC trong vi điều khiển ATmega324P có độ phân giải 10 bit. ▪ 1 LSB = Vref/2N = 2.56 V/ 210 = 0.0025V = 2.5mV 2. (0.25đ) Hãy nêu sự khác nhau giữa chế độ chuyển đổi 1 lần (single conversion mode) và chế độ tự chạy (free running mode). Khi nào thì nên sử dụng các chế độ này và cho ví dụ ứng với mỗi trường hợp. ▪ Chế độ single conversion chỉ chuyển đổi 1 lần duy nhất sau khi bit ADSC được bật. Mỗi khi muốn đo ta phải khởi động việc chuyển đổi bằng cách bật ADSC. o Sử dụng khi đo giá trị không liên tục, hoặc khi cần tần số lấy mẫu nhỏ. o Ví dụ: Đo giá trị ngõ ra cảm biến nhiệt độ khi người dùng nhấn nút START. ▪ Chế độ Free Running sẽ thực hiện chuyển đổi liên tục sau khi bit ADSC được bật. Sau khi hoàn tất 1 chuyển đổi, ADC sẽ tự khởi động lần chuyển đổi tiếp theo. o Sử dụng khi cần lấy giá trị liên tục, tần số lấy mẫu lớn. o Ví dụ: Đo liên tục giá trị cảm biến nhiệt độ để điều khiển lò nhiệt. 3. (0.25đ) ADC của ATmega324P có thể sử dụng các nguồn điện áp tham chiếu nào? Nếu muốn sử dụng nguồn tham chiếu bên ngoài (AREF) với giá trị 3.3V, ta cần cấu hình thanh ghi ADMUX như thế nào? ▪ ADC của Atmega324P có thể sử dụng 4 nguồn điện áp tham chiếu: 1. Điện áp ngoài từ chân AREF 2. Điện áp AVCC 3. Điện áp nội 1.1V 4. Điện áp nội 2.56V ▪ Để chọn điện áp tham chiếu bên ngoài ta đưa giá trị 00 vào 2 bit REFS[1:0] của ADMUX. 4. (0.25đ) Giả sử ADC của ATmega324P được cấu hình với Vref = 5V và độ phân giải 10-bit. Nếu tín hiệu analog đầu vào là 3V, giá trị số (digital) thu được sẽ là bao nhiêu? Hãy trình bày công thức và các bước tính toán. ▪ Giá trị ADC được tính như sau: ADCVAL = Vin x 2N/Vref = 3 x 210/5 = 614.4 ▪ Vì giá trị ADC là số nguyên nên kết quả sẽ là 614. MSSV: ................................. Họ và tên SV: ....................................................................................... Mã đề: 2 - Trang 4/8 5. Cho một hệ thống đo nhiệt độ sử dụng cảm biến nhiệt độ LM35 (xem hình vẽ) và ADC của ATmega324P. Điện áp ngõ ra cảm biến thay đổi tuyến tính với nhiệt độ cứ 10mV/°C. Ngõ ra cảm biến (OUTPUT) được nối vào ngõ vào ADC1, với điện áp tham chiếu bằng 2.56V đưa vào từ bên ngoài. a) (0.25đ) Viết công thức tính nhiệt độ theo giá trị ADC đọc được. ▪ Nhiệt độ: t (oC) = VLM35 / 10 (Với VLM35 tính theo đơn vị mV). ▪ VLM35 (mV) = (ADCVAL x Vref ) / 2N = (ADCVAL x 2.56 x 1000 ) / 210 ▪ Từ đó, nhiệt độ t (oC) = (ADCVAL x 2.56 x 100 ) / 1024 = ADCVAL / 4 = (ADCVAL >> 2). b) (0.25đ) Sai số do lượng tử hóa của phép đo là bao nhiêu độ C. ▪ Với ADC 10 bit, sai số do lượng tử hóa sẽ là ±0.5LSB 0.5LSB = 0.5 x 2.56 x 1000 / 1024 = 1.25 mV ▪ Với cảm biến LM35, 1.25 mV tương ứng 1.25 / 10 = 0.125 oC ▪ Vậy, sai số phép đo là ±0.125 oC. (Nếu SV cho sai số lượng tử hóa là 1LSB = 2.5mV thì cũng chấp nhận sai số của phép đo là 0.25oC). c) (0.25đ) Viết chương trình con INIT_ADC cấu hình ADC với ngõ vào đơn kênh, chế độ tự chạy (free running mode), tần số ADC (fADC) được chia từ clock hệ thống (fosc) với hệ số chia prescaler = 64. Giải thích ý nghĩa của từng bit trong các thanh ghi liên quan (ADCSRA, ADMUX). ❖ Giải thích: ▪ ADMUX: o REFS1 = 0, REFS0 = 0: nguồn tham chiếu (Vref) từ bên ngoài. o ADLAR = 1: hiệu chỉnh trái để cho ADCH chứa 8 bit cao dùng cho câu d. o MUX[4:0] = 00001: ngõ vào ADC1. ▪ ADCSRA: o ADEN = 1: cho phép ADC. o ADSC = 1: bắt đầu chuyển đổi. o ADATE = 1: cho phép chế độ tự kích. o ADPS[2:0] = 110 (Prescaler = 64). ▪ ADCSRB: o ADTS[2:0] = 000 → Free Running → Mặc định → không cần cấu hình. ❖ Chương trình: INIT_ADC: LDI R16,0b0010_0001 STS ADMUX,R16 LDI R16,0b1110_0110 STS ADCSRA,R16 RET d) (0.25đ) Viết chương trình con TEMP_MEASURE đọc ADC, chuyển thành giá trị nhiệt độ (°C) số nguyên chứa vào thanh ghi R0. TEMP_MEASURE: ; Chờ ADIF=1 LDS R16, ADCSRA ; Đọc ADCSRA vào R16 ; Bỏ qua lệnh tiếp theo nếu ADIF=1 SBRS R16, ADIF ; Quay lại kiểm tra nếu ADIF=0 RJMP TEMP_MEASURE STS ADCSRA, R16 ; Xóa ADIF LDS R16, ADCL ; Đọc ADCL trước ; Đọc ADCL vào R16 (nhưng không dùng) LDS R0, ADCH ; Đọc ADCH vào R0 RET ; Trở về chương trình gọi ▪ Nhận xét: o Từ kết quả câu 5a, nhiệt độ t (oC) = (ADCVAL x 2.56 x 100 ) / 1024 = ADCVAL / 4 = (ADCVAL >> 2). o Vì vậy, ta chỉ cần cấu hình hiệu chỉnh trái (ADLAR = 1) và chỉ sử dụng các bit trong ADCH. Hay nói cách khác là chúng ta chỉ sử dụng 8 bit cao trong 10 bit kết quả chuyển đổi. Điều này tương đương với ADCVAL/4. (có thể cho ADLAR = 0: hiệu chỉnh phải, nhưng ở câu d phải cho ADLAR = 1). MSSV: ................................. Họ và tên SV: ....................................................................................... Mã đề: 2 - Trang 5/8 Câu 4. (L.O.2, L.O.5, L.O.6): (1.0 điểm) Cho hệ vi điều khiển ATmega324P gồm 1 LED và nguồn xung vuông f = 10Hz đưa vào chân ngắt ngoài INT2 (PB2). Chương trình điều khiển dùng ngắt ngoài INT2 như sau: .ORG RJMP .ORG RJMP .ORG 0 MAIN 0X0006 INT2_ISR 0X0040 Hình vẽ Câu 4. f = 10Hz MAIN: SBI DDRC, 5 ; PC5 là ngõ ra điều khiển LED CBI PORTC, 5 ; tắt đèn LED LDI R16, (1<<ISC21) | (1<<ISC20) ; ngắt ngoài INT2 chọn cạnh lên …………………..... STS EICRA, R16 LDI R16, (1<<INT2) ; cho phép ngắt ngoài INT2…………....................... OUT EIMSK, R16 SEI ; cho phép ngắt toàn cục …………………………….. LP: RJMP LP INT2_ISR: LDI R16, (1<<5) IN R17, PORTC EOR R17, R16 OUT PORTC, R17 RETI 1. (0.5đ) Thêm các dòng chú thích còn thiếu, ghi vào dòng (; ………) của chương trình trên. 2. (0.5đ) Mô tả ngắn gọn trạng thái của đèn LED. ▪ Ngắt INT2 theo cạnh lên: mỗi khi xung có cạnh lên thì đèn LED sẽ thay đổi sáng ↔ tắt. ▪ Thời gian sáng/tắt đèn bằng thời gian 1 chu kỳ xung = 1/10 = 0.1 giây. ………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………… ………………………………………………………………………………………………………………… MSSV: ................................. Họ và tên SV: ....................................................................................... Mã đề: 2 - Trang 6/8 Câu 5. (L.O.2, L.O.5, L.O.6): (2.0 điểm) Hệ thống vi điều khiển ATmega324P mô phỏng hệ thống tính cước taxi gồm: ▪ Bộ đếm Km: tạo ra 1 xung cạnh xuống khi xe chạy được cứ mỗi 1 Km; nối vào chân INT0 (PD2). ▪ Nút nhấn SW: nối vào vào chân INT1 (PD3). Khi nhấn tạo 1 xung cạnh xuống (giả sử SW lý tưởng). ▪ 2 LED 7 đoạn: dùng để hiển thị giá tiền cước tính theo đơn vị Ngàn đồng (giả sử lớn nhất là 99). Hoạt động của mạch được mô tả như sau: ▪ Ban đầu chưa có khách thì hiển thị giá trị 00. ▪ Khi khách lên xe thì tài xế nhấn nút SW lần 1, xe chạy và tính tiền theo giá 1 Km là 3 Ngàn đồng (giả sử là giá tiền không vượt quá 99 Ngàn đồng). Chú ý bắt đầu chở khách là đồng hồ nhảy 3 Ngàn đồng, và cứ mỗi 1 Km thì tăng thêm 3 Ngàn đồng. ▪ Khi tới nơi đến, thì tài xế nhấn nút SW lần 2 để chốt giá tiền hiển thị cho khách. ▪ Khi khách trả tiền xuống xe thì tài xế nhấn nút SW lần 3 để hệ thống tính cước trở lại trạng thái ban đầu (trạng thái xe chưa có khách). Chương trình điều khiển được viết như sau: .ORG RJMP .ORG RJMP .ORG RJMP .ORG 0 MAIN 0X0002 INT0_ISR 0X0004 INT1_ISR 0X0040 MAIN: LDI OUT SBI SBI CBI CBI SBI LDI LDI CALL LOOP:CALL RJMP INIT_EXT: … DISPLAY: … INT0_ISR: … INT1_ISR: … R16,0XFF ;khởi tạo chân port cho hiển thị 2 LED 7 đoạn DDRA, R16 DDRC, 0 DDRC, 1 PORTC, 0 ;khóa chốt U2 PORTC, 1 ;khóa chốt U3 PORTD, 3 ;dùng điện trở kéo lên bên trong cho SW R17, 0 ;R17 là biến đếm trạng thái cho ngắt từ SW R18, 0 ;R18 chứa số tiền cước xe INIT_EXT ;cho phép dùng các ngắt liên quan DISPLAY ;hiển thị giá trị R18 ra 2 LED 7 đoạn. LOOP ;ctcon khởi tạo ngắt ;ctcon hiển thị giá trị R18 ra 2 LED 7 đoạn (tối đa 99) ;ISR ngắt ngoài INT0 để tính cước ;ISR ngắt ngoài INT1 khi có nhấn nút thay đổi trạng thái MSSV: ................................. Họ và tên SV: ....................................................................................... Mã đề: 2 - Trang 7/8 1. (0.5đ) Viết chương trình con INIT_EXT có nhiệm vụ chọn kiểu ngắt ngoài INT0, INT1 theo cạnh xuống và cho phép dùng ngắt INT1. INIT_EXT: LDI STS LDI OUT SEI RET R16, (1<<ISC01) | (1<<ISC11) ;ngắt INT0, INT1 cạnh xuống EICRA, R16 R16, (1<<INT1) ;cho phép ngắt INT1 EIMSK, R16 ;cho phép ngắt 2. (0.5đ) Viết chương trình ngắt INT0_ISR để tính cước: mỗi khi có 1 xung từ bộ đếm Km (tương đương 1 Km) thì R18 được tăng 3 (giả sử giá trị lớn nhất là 99, SV không cần kiểm tra điều kiện này). INT0_ISR: PUSH R16 IN R16, SREG PUSH R16 LDI R16, 3 ADD R18, R16 POP R16 OUT SREG, R16 POP R16 RETI ;cất SREG vào stack ;cộng thêm cước 3 Ngàn mỗi 1 Km 3. (1.0đ) Viết chương trình ngắt INT1_ISR thay đổi trạng thái theo nút SW và thực thi tác vụ tương ứng. Khi nhấn nút thì R17 tăng lên 1. R17 chỉ có 3 giá trị 0, 1, 2 ứng với 3 trạng thái. Nếu R17 đang bằng 2 thì giá trị tiếp theo sẽ quay về 0. Ứng với mỗi trạng thái của R17, sẽ thực hiện các tác vụ sau: ▪ R17 = 0 ứng với trạng thái xe chưa có khách: thì cấm ngắt INT0, đặt R18 = 0 (giá cước bằng 0). ▪ R17 = 1 ứng trạng thái có khách lên xe: thì cho phép ngắt INT0, đặt R18 = 3 (giá cước bắt đầu từ 3). ▪ R17 = 2 ứng trạng thái khách tới nơi đến: cấm ngắt INT0 để chốt giá cước. Cách làm: Có thể viết gọn lại: R17 ; tăng R17 ;R17 có 3 giá trị 0,1,2 CPI R17, 3 BRNE S0 LDI R17, 0 INT1_ISR: INC S0: S1: S2: EXIT: CPI R17, 0 BRNE S1 CBI EIMSK, INT0 ; R17=0 LDI R18, 0 RJMP EXIT CPI R17, 1 BRNE S2 SBI EIMSK, INT0 ; R17=1 LDI R18, 3 RJMP EXIT CBI EIMSK, INT0 ; R17=2 RETI R17 ; tăng R17 ;R17 có 3 giá trị 0,1,2 CPI R17, 3 BRNE S1 LDI R17, 0 CBI EIMSK, INT0 ; R17=0 LDI R18, 0 RJMP EXIT CPI R17, 1 BRNE S2 SBI EIMSK, INT0 ; R17=1 LDI R18, 3 RJMP EXIT CBI EIMSK, INT0 ; R17=2 RETI INT1_ISR: INC S1: S2: EXIT: --- HẾT--MSSV: ................................. Họ và tên SV: ....................................................................................... Mã đề: 2 - Trang 8/8
0
You can add this document to your study collection(s)
Sign in Available only to authorized usersYou can add this document to your saved list
Sign in Available only to authorized users(For complaints, use another form )