You are on page 1of 7

Bài tập chương 3

3.1 Hãy cho biết phương pháp định địa chỉ của các lệnh sau:
a) MOV R1, R15
b) LD R10, Y
c) LDI R16, $12
d) LDS R16, $12
e) ST -X, R28
f) RJMP LOOP
g) LPM
h) CALL CTCON
i) IJMP
j) PUSH XL
k) CBI PINA, 5
l) BRNE KHAC
3.2 Viết các lệnh tương ứng với các phương pháp định địa chỉ bên dưới (không dùng lại các lệnh
ở câu 3.1).
a) Định địa chỉ 1 thanh ghi đơn.
b) Định địa chỉ 1 thanh ghi đơn với giá trị tức thời.
c) Định địa chỉ thanh ghi.
d) Định địa chỉ trực tiếp (IORs).
e) Định địa chỉ trực tiếp SRAM.
f) Định địa chỉ gián tiếp qua thanh ghi (dữ liệu gián tiếp với hậu tố cộng (+)).
g) Định địa chỉ gián tiếp qua thanh ghi (dữ liệu gián tiếp với một độ dời).
h) Định địa chỉ trực tiếp bộ nhớ chương trình.
i) Định địa chỉ tương đối không điều kiện.
j) Định địa chỉ tương đối có điều kiện.
k) Định địa chỉ bit theo byte.
l) Định địa chỉ bit theo bit.
3.3 Offset tương đối (biểu diễn dưới dạng số nhị phân) của lệnh RJMP AHEAD là bao nhiêu nếu
lệnh này đang ở ô nhớ 200CH, và nhãn AHEAD biểu diễn lệnh ở địa chỉ 20C3H.

3.4 Offset tương đối (biểu diễn dưới dạng số nhị phân) của lệnh RJMP BACK là bao nhiêu nếu
lệnh này đang ở ô nhớ 3A50H, và nhãn BACK biểu diễn lệnh ở địa chỉ 397DH.

3.5 Giả sử lệnh BRNE AHEAD ở bộ nhớ chương trình tại địa chỉ 2F9FH, và nhãn AHEAD tương
ứng với lệnh ở địa chỉ 2FC8H. Tìm offset tương đối (biểu diễn dưới dạng số nhị phân).

3.6 Lệnh BRLO BACK ở bộ nhớ chương trình tại địa chỉ 095CH. Lệnh này có offset tương đối
là 1100110. Hãy tìm địa chỉ của nhãn BACK.

3.7 Nội dung của các thanh ghi và các ô nhớ SRAM là:
R15 = 42H (122H) = 25H
R16 = 5AH (123H) = F5H
R26 = C5H (124H) = 17H
R27 = 01H (125H) = 5CH
SP = 8FFH (126H) = 8AH
(127H) = 06H
Ghi chú sau mỗi dòng lệnh tên các thanh ghi hoặc địa chỉ ô nhớ SRAM có thay đổi và nội dung
của chúng.
SWAP R15 ;R15 = 24H
MUL R16, R15 ;…………………………
LDI XL, $25 ;…………………………
LD R16, -X ;…………………………
ADD R16, R0 ;…………………………
ST X+, R16 ;…………………………
PUSH R1 ;…………………………
POP R5 ;…………………………

Hãy cho biết thời gian thực thi đoạn chương trình trên với nguồn xung clock mặc định là 8MHz
trong hai trường hợp sau:
a) Bit cầu chì CKDIV8 = 0 (đã lập trình).
b) Bit cầu chì CKDIV8 = 1 (chưa lập trình).
3.8 Nội dung của các thanh ghi và các ô nhớ SRAM là:
R20 = 42H (12FH) = 25H
R21 = 5AH (130H) = F5H
R30 = 31H (131H) = 17H
R31 = 2FH (132H) = 05H
SP = 8A0H (133H) = 06H
Ghi chú sau mỗi dòng lệnh tên các thanh ghi hoặc địa chỉ ô nhớ SRAM có thay đổi và nội dung
của chúng.
PUSH ZH ;…………………………
LDS R21, $130 ;…………………………
LDI R31, $1 ;…………………………
LD R20, Z+ ;…………………………
ADD R21, R20 ;…………………………
ST Z+, R21 ;…………………………
ROL R21 ;…………………………
ANDI R21, $D6 ;…………………………
PUSH R21 ;…………………………
Hãy cho biết thời gian thực thi đoạn chương trình trên với nguồn xung clock mặc định là 8MHz
trong hai trường hợp sau:
a) Bit cầu chì CKDIV8 = 0 (đã lập trình).
b) Bit cầu chì CKDIV8 = 1 (chưa lập trình).
3.9 Ghi chú sau mỗi dòng lệnh tên các thanh ghi hoặc địa chỉ ô nhớ SRAM (kể cả ô nhớ ngăn xếp
và con trỏ SP) có thay đổi và nội dung của chúng.

.ORG 0
LDI R20, $66 ; R20 = 66H, SP = 8FFH
LDI R30, $7F ;………………………..
LDI R17, $5D ;………………………..
MOV R5, R17 ;………………………..
PUSH R20 ;………………………..
PUSH R30 ;………………………..
PUSH R5 ;………………………..
LDI R20, $0F ;………………………..
MOV R5, R20 ;………………………..
POP ZL ;………………………..
POP R5 ;………………………..
POP R20 ;………………………..
Đoạn chương trình có trả lại các trị cũ cho các thanh ghi R5, R20 và R30 không? Nếu không thì
phải đổi các lệnh như thế nào để lưu lại giá trị cũ.
3.10 Viết các chương trình để cài đặt các phép toán logic như ở hình bên dưới.

3.11 Hãy viết các lệnh dùng để tạo ra xung mức thấp trong 5 μs ở PB7. Fosc=8MHz trong hai
trường hợp sau:
a) Bit cầu chì CKDIV8 = 0 (đã lập trình).
b) Bit cầu chì CKDIV8 = 1 (chưa lập trình).
3.12 Xét đoạn chương trình sau:
SBI DDRC, 5
PULSE: SBI PORTC, 5
CALL DELAY
CBI PORTC, 5
CALL DELAY
RJMP PULSE
DELAY: LDI R22, 200
LP3: LDI R21, 250
LP2: LDI R20, 250
LP1: NOP
NOP
DEC R20
BRNE LP1
DEC R21
BRNE LP2
DEC R22
BRNE LP3
RET

Hãy tính thời gian MỨC CAO và thời gian MỨC THẤP của xung ở chân PC5.
a) Tính gần đúng.
b) Tính chính xác chương trình DELAY.
3.13 Bộ nhớ SRAM được khởi tạo trị như sau, ngay trước khi thực thi lệnh RET:
(107H) = 9AH SP = 109H
(108H) = 78H PC = 0200H
(109H) = 56H
(10AH) = 34H
(10BH) = 12H
Nội dung của PC và SP sau khi thực thi lệnh RET là bao nhiêu?
3.14 Cho đoạn mã sau:
RTN: IN R16, SREG
PUSH R16
LOOP: LD R16, X+
ST Y+, R16
DEC R17
BRNE LOOP
POP R16
OUT SREG, R16
RET
a) Chương trình con RTN làm gì?
b) Thanh ghi nào được dùng làm địa chỉ nguồn?
c) Thanh ghi nào được dùng làm địa chỉ đích?
d) Thanh ghi R17 được dùng làm gì trong chương trình con?
e) Ta nên thay đổi chương trình con trên như thế nào để bảo toàn các thanh ghi R16, R17, X, Y?
3.15 Cho đoạn mã sau:
RTN: PUSH R20
LP: LD R21, Z+
CP R21, R20
BRNE NEXT
SER R21
RJMP FIN
NEXT: DEC R22
BRNE LP
CLR R21
FIN: POP R20
RET
a) Chương trình con RTN làm gì?
b) Thanh ghi nào được dùng làm mẫu dữ liệu tìm kiếm?
c) Thanh ghi nào được dùng chứa kết quả?
d) Thanh ghi R20 được dùng làm gì trong chương trình con?
e) Giải thích hoạt động của các lệnh PUSH và POP trong chương trình con.

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


CTC: PUSH R21
MOV R21, R20 ;(1)
SWAP R21
EOR R21, R20
BREQ BANG ;(2)
CLT
RJMP KT
BANG:
SET
KT: POP R21
RET
a) Cho biết phương pháp định địa chỉ của lệnh (1), (2).
b) Cho biết kết quả cờ T sau khi thực hiện chương trình CTC với R20 = F0H và R20 = AAH?
c) Tại sao cần có lệnh PUSH R21/POP R21?
d) Cho biết chương trình con làm gì? Có thông số nhập và thông số xuất là gì?
3.17 Viết chương trình có nhiệm vụ liên tục thực hiện việc so sánh nội dung nhận từ Port B và Port
C (số không dấu). Kết quả so sánh thể hiện bằng các đèn điều khiển LỚN (PA0), BẰNG (PA1),
NHỎ (PA2). Theo kết quả so sánh thì đèn tương ứng sẽ sáng, các đèn còn lại tắt. Muốn đèn sáng
thì bit điều khiển bằng 0, muốn tắt thì bit điều khiển bằng 1.
Chương trình cần thay đổi thế nào khi so sánh dữ liệu nhận về là số có dấu.

3.18 Viết chương trình liên tục thực hiện công việc theo 2 chân PD1 và PD0 như sau, băng 2
cách:
PD1 PD0 Nội dung R22 bằng
0 0 R21 + R20
0 1 R21 – R20
1 0 R21 AND R20
1 1 R21 OR R20
a. So sánh cùng lúc 2 chân PD1 và PD0..
b. Xét từng chân PD1 và PD0

3.19 Một DIP switch 4 bit và LED 7 đoạn anode chung được nối vào ATmega324P như được chỉ
trong hình. Hãy viết chương trình liên tục đọc mã 4 bit từ DIP switch và cập nhật các LED để hiển
thị ký tự hex thích hợp. Thí dụ, nếu đọc được mã 1100B thì sẽ xuất hiện ký tự hex “C”, như vậy
các đoạn từ a đến g tương ứng sẽ là ON, OFF, OFF, ON, ON, ON, và OFF.

a) Lập bảng mã led 7 đoạn để xuất ra Port B hiển thi cho giá tri HEX: 0,1,..,9,A,B,C,D,E,F
b) Viết chương trình không dùng bảng tham chiếu .
c) Viết chương trình dùng bảng tham chiếu mã led 7 đoạn…

3.20 Viết chương trình con đổi 1 số BCD 2 ký số thành 2 mã (LED) 7 đoạn. Số BCD được đọc từ
Port B và kết quả được xuất ra Port C và Port D (Port C ứng với ký số hàng chục, Port D ứng hàng
đơn vị).

Minh họa cho kết nối LED 7 đoạn ở Port C (tương tự cho Port D)
3.21 a. Viết chương trình con BCDTOASCII đổi 1 ký số BCD trong thanh ghi R20 thành biểu
diễn ASCII tương ứng và cất vào trong ô nhớ được chỉ bởi thanh ghi X. Nếu giá trị trong R20
không phải BCD thì cho bit T = 1. Mã ASCII của số 0, 1, ..,9 là 30H, 31H, .., 39H.
b. Từ đó hãy phát triển thành chương trình con đổi 2 ký số BCD trong thanh ghi R20 thành
biểu diễn ASCII của chúng, kết quả được cất vào 2 ô nhớ có địa chỉ liên tiếp với địa chỉ đầu chứa
trong thanh ghi X (mã ASCII của ký số BCD có trọng số cao sẽ được cất ở địa chỉ thấp).

3.22 a. Viết chương trình con HEXTOASCII đổi 1 chữ số HEX trong thanh ghi R20 (chứa ở 4
bit thấp, còn 4 bit cao bằng 0) thành biểu diễn ASCII của chúng, kết quả được cất vào thanh ghi
R20.
b. Dùng chương trình con HEXTOASCII ở câu a viết chương trình liên tục nhận data từ
Port B và đổi thành mã ASCII tương đương. ASCII của 4 bit thấp xuất ra Port C và ASCII của 4
bit thấp xuất ra Port D. Chương trình liên tục thực hiện cho tới khi giá tri nhận được là 0 thì dừng
sau khi xuất ra 2 port.

3.23 a. Viết chương trình con ASCIITOBCD đổi biểu diễn ASCII được cất trong ô nhớ được
chỉ bởi thanh ghi Y thành ký số BCD tương ứng và cất vào trong thanh ghi R20. Nếu giá trị trong
thanh ghi R20 không phải BCD thì cho bit T = 1.
b. Từ đó hãy phát triển thành chương trình con đổi 2 ký số dạng ASCII được cất trong ô
nhớ được chỉ bởi thanh ghi Y (ký số có trọng số cao chứa ở địa chỉ thấp) thành BCD 2 ký số (BCD
nén) cất trong thanh ghi R20.

3.24 a. Viết chương trình con ASCIITOHEX đổi biểu diễn ASCII được cất trong ô nhớ được
chỉ bởi thanh ghi Y thành ký số HEX (0,1, .., 9, A, B, C, D, E, F) tương ứng và cất vào trong thanh
ghi R20. Nếu giá trị ô nhớ không phải mã ASCII của ký số HEX thì cho bit T = 1.
b. Sử dụng chương trình con câu a để viết chương trình con đổi 2 ký số dạng ASCII được
cất trong ô nhớ được chỉ bởi thanh ghi Y (ký số có trọng số cao chứa ở địa chỉ thấp) thành số HEX
2 ký số (HEX trọng số cao cất 4 bit cao, số HEX trọng số thấp cất 4 bit thấp) cất trong thanh ghi
R20.

3.25 Viết chương trình tìm kiếm trong khối dữ liệu SRAM gồm 16 byte dữ liệu bắt đầu ở địa chỉ
100H với byte dữ liệu được đọc từ Port C. Chỉ cần tìm 1 giá trị giống nhau.
a) Khi hoàn tất tìm kiếm thì đặt bit 1 của thanh ghi R24 lên 1.
b) Nếu tìm thấy dữ liệu thì đặt bit 2 của thanh ghi R24 lên 1.
c) Nếu không tìm thấy dữ liệu thì xóa bit 2 thanh ghi R24 về 0.
Chú ý không thay đổi các bit còn lại của R24

3.26 Viết chương trình xác định xem có bao nhiêu byte có trị bằng 0, giá trị âm, giá trị dương trong
một khối bộ nhớ SRAM có địa chỉ cuối là 1FFH, số byte của khối dữ liệu là nội dung ô nhớ 200H
(giả sử khác 0). Kết quả: ô nhớ 240H sẽ chứa số byte có trị bằng 0, ô nhớ 241H sẽ chứa số byte có
trị âm, ô nhớ 242H sẽ chứa số byte có trị dương.

3.27 Viết chương trình tìm phần tử nhỏ nhất trong 1 khối dữ liệu SRAM. Chiều dài của khối dữ
liệu ở trong ô nhớ 141H (giả sử khác 0) và địa chỉ bắt đầu khối ở trong ô nhớ 142H và 143H (ô
nhớ địa chỉ thấp chứa byte thấp của địa chỉ bắt đầu) (giả sử vẫn trong vùng nhớ SRAM). Kết quả
chứa phần tử nhỏ nhất đó trong ô nhớ 140H, giả sử khối dữ liệu chứa các số nhị phân không dấu.
3.28 Làm lại câu 3.27 với khối dữ liệu chứa số có dấu và tìm giá trị lớn nhất.
3.29 Viết chương trình thực hiện các nhiệm vụ sau:
a. Xóa 1KB địa chỉ cao SRAM vi điều khiển ATmega324P (từ địa chỉ 0xXXX đến địa chỉ
cuối).
b. Điền toàn bộ 1KB địa chỉ cao SRAM vi điều khiển ATmega324P (từ địa chỉ 0xXXX đến
địa chỉ cuối) giá trị 55H.
c. Kiểm tra lại toàn bộ giá trị ở mỗi ô nhớ (ở câu b) có bằng 55H không? Nếu đúng thì cho
bit T = 1, ngược lại bit T = 0.
3.30 Viết chương trình copy nội dung 16 ô nhớ SRAM có địa chỉ đầu là 200H vào 16 thanh ghi
GPRs đầu tiên (R0-R15)
3.31 Viết chương trình copy 16 word của bộ nhớ Flash có địa chỉ đầu là 0100H vào vùng SRAM
có địa chỉ đầu bằng địa chỉ byte thấp của word đầu tiên của khối word copy.

3.32 Cho chương trình con SOBIT_1 có chức năng đếm số bit 1 có trong thanh ghi R20 (in: R20,
out: R21 chứa kết quả). Viết chương trình đếm trong chuỗi data SRAM gồm 100 byte có địa chỉ
đầu là $200, có bao nhiêu ô nhớ có tổng số bit 1 là con số chẵn. Kết quả cất vào ô nhớ $1FF

3.33 Viết chương trình tạo xung như hình vẽ, cho trước chương trình con DL1s có chức năng tạo
trễ 1 giây.

3.34 Tạo sóng vuông DC=50% ở ngõ ra PD3, biết rằng tần số phụ thuộc vào ngõ vào PD6: nếu
PD7 = 0 thì f = 0.8KHz, PD7 = 1 thì f = 5 Hz. (Biết Fosc = 8MHz, CKDIV8 = 1)

You might also like