baocaoLAB - L04 - Nhom06 - Tô Trần Hữu Luân

You might also like

Download as pdf or txt
Download as pdf or txt
You are on page 1of 175

ĐẠI HỌC QUỐC GIA TP.

HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA


BÁO CÁO THÍ NGHIỆM

VI XỬ LÝ

Nhóm thí nghiệm: Nhóm 06 – Lớp L04


GVHD: Nguyễn Phan Hải Phú

STT Họ tên MSSV

1 Tô Trần Hữu Luân 2113985

2 Võ Phước Luân 2113990

3 Nguyễn Quang Minh 2152768

TP. Hồ Chí Minh, ngày 03 tháng 04 năm 2023

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:

 Tài liệu hướng dẫn thí nghiệm, chương 1, 2

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)

1
b) Viết chương trình đọc liên tục trạng thái của DIP Switch và gửi ra LED. Nếu Swich ở
trạng thái OFF, LED tương ứng sẽ tắt.
.CSEG
.ORG 0x00
CLR R16
OUT DDRA,R16
LDI R16,0xFF
OUT PORTA,R16
LDI R16,0xFF
OUT DDRB,R16
CLR R16
OUT PORTB,R16
LP: IN R16,PINA
COM R16
OUT PORTB,R16
RJMP LP

2
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
Để lấy 4byte thấp:
IN R18, PINA
MOV R19, R18
ANDI R18, $0F
Để lấy 4byte cao:
ANDI R19, $F0
SWAP R19
b. Enable điện trở pullup như thế nào?
PORTA là port nhập nên để xét điện trở kéo lên cho nó ta chỉ cần out giá trị
$FF ra thanh ghi PORTA.
c. Khi Switch ở trạng thái ON/OFF, giá trị chân Port bằng bao nhiêu?
Switch ON: chân PORTA có giá trị 0, chân PORTB có giá trị 1
Switch OFF: chân PORTA có giá trị 1, chân PORTB có giá trị 0
d. Khi chân port ở trạng thái 1, BAR LED sáng hay tắt?
Port ở trạng thái 1 thì BAR LED sáng.

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.
.CSEG
.ORG 0x00
CLR R16
OUT DDRA,R16
LDI R16,0xFF
OUT PORTA,R16
LDI R16,0xFF
OUT DDRB,R16
CLR R16
OUT PORTB,R16
LP: IN R16,PINA
LDI R17,5
ADD R16,R17
COM R16
OUT PORTB,R16
RJMP LP

b) Thay đổi trạng thái của Dip Switch và quan sát trạng thái Bar LED

3
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
VD: PORTA = 0b0111_1111, thì PORTB = 3*15.
.CSEG

4
.ORG 0x00
CLR R16
OUT DDRA,R16
LDI R16,0xFF
OUT PORTA,R16
LDI R16,0xFF
OUT DDRB,R16
CLR R16
OUT PORTB,R16
LP: IN R16,PINA
MOV R17,R16
ANDI R16,0b00001111
ANDI R17,0b11110000
SWAP R17
MUL R16,R17
COM R0
OUT PORTB,R0
RJMP LP

b) Thay đổi trạng thái của Dip Switch và quan sát trạng thái Bar LED

5
Trả lời các câu hỏi
Làm thế nào lấy giá trị từ 2 nibble của PORT A
Để lấy 4byte thấp:
IN R18, PINA
MOV R19, R18
ANDI R18, $0F
Để lấy 4byte cao:
ANDI R19, $F0
SWAP R19

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

6
VD: PORTA = 0b0111_1111, thì PORTB = 3* (-1).
.CSEG
.ORG 0x00
CLR R16
OUT DDRA,R16
LDI R16,0xFF
OUT PORTA,R16
LDI R16,0xFF
OUT DDRB,R16
CLR R16
OUT PORTB,R16
LP: IN R16,PINA
MOV R17,R16
ANDI R16,0b00001111
LDI R18,0x08
AND R18,R16
BRNE SOAM1
RJMP TT1
SOAM1: ORI R16,0b11110000
TT1: ANDI R17,0b11110000
SWAP R17
LDI R18,0x08
AND R18,R16
BRNE SOAM2
RJMP TT2
SOAM2: ORI R17,0b11110000
TT2: MULS R16,R17
COM R0
OUT PORTB,R0
RJMP LP

b) Thay đổi trạng thái của Dip Switch và quan sát trạng thái Bar LED

7
8
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)

b) Viết chương trình bật LED nếu SW nhấn, tắt LED nếu SW nhả.

.cseg
.org 0x00
start: CBI DDRA,0
SBI PORTA,0
SBI DDRA,1
CBI PORTA,1
MAIN: SBIS PINA,0
RJMP RELEASE
PRESSED: CBI PORTA,1
RJMP MAIN
RELEASE: SBI PORTA,1
RJMP MAIN

9
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?
Nhấn: PORTA0 = 0
Nhả: PORTA0 = 1
b. Để LED sáng, chân port xuất ra mức logic gì?
LED sáng chân PORTA1 xuất mức 1

10
MỤC TIÊU:

 Thực hiện các lệnh tạo trễ dùng câu lệnh


 Thực hiện giao tiếp với thanh ghi dịch

THAM KHẢO:

 Tài liệu hướng dẫn thí nghiệm, chương 1, 2

BÀI 1

Cho chương trình như sau:


.include "m324PAdef.inc"
.org 00
ldi r16,0x01
out DDRA, r16
start:
sbi PORTA,PINA0
cbi PORTA, PINA0
rjmp start

Kết nối PA0 vào một kênh đo trên khối TEST STATION và đo dạng xung trên
oscilloscope

11
BÀI 2

a) Viết chương trình con Delay1ms và dùng nó để viết chương trình tạo xung vuông tần số
1Khz trên PA0.
DELAY_1MS: LDI R21,80 ;1MC
L1: LDI R20,25 ;1MC
L2: DEC R20 ;1MC
NOP ;1MC
BRNE L2 ;2/1MC
DEC R21 ;1MC
BRNE L1 ;2/1MC
RET ;4MC
Chương trình tạo xung vuông tần số 1Khz trên PA0.
.cseg
.org 0x00
START:
SBI DDRA, 0
MAIN:
CBI PORTA,0
CALL DELAY_05MS
SBI PORTA,0
CALL DELAY_05MS
JMP MAIN
DELAY_05MS:
LDI R21,40 ;1MC
L1: LDI R20,25 ;1MC
L2: DEC R20 ;1MC
NOP ;1MC

12
BRNE L2 ;2/1MC
DEC R21 ;1MC
BRNE L1 ;2/1MC
RET ;4MC

13
b) Dùng chương trình con này viết các chương trình con Delay10ms, Delay100ms, Delay1s.

DELAY_10MS: LDI R21,80 ;1MC


L1: LDI R20,250 ;1MC
L2: DEC R20 ;1MC
NOP ;1MC
BRNE L2 ;2/1MC
DEC R21 ;1MC
BRNE L1 ;2/1MC
RET ;4MC

DL100ms: LDI R22, 80


LP3: LDI R21, 10
LP2: LDI R20, 250
LP1: NOP
DEC R20
BRNE LP1
DEC R21
BRNE LP2
DEC R22
BRNE LP3
RET

DL1s: LDI R22, 80


LP3: LDI R21, 100
LP2: LDI R20, 250
LP1: NOP
DEC R20
BRNE LP1
DEC R21
BRNE LP2
DEC R22
BRNE LP3
RET

14
Trả lời các câu hỏi
a. Cách tính số chu kỳ máy để thực hiện chương trình con Delay1ms. Trình bày
hình ảnh mô phỏng
Tần số của Atmega324 là 8MHz tương ứng với 1MC = 1uS.
Delay 1ms sẽ tương ứng với 1000MC.
Áp dụng công thức TDL = 4 x m x n = 1000.
Ta chọn được m = 250, n= 1.

Ta có thể thấy chu kì máy gần 1000.

15
b. Hình ảnh xung 1Khz trên PA0

c) Dùng chương trình con Delay1s viết chương trình chớp/tắt 1 LED gắn vào PA0.

.cseg
.org 0x00
START: SBI DDRA, 0
MAIN: CBI PORTA,0
CALL DL1s
SBI PORTA,0
CALL DL1s
JMP MAIN
DL1s: LDI R22, 80
LP3: LDI R21, 100
LP2: LDI R20, 250
LP1: NOP
DEC R20
BRNE LP1
DEC R21
BRNE LP2
DEC R22
BRNE LP3
RET

16
BÀI 3
1. Trả lời các câu hỏi

17
a. Mô tả kết nối trên kit thí nghiệm

18
b. Theo như datasheet của 74HC595, tần số clock cao nhất mà nó có thể hoạt
động được là bao nhiêu. 35MHz

c. Nếu muốn mở rộng hiển thị ra 16 LED thì ta phải làm như thế nào?

Ta sẽ viết một mã nguồn tương tự như bên dưới với cả PORTA và PORTB đều là
output, kết nối PORTB như câu a với một dãy bar led khác

d. Mã nguồn với chú thích

main:
call initport ; cấu hình ngõ vào
call cleardata ; xoá dữ liệu
call shiftoutdata ; dịch dữ liệu vào
initport:
ldi r24,0x0F
out DDRB, r24 ; DDRB là ngõ ra
ret
cleardata:
cbi PORTB, 3
sbi PORTB, 3
ret
;Shift out data
shiftoutdata:
again:
ldi r20,0xFF
cbi PORTB, 1
LDI R25, 15; dịch 8bit 2 lần
shiftloop:
lsl r20
brcc carry ; kiểm tra cờ C
sbi PORTB, 0
rjmp sh_cp
carry:
cbi PORTB, 0
sh_cp:
cbi PORTB, 1 ; gửi xung gửi dữ liệu vào thanh ghi dịch
sbi PORTB, 1

19
sbi PORTB, 2 ; gửi xung xuất dữ liệu từ thanh ghi dịch
cbi PORTB, 2

rcall DELAY_500ms
dec R25 ;
brne shiftloop
rjmp again
ret
DELAY_500ms:
ldi r16, 21
ldi r17, 75
ldi r18, 191
L1: dec r18
brne L1
dec r17
brne L1
dec r16
brne L1
nop
ret

20
MỤC TIÊU:

 Hiểu cách chống rung phím


 Hiểu cách giao tiếp LCD
 Hiểu cách giao tiếp phím đơn
 Hiểu cách giao tiếp bàn phím ma trận

THAM KHẢO:

 Tài liệu hướng dẫn thí nghiệm, chương 1, 2 , 3 ,6

BÀI 1

a) Kết nối một PORT của AVR vào J33 (Header điều khiển LCD) trên kit thí nghiệm.
b) Dùng các chương trình mẫu trong tài liệu hướng dẫn thí nghiệm, viết chương trình khởi
động LCD và xuất lên LCD như sau. (XX là số nhóm)

TN VXL-AVR
Nhom: XX

BÀI 2

c) Kết nối 1 switch đến 1 chân port của AVR, kết nối module BAR LED đến 1 port của
AVR, kết nối LCD đến 1 port của AVR
d) Viết chương trình đếm số lần nhấn nút và xuất kết quả ra barled, đồng thời xuất ra LCD
(không chống rung)

e) Thêm tính năng chống rung phím vào chương trình

f) Thực hiện chương trình, nhấn/nhả nút và quan sát kết quả

BÀI 3

a) Kết nối tín hiệu từ một port của AVR đến module bàn phím ma trận , kết nối module
BAR LED và LCD đến 2 port khác của AVR.
b) Viết chương trình con SCANKEY để quét bàn phím ma trận và trả về giá trị từ 0x0 đến
0xF ứng với mã của phím được nhấn. Nếu không có phím nào được nhấn trả về giá trị
0xFF. Giá trị trả về chứa trong R24

21
c) Dùng chương trình con này, viết chương trình thực hiện việc quét phím và xuất giá trị
đọc được lên bar led và LCD.

d) Thực hiện chương trình, quan sát kết quả

BÀI 1
1. Trả lời các câu hỏi
a. LCD phân biệt command và data bằng cách nào?
Dựa vào chân RS
b. Ngoài cách đọc bit BUSY, còn cách nào để đảm bảo là LCD rảnh khi gửi dữ
liệu/command?
Delay cho mỗi lần thực thi lệnh
c. Mô tả kết nối trên kit thí nghiệm.

22
.EQU LCD=PORTC ;PORTC giao tiếp bus LCD 16 x 2
.EQU LCD_DR=DDRC
.EQU LCD_IN=PINC
.EQU RS=0 ;bit RS
.EQU RW=1 ;bit RW
.EQU E=2 ;bit E
.EQU CR=$0D ;mã xuống dòng
.EQU NULL=$00 ;mã kết thúc
.ORG 0
RJMP MAIN
.ORG 0X40
MAIN: LDI R16,HIGH(RAMEND) ;đưa stack lên vùng địa chỉ cao
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,0XFF
OUT LCD_DR,R16 ;khai báo PORTC là output
CBI LCD,RS ;RS=PC0=0
CBI LCD,RW ;RW=PC1=0 truy xuất ghi
CBI LCD,E ;E=PC2=0 cấm LCD
; ;khởi tạo LCD gồm:
;reset cấp nguồn ;cấu hình LCD hoạt động chế độ 4 bit ;----------------------------
RCALL POWER_RESET_LCD4
;reset cấp nguồn LCD 4 bit
RCALL INIT_LCD4
;ctc khởi động LCD 4 bit
;
CBI LCD,RS
;RS=0 ghi lệnh
LDI R17,$84
;con trỏ bắt đầu ở dòng 1 vị trí thứ 4
RCALL OUT_LCD4_2
LDI R16,1
;chờ 100μs
RCALL DELAY_US
LDI ZH,HIGH(TAB<<1)
;Z trỏ đầu bảng tra ký tự
LDI ZL,LOW(TAB<<1)
LINE1: LPM R17,Z+
;lấy mã ASCII ký tự từ Flash ROM
CPI R17,CR
;kiểm tra ký tự xuống dòng ?
BREQ DOWN
;ký tự CR xuống dòng
SBI LCD,RS
;RS=1 ghi data hiển thị LCD
RCALL OUT_LCD4_2
;ghi mã ASCII ký tự ra LCD
LDI R16,1
;chờ 100μs
RCALL DELAY_US
RJMP LINE1
;tiếp tục hiển thị dòng 1
DOWN: CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,$C4 ;con trỏ bắt đầu ở dòng 2 vị trí thứ 3
RCALL OUT_LCD4_2
LDI R16,1 ;chờ 100μs
RCALL DELAY_US

23
LINE2: LPM R17,Z+ ;lấy mã ASCII ký tự từ Flash ROM
CPI R17,NULL ;kiểm tra ký tự kết thúc
BREQ HERE ;ký tự NULL thoát
SBI LCD,RS ;RS=1 ghi data hiển thị LCD
RCALL OUT_LCD4_2 ;ghi mã ASCII ký tự ra LCD
LDI R16,1 ;chờ 100μs
RCALL DELAY_US
RJMP LINE2 ;tiếp tục hiển thị dòng 2
HERE: RJMP HERE
;
;Các lệnh reset cấp nguồn LCD 4 bit
;Chờ hơn 15ms
;Ghi 4 bit mã lệnh 30H lần 1, chờ ít nhất 4.1ms
;Ghi 4 bit mã lệnh 30H lần 2, chờ ít nhất 100μs
;Ghi byte mã lệnh 32H, chờ ít nhất 100μs sau mỗi lần ghi 4 bit
;
POWER_RESET_LCD4:
LDI R16,200 ;delay 20ms
RCALL DELAY_US ;ctc delay 100μsxR16
;Ghi 4 bit cao mã lệnh 30H lần 1, chờ 4.2ms
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,$30 ;mã lệnh=$30 lần 1,RS=RW=E=0
RCALL OUT_LCD4 ;ctc ghi ra LCD 4 bit cao
LDI R16,42 ;delay 4.2ms
RCALL DELAY_US
;Ghi 4 bit cao mã lệnh 30H lần 2, chờ 200μs
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,$30 ;mã lệnh=$30 lần 2
RCALL OUT_LCD4 ;ctc ghi ra LCD 4 bit cao
LDI R16,2 ;delay 200μs
RCALL DELAY_US
;Ghi byte mã lệnh 32H
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,$32
RCALL OUT_LCD4_2; ctc ghi 1 byte, mỗi lần 4 bit
RET
;INIT_LCD4 khởi động LCD ghi 4 byte mã lệnh
;Function set: 0x28: 8 bit, 2 dòng font 5x8
;Clear display: 0x01: xóa màn hình
;Display on/off control: 0x0C: màn hình on, con trỏ off
;Entry mode set: 0x06: dịch phải con trỏ, địa chỉ DDRAM tăng 1 khi ghi data
;
INIT_LCD4: CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,0x28 ;chế độ giao tiếp 8 bit, 2 dòng font 5x8
RCALL OUT_LCD4_2
;
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,0x01 ;xóa màn hình
RCALL OUT_LCD4_2
LDI R16,20 ;chờ 2ms sau lệnh Clear display
RCALL DELAY_US
;
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,0x0C ;màn hình on, con trỏ off
RCALL OUT_LCD4_2
;
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,0x06 ;dịch phải con trỏ, địa chỉ DDRAM tăng 1 khi ghi data

24
RCALL OUT_LCD4_2
;
RET
;
;OUT_LCD4_2 ghi 1 byte mã lệnh/data ra LCD
;chia làm 2 lần ghi 4bit: 4 bit cao trước, 4 bit thấp sau
;Input: R17 chứa mã lệnh/data,R16
;bit RS=0/1:lệnh/data,bit RW=0:ghi
;Sử dụng ctc OUT_LCD4
;
OUT_LCD4_2:
IN R16,LCD ;đọc PORT LCD
ANDI R16,(1<<RS) ;lọc bit RS
PUSH R16 ;cất R16
PUSH R17 ;cất R17
ANDI R17,$F0 ;lấy 4 bit cao
OR R17,R16 ;ghép bit RS
RCALL OUT_LCD4 ;ghi ra LCD
LDI R16,1 ;chờ 100us
RCALL DELAY_US
POP R17 ;phục hồi R17
POP R16 ;phục hồi R16
SWAP R17 ;đảo 4 bit
;lấy 4 bit thấp chuyển thành cao
ANDI R17,$F0
OR R17,R16 ;ghép bit RS
RCALL OUT_LCD4;ghi ra LCD
LDI R16,1 ;chờ 100us
RCALL DELAY_US
RET
;
;OUT_LCD4 ghi mã lệnh/data ra LCD
;Input: R17 chứa mã lệnh/data 4 bit cao ;
OUT_LCD4: OUT LCD,R17
SBI LCD,E
CBI LCD,E
RET
;
;DELAY_US tạo thời gian trễ =R16x100μs(Fosc=8MHz, CKDIV8 = 1)
;Input:R16 hệ số nhân thời gian trễ 1 đến 255 ;------------------------------------
DELAY_US: MOV R15,R16 ;1MC nạp data cho R15
LDI R16,200 ;1MC sử dụng R16
L1: MOV R14,R16 ;1MC nạp data cho R14
L2: DEC R14 ;1MC
NOP ;1MC
BRNE L2 ;2/1MC
DEC R15 ;1MC
BRNE L1 ;2/1MC
RET ;4MC
.ORG 0X0200
;
TAB: .DB "TN VXL-AVR",$0D,"Nhom: XX",$00

25
BÀI 2

a) Kết nối 1 switch đến 1 chân port của AVR, kết nối module BAR LED đến 1 port của
AVR, kết nối LCD đến 1 port của AVR

26
b) Viết chương trình đếm số lần nhấn nút và xuất kết quả ra barled, đồng thời xuất ra LCD
(không chống rung)

c) Thêm tính năng chống rung phím vào chương trình


.ORG 0
RJMP MAIN
.ORG 0X40
MAIN : ; r20 chua ket qua
CBI DDRA,0
CBI DDRA,1
SBI PORTA,0
SBI PORTA,1
LDI R16,0XFF
OUT DDRD,R16
STACK :
LDI R16,HIGH (RAMEND)
OUT SPH,R16
LDI R16,LOW (RAMEND )
OUT SPL,R16
START: ; RESET
LDI R22,0X00
OUT PORTD,R22
RCALL XUATLCD
NHAN_PHIM :
SBIS PINA,1 ; KIEM TRA RESET
RJMP START
SBIC PINA,0 ; NEU PHIM NHAN
RJMP NHAN_PHIM
RCALL DELAY20MS ; CHONG RUN PHIM
SBIC PINA,0
RJMP NHAN_PHIM

27
NHA_PHIM:
SBIS PINA,0
RJMP NHA_PHIM
RCALL DELAY20MS ; CHONG RUN KIEM TRA NHA PHIM
SBIS PINA,0
RJMP NHA_PHIM
INC R22 ; TANG BIEN DEM
OUT PORTD,R22
RCALL XUATLCD
RJMP NHAN_PHIM
DELAY20MS:
LDI R21,160 ;1MC
Lp1: LDI R20,250 ;1MC
Lp2: DEC R20 ;1MC
NOP ;1MC
BRNE Lp2 ;2/1MC
DEC R21 ;1MC
BRNE Lp1 ;2/1MC
RET ;4MC
XUATLCD:
PUSH R16
.EQU LCD=PORTC ;PORTC giao tiếp bus LCD 16 x 2
.EQU LCD_DR=DDRC
.EQU LCD_IN=PINC
.EQU RS=0 ;bit RS
.EQU RW=1 ;bit RW
.EQU E=2 ;bit E
.EQU CR=$0D ;mã xuống dòng
.EQU NULL=$00 ;mã kết thúc
LDI R16,HIGH(RAMEND) ;đưa stack lên vùng địa chỉ cao
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,0XFF
OUT LCD_DR,R16 ;khai báo PORTC là output
CBI LCD,RS ;RS=PC0=0
CBI LCD,RW ;RW=PC1=0 truy xuất ghi
CBI LCD,E ;E=PC2=0 cấm LCD
; ;khởi tạo LCD gồm:
;reset cấp nguồn ;cấu hình LCD hoạt động chế độ 4 bit ;--------------------------------
RCALL POWER_RESET_LCD4
;reset cấp nguồn LCD 4 bit
RCALL INIT_LCD4
;ctc khởi động LCD 4 bit
;
CBI LCD,RS
;RS=0 ghi lệnh
LDI R17,$83
;con trỏ bắt đầu ở dòng 1 vị trí thứ 3
RCALL OUT_LCD4_2
LDI R16,1
;chờ 100μs
RCALL DELAY_US
LDI ZH,HIGH(TAB<<1)
;Z trỏ đầu bảng tra ký tự
LDI ZL,LOW(TAB<<1)
LINE1: LPM R17,Z+
;lấy mã ASCII ký tự từ Flash ROM

28
CPI R17,CR
;kiểm tra ký tự xuống dòng ?
BREQ DOWN
;ký tự CR xuống dòng
SBI LCD,RS
;RS=1 ghi data hiển thị LCD
RCALL OUT_LCD4_2
;ghi mã ASCII ký tự ra LCD
LDI R16,1
;chờ 100μs
RCALL DELAY_US
RJMP LINE1
;tiếp tục hiển thị dòng 1
DOWN: CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,$C7 ;con trỏ bắt đầu ở dòng 2 vị trí thứ 7
RCALL OUT_LCD4_2
LDI R16,1 ;chờ 100μs
RCALL DELAY_US
RCALL HEXTOASCII
LDI YH,0X08
LDI YL,0X00
LINE2:
XUATTRAM:
LD R17,Y+
CPI R17,48
BREQ XUATCHUC
SBI LCD,RS
RCALL OUT_LCD4_2
LDI R16,1
RCALL DELAY_US
XUATCHUC:
LD R17,Y+
CPI R17,48
BREQ XUATDONVI
SBI LCD,RS
RCALL OUT_LCD4_2
LDI R16,1
RCALL DELAY_US
XUATdonvi:
LD R17,Y+
SBI LCD,RS
RCALL OUT_LCD4_2
LDI R16,1
RCALL DELAY_US
HERE: JMP NHAN_PHIM
;
;Các lệnh reset cấp nguồn LCD 4 bit
;Chờ hơn 15ms
;Ghi 4 bit mã lệnh 30H lần 1, chờ ít nhất 4.1ms
;Ghi 4 bit mã lệnh 30H lần 2, chờ ít nhất 100μs
;Ghi byte mã lệnh 32H, chờ ít nhất 100μs sau mỗi lần ghi 4 bit
POWER_RESET_LCD4:
LDI R16,200 ;delay 20ms
RCALL DELAY_US ;ctc delay 100μsxR16
;Ghi 4 bit cao mã lệnh 30H lần 1, chờ 4.2ms
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,$30 ;mã lệnh=$30 lần 1,RS=RW=E=0
RCALL OUT_LCD4 ;ctc ghi ra LCD 4 bit cao

29
LDI R16,42 ;delay 4.2ms
RCALL DELAY_US
;Ghi 4 bit cao mã lệnh 30H lần 2, chờ 200μs
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,$30 ;mã lệnh=$30 lần 2
RCALL OUT_LCD4 ;ctc ghi ra LCD 4 bit cao
LDI R16,2 ;delay 200μs
RCALL DELAY_US
;Ghi byte mã lệnh 32H
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,$32
RCALL OUT_LCD4_2; ctc ghi 1 byte, mỗi lần 4 bit
RET
;INIT_LCD4 khởi động LCD ghi 4 byte mã lệnh
;Function set: 0x28: 8 bit, 2 dòng font 5x8
;Clear display: 0x01: xóa màn hình
;Display on/off control: 0x0C: màn hình on, con trỏ off
;Entry mode set: 0x06: dịch phải con trỏ, địa chỉ DDRAM tăng 1 khi ghi data
;
INIT_LCD4: CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,0x28 ;chế độ giao tiếp 8 bit, 2 dòng font 5x8
RCALL OUT_LCD4_2
;
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,0x01 ;xóa màn hình
RCALL OUT_LCD4_2
LDI R16,20 ;chờ 2ms sau lệnh Clear display
RCALL DELAY_US
;
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,0x0C ;màn hình on, con trỏ off
RCALL OUT_LCD4_2
;
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,0x06 ;dịch phải con trỏ, địa chỉ DDRAM tăng 1 khi ghi data
RCALL OUT_LCD4_2
;
RET
;
;OUT_LCD4_2 ghi 1 byte mã lệnh/data ra LCD
;chia làm 2 lần ghi 4bit: 4 bit cao trước, 4 bit thấp sau
;Input: R17 chứa mã lệnh/data,R16
;bit RS=0/1:lệnh/data,bit RW=0:ghi
;Sử dụng ctc OUT_LCD4
;
OUT_LCD4_2:
IN R16,LCD ;đọc PORT LCD
ANDI R16,(1<<RS) ;lọc bit RS
PUSH R16 ;cất R16
PUSH R17 ;cất R17
ANDI R17,$F0 ;lấy 4 bit cao
OR R17,R16 ;ghép bit RS
RCALL OUT_LCD4 ;ghi ra LCD
LDI R16,1 ;chờ 100us
RCALL DELAY_US
POP R17 ;phục hồi R17
POP R16 ;phục hồi R16
SWAP R17 ;đảo 4 bit

30
;lấy 4 bit thấp chuyển thành cao
ANDI R17,$F0
OR R17,R16 ;ghép bit RS
RCALL OUT_LCD4;ghi ra LCD
LDI R16,1 ;chờ 100us
RCALL DELAY_US
RET
;
;OUT_LCD4 ghi mã lệnh/data ra LCD
;Input: R17 chứa mã lệnh/data 4 bit cao ;
OUT_LCD4: OUT LCD,R17
SBI LCD,E
CBI LCD,E
RET
;
;DELAY_US tạo thời gian trễ =R16x100μs(Fosc=8MHz, CKDIV8 = 1)
;Input:R16 hệ số nhân thời gian trễ 1 đến 255 ;----------------------------------------
DELAY_US: MOV R15,R16 ;1MC nạp data cho R15
LDI R16,200 ;1MC sử dụng R16
L1: MOV R14,R16 ;1MC nạp data cho R14
L2: DEC R14 ;1MC
NOP ;1MC
BRNE L2 ;2/1MC
DEC R15 ;1MC
BRNE L1 ;2/1MC
RET ;4MC
.ORG 0X0200
;
TAB: .DB "KET QUA LA:" ,$0D
RET
HEXTOASCII:
push r22
push r21
push r20
push r18
mov r18,R22
ldi r20,0
ldi r21,0
ldi r22,0
loop1:
cpi r18,10
brlo a
subi r18,10
inc r21
rjmp loop1
a: mov r22,r18
loop2:
cpi r21,10
brlo b
subi r21,10
inc r20
rjmp loop2
b:
mov r17,r20
rcall HEX_ASC
sts 0x800,r18
mov r17,r21
rcall HEX_ASC

31
sts 0x801,r18
mov r17,r22
rcall HEX_ASC
sts 0x802,r18
LDI R18,0X00
STS 0X803,R18
pop r18
pop r20
pop r21
pop r22
ret
;HEX_ASC chuyển từ mã Hex sang mã ASCII
;Input R17=mã Hex,Output R18=mã ASCII
;
HEX_ASC:
CPI R17,0X0A
BRCS NUM
LDI R18,0X37
RJMP CHAR
NUM: LDI R18,0X30
CHAR: ADD R18,R17
RET

f) Thực hiện chương trình, quan sát kết quả

32
BÀI 3

a) Kết nối tín hiệu từ một port của AVR đến module bàn phím ma trận , kết nối module
BAR LED và LCD đến 2 port khác của AVR.
b) Viết chương trình con SCANKEY để quét bàn phím ma trận và trả về giá trị từ 0x0 đến
0xF ứng với mã của phím được nhấn. Nếu không có phím nào được nhấn trả về giá trị
0xFF. Giá trị trả về chứa trong R24
;
;SCANKEY đọc trạng thái các phím,
;Trả về R24= mã phím và C=1 nếu có phím nhấn
;Trả về C=0 nếu phím chưa nhấn
;
SCANKEY:
LDI R24,4 ;R24 đếm số lần quét cột
LDI R20,0XFE ;bắt đầu quét cột 0
SCAN_COL:
OUT PORTA,R20
IN R19,PINA ;đọc trạng thái hàng
IN R19,PINA ;đọc lại trạng thái hàng
ANDI R19,0XF0 ;che 4 bit cao lấy mã hàng

33
CPI R19,0XF0 ;xem có phím nhấn?
BRNE CHK_KEY ;R19 khác F0H: có phím nhấn
LSL R20 ;quét cột kế tiếp
INC R20 ;đặt LSB=1
DEC R24
BRNE SCAN_COL ;tiếp tục quét hết số cột
CLC ;phím chưa nhấn,C=0
RJMP EXIT ;thoát
CHK_KEY:
SUBI R24,4 ;tính vị trí cột
NEG R24 ;bù 2 lấy số dương
SWAP R19 ;đảo sang 4 bit thấp mã hàng
LDI R20,4 ;quét 4 hàng tìm vị trí hàng…
SCAN_ROW: ; tìm vị trí hàng có phím được nhấn
ROR R19 ;quay phải mã hàng qua C tìm bit 0
BRCC SET_FLG ;C=0 đúng vị trí hàng có phím nhấn
INC R24 ;không đúng hàng, tăng vị trí hàng thêm 4
INC R24
INC R24
INC R24
DEC R20
BRNE SCAN_ROW ;quét hết 4 hàng
CLC ;không có phím nhấn C=0
LDI R24,0XFF
RJMP EXIT ;thoát
SET_FLG: SEC ;có phím nhấn C=1
EXIT: RET

c) Dùng chương trình con này, viết chương trình thực hiện việc quét phím và xuất giá trị
đọc được lên bar led và LCD.
.EQU OUTPORT=PORTD
.ORG 0
RJMP MAIN
.ORG 0X40
MAIN: LDI R16,HIGH(RAMEND);đưa stack lên vùng địa chỉ cao
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,0X0F
OUT DDRA,R16
LDI R16,0XFF
OUT PORTA,R16
LDI R16,0XFF
OUT DDRD,R16
LDI R16,0X00
OUT PORTD,R16
START:
RCALL KEY_RD ;ctc đọc phím
CLR R16
OUT OUTPORT,R16
OUT OUTPORT,R17 ;hiển thị mã phím ra bar LED
RCALL XUATLCD
RJMP START ;lặp vòng từ đầU
;
;KEY_RD đọc trạng thái phím
;Chống rung phím khi nhấn/nhả 50 lần

34
;Sử dụng SCANKEY nhận dạng phím nhấn: R17 = mã phím, C = 0: chưa nhấn, C = 1: có nhấn
;Chỉ thoát khi có phím nhấn!!!
;
KEY_RD:
LDI R16,50 ;số lần nhận dạng phím nhấn
BACK1: RCALL SCANKEY ;gọi ctc nhận dạng phím
BRCC KEY_RD ;C=0 phím chưa nhấn lặp lại
DEC R16 ;đếm số lần nhận dạng phím
BRNE BACK1 ;lặp vòng cho đủ số lần đếm
PUSH R17 ;xác nhận phím nhấn,cất mã phím
WAIT_1: LDI R16,50 ;số lần nhận dạng phím nhả
BACK2: RCALL SCANKEY ;gọi ctc nhận dạng phím
BRCS WAIT_1 ;C=1 phím chưa nhả
DEC R16 ;đếm số lần nhận dạng phím
BRNE BACK2 ;lặp vòng cho đủ số lần đếm
POP R17 ;xác nhận phím nhả lấy lại mã phím
MOV R24,R17
RET
;SCANKEY đọc trạng thái các phím,
;Trả về R24= mã phím và C=1 nếu có phím nhấn
;Trả về C=0 nếu phím chưa nhấn
;
SCANKEY:
LDI R17,4 ;R17 đếm số lần quét cột
LDI R20,0XFE ;bắt đầu quét cột 0
SCAN_COL:
OUT PORTA,R20
IN R19,PINA ;đọc trạng thái hàng
IN R19,PINA ;đọc lại trạng thái hàng
ANDI R19,0XF0 ;che 4 bit cao lấy mã hàng
CPI R19,0XF0 ;xem có phím nhấn?
BRNE CHK_KEY ;R19 khác F0H: có phím nhấn
LSL R20 ;quét cột kế tiếp
INC R20 ;đặt LSB=1
DEC R17
BRNE SCAN_COL ;tiếp tục quét hết số cột
CLC ;phím chưa nhấn,C=0
MOV R24,R17
RJMP EXIT ;thoát
CHK_KEY:
SUBI R17,4 ;tính vị trí cột
NEG R17 ;bù 2 lấy số dương
SWAP R19 ;đảo sang 4 bit thấp mã hàng
LDI R20,4 ;quét 4 hàng tìm vị trí hàng…
SCAN_ROW: ; tìm vị trí hàng có phím được nhấn
ROR R19 ;quay phải mã hàng qua C tìm bit 0
BRCC SET_FLG ;C=0 đúng vị trí hàng có phím nhấn
INC R17 ;không đúng hàng, tăng vị trí hàng thêm 4
INC R17
INC R17
INC R17
DEC R20
BRNE SCAN_ROW ;quét hết 4 hàng
CLC ;không có phím nhấn C=0
RJMP EXIT ;thoát
SET_FLG: SEC ;có phím nhấn C=1
EXIT:
MOV R24,R17

35
RET
XUATLCD:
PUSH R16
.EQU LCD=PORTB ;PORTB giao tiếp bus LCD 16 x 2
.EQU LCD_DR=DDRB
.EQU LCD_IN=PINB
.EQU RS=0 ;bit RS
.EQU RW=1 ;bit RW
.EQU E=2 ;bit E
.EQU CR=$0D ;mã xuống dòng
.EQU NULL=$00 ;mã kết thúc
LDI R16,HIGH(RAMEND) ;đưa stack lên vùng địa chỉ cao
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,0XFF
OUT LCD_DR,R16 ;khai báo PORTC là output
CBI LCD,RS ;RS=PC0=0
CBI LCD,RW ;RW=PC1=0 truy xuất ghi
CBI LCD,E ;E=PC2=0 cấm LCD
; ;khởi tạo LCD gồm:
;reset cấp nguồn ;cấu hình LCD hoạt động chế độ 4 bit ;-------------------------------
-
RCALL POWER_RESET_LCD4
;reset cấp nguồn LCD 4 bit
RCALL INIT_LCD4
;ctc khởi động LCD 4 bit
;
CBI LCD,RS
;RS=0 ghi lệnh
LDI R17,$83
;con trỏ bắt đầu ở dòng 1 vị trí thứ 3
RCALL OUT_LCD4_2
LDI R16,1
;chờ 100μs
RCALL DELAY_US
LDI ZH,HIGH(TAB<<1)
;Z trỏ đầu bảng tra ký tự
LDI ZL,LOW(TAB<<1)
LINE1: LPM R17,Z+
;lấy mã ASCII ký tự từ Flash ROM
CPI R17,CR
;kiểm tra ký tự xuống dòng ?
BREQ DOWN
;ký tự CR xuống dòng
SBI LCD,RS
;RS=1 ghi data hiển thị LCD
RCALL OUT_LCD4_2
;ghi mã ASCII ký tự ra LCD
LDI R16,1
;chờ 100μs
RCALL DELAY_US
RJMP LINE1
;tiếp tục hiển thị dòng 1
DOWN: CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,$C5 ;con trỏ bắt đầu ở dòng 2 vị trí thứ 5
RCALL OUT_LCD4_2
LDI R16,1 ;chờ 100μs

36
RCALL DELAY_US
LINE2:
BREQ XUANCANH
TT: MOV R17,R24
RCALL HEX_ASC
MOV R17,R18
SBI LCD,RS
RCALL OUT_LCD4_2
LDI R16,1
RCALL DELAY_US
RJMP START
XUANCANH:
LPM R17,Z+ ;lấy mã ASCII ký tự từ Flash ROM
CPI R17,NULL ;kiểm tra ký tự kết thúc
BREQ TT ;ký tự NULL thoát
SBI LCD,RS ;RS=1 ghi data hiển thị LCD
RCALL OUT_LCD4_2 ;ghi mã ASCII ký tự ra LCD
LDI R16,1 ;chờ 100μs
RCALL DELAY_US
RJMP XUANCANH ;tiếp tục hiển thị dòng 2
;
;Các lệnh reset cấp nguồn LCD 4 bit
;Chờ hơn 15ms
;Ghi 4 bit mã lệnh 30H lần 1, chờ ít nhất 4.1ms
;Ghi 4 bit mã lệnh 30H lần 2, chờ ít nhất 100μs
;Ghi byte mã lệnh 32H, chờ ít nhất 100μs sau mỗi lần ghi 4 bit
;
POWER_RESET_LCD4:
LDI R16,200 ;delay 20ms
RCALL DELAY_US ;ctc delay 100μsxR16
;Ghi 4 bit cao mã lệnh 30H lần 1, chờ 4.2ms
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,$30 ;mã lệnh=$30 lần 1,RS=RW=E=0
RCALL OUT_LCD4 ;ctc ghi ra LCD 4 bit cao
LDI R16,42 ;delay 4.2ms
RCALL DELAY_US
;Ghi 4 bit cao mã lệnh 30H lần 2, chờ 200μs
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,$30 ;mã lệnh=$30 lần 2
RCALL OUT_LCD4 ;ctc ghi ra LCD 4 bit cao
LDI R16,2 ;delay 200μs
RCALL DELAY_US
;Ghi byte mã lệnh 32H
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,$32
RCALL OUT_LCD4_2; ctc ghi 1 byte, mỗi lần 4 bit
RET
;INIT_LCD4 khởi động LCD ghi 4 byte mã lệnh
;Function set: 0x28: 8 bit, 2 dòng font 5x8
;Clear display: 0x01: xóa màn hình
;Display on/off control: 0x0C: màn hình on, con trỏ off
;Entry mode set: 0x06: dịch phải con trỏ, địa chỉ DDRAM tăng 1 khi ghi data
;
INIT_LCD4: CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,0x28 ;chế độ giao tiếp 8 bit, 2 dòng font 5x8
RCALL OUT_LCD4_2
;
CBI LCD,RS ;RS=0 ghi lệnh

37
LDI R17,0x01 ;xóa màn hình
RCALL OUT_LCD4_2
LDI R16,20 ;chờ 2ms sau lệnh Clear display
RCALL DELAY_US
;
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,0x0C ;màn hình on, con trỏ off
RCALL OUT_LCD4_2
;
CBI LCD,RS ;RS=0 ghi lệnh
LDI R17,0x06 ;dịch phải con trỏ, địa chỉ DDRAM tăng 1 khi ghi data
RCALL OUT_LCD4_2
;
RET
;
;OUT_LCD4_2 ghi 1 byte mã lệnh/data ra LCD
;chia làm 2 lần ghi 4bit: 4 bit cao trước, 4 bit thấp sau
;Input: R17 chứa mã lệnh/data,R16
;bit RS=0/1:lệnh/data,bit RW=0:ghi
;Sử dụng ctc OUT_LCD4
;
OUT_LCD4_2:
IN R16,LCD ;đọc PORT LCD
ANDI R16,(1<<RS) ;lọc bit RS
PUSH R16 ;cất R16
PUSH R17 ;cất R17
ANDI R17,$F0 ;lấy 4 bit cao
OR R17,R16 ;ghép bit RS
RCALL OUT_LCD4 ;ghi ra LCD
LDI R16,1 ;chờ 100us
RCALL DELAY_US
POP R17 ;phục hồi R17
POP R16 ;phục hồi R16
SWAP R17 ;đảo 4 bit
;lấy 4 bit thấp chuyển thành cao
ANDI R17,$F0
OR R17,R16 ;ghép bit RS
RCALL OUT_LCD4;ghi ra LCD
LDI R16,1 ;chờ 100us
RCALL DELAY_US
RET
;
;OUT_LCD4 ghi mã lệnh/data ra LCD
;Input: R17 chứa mã lệnh/data 4 bit cao ;
OUT_LCD4: OUT LCD,R17
SBI LCD,E
CBI LCD,E
RET
;
;DELAY_US tạo thời gian trễ =R16x100μs(Fosc=8MHz, CKDIV8 = 1)
;Input:R16 hệ số nhân thời gian trễ 1 đến 255 ;---------------------------------------
-
DELAY_US: MOV R15,R16 ;1MC nạp data cho R15
LDI R16,200 ;1MC sử dụng R16
L1: MOV R14,R16 ;1MC nạp data cho R14
L2: DEC R14 ;1MC
NOP ;1MC
BRNE L2 ;2/1MC

38
DEC R15 ;1MC
BRNE L1 ;2/1MC
RET ;4MC
.ORG 0X0200
;
TAB: .DB "KET QUA LA :" ,$0D,"PHIM ",0X00
RET
;HEX_ASC chuyển từ mã Hex sang mã ASCII
;Input R17=mã Hex,Output R18=mã ASCII
;
HEX_ASC:
CPI R17,0X0A
BRCS NUM
LDI R18,0X37
RJMP CHAR
NUM: LDI R18,0X30
CHAR: ADD R18,R17
RET

39
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG

MỤC TIÊU:

 Hiểu các mode hoạt động của timer


 Hiểu cách sử dụng timer để tao delay và tạo xung

THAM KHẢO:

 Tài liệu hướng dẫn thí nghiệm, chương 4, 5


 Atmel-2505-Setup-and-Use-of-AVR-Timers_ApplicationNote_AVR130.pdf

BÀI 1

a) Viết chương trình con delay 1 ms sử dụng timer 0. Sử dụng chương trình con này để tạo
xung 1 Khz trên chân PA0.

DELAY1ms:
LDI R17,-125 ;nạp TCNT0 = 0xA0 = -125
OUT TCNT0,R17
LDI R17,0X00 ;TCCR0A= 0000 0000
OUT TCCR0A,R17
LDI R17,0X03 ;Timer0 chạy, chọn CS02:CS00 = 011, hệ số chia N = 64
OUT TCCR0B,R17 ;TCCR0B= 0000 0011, MODE NOR
WAIT:
SBIS TIFR0,TOV0 ;chờ cờ TOV0 = 1 báo Timer0 tràn
RJMP WAIT ;cờ TOV0=0 tiếp tục chờ
SBI TIFR0,TOV0 ;TOV0 = 1 xóa cờ TOV0
LDI R17,0x00 ;dừng Timer0
OUT TCCR0B,R17
RET

BÀI 2

a) Viết chương trình tạo 1 xung vuông 64 us sử dụng timer 0 ở chế độ Normal mode.
Ngõ ra sử dụng chân OC0.
b) Viết chương trình thực hiện tạo xung vuông có chu kỳ 64 us sử dụng timer 1 ở chế độ
CTC mode. Ngõ ra sử dụng chân OC0.

https://doe.dee.hcmut.edu.vn/
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
c) Kết nối chân OC0 ra oscilloscope và quan sát

BÀI 3

a) Cho chương trình sau tạo 2 xung PWM trên OC0A và OC0B

.org 00

call initTimer0

start:

rjmp start

initTimer0:

// Set OC0A (PB3) and OC0B (PB4) pins as outputs

ldi r16, (1 << PB3) | (1 << PB4);

out DDRB,r16

ldi r16, (1 << COM0B1)|(1 << COM0A1) | (1 << WGM00)|(1 << WGM01)

out TCCR0A,r16 // setup TCCR0A

ldi r16, (1 << CS01)

out TCCR0B,r16 // setup TCCR0B

ldi r16, 100

out OCR0A,r16 //OCRA = 100

ldi r16, 75

out OCR0B,r16 //OCRB = 75

ret

b) Kết nối chân OC0A và chân OC0B ra 2 kênh đo của oscilloscope, đo và ghi nhận, giải
thích dạng sóng thu được

Giải thích:

- WGM00 và WGM01 lên 1 lựa chọn mô thức Fast PWM (WGM0[2:0] = 011),
TOP=MAX= 0xFF

https://doe.dee.hcmut.edu.vn/
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
- COM0A1 = 1, COM0A0 = 0: OC0A=0 khi đạt kết quả so sánh OCR0A = 100,
OC0A = 1 khi bộ đếm đạt BOTTOM (trạng thái không đảo)

- COM0B1 = 1,COM0B0 = 0: OC0B=0 khi đạt kết quả so sánh OCR0B = 75,
OC0B = 1 khi bộ đếm đạt BOTTOM (trạng thái không đảo)

- CS02= 0,CS01 = 1, CS00 = 0: clkosc=clkI/O / 8 (CS0[2:0] = 010)


clkI/O 8MHz 1
Tần số 2 sóng: f = 8(TOP+1) = 8 x 256 = 400KHz  Chu kì T = f = 256μs

8 TH 101
Chân OC0A: TH = (100+1)x 8MHz = 101μs  D= T
= 256
= 39,5%

8 TH 76
Chân OC0B: TH = (75+1)x 8MHz = 76μs  D= T
=
256
= 29,7%

BÀI 4

a) Sửa chương trình trên ứng với các trường hợp khác nhau của TCCR0A và TCCR0B

TCCR0A TCCR0B

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 COM0A COM0A COM0B COM0B WGM0 WGM0 FOC0 FOC0 WGM0 CS0 CS0 CS0
1 0 1 0 1 0 A B 2 2 1 0

2 1 0 1 0 1 1 0 0 1 0

3 1 0 1 0 1 1 1 0 1 0

4 1 0 1 0 0 1 0 0 1 0

b) Kết nối chân OC0A và chân OC0B ra 2 kênh đo của oscilloscope, đo và ghi nhận, giải
thích dạng sóng thu được

https://doe.dee.hcmut.edu.vn/
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG

WGM0[2:0] = 011: MODE FPWM (TOP = MAX)

COM0A[1:0] = 10: Clear OC0A khi đạt giá trị so sánh OCR0A=100, set OC0A tại BOTTOM

COM0B[1:0] = 10: Clear OC0B khi đạt giá trị so sánh OCR0B= 75, set OC0B tại BOTTOM

WGM0[2:0] = 011: MODE FPWM (TOP = 0xFF)

COM0A[1:0] = 10, COM0B[1:0] = 10: Clear OC0B khi đạt giá trị so sánh OCR0B = 75, set OC0B tại BOTTOM

https://doe.dee.hcmut.edu.vn/
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
WGM0[2:0] = 011: MODE PCPWM (TOP = 0xFF)

COM0A[1:0 ]= 10: OC0A = 0 khi đếm lên đạt giá trị so sánh OCR0A = 100, OC0A = 1 khi đếm xuống đạt giá trị
so sánh OCR0A = 100

COM0B[1:0] = 10: OC0B = 0 khi đếm lên đạt giá trị so sánh OCR0B = 75, OC0B = 1 khi đếm xuống đạt giá trị so
sánh OCR0B = 75

BÀI 5

a) Viết chương trình tạo ra 1 xung tần số 1Khz, duty cycle 25% trên chân OC0B

1 1
Chu kỳ T = f = 1000 = 1000us, xung vuông có duty cycle 25%  Thời gian delay bit
cao và bit thấp là TH =250 us, TL = 750us
Từ Fosc = 8MHz, CKDIV8 = 1  Tosc = 0.125μs
Giá trị nạp cho thanh ghi TCNT0 (-n) và hệ số chia (N) là:
Với TH = 250us:
Giá trị nạp cho thanh ghi TCNT0 (-n) và hệ số chia (N) là:
TH 250
Chọn N = 8, ta tính được n = T =
0.125 x 8
= 250  −n =− 250
CLKT0

Với TL = 750us:
Giá trị nạp cho thanh ghi TCNT0 (-n) và hệ số chia (N) là:
TL 750
Chọn N = 8, ta tính được n = T =
0.125 x 8
= 750  −n =− 750 =− 250 x 3
CLKT0

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm: 06
Nhóm môn học: L04 Môn thí nghiệm: Vi xử lí thí nghiệm

BÀI 1
1. Trả lời các câu hỏi
a. Khoảng thời gian trễ lớn nhất có thể tạo ra bởi timer 0 với tần số 8Mhz là bao
nhiêu? Trình bày cách tính toán
Với MC = 1/8Mhz = 0.125 μs
Bộ timer0 8 bit thì 0  255 , vậy sau 256 xung sẽ tràn
Prescaler tối đa là =2^10 =1024
Ta có tdelay max = 0.125x 256x1024 = 32,768ms

b. Khoảng thời gian trễ lớn nhất có thể tạo ra bởi timer 1 với tần số 8Mhz là bao
nhiêu? Trình bày cách tính toán
Với MC = 1/8Mhz = 0.125 s
Bộ timer1 16 bit thì 0  65535 , vậy sau 65536 xung sẽ tràn
Prescaler tối đa là =2^10 =1024
Ta có tdelay max = 0.125x 65536x1024 = 8388,608ms

c. Trình bày cách tính prescaler và các giá trị nạp vào các thanh ghi của timer0
trong bài thí nghiệm
Prescaler ( thang chia đặt trước) : bằng Tdelay/(số xung clock đến tràn x MC)
Khi đó ta sẽ chọn được thang chia hợp lí:
- Tần số 500 Hz  T = 2 ms
- Xung đối xứng (D=50%)  tH = tL = 1ms
- Cần thời gian Delay = 1 ms.
 Xác định các giá trị để khởi động cho Timer0 hoạt động ở Mode NOR và hệ
số chia nạp
vào các thanh ghi điều khiển TCCR0A, TCCR0B
- Chọn hệ số chia tần:

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm: 06
Nhóm môn học: L04 Môn thí nghiệm: Vi xử lí thí nghiệm

tH = tL = tDELAY = 1ms = = n x TCLKT0 = n x TOSC x N = 125 x 0.125s x 64


Chọn hệ số chia N=64, n=125  Giá trị nạp cho TCNT0 = -125 (83H)
Các giá trị được nạp vào các thanh ghi :
-Nạp (-125) hay 131 giá trị đầu ghi vào TCNT0 bộ đếm của timer0 -Nạp 0x00 vào
TCCR0A để timer0 vào mô thức normal
-Nạp 0x00 vào TCCR0B để timer0 dừng đếm
-Nạp 0x03 vào TCCR0B để timer0 đếm với CLK/64

d. Mã nguồn chương trình với chú thích


.ORG 0
LDI R16,$01
OUT
DDRA,R16 ;PA0 output
LDI R17,0
OUT
TCCR0A,R17 ;Timer0, mode NOR, chưa hoạt động
OUT
TCCR0B,R17
START:
RCALL
DELAY ;3MC
IN
R17,PORTA ;1MC
EOR R17,R16 ;1MC Đảo giá trị ngỏ ra chân PA0
OUT
PORTA,R17 ;1MC
RJMP
START ;2MC
DELAY:
LDI R17,(-125) ;(1MC)
OUT
TCNT0,R17 ;(1MC)
LDI R17,0X03
;(1MC)
OUT TCCR0B,R17 ;(1MC) Timer0, mode NOR, N = 64
WAIT:

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm: 06
Nhóm môn học: L04 Môn thí nghiệm: Vi xử lí thí nghiệm

IN R17,TIFR0 ;(1MC)
SBRS R17,TOV0 ;(2/1MC)
RJMP
WAIT ;(2MC)
OUT TIFR0,R17 ;(1MC)
LDI R17,0X00 ;(1MC)
OUT TCCR0B,R17 ;(1MC)
RET
;(4MC)

BÀI 2
1. Trả lời các câu hỏi
a. Ở mode Normal, khi nào bit TOVx được set lên 1?
Ở mode Normal, bit TOVx được set lên 1 khi giá trị thanh ghi TCNTx tràn từ 0xFF về 0x00
(timer0 và timer2) và TCNT1 tràn từ 0xFFFF về 0x0000

b. Ở mode CTC, khi nào bit OCFx được set lên 1?


Ở mode CTC, Ban đầu TCNT0 đếm từ 0x00 lên đến khi bộ đếm bằng giá trị trong thanh ghi
OCRxA hoặc OCRxB, sẽ đáp ứng kết quả so sánh bằng. Ở xung CLKT0 tiếp theo, cờ OCFxA
hoặc OCFxB được phần cứng đặt lên 1 chỉ báo nội dung bộ đếm bằng giá trị so sánh.
c. Giá trị các thanh ghi cấu hình cho timer 0 cho 2 trường hợp
����/�
Chọn clkTimer = 64
 CS0[2:0] = 011

Mode Normal: TCCR0A = 0b0000 0000, TCCR0B = 0b0000 0011


Mode CTC: TCCR0A = 0b0000 0010, TCCR0B = 0b0000 0011

d. Mã nguồn chương trình cho hai trường hợp


Viết chương trình tạo 1 xung vuông 64 us sử dụng timer 0 ở chế độ Normal mode. Ngõ ra sử
dụng chân OC0.
- Xung đối xứng (D=50%)  tH = tL = T/2 = 64us/2 = 32 us
- Cần thời gian Delay = 32 us.
 Xác định các giá trị để khởi động cho Timer0 hoạt động ở Mode NOR và hệ số chia nạp
vào các thanh ghi điều khiển TCCR0A, TCCR0B

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm: 06
Nhóm môn học: L04 Môn thí nghiệm: Vi xử lí thí nghiệm

- Chọn hệ số chia tần:


tH = tL = tDELAY = 1ms = = n x TCLKT0 = n x TOSC x N = 32 x 0.125s x 8
Chọn hệ số chia N=8, n=32
 Giá trị nạp cho TCNT0 = -32 (MODE NOR)  Giá trị nạp cho OCR0A = 31 (MODE
CTC)
CODE MODE NOR
.ORG 0
LDI R16,$01
OUT DDRB,R16 ;PB0 output
LDI R17,0
OUT TCCR0B,R17 ;Timer0, mode NOR, chưa hoạt động
OUT TCCR0B,R17
START:
RCALL DELAY ;3MC
IN
R17,PORTB ;1MC
EOR R17,R16 ;1MC Đảo giá trị ngỏ ra chân PA0
OUT PORTB,R17 ;1MC
RJMP START ;2MC
DELAY:
LDI R17,(-32) ;(1MC)
OUT TCNT0,R17 ;(1MC)
LDI R17,0X02 ;(1MC)
OUT TCCR0B,R17 ;(1MC) Timer0, mode NOR, N = 64
WAIT:
IN R17,TIFR0 ;(1MC)
SBRS R17,TOV0 ;(2/1MC)
RJMP WAIT ;(2MC)
OUT TIFR0,R17 ;(1MC)

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm: 06
Nhóm môn học: L04 Môn thí nghiệm: Vi xử lí thí nghiệm

RET ;(4MC)

CODE MODE CTCMODE CTC


.ORG 0
LDI R16,$01
OUT DDRB,R16 ;PB0 output
LDI R17,0x02
OUT TCCR0B,R17 ;Timer0, mode CTC, chưa hoạt động
LDI R17,0x00
OUT TCCR0B,R17
START:
RCALL DELAY ;3MC
IN

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm: 06
Nhóm môn học: L04 Môn thí nghiệm: Vi xử lí thí nghiệm

R17,PORTB ;1MC
EOR R17,R16 ;1MC Đảo giá trị ngỏ ra chân PA0
OUT PORTB,R17 ;1MC
RJMP START ;2MC
DELAY:LDI R17,31 ;(1MC)
OUT OCR0A,R17 ;(1MC)
LDI R17,0X02 ;(1MC)
OUT TCCR0B,R17 ;(1MC) Timer0, mode CTC, N = 64
WAIT:
IN R17,TIFR0 ;(1MC)
SBRS R17,OCF0A ;(2/1MC)
RJMP WAIT ;(2MC)
OUT TIFR0,R17 ;(1MC)
RET ;(4MC)

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm: 06
Nhóm môn học: L04 Môn thí nghiệm: Vi xử lí thí nghiệm

BÀI 3
1. Trả lời các câu hỏi
a. Dạng sóng trên oscilloscope (chụp và chèn vào)

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm: 06
Nhóm môn học: L04 Môn thí nghiệm: Vi xử lí thí nghiệm

b. Giải thích lý do có dạng sóng (tần số, chu kỳ làm việc, phase) như kết quả

Giải thích:
- WGM00 và WGM01 lên 1 lựa chọn mô thức Fast PWM (WGM0[2:0] = 011), TOP=MAX=
0xFF
- COM0A1 = 1, COM0A0 = 0: OC0A=0 khi bộ đếm đạt kết quả so sánh OCR0A = 100,
OC0A = 1 khi bộ đếm đạt BOTTOM (trạng thái không đảo)
- COM0B1 = 1,COM0B0 = 0: OC0B=0 khi bộ đếm đạt kết quả so sánh OCR0B = 75, OC0B
= 1 khi bộ đếm đạt BOTTOM (trạng thái không đảo)
- CS02= 0,CS01 = 1, CS00 = 0: clkosc=clkI/O / 8 (CS0[2:0] = 010)

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm: 06
Nhóm môn học: L04 Môn thí nghiệm: Vi xử lí thí nghiệm

clkI/O 8MHz 1
Tần số 2 sóng: f = 8(TOP+1) = 8 x 256 = 400KHz  Chu kì T = f = 256μs
8 TH 101
Chân OC0A: TH = (100+1)x 8MHz = 101μs  D= T
= 256
= 39,5%
8 TH 76
Chân OC0B: TH = (75+1)x 8MHz = 76μs  D= T
= 256
= 29,7%

BÀI 4
1. Trả lời các câu hỏi
a. Các mode làm việc của timer 0 ứng với các giá trị trên bảng

TH1:
TCCR0A = 1010xx11;
TCCR0B = xxxx0010
COM0A = 10 => Xóa OC0A=0 khi TCNT0 = OCR0A
COM0B = 10 => Xóa OC0B=0 khi TCNT0 = OCR0B
WGM2-WGM1-WGM0 = 011 => Timer0 hoạt động với chế độ FPWM (011)
CS2-CS1-CS0 = 010 => prescaler = 8
TH2:
TCCR0A = 1010xx11;
TCCR0B = xxxx1010
COM0A = 10 => Xóa OC0A=0 khi TCNT0 = OCR0A
COM0B = 10 => Xóa OC0B=0 khi TCNT0 = OCR0B
WGM2-WGM1-WGM0 = 111 => Timer0 hoạt động với chế độ dữ trữ

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm: 06
Nhóm môn học: L04 Môn thí nghiệm: Vi xử lí thí nghiệm

CS2-CS1-CS0 = 010 => prescaler = 8


TH3:
TCCR0A = 1010xx01;
TCCR0B = xxxx0010
COM0A = 10 => Xóa OC0A=0 khi TCNT0 = OCR0A
COM0B = 10 => Xóa OC0B=0 khi TCNT0 = OCR0B
WGM2-WGM1-WGM0 = 001 => Timer0 hoạt động với chế độ PCPWM
CS2-CS1-CS0 = 010 => prescaler = 8

2. Chụp ảnh các dạng sóng ứng với các mode làm việc và giải thích.

* Giải thích:
Trong chế độ FPWM, nếu giá trị của thanh ghi TCNT0 (Timer/Counter 0) nhỏ hơn giá trị của
OCR0A( OCR0B), thì chân OC0A (OC0B) sẽ được set lên mức cao. Ngược lại, nếu giá trị của
TCNT0 lớn hơn hoặc bằng giá trị của OCR0A( OCR0B), thì chân OC0A (OC0B) sẽ được clear
xuống mức thấp.
Timer0 để tạo tín hiệu đầu ra trên các chân OC0A (PB3) và OC0B (PB4) của vi điều khiển.
Đoạn
code trong hàm initTimer0 được sử dụng để thiết lập Timer0 với các thông số như sau:-Chân
OC0A và OC0B được cấu hình là ngõ ra
-Sử dụng chế độ Fast PWM với TOP = OCR0A
-Tần số clock cho Timer0 được chọn là clk/8
-Giá trị của thanh ghi OCR0A được cài đặt là 100
-Giá trị của thanh ghi OCR0B được cài đặt là 75
Tín hiệu đầu ra trên chân OC0A sẽ tạo thành một xung có chu kỳ 100 clock cycle, trong đó duty
cycle được xác định bởi giá trị của OCR0B. Cụ thể là xung sẽ được giữ ở mức cao trong 75
clock

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm: 06
Nhóm môn học: L04 Môn thí nghiệm: Vi xử lí thí nghiệm

cycle và giữ ở mức thấp trong 25 clock cycle còn lại. Tín hiệu đầu ra trên chân OC0B sẽ tạo
thành
một xung có duty cycle 75/100.
Chân OC0A (PB3) sẽ xuất ra xung vuông với chu kỳ 400µs (OCR0A = 100, tần số 2.5kHz).
Chân
OC0B (PB4) sẽ xuất ra xung vuông với chu kỳ 300µs (OCR0B = 75, tần số 3.33kHz).

BÀI 5
1. Trả lời các câu hỏi
a. Timer 0 làm việc ở mode nào?
TIMER0 ở mode FPWM với TOP = OCR0A
b. Giá trị đưa vào các thanh ghi của timer 0 là bao nhiêu? Giải thích

1 1
Chu kỳ T = f = 1000 = 1000us, xung vuông có duty cycle 25%  Thời gian delay bit
cao và bit thấp là TH =250 us, TL = 750us
Từ Fosc = 8MHz, CKDIV8 = 1  Tosc = 0.125μs
Giá trị nạp cho thanh ghi TCNT0 (-n) và hệ số chia (N) là:
Với TH = 250us:
TH 250
Chọn N = 8, ta tính được n = T =
0.125 x 8
= 250  −n =− 250
CLKT0

Với TL = 750us:
TL 750
Chọn N = 8, ta tính được n = T =
0.125 x 8
= 750
CLKT0

 −n =− 750 =− 250 x 3

2. Trình bày mã nguồn với chú thích.


.ORG 0
RJMP MAIN
.ORG 0X40

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm: 06
Nhóm môn học: L04 Môn thí nghiệm: Vi xử lí thí nghiệm

MAIN:
LDI R16,HIGH(RAMEND)
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL,R16

LDI R17,0XFF ; PORT B XUẤT


OUT DDRB,R17
LDI R17,0 ; MODE NORMAL,
OUT TCCR0A,R17
OUT TCCR0B,R17 ; DỪNG TIMER0

START:
SBI PORTB,4
RCALL DELAY025MS
CBI PORTB,4
RCALL DELAY075MS
RJMP START

DELAY025MS:
LDI R17, $06 ; CHỌN n=250; R17=256-250=6
OUT TCNT0,R17;
LDI R17, $02 ; CHỌN CS=010--> N=8
OUT TCCR0B,R17 ; BẮT ĐẦU ĐẾM
WAIT1:
IN R17, TIFR0 ; ĐỌC CỜ TRÀN ,LƯU R17
SBRS R17,TOV0 ; KIỂM TRA TOV0=1?
RJMP WAIT1
OUT TIFR0,R17 ; CLEAR BIT TOV0 VỀ 0
LDI R17,0 ; DỪNG TIMER0 CS=000
OUT TCCR0B,R17
RET

DELAY075MS:
LDI R16,3 ; LẶP 3 LẦN
LP:
LDI R17,-250 ; CHỌN n=250
OUT TCNT0,R17;
LDI R17,$02 ; CHỌN CS=010--> N=8
OUT TCCR0B,R17 ; BẮT ĐẦU ĐẾM
WAIT2:
IN R17, TIFR0 ; ĐỌC CỜ TRÀN LƯU R17
SBRS R17,TOV0 ; KIỂM TRA TOV0=1?
RJMP WAIT2
SBI TIFR0,TOV0 ; CLEAR BIT TOV0 VỀ 0
LDI R17,0 ; DỪNG TIMER0 CS=000
OUT TCCR0B,R17

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm: 06
Nhóm môn học: L04 Môn thí nghiệm: Vi xử lí thí nghiệm

DEC R16
CPI R16,0 ; NẾU R16 = 0, KẾT THÚC VÒNG LẶP
BRNE LP
RET

https://doe.dee.hcmut.edu.vn/
LAB 2-2
GIAO TIẾP LED 7 ĐOẠN VÀ LED MA TRẬN

MỤC TIÊU:

 Giao tiếp được với LED 7 đoạn


 Giao tiếp được với LED ma trận

THAM KHẢO:

 Tài liệu hướng dẫn thí nghiệm, chương 4


 Atmel-2505-Setup-and-Use-of-AVR-Timers_ApplicationNote_AVR130.pdf

BÀI 2

a) Kết nối 1 port của AVR vào header J34. Kết nối 2 chân port khác vào tín hiệu nLE0 và
nLE1 trên header J82. Set jumper để cấp nguồn cho LED 7 đoạn
b) Sử dụng các chương trình mẫu trong tài liệu hướng dẫn thí nghiệm, viết chương trình hiển
thị số 0123 lên 4 LED 7 đoạn, sử dụng timer 0 để quét LED với tần số quét 50Hz.

BÀI 3

a) Kết nối port của AVR vào dip Switch, giả sử đó là PORTA
b) Viết chương trình hiện giá trị PORTA * 9 lên 4 LED 7 đoạn.
c) Thay đổi giá trị dip switch và quan sát kết quả

BÀI 4

a) Kết nối các tín hiệu cần thiết để điều khiển LED ma trận. .
b) Sử dụng chương trình mẫu, chỉnh sửa nếu cần thiết để hiển thị chữ ‘A’ lên LED ma trận.
Quét LED ma trận sử dụng timer để tạo delay với tần số quét 25 Hz.
c) Chỉnh sửa chương trình để đạt tần số quét là 125Hz.

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:

2. Trả lời các câu hỏi


a. Để có tần số quét là 50Hz, một LED sẽ sáng 1 lần trong bao lâu?
Thới gian một LED sáng 1 lần là: Tdelay = 1/(50.4)= 5ms
Vậy ở đây ta cần tạo chương trình delay 5ms để 1 led sáng 50 lần trong 1s
b. Cấu hình timer như thế nào để có độ trễ này
Dùng Timer0, với MC = 1/8Mhz = 0.125 s
tDELAY = 5ms = = n x TCLKT0 = n x TOSC x N ≈ 39 x 0.125s x 1024
 Cấu hình Timer MODE CTC với N = 1024 và giá trị bộ đếm nạp vào OCR0A = 39 - 1
Giá trị nạp vào các thanh ghi:
OCR0A : 39-1
TCCR0A : 0000 0010 -> WGM01:WGM00 = 10 ;MODE CTC
TCCR0B : 0000 0100 -> WGM02:CS02:CS01:CS0 = 0101 ;N = 1024

3. Mã nguồn và chú thích


.EQU DATA_DDR = DDRB
.EQU DATA_OUT = PORTB
.EQU LE_DDR = DDRA ; enable pin of HC573
.EQU LE = PORTA
.ORG 0
RJMP MAIN
.ORG $40
MAIN:
SER R16
OUT DATA_DDR, R16
SBI LE_DDR, 0
SBI LE_DDR, 1
CBI LE, 0
CBI LE, 1 ; lock 573
LDI R18, $FF ; choose led to display
LOOP:
LDI R17, 3 ; data to display
LDI R19, $FE
RCALL DISPLAY_7SEG
RCALL SET_UP_TIMER

LDI R17, 2
LDI R19, $FD
RCALL DISPLAY_7SEG
RCALL SET_UP_TIMER

LDI R17, 1
LDI R19, $FB
RCALL DISPLAY_7SEG

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:

RCALL SET_UP_TIMER

LDI R17, 0
LDI R19, $F7
RCALL DISPLAY_7SEG
RCALL SET_UP_TIMER
RJMP LOOP

;---------------------
; input data R18 -- choose led to display
; input R17 -- data to display
DISPLAY_7SEG:
PUSH R18
ANDI R18, $0F

OUT DATA_OUT, R18 ; enable 573 to choose led


;Turn off led
SBI LE, 1
NOP
CBI LE, 1

LDI ZH, HIGH(TAB << 1) ; look-up Led7seg


LDI ZL, LOW(TAB << 1)
ADD ZL, R17
BRCC SKIP
INC ZH
SKIP:
LPM R20, Z
OUT DATA_OUT, R20
SBI LE, 0
NOP
CBI LE, 0
;Chon led
OUT DATA_OUT, R19
SBI LE, 1
NOP
CBI LE, 1
POP R18
RET
;------------------ USE TIMER0 TO DELAY
SET_UP_TIMER:
LDI R16, 0
OUT TCCR0A, R16 ; timer 0 mod NOR
OUT TCCR0B, R16 ; stop timer
DELAY:
PUSH R16
LDI R16,HIGH(-5000)
STS TCNT1H, R16
LDI R16,LOW(-5000)

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:

STS TCNT1L, R16

LDI R16,$00
STS TCCR1A,R16 ;TCCR1A= 0000 0000
LDI R16,$01
STS TCCR1B,R16 ;TCCR1B= 0000 0001
WAIT:
SBIS TIFR1, TOV1 ; check if TOV = 1
RJMP WAIT ; continue counting
SBI TIFR1, TOV1 ; reset TOV0
LDI R16, 0
STS TCCR1B, R16 ; stop timer
POP R16
RET
TAB: .DB 0xC0, 0xF9, 0xA4, 0xB0

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
2. Trả lời các câu hỏi

a. Giá trị PORTA * 9 là số có bao nhiêu bit


Giá trị lớn nhất = 255 * 9 = 2295 = 1000 1111 0111 B  Giá trị PORTA * 9 là số có 12 bit
3. Mã nguồn và chú thích

Sử dụng Timer để sinh ra ngắt sau mỗi khoảng thời gian phù hợp. Hiển thị
4 giá trị chứa trong các ô nhớ ở địa chỉ 0x0200, 0x0201, 0x0202, 0x0203 (lần lượt
là hàng đơn vị, hàng chục, hàng trăm, hàng nghìn) ra 4 LED 7. Khi xảy ra ngắt,
lần lượt xuất dữ liệu và bật từng LED tương ứng. Khi ngắt đầu tiên xảy ra, LED3
sẽ hiển thị giá trị ở ô nhớ 0x0100, 3 LED còn lại tắt. Khi xảy ra ngắt lần thứ 2,
LED2 sẽ hiển thị giá trị ở ô nhớ 0x0101. Quá trình sẽ diễn ra tương tự cho 2 LED
còn lại và lặp đi lặp lại.

b). Làm thế nào để hiển thị từng chữ số lên 4 LED?

.DEF TRAM = R23


.DEF CHUC = R24
.DEF DONVI = R25
.DEF SONHO = R15
.ORG 0
RJMP MAIN
.ORG 0X40
MAIN:
CALL CONFIG
START:
IN R20, PINA
CALL SAVE_TRAM_CHUC_DONVI
CALL CACULATE ;Ket qua tinh toan se luu vao o nho $0100
-- $0103
LOOP:
LDI R18, $FF ; TURN OFF LED
LDI XL, $00
LDI XH, $01
LDI R19, $FE
RCALL DISPLAY_7SEG
RCALL SET_UP_TIMER

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:

LDI R19, $FD


LDI XL, $01
LDI XH, $01
RCALL DISPLAY_7SEG
RCALL SET_UP_TIMER

LDI R19, $FB


LDI XL, $02
LDI XH, $01
RCALL DISPLAY_7SEG
RCALL SET_UP_TIMER

LDI R19, $F7


LDI XL, $03
LDI XH, $01
RCALL DISPLAY_7SEG
RCALL SET_UP_TIMER
RJMP START
CONFIG:
CLR R16
OUT DDRA, R16 ;PortA la input
SER R16
OUT DDRB, R16 ;PortB la output
OUT PORTA, R16 ;Pull-up
LDI R16, $03 ;PortD chan 0 va 1 la output
OUT DDRD, R16
CBI PORTD, 0 ;Khoa chot
CBI PORTD, 1 ;Khoa chot
LDI XL, $00
LDI XH, $01
RET
CACULATE:
LDI R19, $09
MUL DONVI, R19
MOVW R20, R0 ;Ket qua luu vao R21:R20
PUSH TRAM ;Dung sau
PUSH CHUC ;Dung sau
CALL SAVE_TRAM_CHUC_DONVI ;Sau dong nay ta se duoc hang don vi cua
ket qua
STS $0100, DONVI ;Luu hang don vi vao o nho nay

MOV SONHO, CHUC ;Hang chuc o kqua truoc chinh la so nho


cua phep nhan lan sau
POP CHUC ;Lay hang chuc cua kqua nhap tu portA ra
lai
MUL CHUC, R19
MOVW R20, R0
ADD R20, SONHO
CALL SAVE_TRAM_CHUC_DONVI ;Sau dong nay se duoc hang chuc

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:

cua kqua
STS $0101, DONVI ;Luon luu vao la hang don vi

MOV SONHO, CHUC ;Hang chuc o kqua truoc chinh la


so nho cua phep nhan lan sau
POP TRAM ;Lay hang tram cua kqua nhap tu
portA ra lai
MUL TRAM, R19
MOVW R20, R0
ADD R20, SONHO
CALL SAVE_TRAM_CHUC_DONVI ;Sau dong nay se duoc hang tram va
hang nghin cua kqua
STS $0102, DONVI
STS $0103, CHUC
RET
SAVE_TRAM_CHUC_DONVI:
MOV R18, R20
LDI R21, 10
CLR R22
L1:
INC R22 ;Div10 lan 1
SUB R18, R21
BRCC L1
DEC R22
ADD R18, R21
PUSH R18 ;Cat hang don vi
MOV R18, R22 ;Lay phan nguyen chia 10 lan 2
CLR R22
L2:
INC R22 ;Div10 lan 2
SUB R18, R21
BRCC L2
DEC R22
ADD R18, R21
PUSH R18 ;Cat hang chuc
MOV R18, R22 ;Lay phan nguyen chia 10 lan 3
CLR R22
L3:
INC R22 ;Div10 lan 3
SUB R18, R21
BRCC L3
DEC R22
ADD R18, R21
PUSH R18 ;Cat hang tram
POP TRAM ;Hang tram
POP CHUC ;Hang chuc
POP DONVI ;Hang don vi
RET
; input data R18 -- choose led to display

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:

DISPLAY_7SEG:
PUSH R18
ANDI R18, $0F
OUT PORTB, R18 ; enable 573 to choose led
;Turn off led
SBI PORTD, 1
NOP
CBI PORTD, 1
LDI ZH, HIGH(TAB << 1) ; look-up Led7seg
LDI ZL, LOW(TAB << 1)
LD R15, X
ADD ZL, R15
LPM R17, Z
OUT PORTB, R17
SBI PORTD, 0
NOP
CBI PORTD, 0
OUT PORTB, R19
SBI PORTD, 1
NOP
CBI PORTD, 1
POP R18
RET
;------------------ USE TIMER0 TO DELAY

SET_UP_TIMER: ; 1/200 = 0.05 s = 40 000 (MCs) => use CLK/256 divider with
N = 156 pulses
LDI R16, 0
OUT TCCR0A, R16 ; timer 0 mod NOR
OUT TCCR0B, R16 ; stop timer
DELAY:
LDI R16, $64 ; input (-n)
OUT TCNT0, R16 ; count 156 pulses

LDI R16, $04 ; use CLK/256 prescaler


OUT TCCR0B, R16 ; start timer
WAIT:
SBIS TIFR0, TOV0 ; check if TOV = 1
RJMP WAIT ; continue counting
SBI TIFR0, TOV0 ; reset TOV0
LDI R16, 0
OUT TCCR0B, R16 ; stop timer
RET

TAB:
.DB 0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90,
0X88, 0X83

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:

.DB 0XC6,0XA1,0X86,0X8E

BÀI 4

1. Trả lời các câu hỏi


a. Mô tả kết nối trên kit
PortB: xuất dữ liệu PA0: CLK PA1: DSI PA2: LATCH
b. Để có tần số quét 25Hz thì một cột LED sáng trong bao lâu?
T = 5ms
c. Sự khác nhau khi quét ở tần số 25Hz và 125Hz
Khi quét ở tần số 25 Hz: Một cột LED sáng trong 5 ms
Khi quét ở tần số 125 Hz: Một cột LED sáng trong 1 ms

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:

2. Mã nguồn chương trình với chú thích


Trường hợp quét ở tần số 25 Hz:
.ORG 0X0000 ;INTERRUPT VECTOR TABLE
RJMP RESET_HANDLER ; RESET
.ORG 0X001A
RJMP TIMER1_COMP_ISR
RESET_HANDLER: ; INITIALIZE STACK POINTER
LDI R16, HIGH(RAMEND)
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
CALL SHIFTREGISTER_INITPORT
CALL SHIFTREGISTER_CLEARDATA
CALL INITTIMER1CTC ; ENABLE GLOBAL INTERRUPTS
SEI
CALL LEDMATRIX_PORTINIT

MAIN:
JMP MAIN
.EQU CLEARSIGNALPORT = PORTB ; SET CLEAR SIGNAL PORT TO PORTB
.EQU CLEARSIGNALPIN = 3 ; SET CLEAR SIGNAL PIN TO PIN 3 OF
PORTB
.EQU SHIFTCLOCKPORT = PORTB ; SET SHIFT CLOCK PORT TO PORTB
.EQU SHIFTCLOCKPIN = 2 ; SET SHIFT CLOCK PIN TO PIN 2 OF PORTB
.EQU LATCHPORT = PORTB ; SET LATCH PORT TO PORTB
.EQU LATCHPIN = 1 ; SET LATCH PIN TO PIN 1 OF PORTB
.EQU SHIFTDATAPORT = PORTB ; SET SHIFT DATA PORT TO PORTB
.EQU SHIFTDATAPIN = 0 ; SET SHIFT DATA PIN TO PIN 0 OF PORTB
; INITIALIZE PORTS AS OUTPUTS

SHIFTREGISTER_INITPORT:
PUSH R24
LDI
R24,(1<<CLEARSIGNALPIN)|(1<<SHIFTCLOCKPIN)|(1<<LATCHPIN)|(1<<SHIFTDATAPIN)
OUT DDRB, R24 ; SET DDRB TO OUTPUT
POP R24
RET
SHIFTREGISTER_CLEARDATA:
CBI CLEARSIGNALPORT, CLEARSIGNALPIN ; SET CLEAR SIGNAL PIN TO LOW
; WAIT FOR A SHORT TIME
SBI CLEARSIGNALPORT, CLEARSIGNALPIN ; SET CLEAR SIGNAL PIN TO HIGH
RET
; SHIFT OUT DATA
; SHIFT OUT R27 TO BAR LED
SHIFTREGISTER_SHIFTOUTDATA:
PUSH R18
CBI SHIFTCLOCKPORT, SHIFTCLOCKPIN

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:

LDI R18, 8 ; SHIFT 8 BITS


SHIFTLOOP:
SBRC R27, 7 ; CHECK IF THE MSB OF SHIFTDATA
IS 1
SBI SHIFTDATAPORT, SHIFTDATAPIN ; SET SHIFT DATA PIN TO HIGH
SBI SHIFTCLOCKPORT, SHIFTCLOCKPIN ; SET SHIFT CLOCK PIN TO HIGH
LSL R27 ; SHIFT LEFT
CBI SHIFTCLOCKPORT, SHIFTCLOCKPIN ; SET SHIFT CLOCK PIN TO LOW
CBI SHIFTDATAPORT, SHIFTDATAPIN ; SET SHIFT DATA PIN TO LOW
DEC R18 ; LATCH DATA
BRNE SHIFTLOOP
SBI LATCHPORT, LATCHPIN ; SET LATCH PIN TO HIGH
CBI LATCHPORT, LATCHPIN ; SET LATCH PIN TO LOW
POP R18
RET
; LOOKUP TABLE FOR COLLUMN CONTROL
LEDMATRIX_COL_CONTROL: .DB 0X80, 0X40, 0X20, 0X10, 0X08, 0X04, 0X02, 0X01
; LOOKUP TABLE FOR FONT
LEDMATRIX_FONT_A: .DB 0B000000000, 0B11111100, 0B00010010, 0B00010001,
0B00010001, 0B00010010, 0B11111100, 0B00000000
; J38 CONNECT TO PORTD
; CLEAR SIGNAL PIN TO PINE OF PORTB
; SHIFT CLOCK PIN TO PIN 1 OF PORTB
; LATCH PIN TO PIN 8 OF PORTB
; SHIFT DATA PIN TO PIN 3 OF PORTB
; OUTPUT: NONE
.EQU LEDMATRIXPORT = PORTD
.EQU LEDMATRIXDIR = DDRD
.DSEG
.ORG SRAM_START ;STARTING ADDRESS IS 0X100
LEDMATRIXBUFFER: .BYTE 8
LEDMATRIXCOLINDEX: .BYTE 1
.CSEG
.ALIGN 2

LEDMATRIX_PORTINIT:
PUSH R20
PUSH R21
LDI R20, 0B11111111 ; SET PORT AS OUTPUT
OUT LEDMATRIXDIR, R20
LDI R20,0 ;COL INDEX START AT 0
LDI R31, HIGH(LEDMATRIXCOLINDEX)
LDI R30, LOW(LEDMATRIXCOLINDEX)
ST Z,R20
LDI R20,0
LDI R31,HIGH (LEDMATRIX_FONT_A << 1) ;Z REGISTER POINT TO FONTA VALUE
LDI R30, LOW(LEDMATRIX_FONT_A << 1)
LDI R29,HIGH (LEDMATRIXBUFFER) ; Y REGISTER POINT TO FONTA
VALUE

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:

LDI R28,LOW(LEDMATRIXBUFFER)
LDI R20,8

LEDMATRIX_PORTINIT_LOOP: ;COPY FONT TO DISPLAY BUFFER

LPM R21, Z+
ST Y+, R21
DEC R20
CPI R20,0
BRNE LEDMATRIX_PORTINIT_LOOP
POP R21
POP R20
RET
; DISPLAY A COLLUMN OF LED MATRIX
; INPUT: R27 CONTAINS THE VALUE TO DISPLAY
; R26 CONTAIN THE COL INDEX (3..8)
; OUTPUT: NONE

LEDMATRIX_DISPLAY_COL:
PUSH R16 ; SAVE THE TEMPORARY REGISTER
PUSH R27
CLR R16
OUT LEDMATRIXPORT, R16
CALL SHIFTREGISTER_SHIFTOUTDATA
LDI R31,HIGH(LEDMATRIX_COL_CONTROL << 1)
LDI R30,LOW(LEDMATRIX_COL_CONTROL << 1)
CLR R16
ADD R30,R26
ADC R31,R16
LPM R27,Z
OUT LEDMATRIXPORT, R27
POP R27
POP R16 ; RESTORE THE TEMPORARY REGISTER FUNCTION
RET ; RETURN FROM THE FUNCTION
INITTIMER1CTC:
PUSH R16
LDI R16,HIGH(156) ; LOAD THE HIGH BYTE INTO THE TEMPORARY
REGISTER
STS OCR1AH,R16 ; SET THE HIGH BYTE OF THE TIMER 1
COMPARE VALUE
LDI R16,LOW(156) ; LOAD THE LOW BYTE INTO THE TEMPORARY
REGISTER
STS OCR1AL, R16 ; SET THE LOW BYTE OF THE TIMER 1
COMPARE VALUE
LDI R16, (1 << CS10)|(1<< WGM12) ; LOAD THE VALUE 0X00000101 INTO THE
TEMPORARY REGISTER
STS TCCR1B, R16 ; ENABLE THE TIMER 1 COMPARE A
INTERRUPT;
LDI R16, (1 << OCIE1A) ; LOAD THE VALUE 0X00000010 INTO THE

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:

TEMPORARY REGISTER
STS TIMSK1, R16
POP R16
RET

TIMER1_COMP_ISR:
PUSH R16
PUSH R26
PUSH R27
LDI R31,HIGH(LEDMATRIXCOLINDEX)
LDI R30,LOW(LEDMATRIXCOLINDEX)
LD R16,Z
MOV R26, R16
LDI R31,HIGH(LEDMATRIXBUFFER)
LDI R30,LOW(LEDMATRIXBUFFER)
ADD R30, R16
CLR R16
ADC R31,R16
LD R27,Z
CALL LEDMATRIX_DISPLAY_COL
INC R26
CPI R26,8
BRNE TIMER1_COMP_ISR_CONT
LDI R26,0 ;IF R268, RESET TO 0

TIMER1_COMP_ISR_CONT:
LDI R31, HIGH(LEDMATRIXCOLINDEX)
LDI R30, LOW(LEDMATRIXCOLINDEX)
ST Z,R26
POP R27
POP R26
POP R16
RETI

Trường hợp quét ở tần số 125 Hz:


.ORG 0X0000 ;INTERRUPT VECTOR TABLE
RJMP RESET_HANDLER ; RESET
.ORG 0X001A
RJMP TIMER1_COMP_ISR
RESET_HANDLER: ; INITIALIZE STACK POINTER
LDI R16, HIGH(RAMEND)
OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16
CALL SHIFTREGISTER_INITPORT
CALL SHIFTREGISTER_CLEARDATA
CALL INITTIMER1CTC ; ENABLE GLOBAL INTERRUPTS
SEI

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:

CALL LEDMATRIX_PORTINIT

MAIN:
JMP MAIN
.EQU CLEARSIGNALPORT = PORTB ; SET CLEAR SIGNAL PORT TO PORTB
.EQU CLEARSIGNALPIN = 3 ; SET CLEAR SIGNAL PIN TO PIN 3 OF
PORTB
.EQU SHIFTCLOCKPORT = PORTB ; SET SHIFT CLOCK PORT TO PORTB
.EQU SHIFTCLOCKPIN = 2 ; SET SHIFT CLOCK PIN TO PIN 2 OF PORTB
.EQU LATCHPORT = PORTB ; SET LATCH PORT TO PORTB
.EQU LATCHPIN = 1 ; SET LATCH PIN TO PIN 1 OF PORTB
.EQU SHIFTDATAPORT = PORTB ; SET SHIFT DATA PORT TO PORTB
.EQU SHIFTDATAPIN = 0 ; SET SHIFT DATA PIN TO PIN 0 OF PORTB
; INITIALIZE PORTS AS OUTPUTS

SHIFTREGISTER_INITPORT:
PUSH R24
LDI
R24,(1<<CLEARSIGNALPIN)|(1<<SHIFTCLOCKPIN)|(1<<LATCHPIN)|(1<<SHIFTDATAPIN)
OUT DDRB, R24 ; SET DDRB TO OUTPUT
POP R24
RET
SHIFTREGISTER_CLEARDATA:
CBI CLEARSIGNALPORT, CLEARSIGNALPIN ; SET CLEAR SIGNAL PIN TO LOW
; WAIT FOR A SHORT TIME
SBI CLEARSIGNALPORT, CLEARSIGNALPIN ; SET CLEAR SIGNAL PIN TO HIGH
RET
; SHIFT OUT DATA
; SHIFT OUT R27 TO BAR LED
SHIFTREGISTER_SHIFTOUTDATA:
PUSH R18
CBI SHIFTCLOCKPORT, SHIFTCLOCKPIN
LDI R18, 8 ; SHIFT 8 BITS
SHIFTLOOP:
SBRC R27, 7 ; CHECK IF THE MSB OF SHIFTDATA
IS 1
SBI SHIFTDATAPORT, SHIFTDATAPIN ; SET SHIFT DATA PIN TO HIGH
SBI SHIFTCLOCKPORT, SHIFTCLOCKPIN ; SET SHIFT CLOCK PIN TO HIGH
LSL R27 ; SHIFT LEFT
CBI SHIFTCLOCKPORT, SHIFTCLOCKPIN ; SET SHIFT CLOCK PIN TO LOW
CBI SHIFTDATAPORT, SHIFTDATAPIN ; SET SHIFT DATA PIN TO LOW
DEC R18 ; LATCH DATA
BRNE SHIFTLOOP
SBI LATCHPORT, LATCHPIN ; SET LATCH PIN TO HIGH
CBI LATCHPORT, LATCHPIN ; SET LATCH PIN TO LOW
POP R18
RET
; LOOKUP TABLE FOR COLLUMN CONTROL
LEDMATRIX_COL_CONTROL: .DB 0X80, 0X40, 0X20, 0X10, 0X08, 0X04, 0X02, 0X01

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:

; LOOKUP TABLE FOR FONT


LEDMATRIX_FONT_A: .DB 0B000000000, 0B11111100, 0B00010010, 0B00010001,
0B00010001, 0B00010010, 0B11111100, 0B00000000
; J38 CONNECT TO PORTD
; CLEAR SIGNAL PIN TO PINE OF PORTB
; SHIFT CLOCK PIN TO PIN 1 OF PORTB
; LATCH PIN TO PIN 8 OF PORTB
; SHIFT DATA PIN TO PIN 3 OF PORTB
; OUTPUT: NONE
.EQU LEDMATRIXPORT = PORTD
.EQU LEDMATRIXDIR = DDRD
.DSEG
.ORG SRAM_START ;STARTING ADDRESS IS 0X100
LEDMATRIXBUFFER: .BYTE 8
LEDMATRIXCOLINDEX: .BYTE 1
.CSEG
.ALIGN 2

LEDMATRIX_PORTINIT:
PUSH R20
PUSH R21
LDI R20, 0B11111111 ; SET PORT AS OUTPUT
OUT LEDMATRIXDIR, R20
LDI R20,0 ;COL INDEX START AT 0
LDI R31, HIGH(LEDMATRIXCOLINDEX)
LDI R30, LOW(LEDMATRIXCOLINDEX)
ST Z,R20
LDI R20,0
LDI R31,HIGH (LEDMATRIX_FONT_A << 1) ;Z REGISTER POINT TO FONTA VALUE
LDI R30, LOW(LEDMATRIX_FONT_A << 1)
LDI R29,HIGH (LEDMATRIXBUFFER) ; Y REGISTER POINT TO FONTA
VALUE
LDI R28,LOW(LEDMATRIXBUFFER)
LDI R20,8

LEDMATRIX_PORTINIT_LOOP: ;COPY FONT TO DISPLAY BUFFER

LPM R21, Z+
ST Y+, R21
DEC R20
CPI R20,0
BRNE LEDMATRIX_PORTINIT_LOOP
POP R21
POP R20
RET
; DISPLAY A COLLUMN OF LED MATRIX
; INPUT: R27 CONTAINS THE VALUE TO DISPLAY
; R26 CONTAIN THE COL INDEX (3..8)
; OUTPUT: NONE

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:

LEDMATRIX_DISPLAY_COL:
PUSH R16 ; SAVE THE TEMPORARY REGISTER
PUSH R27
CLR R16
OUT LEDMATRIXPORT, R16
CALL SHIFTREGISTER_SHIFTOUTDATA
LDI R31,HIGH(LEDMATRIX_COL_CONTROL << 1)
LDI R30,LOW(LEDMATRIX_COL_CONTROL << 1)
CLR R16
ADD R30,R26
ADC R31,R16
LPM R27,Z
OUT LEDMATRIXPORT, R27
POP R27
POP R16 ; RESTORE THE TEMPORARY REGISTER FUNCTION
RET ; RETURN FROM THE FUNCTION
INITTIMER1CTC:
PUSH R16
LDI R16,HIGH(31) ; LOAD THE HIGH BYTE INTO THE TEMPORARY
REGISTER
STS OCR1AH,R16 ; SET THE HIGH BYTE OF THE TIMER 1
COMPARE VALUE
LDI R16,LOW(31) ; LOAD THE LOW BYTE INTO THE TEMPORARY
REGISTER
STS OCR1AL, R16 ; SET THE LOW BYTE OF THE TIMER 1
COMPARE VALUE
LDI R16, (1 << CS10)|(1<< WGM12) ; LOAD THE VALUE 0X00000101 INTO THE
TEMPORARY REGISTER
STS TCCR1B, R16 ; ENABLE THE TIMER 1 COMPARE A
INTERRUPT;
LDI R16, (1 << OCIE1A) ; LOAD THE VALUE 0X00000010 INTO THE
TEMPORARY REGISTER
STS TIMSK1, R16
POP R16
RET

TIMER1_COMP_ISR:
PUSH R16
PUSH R26
PUSH R27
LDI R31,HIGH(LEDMATRIXCOLINDEX)
LDI R30,LOW(LEDMATRIXCOLINDEX)
LD R16,Z
MOV R26, R16
LDI R31,HIGH(LEDMATRIXBUFFER)
LDI R30,LOW(LEDMATRIXBUFFER)
ADD R30, R16
CLR R16

https://doe.dee.hcmut.edu.vn/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:

ADC R31,R16
LD R27,Z
CALL LEDMATRIX_DISPLAY_COL
INC R26
CPI R26,8
BRNE TIMER1_COMP_ISR_CONT
LDI R26,0 ;IF R268, RESET TO 0

TIMER1_COMP_ISR_CONT:
LDI R31, HIGH(LEDMATRIXCOLINDEX)
LDI R30, LOW(LEDMATRIXCOLINDEX)
ST Z,R26
POP R27
POP R26
POP R16
RETI

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/
ĐẠI HỌC QUỐC GIA TP. HỒ CHÍ MINH
TRƯỜNG ĐẠI HỌC BÁCH KHOA


BÁO CÁO THÍ NGHIỆM


VI XỬ LÝ

Nhóm thí nghiệm: Nhóm 06 – Lớp L04


GVHD: Nguyễn Phan Hải Phú

STT Họ tên MSSV

1 Tô Trần Hữu Luân 2113985

2 Võ Phước Luân 2113990

3 Nguyễn Quang Minh 2152768

TP. Hồ Chí Minh, ngày 18 tháng 4 năm 2023


LAB 3
GIAO TIẾP SERIAL PORT, EEPROM, RTC

MỤC TIÊU:

 Hiểu và sử dụng được các ngoại vi UART, I2C, SPI


 Hiểu cách giao tiếp với RTC, EEPROM

THAM KHẢO:

 Tài liệu hướng dẫn thí nghiệm, chương 4, 5


 Atmel-2505-Setup-and-Use-of-AVR-Timers_ApplicationNote_AVR130.pdf

BÀI 1
1. Trả lời các câu hỏi
a. Với tần số là 8Mhz, baudrate thực tế sẽ sai lệch với mong muốn là
9600 như thế nào?
b. Cờ UDRE dùng để làm gì?
- UDRE là một cờ ngắt trong vi điều khiển ATmega324p cho biết bộ
đệm truyền (UDR) có sẵn sàng nhận dữ liệu mới hay không. Khi
UDRE được đặt, nó có nghĩa là bộ đệm trống và sẵn sàng để được
ghi.
c. Sự khác nhau giữa hardware UART và software UART (bit-banging
UART)
- UART phần cứng là một phần của vi điều khiển và được tích hợp
sẵn trong vi điều khiển. Nó sử dụng các chân riêng biệt để truyền và
nhận dữ liệu3. Trong khi đó, UART phần mềm (bit-banging UART)
là một phần mềm được viết để giả lập UART phần cứng. Nó sử

dụng các chân GPIO của vi điều khiển để truyền và nhận dữ liệu.
d. Chân TxD0 và chân RxD0 của UART0 là chân port nào?
- Chân TxD0 và chân RxD0 của UART0 trong ATmega324p là chân
port PD0 và PD1.
e. Atmega324 có bao nhiêu phần cứng UART?
- ATmega324p có 2 phần cứng UART là UART0 và UART1.

https://doe.dee.hcmut.edu.vn/
LAB 3
GIAO TIẾP SERIAL PORT, EEPROM, RTC

2. Mã nguồn và chú thích:


.ORG 0
RJMP SET_T_R
.ORG $40
SET_T_R:
LDI R16,24
STS UCSR0B,R16
LDI R16,6
STS UCSR0C,R16
LDI R16,0
STS UBRR0H,R16
LDI R16,51
STS UBRR0L,R16
STACK:
LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
MAIN:
RCALL RECEIVE
RCALL TRANS
RJMP MAIN
TRANS:
LDS R17,UCSR0A
SBRS R17,UDRE0
RJMP TRANS
STS UDR0,R18
RET
RECEIVE:
LDS R17,UCSR0A
SBRS R17,RXC0
RJMP RECEIVE
LDS R18,UDR0
RET

https://doe.dee.hcmut.edu.vn/
LAB 3
GIAO TIẾP SERIAL PORT, EEPROM, RTC

https://doe.dee.hcmut.edu.vn/
LAB 3
GIAO TIẾP SERIAL PORT, EEPROM, RTC

BÀI 3
1. Trả lời các câu hỏi

a. Theo datasheet của 74HC595, tần số cao nhất của xung nhịp đưa
vào 74595 là bao nhiêu?
- Tần số cao nhất của xung nhịp đưa vào 74595 là 25MHz.
b. Với clock là 8Mhz thì SPI của Atmega328 có tốc độ cao nhất là bao
nhiêu?
- Với clock là 8MHz thì SPI của Atmega324P sẽ có tốc độ cao nhất
là 4MHz.
2. Mã nguồn và chú thích:
.ORG 0
RJMP STACK
.ORG $40
STACK:
LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
SET_UART:
LDI R16,16
STS UCSR0B,R16
LDI R16,6
STS UCSR0C,R16
LDI R16,0
STS UBRR0H,R16
LDI R16,51
STS UBRR0L,R16
SET_SPI:
LDI R16,0XB0
OUT DDRB,R16
SBI PORTB,4
SBI PORTB,6
LDI R16,0X51
OUT SPCR0,R16
MAIN:
RCALL UART_RECEIVE
RCALL SPI_TRANS
RJMP MAIN
UART_RECEIVE:
LDS R17,UCSR0A
SBRS R17,RXC0
RJMP UART_RECEIVE
LDS R18,UDR0
RET
SPI_TRANS:
OUT SPDR0,R18
CBI PORTB,4

https://doe.dee.hcmut.edu.vn/
LAB 3
GIAO TIẾP SERIAL PORT, EEPROM, RTC

TRANS:
IN R17,SPSR0
SBRS R17,SPIF0
RJMP TRANS
SBI PORTB,4
RET

https://doe.dee.hcmut.edu.vn/
LAB 3
GIAO TIẾP SERIAL PORT, EEPROM, RTC

BÀI 4
1. Trả lời các câu hỏi

a. Dung lượng của EEPROM 25AA1024 là bao nhiêu?


- Dung lượng của EEPROM 25AA1024 là 1MB
b. Theo datasheet, tần số nhanh nhất của xung CK đưa vào EEPROM
này là bao nhiêu?
2. Mã nguồn và chú thích:
.EQU SPI_PORT=PORTB
.EQU SPI_PORT_DDR=DDRB
.EQU SS=4
.EQU MOSI=5
.EQU MISO=6
.EQU SCK=7
.EQU WIP=0
.EQU PE=$42
.EQU WREN=$06
.EQU WRDI=$04
.EQU RDSR=$05
.EQU WRSR=$01
.EQU SPI_RD=$03
.EQU SPI_WR=$02
.ORG 0
RJMP IOSET
.ORG $40
IOSET:
LDI R16,0XFF
OUT DDRA,R16
LDI R16,0
OUT PORTA,R16
STACK:
LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
SET_UART:
LDI R16,16
STS UCSR0B,R16
LDI R16,6
STS UCSR0C,R16
LDI R16,0
STS UBRR0H,R16
LDI R16,51
STS UBRR0L,R16
SET_SPI:
LDI R16,240
OUT DDRB,R16
SBI PORTB,4
SBI PORTB,6

https://doe.dee.hcmut.edu.vn/
LAB 3
GIAO TIẾP SERIAL PORT, EEPROM, RTC

LDI R16,0X51
OUT SPCR0,R16
LDI R16,1
STS SPSR0,R16
MAIN:
LDI R18,0
RCALL EEPROM_READ
START:
RCALL UART_RECEIVE
INC R18
OUT PORTA,R18
RCALL EEPROM_ERASE
RCALL EEPROM_WRITE
RJMP START
UART_RECEIVE:
LDS R17,UCSR0A
SBRS R17,RXC0
RJMP UART_RECEIVE
LDS R19,UDR0
RET
SPI_TRANS:
OUT SPDR0,R16
TRANS:
IN R20,SPSR0
SBRS R20,SPIF0
RJMP TRANS
IN R21,SPDR0
RET
EEPROM_WRITE:
CBI SPI_PORT,SS
LDI R16,WREN
RCALL SPI_TRANS
SBI SPI_PORT,SS
CBI SPI_PORT,SS
LDI R16,0X02
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS
LDI R16,1
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS
MOV R16,R18
RCALL SPI_TRANS
SBI SPI_PORT,SS
WR_FIN:
LDI R16,RDSR
CBI SPI_PORT,SS
RCALL SPI_TRANS
SBRC R21,WIP
RJMP WR_FIN
SBI SPI_PORT,SS
RET

https://doe.dee.hcmut.edu.vn/
LAB 3
GIAO TIẾP SERIAL PORT, EEPROM, RTC

EEPROM_ERASE:
LDI R16,WREN
CBI SPI_PORT,SS
RCALL SPI_TRANS
SBI PORTB,SS
LDI R16,PE
CBI PORTB,SS
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS
LDI R16,1
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS
SBI SPI_PORT,SS
ERASER_FIN:
LDI R16,RDSR
CBI SPI_PORT,SS
RCALL SPI_TRANS
SBRC R21,WIP
RJMP ERASER_FIN
SBI SPI_PORT,SS
RET
EEPROM_READ:
LDI R16,SPI_RD
CBI PORTB,SS
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS
LDI R16,1
RCALL SPI_TRANS
LDI R16,0
RCALL SPI_TRANS
LDI R16,$FF
RCALL SPI_TRANS
SBI PORTB,SS
MOV R18,R21
RET

https://doe.dee.hcmut.edu.vn/
LAB 3
GIAO TIẾP SERIAL PORT, EEPROM, RTC

https://doe.dee.hcmut.edu.vn/
LAB 3
GIAO TIẾP SERIAL PORT, EEPROM, RTC

https://doe.dee.hcmut.edu.vn/

You might also like