Prelab 2 - Bùi Trần Gia Hưng

You might also like

Download as docx, pdf, or txt
Download as docx, pdf, or txt
You are on page 1of 38

Bùi Trần Gia Hưng - MSSV : 2211353

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.

https://doe.dee.hcmut.edu.vn/
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
b) Mô phỏng, chỉnh sửa chương trình để tạo ra xung chính xác.

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 PA0 vào oscilloscope để kiểm tra

https://doe.dee.hcmut.edu.vn/
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
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.

https://doe.dee.hcmut.edu.vn/
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
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.

c) Kết nối chân OC0 ra oscilloscope và quan sát

https://doe.dee.hcmut.edu.vn/
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
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

https://doe.dee.hcmut.edu.vn/
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
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

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

b) Kết nối vào Oscilloscope và đo dạng sóng ngõ ra

c) Kết nối OC0B vào kênh R của 1 LED RGB. Viết chương trình để tăng duty cycle trên
OC0B từ 0% lên 100% rồi lại giảm xuống 0, sau 10 ms duty cycle tăng/giảm 1%.

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. 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: T osc = 1us, Td=n*T osc*N do đó
Tdmax = 255*1us*1024 = 0.26112 s = 261.12 ms

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
T osc = 1us, Td = m*T osc*N do đó Tdmax = 65535*1us*1024 = 67.10784s

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
T osc = 1us, Td = 1ms = n*T osc*N
Chọn N = 8, n = 125
d. Mã nguồn chương trình với chú thích

SBI DDRA,0
CBI PORTA,0
START:
RCALL DELAY
SBI PORTA,0
RCALL DELAY
CBI PORTA,0

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

RJMP START
DELAY:
LDI R16,-125
OUT TCNT0,R16
LDI R16,0x00
OUT TCCR0A,R16
LDI R16,0x02
OUT TCCR0B,R16
SBIS TIFR0,TOV0
RJMP WAIT
SBI TIFR0,TOV0
LDI R16,0x00
OUT TCCR0B,R17
RET

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?
- Timer tràn
b. Ở mode CTC, khi nào bit OCFx được set lên 1?
- Đạt kết quả so sánh
c. Giá trị các thanh ghi cấu hình cho timer 0 cho 2 trường hợp
Mode Normal

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

TCNT0 = 0xFF, TCCR0A = 0, TCCR0B = 0x02; mode CTC: TCNT0 = 0,


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

.org 0

sbi ddrb,0

cbi portb,0

ldi r17,0

out TCCR0A,r17

ldi r17,0

out TCCR0B,r17

Start:

call delay

sbi portb,0

call delay

cbi portb,0

rjmp Start

delay:

ldi r16,32

out TCNT0,r16

ldi r16,0x01

out TCCR0B,r16

wait: sbis TIFR0,TOV0

rjmp wait

sbi TIFR0,TOV0

ldi r16,0

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

out TCCR0B,r16

ret

.org 0

sbi ddrb,0

cbi portb,0

ldi r17,31

out OCR0A,r17

ldi r17,0x02

out TCCR0A,r17

ldi r17,0x01

out TCCR0B,r17

ldi r16,1

Start:

sbis TIFR0, OCF0A

rjmp Start

SBI TIFR0, OCF0A

in r17,portB

eor r17,r16

out portB, r17

rjmp Start

BÀI 3

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

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)

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ả

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
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.

BÀI 5
1. Trả lời các câu hỏi
a. Timer 0 làm việc ở mode nào?
b. Giá trị đưa vào các thanh ghi của timer 0 là bao nhiêu? Giải thích
2. Trình bày mã nguồn với chú thích.

.org 0

ldi r16, high(ramend)

out sph,r16

ldi r16, low(ramend)

out spl,r16

sbi ddrb,0

ldi r17,0

out TCCR0A,r17

ldi r17,0

out TCCR0B,r17

Start:

call Delay_10ms

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

call Duty_Cycle

call Tinh_Thoigian

sbi portB,0

mov r17,r21

neg r17

call Delay_T0

cbi portB,0

mov r17,r20

neg r17

call Delay_T0

rjmp Start

Delay_T0:

out TCNT0,r17

ldi r17, 0x02

out TCCR0B,r17

Wait:

sbis TIFR0,TOV0

rjmp Wait

sbi TIFR0,TOV0

ldi r17,0

out TCCR0B,r17

ret

Delay_10ms:

ldi r16,-156

out TCNT0,r16

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

ldi r16,0

out TCCR0A,r16

ldi r16,0x03

out TCCR0B,r16

wait_1:

sbis TIFR0,TOV0

rjmp wait_1

sbi TIFR0,TOV0

ldi r16,0

out TCCR0B,r16

ret

Duty_Cycle:

Tang:

inc r17

cpi r17,100

brpl Giam

ret

Giam:

dec r17

cpi r17,0

https://doe.dee.hcmut.edu.vn/
Downloaded by H?NG BÙI TR?N GIA (hung.buitrangia@hcmut.edu.vn)

lOMoARcPSD|22768340 BÁO CÁO


Nhóm:

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

Nhóm môn học: Môn thí nghiệm:


brmi Tang

ret

;ctc tinh thoi gian tH và tL, ngo vao la r17, tra ve th=r21 va

tL=r20

Tinh_Thoigian:

call Nhan10

call Chia8

mov r21, r19

ldi r16,100

sub r16,r17

mov r17,r16

call Nhan10

call Chia8

mov r20,r19

ret

;ctc nhan10, tra ve r18

Nhan10:

push r17

mov r16,r17

mov r18,r17

add r16,r16

add r16,r16

add r18,r16

add r18,r18

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

pop r17

ret

;ctc chia 8, thuong tra ve r19

Chia8:

push r18

tru:

inc r19

subi r18, 8

brcc tru

dec r19

pop r18

ret

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

LAB2_1 Bài 5.

Mấy bài tạo xung, trước hết cần phân tích xung yêu cầu, tốt nhất là vẽ dạng xung ra.

Tính xem mấy đoạn thời gian là bao lâu.


Xem kỹ đề có ràng buộc cấu hình timer không, (timer 8bit hay 16 bit, hệ số chia yêu cầu là bao
nhiêu) => xác định rõ giá trị đếm cao nhất của timer, từ đó đưa ra cách viết cụ thể.
Ví dụ: Yêu cầu xuất xung như trên, giá trị đếm cao nhất timer có thể dùng vượt quá 0.75ms có
thể dùng cách sau: tính toán hệ số n cho mức cao, n cho mức thấp. Viết chương trình delay có
thể thay đổi giá trị gán TCNT0 vào trong 2 trường hợp.
Ví dụ: Yêu cầu xuất xung như trên, giá trị đếm cao nhất timer bị ràng buộc còn có 0.001ms là tối
đa thì bắt buộc phải dùng thêm vòng lập.
.EQU MUCCAO = -31
.EQU MUCTHAP = -94

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

.ORG 0
RJMP MAIN

//--------------------------------------------------------
.ORG 0X40
MAIN:
//Cấu hình chân output
...

//Cấu hình Timer , dừng timer


...

LOOP:
SBI PORTB, 4
LDI R16, MUCCAO
RCALL DELAY
//Tự viết cho nhớ
...

RJMP LOOP

DELAY:
//Tự viết cho nhớ
...

RET

Dùng thêm vòng lập thì có thể tham khảo sau


.ORG 0
RJMP MAIN

//--------------------------------------------------------
.ORG 0X40
MAIN:
//Cấu hình chân output
...

//Cấu hình Timer , dừng timer


...

LOOP:
//Viết chương trình set bit output, sau đó gọi chương trình con DELAY10us 25 lần

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

...

//Viết chương trình clear bit output, sau đó gọi chương trình con DELAY10us 75 lần
...

RJMP LOOP

DELAY10us:
//Tự viết cho nhớ
...

RET

Bài 5b

// Bai 5b. Dùng mode fast PWM có thể tham khảo code sau.
.ORG 0x00
RJMP MAIN
.ORG 0X40
MAIN:
LDI R16, (1 << WGM01) | (1 << WGM00) | (1 << COM0B1)
OUT TCCR0A,R16
LDI R16, (1 << WGM02) | (1 << CS01) | (1 << CS00)
OUT TCCR0B,R16 ;SETUP CHE DO FPWM (111)
LDI R16, (1 << PB4) | (1 << PB3) ; OC0B ~ PB4
OUT DDRB,R16 ; OC0B XUAT
LDI R16,124
OUT OCR0A,R16 ;GIA TRI SO SANH KENH A
// SET CHE DO TIMER0 FPWM
RJMP START
SETUP_TIMER0:
OUT OCR0B,R17 ;GIA TRI SO SANH KENH B
RET

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

START:
CLR R17
START_TANG:
LDI R18,4 ;SO LAN CHU KI CAN HOAN THANH DE BU
TANG:
RCALL DELAY_10MS
INC R17 ;TANG DUTY CYCLE, TANG 1 LAN TUONG UNG TANG 0.08%
CPI R17,124
BREQ START_GIAM
RCALL SETUP_TIMER0
DEC R18
BRNE TANG
INC R17 ;SAU 4 LAN TANG 0.08%, TANG BU THEM 0.08% DE SAU
LDI R18,4
RJMP TANG
START_GIAM:
LDI R18,4 ;SO LAN CHU KI CAN HOAN THANH DE BU
GIAM:
RCALL DELAY_10MS
DEC R17 ;GIAM DUTY CYCLE, GIAM 1 LAN TUONG UNG GIAM 0.08%
CPI R17,0
BREQ START_TANG
RCALL SETUP_TIMER0
DEC R18
BRNE GIAM
DEC R17 ;SAU 4 LAN GIAM 0.08%, GIAM BU THEM 0.08% DE SAU 5 LAN THANH GIAM 4%
LDI R18,4
RJMP GIAM
DELAY_10MS:
LDI R19,10
L3: RCALL DELAY_1MS
DEC R19
BRNE L3
RET
DELAY_1MS: // CKDIV CHƯA LẬP TRÌNH -> MC =0.125us
LDI R22,10 // 1MC
L2: LDI R23,200 // 1MC
L1 : NOP // 1MC
DEC R23 // 1MC
BRNE L1 // 2/1 MC
DEC R22 // 1MC
BRNE L2 // 2/1MC
RET

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

LAB2_2 Bài 2.

Khối hiển thị 4 LED 7 đoạn.


LED 7 đoạn có cấu tạo gồm 8 LED đơn được nối chung cực anode (dạng LED anode chung)
hoặc nối chung cực cathode (dạng LED cathode chung). Các LED trên LED 7 đoạn được đánh
tên lần lượt là a, b, c, d, e, f, g tương ứng với 7 đoạn để hiển thị số hoặc các chữ cái, đồng thời
còn có thêm một LED tên dp để hiển thị dấu chấm thập phân giữa các chữ số. Để điều khiển
LED 7 đoạn hiển thị một chữ số, người lập trình cần điều khiển các đèn LED sáng, tắt tương ứng
để hiển thị chữ số đó. Ví dụ như muốn hiển thị chữ số 7 lên LED 7 đoạn loại cathode chung
(hình dưới bên tay trái) ta cần làm sáng các đèn a, b, c bằng cách phân cực thuận cho các LED
này (các chân a, b, c cần ở mức cao) và tắt tất cả các đèn còn lại (các chân còn lại ở mức thấp).

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

Trong kit thí nghiệm vi xử lý, phần mạch điều khiển LED 7 đoạn được thiết kế như sau:

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

Khối LED 7 đoạn gồm có 4 LED loại anode chung vì chân chung của LED 7 đoạn là chân số 3
và 8 được cấp nguồn thông qua việc điều khiển đóng ngắt BJT. Các tín hiệu điều khiển đóng
ngắt các BJT có tên là LED0, LED1, LED2, LED3, để bật LED 7 đoạn tương ứng thì các
chân này phải ở mức thấp (mức 0). Bốn tín hiệu cho phép bật từng LED 7 đoạn là LED0,
LED1, LED2, LED3 là ngõ ra của IC 74’573 (IC chốt), với tín hiệu cho phép chốt là nLE_1
được nối với header J82-có thể nối với VXL để điều khiển.

Hoạt động của IC chốt: khi tính hiệu vào chân /LE (tích cực thấp) của IC được tích cực thì ngõ ra
Qn = Dn. Khi chân LE hết tích cực thì ngõ ra Qn được giữ nguyên trạng thái đã chốt trước đó dù
cho ngõ vào Dn có thay đổi, thiết kế như thế để đảm bảo việc điều khiển các khối LED 7 đoạn
vẫn còn dù cho VXL không còn điều khiển khối LED. Ví dụ: Giờ muốn LED[0:3] = 0b1010 để

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

bật 2 đèn LED0 và LED2 (0 là bật) thì các bước làm như sau:
(Kết nốt D0 đến D7 và nLE_1 vào port của vxl)
nLE_1 = 1 (đảm bảo không cho phép chốt khi thay đổi tín hiệu đầu vào D0:D7)
Thay đổi tín hiệu đầu vào cần thiết:
D0 = 0
D1 = 1
D2 = 0
D3 = 1
nLE_1 = 0 (cho phép chốt tín hiệu)
nLE_1 = 1 (dừng việc chốt tín hiệu)
Các chân A, B, C, D, E, F, G, DP (chân hiển thị dấu chấm thập phân) của LED 7 đoạn được nối
vào ngõ ra của IC 74’573 (IC chốt). Vì thế để LED 7 đoạn hiển thị được chữ số mong muốn thì
người lập trình cần chốt dữ liệu ra khỏi con 573 sao cho các đoạn của LED sáng đúng mong
muốn.

Ta có thể thấy, các chân A, B, C, D, E, F, G, DP của cả 4 LED 7 đoạn trong thiết kế đều được
nối chung ứng với nhau, do đó không thể điều khiển 4 LED 7 đoạn này sáng các giá trị khác
nhau trong cùng một thời điểm. Để đảm bảo việc hiển thị 4 LED 7 đoạn này hiển thị sao cho
người dùng thấy được nó hiển thị 4 ký tự khác nhau, ví dụ số 3 2 1 0 ở trên 4 đèn, ta phải thực
hiện việc quét LED, tần số quét LED cần cao hơn tần số lưu ảnh của mắt (25Hz), thường ta sẽ
tính toán để quét LED ở 30Hz hoặc cao hơn. Quét LED tức là viết chương trình hiển thị từng
LED từ trái qua phải hoặc ngược lại.

Tính toán thời gian delay t: Giả sử ta cần tính toán quét LED ở tần số 100Hz, => chu kỳ quét
LED là 1/100 = 10ms, ta thấy trong bài này cần delay 4 lần vì thế t = 10ms/4 = 2.5ms. => xài
1ms là ok.

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

Code tham khảo, các chương trình con, bảng tra của bài này nên hiểu cách sử dụng để thực hiện
các bài liên quan đến hiển thị LED 7 đoạn dễ dàng.
.EQU LED_7SEG_PORT = PORTD
.EQU LED_7SEG_DDRD = DDRD
.EQU LED_7SEG_LE_PORT = PORTB
.EQU LED_7SEG_LE_DDRD = DDRB
.EQU LED_7SEG_LE0_PIN = 4 ;Data
.EQU LED_7SEG_LE1_PIN = 5 ;Select
.ORG 0
RJMP MAIN

.ORG 0x40
MAIN:
LDI R16,LOW(RAMEND) ;DUA DIA CHI RAMEND LEN VI TRI CAO NHAT
OUT SPL,R16
LDI R16,HIGH(RAMEND)
OUT SPH,R16

/* Kết nối và cấu hình port sử dụng LED 7 đoạn gồm port D cho Data và 2 tín hiệu
chọn nLE_0 nLE_1 ứng với PD4 và PB5, các tín hiệu này đều là output, đặt giá trị ban đầu
cho các tín hiệu này ứng với: LED không hiển thị và không cho phép chốt */

;--------------------------------
LOOP:

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

/* Cách 1: cơ bản để hiểu cách hiển thị LED 7 đoạn


Delay 1ms
R26 = 0
R27 = 1
Gọi chương trình con DISPLAY_7SEG để hiển thị

Delay 1ms
R26 = 1
R27 = 2
Gọi chương trình con DISPLAY_7SEG để hiển thị

Delay 1ms
R26 = 2
R27 = 3
Gọi chương trình con DISPLAY_7SEG để hiển thị

Delay 1ms
R26 = 3
R27 = 4
Gọi chương trình con DISPLAY_7SEG để hiển thị
*/

/* Cách 2:
Dùng vòng lập 4 lần thực hiện lại chương trình trên */

RJMP LOOP

;-------------------------------------------
;INPUT R26 (VI TRI LED(TU 0 DEN 3)), R27 (SO TREN LED 0 DEN 9)
;OUTPUT: none
;-------------------------------------------
DISPLAY_7SEG:
LDI R16,$FF
OUT LED_7SEG_PORT, R16
SBI LED_7SEG_LE_PORT, LED_7SEG_LE1_PIN
NOP
CBI LED_7SEG_LE_PORT, LED_7SEG_LE1_PIN

LDI ZH,HIGH(TABLE_7SEG_DATA<<1)
LDI ZL,LOW(TABLE_7SEG_DATA<<1)
CLR R16
ADD R30, R27
ADC R31, R16
LPM R16,Z
OUT LED_7SEG_PORT, R16

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

SBI LED_7SEG_LE_PORT, LED_7SEG_LE0_PIN


NOP
CBI LED_7SEG_LE_PORT, LED_7SEG_LE0_PIN

LDI ZH, HIGH(TABLE_7SEG_CONTROL << 1)


LDI ZL, LOW(TABLE_7SEG_CONTROL << 1)
CLR R16
ADD ZL, R26
ADC ZH, R16
LPM R16, Z
OUT LED_7SEG_PORT, R16

SBI LED_7SEG_LE_PORT, LED_7SEG_LE1_PIN


NOP
CBI LED_7SEG_LE_PORT, LED_7SEG_LE1_PIN
RET
;--------------------------------
DELAY1MS:
LDI R16,-125
OUT TCNT0,R16

LDI R16,$00
OUT TCCR0A,R16
LDI R16,$03 ;0000 0011
OUT TCCR0B,R16
AGAIN:
SBIS TIFR0,TOV0
RJMP AGAIN
SBI TIFR0,TOV0
LDI R16,$00
OUT TCCR0B,R16
RET
;--------------------------------
TABLE_7SEG_DATA:
.DB 0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90, 0X88, 0X83, 0XC6,
0XA1, 0X86, 0X8E
TABLE_7SEG_CONTROL:
.DB 0b00001110, 0b00001101, 0b00001011, 0b00000111

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

LAB2_2 Bài 3

PORT A*9 tối đa là 255*9 = 2295, cần hiển thị đến 4 chữ số => cần tối thiểu 12 bit. Thuật toán
để thực hiện hiện hiển thị này gồm các bước sau:
Đọc port A
Thực hiện PORT A*9 => kết quả gọi là B16bit phải cất trong 2 thanh ghi (16 bit)
Thực hiện việc lấy chữ số hàng ngàn, trăm, chục, đơn vị:
Lấy B16bit chia 1000 => thương số là chữ số hàng ngàn, số dư gọi là Dư_1
Lấy Dư_1 chia 100 => thương số là chữ số hàng trăm, được số dư gọi là Dư_2
Lấy Dư_2 chia 10 => thương số là chữ số hàng chục, số dư là chữ số hàng đơn vị.
Vấn đề ở đây là phải thực hiện phép chia 2 số 16 bit. => cho code thực hiện số 16 bit chia số
16 bit luôn, không cần hiểu thuật toán, chỉ cần biết cách sử dụng.
.DEF ANSL = R0 ;To hold low-byte of answer
.DEF ANSH = R1 ;To hold high-byte of answer
.DEF REML = R2 ;To hold low-byte of remainder
.DEF REMH = R3 ;To hold high-byte of remainder
.DEF AL = R16 ;To hold low-byte of dividend
.DEF AH = R17 ;To hold high-byte of dividend
.DEF BL = R18 ;To hold low-byte of divisor
.DEF BH = R19 ;To hold high-byte of divisor
.DEF C = R20 ;Bit Counter
DIV1616:
MOVW ANSH:ANSL,AH:AL ;Copy dividend into answer
LDI C,17 ;Load bit counter
SUB REML,REML ;Clear Remainder and Carry
CLR REMH ;
LOOP: ROL ANSL ;Shift the answer to the left
ROL ANSH ;
DEC C ;Decrement Counter
BREQ DONE ;Exit if sixteen bits done
ROL REML ;Shift remainder to the left
ROL REMH ;
SUB REML,BL ;Try to subtract divisor from remainder
SBC REMH,BH
BRCC SKIP ;If the result was negative then
ADD REML,BL ;reverse the subtraction to try again

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

ADC REMH,BH ;
CLC ;Clear Carry Flag so zero shifted into A
RJMP LOOP ;Loop Back
SKIP: SEC ;Set Carry Flag to be shifted into A
RJMP LOOP
DONE:RET

Cách dùng:
LDI AL,LOW(Số bị chia) ;Load low-byte of dividend into AL
LDI AH,HIGH(Số bị chia) ;Load HIGH-byte of dividend into AH
LDI BL,LOW(Số chia) ;Load low-byte of divisor into BL
LDI BH,HIGH(Số chia) ;Load high-byte of divisor into BH
RCALL DIV1616
/* linh động sử dụng MOV AL,R20 nếu biết R20 chưa byte thấp của số bị chia*/
/*=> kết quả phép chia R1:R0 (16 bit, R1 byte cao) và số dư R3:R2 */

Sinh viên phải tự viết thêm chương trình BCD16BIT xử lý số 16 bit ra 4 chữ số BCD, cái này rất
quan trọng vì nó có thể sử dụng lại, phục vụ các bài thí nghiệm về sau. Chương trình nên viết
theo yêu cầu sau: (mặc dù số 16 bit tối đa đến 65536, đề bài này tối đa 4 chữ số thì xử lý 4 chữ
số cũng đc, không thì xử lý luôn cả 5 chữ số cho tổng quát)
/* BCD16bit
INPUT: R17 (high), R16 (low)
OUTPUT: R21 (hàng chục ngàn),
R22 (hàng ngàn),
R23 (hàng trăm),
R24 (hàng chục),
R25 (hàng đơn vị)
DESCRIPTION: Chương trình trả về 5 chữ số BCD của số 16 bit*/

BCD16BIT:
//Thực hiện phép chia cho 10000
LDI BL,LOW(10000) ;Load low-byte of divisor into BL
LDI BH,HIGH(10000) ;Load high-byte of divisor into BH
RCALL DIV1616
//Sau câu lệnh trên, chữ số chục ngàn được lưu trong R1:R0, kết quả phép chia lưu
trong R3:R2 => lấy R0 lưu vào R21 ta được chữ số hàng chục ngàn.
...

//Thực hiện phép chia cho 1000


//Gán giá trị trong R3 vào AH
...
//Gán giá trị trong R3 vào AL
...
LDI BL,LOW(1000) ;Load low-byte of divisor into BL

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

LDI BH,HIGH(1000) ;Load high-byte of divisor into BH


RCALL DIV1616
//Sau câu lệnh trên, chữ số ngàn được lưu trong R1:R0, kết quả phép chia lưu trong
R3:R2 => lấy R0 lưu vào R22 ta được chữ số hàng ngàn.
...

//Xử lý tương tự với các chữ số còn lại


RET

Code tham khảo


.EQU LED_7SEG_PORT = PORTD
.EQU LED_7SEG_DDRD = DDRD
.EQU LED_7SEG_LE_PORT = PORTB
.EQU LED_7SEG_LE_DDRD = DDRB
.EQU LED_7SEG_LE0_PIN = 4 ;Data
.EQU LED_7SEG_LE1_PIN = 5 ;Select
.ORG 0
RJMP MAIN

.ORG 0x40
MAIN:
LDI R16,LOW(RAMEND) ;DUA DIA CHI RAMEND LEN VI TRI CAO NHAT
OUT SPL,R16
LDI R16,HIGH(RAMEND)
OUT SPH,R16

/* Kết nối và cấu hình port sử dụng LED 7 đoạn gồm port D cho Data và 2 tín hiệu
chọn nLE_0 nLE_1 ứng với PD4 và PB5, các tín hiệu này đều là output, đặt giá trị ban đầu
cho các tín hiệu này ứng với: LED không hiển thị và không cho phép chốt */
...
/*Cấu hình port A là input, có điện trở kéo lên*/
...

;--------------------------------
LOOP:
//Đọc giá trị PORT A
...

//Nhân giá trị trên PORT A với 9


...
//Gọi chương trình con BCD16BIT để tiến hành phân tích kết quả thành số BCD.
...

//Xuất chữ số hàng ngàn, sau đó delay 1ms


...

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

//Xuất chữ số trăm, sau đó delay 1ms


...

//Xuất chữ số chục, sau đó delay 1ms


...

//Xuất chữ số đơn vị, sau đó delay 1ms


...
RJMP LOOP

;-------------------------------------------
;INPUT R26 (VI TRI LED(TU 0 DEN 3)), R27 (SO TREN LED 0 DEN 9)
;OUTPUT: none
;-------------------------------------------
DISPLAY_7SEG:
LDI R16,$FF
OUT LED_7SEG_PORT, R16
SBI LED_7SEG_LE_PORT, LED_7SEG_LE1_PIN
NOP
CBI LED_7SEG_LE_PORT, LED_7SEG_LE1_PIN

LDI ZH,HIGH(TABLE_7SEG_DATA<<1)
LDI ZL,LOW(TABLE_7SEG_DATA<<1)
CLR R16
ADD R30, R27
ADC R31, R16
LPM R16,Z
OUT LED_7SEG_PORT, R16
SBI LED_7SEG_LE_PORT, LED_7SEG_LE0_PIN
NOP
CBI LED_7SEG_LE_PORT, LED_7SEG_LE0_PIN

LDI ZH, HIGH(TABLE_7SEG_CONTROL << 1)


LDI ZL, LOW(TABLE_7SEG_CONTROL << 1)
CLR R16
ADD ZL, R26
ADC ZH, R16
LPM R16, Z
OUT LED_7SEG_PORT, R16

SBI LED_7SEG_LE_PORT, LED_7SEG_LE1_PIN


NOP
CBI LED_7SEG_LE_PORT, LED_7SEG_LE1_PIN
RET
;--------------------------------
DELAY1MS:

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

LDI R16,-125
OUT TCNT0,R16

LDI R16,$00
OUT TCCR0A,R16
LDI R16,$03 ;0000 0011
OUT TCCR0B,R16
AGAIN:
SBIS TIFR0,TOV0
RJMP AGAIN
SBI TIFR0,TOV0
LDI R16,$00
OUT TCCR0B,R16
RET
;--------------------------------
TABLE_7SEG_DATA:
.DB 0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90, 0X88, 0X83, 0XC6,
0XA1, 0X86, 0X8E
TABLE_7SEG_CONTROL:
.DB 0b00001110, 0b00001101, 0b00001011, 0b00000111
;-----------------------------------------------------------------------------
.DEF ANSL = R0 ;To hold low-byte of answer
.DEF ANSH = R1 ;To hold high-byte of answer
.DEF REML = R2 ;To hold low-byte of remainder
.DEF REMH = R3 ;To hold high-byte of remainder
.DEF AL = R16 ;To hold low-byte of dividend
.DEF AH = R17 ;To hold high-byte of dividend
.DEF BL = R18 ;To hold low-byte of divisor
.DEF BH = R19 ;To hold high-byte of divisor
.DEF C = R20 ;Bit Counter

DIV1616:
MOVW ANSH:ANSL,AH:AL ;Copy dividend into answer
LDI C,17 ;Load bit counter
SUB REML,REML ;Clear Remainder and Carry
CLR REMH ;
LOOP: ROL ANSL ;Shift the answer to the left
ROL ANSH ;
DEC C ;Decrement Counter
BREQ DONE ;Exit if sixteen bits done
ROL REML ;Shift remainder to the left
ROL REMH ;
SUB REML,BL ;Try to subtract divisor from remainder
SBC REMH,BH
BRCC SKIP ;If the result was negative then
ADD REML,BL ;reverse the subtraction to try again
ADC REMH,BH ;

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

CLC ;Clear Carry Flag so zero shifted into A


RJMP LOOP ;Loop Back
SKIP: SEC ;Set Carry Flag to be shifted into A
RJMP LOOP
DONE:RET
/* BCD16bit
INPUT: R17 (high), R16 (low)
OUTPUT: R21 (hàng chục ngàn),
R22 (hàng ngàn),
R23 (hàng trăm),
R24 (hàng chục),
R25 (hàng đơn vị)
DESCRIPTION: Chương trình trả về 5 chữ số BCD của số 16 bit*/

BCD16BIT:
//Thực hiện phép chia cho 10000
LDI BL,LOW(10000) ;Load low-byte of divisor into BL
LDI BH,HIGH(10000) ;Load high-byte of divisor into BH
RCALL DIV1616
//Sau câu lệnh trên, chữ số chục ngàn được lưu trong R1:R0, kết quả phép chia lưu
trong R3:R2 => lấy R0 lưu vào R21 ta được chữ số hàng chục ngàn.
...

//Thực hiện phép chia cho 1000


//Gán giá trị trong R3 vào AH
...
//Gán giá trị trong R3 vào AL
...
LDI BL,LOW(1000) ;Load low-byte of divisor into BL
LDI BH,HIGH(1000) ;Load high-byte of divisor into BH
RCALL DIV1616
//Sau câu lệnh trên, chữ số ngàn được lưu trong R1:R0, kết quả phép chia lưu trong
R3:R2 => lấy R0 lưu vào R22 ta được chữ số hàng ngàn.
...

//Xử lý tương tự với các chữ số còn lại


...

RET

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

LAB2_2 Bài 4

LED ma trận dùng để hiển thị thông tin theo điểm ảnh, do đó LED ma trận có thể dùng để biểu
diễn được chữ số, chữ cái, hình ảnh khác nhau tùy mong muốn của người lập trình. Trong kit thí
nghiệm vi xử lý, sinh viên được sử dụng LED ma trận có kích thước 8x8 để hiển thị hình ảnh.

LED ma trận 8x8 gồm có 64 đèn LED tạo thành các điểm ảnh, các chân anode và cathode của
các LED này đều được đưa thành tín hiệu điều khiển.

LED ma trận có hai loại: loại anode hàng cathode cột và loại cathode cột anode hàng (không thể

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

đổi vị trí giữa cột và hàng vì các chân cấu tạo của chúng là cố định).

Theo ta thấy, các chân anode (cathode) của một hàng (cột) sẽ được nối chung với nhau. Hình ảnh
trên LED ma trận được hiển thị bằng phương pháp quét cột/ hàng (tương tự việc quét 4 LED 7
đoạn ở trên nhưng ở đây là quét 8 cột hoặc hàng của LED ma trận). Ví dụ hiển thị kí tự B trên
LED ma trận ta dùng phương pháp quét cột, mỗi lần ta chỉ cho hiển thị một cột (duy nhất 1 cột
được sáng, các cột còn lại tắt) ứng với kí tự B mà ta mong muốn, sau đó tạo trễ và tiếp sau đó
cho sáng cột kế tiếp… như hình sau.

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/
BÁO CÁO
Nhóm:
Nhóm môn học: Môn thí nghiệm:

Khối LED ma trận trong bộ thí nghiệm được thiết kế như sau.

Loại LED ma trận trong bộ TN là loại cột cathode và hàng anode, vậy để đèn sáng thì anode
phải bằng 1 và cột phải bằng 0, hàng mức 1, cột mức 0
Xét cột (COL) của LED ma trận: ta thấy cột được thiết kế kéo lên nguồn, đồng thời cột đc nối
với ngõ ra của IC đệm ULN2803: OUTx= not (INx), tín hiệu điều khiển IN0:7 được nối với
header và có thể kết nối với 1 port của VXL => Thực hiện phương pháp quét cột thì cột sáng
tương ứng với tín hiệu điều khiển từ port là mức 1 nhé.

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

Xét hàng: hàng là ngõ ra của một con IC 595 (thanh ghi dịch), để đèn sáng thì vị trí tương ứng là
mức 1. Hình sau tóm tắt trạng thái mức cao thấp để đèn sáng.

Code: xem code mẫu trong giáo trình.

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

You might also like