Professional Documents
Culture Documents
Lab1 1
Lab1 1
MỤC TIÊU:
Thực hiện các giao tiếp I/O Port, các lệnh tính toán
THAM KHẢO:
BÀI 1
a) Kết nối 1 port của AVR (VD PORT A) vào dip switch. Kết nối 1 port khác vào bar LED
(Ví dụ PORT B)
.include "m324pdef.inc" ; Sử dụng file định nghĩa cho vi điều khiển ATmega324P
.equ LED_PORT = PORTB ; Định nghĩa tên cho PORT kết nối với thanh LED
.equ SWITCH_PORT = PINA ; Định nghĩa tên cho PORT kết nối với Dip Switch
https://doe.dee.hcmut.edu.vn/
Lab 1-1
giao tiếp I/O và các lệnh tính toán
ldi r16, 0xFF ; 0xFF: Tất cả các chân của PORT B là đầu ra
out DDRB, r16 ; Thiết lập DDRB
Main:
; Đọc trạng thái của Dip Switch từ PORT A
in dipSwitchData, SWITCH_PORT
.equ LED_PORT = PORTB ; Định nghĩa tên cho PORT kết nối với thanh LED
.equ SWITCH_PORT = PINA ; Định nghĩa tên cho PORT kết nối với Dip Switch
https://doe.dee.hcmut.edu.vn/
Lab 1-1
giao tiếp I/O và các lệnh tính toán
Main:
; Đọc trạng thái của DIP Switch từ PORT A
in dipSwitchData, SWITCH_PORT
CheckSwitchLoop:
tst dipSwitchData ; Kiểm tra bit thấp nhất của dipSwitchData
brne SwitchIsOn ; Nếu bit khác 0, nhảy đến SwitchIsOn
https://doe.dee.hcmut.edu.vn/
Lab 1-1
giao tiếp I/O và các lệnh tính toán
SwitchIsOn:
; Nếu bit là 1, bật LED tương ứng
ldi ledData, 0xFF ; 0xFF: Bật LED
out LED_PORT, ledData
NextBit:
; Dịch trái mask để kiểm tra bit tiếp theo
lsl dipSwitchData
dec r18 ; Giảm số lần lặp lại
; Nếu còn bit chưa kiểm tra hết, lặp lại quá trình
brne CheckSwitchLoop
BÀI 2
a) Viết chương trình đọc giá trị của Port đang nối với Dip Switch, cộng thêm 5 và gửi ra
Port đang nối với Bar LED.
https://doe.dee.hcmut.edu.vn/
Lab 1-1
giao tiếp I/O và các lệnh tính toán
.include "m324pdef.inc" ; Sử dụng file định nghĩa cho vi điều khiển ATmega324P
.equ LED_PORT = PORTB ; Định nghĩa tên cho PORT kết nối với thanh LED
.equ SWITCH_PORT = PINA ; Định nghĩa tên cho PORT kết nối với Dip Switch
Main:
; Đọc giá trị từ Dip Switch từ PORT A
in r16, SWITCH_PORT
; Cộng thêm 5
ldi r17, 5
add r16, r17
b) Thay đổi trạng thái của Dip Switch và quan sát trạng thái Bar LED
https://doe.dee.hcmut.edu.vn/
Lab 1-1
giao tiếp I/O và các lệnh tính toán
Để thay đổi trạng thái của Dip Switch và quan sát trạng thái của thanh LED, cần thực hiện các
bước sau:
Kết nối Dip Switch vào PORTA và Bar LED vào PORTB trên vi điều khiển AVR ATmega324P.
Nạp chương trình vào vi điều khiển sử dụng Atmel Studio hoặc các công cụ tương tự.
Thay đổi trạng thái của Dip Switch và quan sát thanh LED để xem kết quả đã cộng thêm 5 được
hiển thị.
BÀI 3
a) Kết nối và thực hiện chương trình tính tích của 2 nibble cao và thấp của PORTAvà gửi ra
PORT B. Coi như 2 nibble này là 2 số không dấu
.include "m324pdef.inc" ; Sử dụng file định nghĩa cho vi điều khiển ATmega324P
.equ LED_PORT = PORTB ; Định nghĩa tên cho PORT kết nối với thanh LED
.equ NIBBLE_HIGH_MASK = 0xF0 ; Mask cho nibble cao (bảy ba một hai)
.equ NIBBLE_LOW_MASK = 0x0F ; Mask cho nibble thấp (không một một một)
Main:
; Đọc giá trị của nibble cao và nibble thấp từ PORTA
in r16, PINA
https://doe.dee.hcmut.edu.vn/
Lab 1-1
giao tiếp I/O và các lệnh tính toán
.include "m324pdef.inc" ; Sử dụng file định nghĩa cho vi điều khiển ATmega324P
.equ LED_PORT = PORTB ; Định nghĩa tên cho PORT kết nối với thanh LED
.equ NIBBLE_LOW_MASK = 0x0F ; Mask cho nibble thấp (không một một một)
Main:
https://doe.dee.hcmut.edu.vn/
Lab 1-1
giao tiếp I/O và các lệnh tính toán
c) Thay đổi trạng thái của Dip Switch và quan sát trạng thái Bar LED
Sau khi nạp chương trình vào vi điều khiển, bạn có thể thay đổi trạng thái của Dip Switch và
quan sát trạng thái của thanh LED kết quả trên PORTB. Khi Dip Switch thay đổi, giá trị tích
được tính toán lại và gửi đến thanh LED để hiển thị.
BÀI 4
a) Kết nối và thực hiện chương trình tính tích của 2 nibble cao và thấp của PORTAvà gửi ra
PORT B. Coi như 2 nibble này là 2 số có dấu
https://doe.dee.hcmut.edu.vn/
Lab 1-1
giao tiếp I/O và các lệnh tính toán
.include "m324pdef.inc" ; Sử dụng file định nghĩa cho vi điều khiển ATmega324P
.equ LED_PORT = PORTB ; Định nghĩa tên cho PORT kết nối với thanh LED
.equ NIBBLE_HIGH_MASK = 0xF0 ; Mask cho nibble cao (bảy ba một hai)
.equ NIBBLE_LOW_MASK = 0x0F ; Mask cho nibble thấp (không một một một)
Main:
; Đọc giá trị của nibble cao và nibble thấp từ PORTA
in r16, PINA
https://doe.dee.hcmut.edu.vn/
Lab 1-1
giao tiếp I/O và các lệnh tính toán
ret
.include "m324pdef.inc" ; Sử dụng file định nghĩa cho vi điều khiển ATmega324P
.equ LED_PORT = PORTB ; Định nghĩa tên cho PORT kết nối với thanh LED
.equ NIBBLE_HIGH_MASK = 0xF0 ; Mask cho nibble cao (bảy ba một hai)
.equ NIBBLE_LOW_MASK = 0x0F ; Mask cho nibble thấp (không một một một)
https://doe.dee.hcmut.edu.vn/
Lab 1-1
giao tiếp I/O và các lệnh tính toán
Main:
; Đọc giá trị của nibble cao và nibble thấp từ PORTA
ldi r16, 0b01111111 ; Set giá trị PORTA
mov r17, r16 ; Sao chép giá trị PORTA sang thanh ghi r17
https://doe.dee.hcmut.edu.vn/
Lab 1-1
giao tiếp I/O và các lệnh tính toán
lsl r20 ; Shift trái thanh ghi 20 để lấy phần cao nhất của giá trị dấu
mov r22, r20 ; Sao chép phần cao nhất vào thanh ghi tạm r22
lsl r21 ; Shift trái thanh ghi 21 để nhân với phần thấp của giá trị dấu
clr r21 ; Xóa bit dấu của phần thấp của giá trị dấu
lsl r18 ; Shift trái thanh ghi 18 để lấy phần cao nhất của giá trị số
movw r24, r16 ; Sao chép giá trị số vào thanh ghi tạm r24:r25
lsl r25 ; Shift trái thanh ghi 25 để lấy phần cao nhất của giá trị số
mul r24, r22 ; Nhân phần cao nhất của giá trị số với phần cao nhất của giá trị dấu
movw r24, r0 ; Sao chép kết quả nhân vào thanh ghi tạm r24:r25
mul r18, r21 ; Nhân phần cao nhất của giá trị số với phần thấp của giá trị dấu
add r24, r0 ; Cộng kết quả nhân vào phần cao nhất của kết quả cuối cùng
clr r25 ; Xóa thanh ghi 25 để chuẩn bị cho phép cộng kế tiếp
mul r24, r21 ; Nhân phần thấp của giá trị số với phần thấp của giá trị dấu
add r25, r0 ; Cộng kết quả nhân vào phần thấp của kết quả cuối cùng
ret
https://doe.dee.hcmut.edu.vn/
Lab 1-1
giao tiếp I/O và các lệnh tính toán
c) Thay đổi trạng thái của Dip Switch và quan sát trạng thái Bar LED
Sau khi nạp chương trình vào vi điều khiển, bạn có thể thay đổi trạng thái của Dip Switch và
quan sát trạng thái của thanh LED kết quả trên PORTB. Khi Dip Switch thay đổi, giá trị tích
được tính toán lại và gửi đến thanh LED để hiển thị.
BÀI 5
a) Kết nối PA0 vào 1 Switch đơn và PA1 vào 1 LED đơn trên khối LED (lưu ý là cùng 1
Port)
.include "m324pdef.inc" ; Sử dụng file định nghĩa cho vi điều khiển ATmega324P
.equ SWITCH_PIN = PINA0 ; Định nghĩa chân kết nối với switch là PA0
.equ LED_PIN = PORTA1 ; Định nghĩa chân kết nối với LED là PA1
Main:
; Thiết lập PA0 là input (switch) và PA1 là output (LED)
ldi r16, (1<<SWITCH_PIN) ; Set bit tương ứng với SWITCH_PIN
ldi r17, (1<<LED_PIN) ; Set bit tương ứng với LED_PIN
ldi r18, ~(1<<SWITCH_PIN) ; Clear bit tương ứng với SWITCH_PIN
out DDRA, r18 ; Xóa bit tương ứng với SWITCH_PIN để thiết lập là input
out DDRA, r17 ; Set bit tương ứng với LED_PIN để thiết lập là output
https://doe.dee.hcmut.edu.vn/
Lab 1-1
giao tiếp I/O và các lệnh tính toán
Loop:
; Đọc trạng thái của switch từ PA0
in r19, PINA
sbrs r19, SWITCH_PIN ; Kiểm tra bit của switch, nếu bit bằng 0 (off)
rjmp SwitchOff ; Nhảy đến SwitchOff
sbi PORTA, LED_PIN ; Bật LED
rjmp Loop ; Lặp lại quá trình
SwitchOff:
cbi PORTA, LED_PIN ; Tắt LED
rjmp Loop ; Lặp lại quá trình
b) Viết chương trình bật LED nếu SW nhấn, tắt LED nếu SW nhả.
.include "m324pdef.inc" ; Sử dụng file định nghĩa cho vi điều khiển ATmega324P
.equ SWITCH_PIN = PINA0 ; Định nghĩa chân kết nối với switch là PA0
.equ LED_PIN = PORTA1 ; Định nghĩa chân kết nối với LED là PA1
https://doe.dee.hcmut.edu.vn/
Lab 1-1
giao tiếp I/O và các lệnh tính toán
Main:
; Thiết lập PA0 là input (switch) và PA1 là output (LED)
ldi r16, (1<<SWITCH_PIN) ; Set bit tương ứng với SWITCH_PIN
ldi r17, (1<<LED_PIN) ; Set bit tương ứng với LED_PIN
ldi r18, ~(1<<SWITCH_PIN) ; Clear bit tương ứng với SWITCH_PIN
out DDRA, r18 ; Xóa bit tương ứng với SWITCH_PIN để thiết lập là input
out DDRA, r17 ; Set bit tương ứng với LED_PIN để thiết lập là output
Loop:
; Đọc trạng thái của switch từ PA0
in r19, PINA
sbrs r19, SWITCH_PIN ; Kiểm tra bit của switch, nếu bit bằng 0 (off)
rjmp SwitchOff ; Nhảy đến SwitchOff nếu switch không được nhấn
sbi PORTA, LED_PIN ; Bật LED nếu switch được nhấn
rjmp Loop ; Lặp lại quá trình
SwitchOff:
cbi PORTA, LED_PIN ; Tắt LED nếu switch không được nhấn
rjmp Loop ; Lặp lại quá trình
https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:
BÀI 1
1. Trả lời các câu hỏi
a. Lấy giá trị từ 2 nibble của PORTA như thế nào
b. Enable điện trở pullup như thế nào?
c. Khi Switch ở trạng thái ON/OFF, giá trị chân Port bằng bao nhiêu?
d. Khi chân port ở trạng thái 1, BAR LED sáng hay tắt?
e. Mã nguồn với chú thích
a.
; Lấy giá trị từ nibble cao của PORTA
ldi r16, 0xF0 ; Load mask để chỉ lấy 4 bit cao
in r17, PORTA ; Đọc giá trị từ PORTA
and r17, r16 ; Lấy chỉ 4 bit cao
https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:
BÀI 2
https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:
..........................................................................................................................
BÀI 3
1. Trả lời các câu hỏi
a. Làm thế nào lấy giá trị từ 2 nibble của PORT A
b. Mã nguồn với chú thích
a.
Để lấy giá trị từ 2 nibble của PORTA, ta cần thực hiện các bước sau:
Đầu tiên, ta sử dụng một mask để chỉ lấy các bit ở vị trí của nibble cần lấy.
Sau đó, đọc giá trị từ PORTA vào một thanh ghi.
Cuối cùng, thực hiện phép AND giữa giá trị đọc được và mask để lấy ra các
bit tương ứng với nibble đó.
b.
.include "m324pdef.inc" ; Sử dụng file định nghĩa cho vi điều khiển
ATmega324P
https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:
Main:
; Lấy giá trị từ nibble cao của PORTA
ldi r16, 0xF0 ; Load mask để chỉ lấy 4 bit cao
in r17, PORTA ; Đọc giá trị từ PORTA
and r17, r16 ; Lấy chỉ 4 bit cao
BÀI 4
1. Trả lời các câu hỏi
https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:
..........................................................................................................................
BÀI 5
1. Trả lời các câu hỏi
a. Khi Switch ở trạng thái nhấn/nhả, giá trị chân Port bằng bao nhiêu?
b. Để LED sáng, chân port xuất ra mức logic gì?
c. Mã nguồn với chú thích
a.
Khi Switch ở trạng thái nhấn (pressed), giá trị chân Port sẽ là LOW (0), vì
dòng điện được điều khiển trực tiếp từ nguồn tiếp xúc của Switch với đất
(GND). Khi Switch ở trạng thái nhả (released), giá trị chân Port sẽ là HIGH
(1), vì dòng điện sẽ được kéo lên mức logic HIGH thông qua điện trở pull-up
nội bộ hoặc ngoại bộ.
b. Để LED sáng, chân port cần xuất ra mức logic LOW (0). Trong một hệ
thống dùng LED thông thường (không sử dụng driver động), việc đưa chân
port xuất ra mức logic LOW sẽ làm cho dòng điện chạy qua LED và nó sẽ
phát sáng.
c. Dưới đây là mã nguồn Assembly AVR với chú thích cho việc đọc trạng thái
của Switch và bật LED tương ứng:
.include "m324pdef.inc" ; Sử dụng file định nghĩa cho vi điều khiển
https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:
ATmega324P
.equ SWITCH_PIN = PINA0 ; Định nghĩa chân kết nối với Switch
.equ LED_PIN = PORTB0 ; Định nghĩa chân kết nối với LED
Main:
; Đọc trạng thái của Switch từ chân PORTA0
sbis PINA, SWITCH_PIN ; Kiểm tra xem Switch có ở trạng thái HIGH
(1) hay không
rjmp SwitchPressed ; Nếu Switch ở trạng thái HIGH, nhảy đến
SwitchPressed
rjmp SwitchReleased ; Nếu Switch ở trạng thái LOW, nhảy đến
SwitchReleased
SwitchPressed:
; Bật LED bằng cách đưa chân PORTB0 xuất ra mức logic LOW (0)
cbi PORTB, LED_PIN
rjmp Main
SwitchReleased:
; Tắt LED bằng cách đưa chân PORTB0 xuất ra mức logic HIGH (1)
https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:
https://doe.dee.hcmut.edu.vn/