Professional Documents
Culture Documents
Báo Cáo Lab 2 T 1 l22
Báo Cáo Lab 2 T 1 l22
MỤC TIÊU:
THAM KHẢO:
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 500 Hz trên chân PA0.
b) Mô phỏng, chỉnh sửa chương trình để tạo ra xung chính xác.
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.
c) Kết nối chân OC0 ra oscilloscope và quan sát
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.
c) Kết nối chân OC0 ra oscilloscope và quan sát
Page | 1
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:
out DDRB,r16
ldi r16, (1 << COM0B1)|(1 << COM0A1) | (1 << WGM00)|(1 << WGM01)
ldi r16, 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
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
Page | 2
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
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
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%.
Page | 3
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
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
Ở dây không set bit cầu chì của ATMEGA324PA, bit cầu chì vẫn là 1.
f = 8MHz -> T = 0.125 us
Với N = 1024
n = 255 (FF)
thì Td max = 0.125 us . 1024 . 255 = 32,640 us = 32.64 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
Ở dây không set bit cầu chì của ATMEGA324PA, bit cầu chì vẫn là 1.
f = 8MHz -> T = 0.125 us
Với N = 1024
n = 2^16=65535 (FFFF) => sau 65536 xung sẽ bị tràn
thì Td max = 0.125 us . 1024 . 65536 = 8388608us = 8.388608s
Page | 4
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
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
Ta có: f = 500Hz => T=1/f= 2ms =>TH=TL=1ms
Mà : f_clk = 8MHz -> T_clk = 0.125 us | N là hệ số chia tần số của Timer0
TH=TL=T_clk*n*N =1ms | n là giá trị bắt đầu đếm lên
Ta chọn N=64 => n=125
Do chọn ở chế độ CTC nên đếm lên 124 (n-1)
Page | 5
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
.ORG 0X40
MAIN:
LDI R16,HIGH(RAMEND) ;DUA STACK LEN DINH SRAM
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
SBI DDRA,0
LDI R16,0X01
START:
RCALL DELAY
IN R17,PORTA
EOR R17,R16 ;DAO BIT R17
OUT PORTA,R17
RJMP START
DELAY:
LDI R17,124 ;SO SÁNH VOI 124
OUT OCR0A,R17
LDI R17,0X02 ;Timer0 mode CTC
OUT TCCR0A,R17
LDI R17,0X03 ;HE SO CHIA 64
OUT TCCR0B,R17
WAIT:
SBIS TIFR0,OCF0A ;CHO CO OCF0A=1
RJMP WAIT
SBI TIFR0,OCF0A
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?
Ở 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, bit OCFx được set lên 1 khi giá trị thanh ghi TCNTx đạt giá trị so sánh
OCRx
Page | 6
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
c. Giá trị các thanh ghi cấu hình cho timer 0 cho 2 trường hợp
Ta có: T=64us =>TH=TL=32us
Mà : f_clk = 8MHz -> T_clk = 0.125 us | N là hệ số chia tần số của Timer0
TH=TL=T_clk*n*N =32us | n là giá trị bắt đầu đếm lên
=> n*N=256
• MODE NORMAL:
Ta chọn: N=8 => n=32 => Bắt đầu đếm lên từ -32
TCNT0 = -32
TCCR0A = 0x00
TCCR0B = 0x02
• MODE CTC:
Ta chọn: N=8 => n=32 => So sánh với 31
OCR1AH = HIGH(31)
OCR1AL = LOW(31)
TCCR1A = 0x00
TCCR1B = 0x0A
d. Mã nguồn chương trình cho hai trường hợp
//mode normal
.EQU OC0A=3 ;OC0A=PB3
.EQU OC0B=4 ;OC0B=PB4
.ORG 0
RJMP MAIN
.ORG 0X40
MAIN:
LDI R16,HIGH(RAMEND) ;DUA STACK LEN DINH SRAM
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
SBI DDRB,OC0A
Page | 7
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
LDI R16,$08
START:
RCALL DELAY
IN R17,PORTB
EOR R17,R16 ;DAO BIT R17
OUT PORTB,R17
RJMP START
DELAY:
LDI R17,-32 ;delay 32us
OUT TCNT0,R17
LDI R17,0X00 ;Timer0 mode NORMAL
OUT TCCR0A,R17
LDI R17,0X02 ;HE SO CHIA 8
OUT TCCR0B,R17
WAIT:
SBIS TIFR0,TOV0 ;CHO CO TOV=1
RJMP WAIT
SBI TIFR0,TOV0
LDI R17,0X00
OUT TCCR0B,R17 ;DUNG TIMER0
RET
//mode CTC
.ORG 0
RJMP MAIN
.ORG 0X40
MAIN:
LDI R16,HIGH(RAMEND) ;DUA STACK LEN DINH SRAM
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
SBI DDRB,OC0A
LDI R16,0X08
Page | 8
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
STS OCR1AH,R17
LDI R17,LOW(31)
STS OCR1AL,R17
LDI R17,0X00 ;Timer1 mode CTC4
STS TCCR1A,R17
LDI R17,0X0A ;HE SO CHIA 8
STS TCCR1B,R17
START:
RCALL WAIT
IN R17,PORTB
EOR R17,R16 ;DAO BIT R17
OUT PORTB,R17
RJMP START
WAIT:
SBIS TIFR1,OCF1A ;CHO CO OCF1A=1
RJMP WAIT
SBI TIFR1,OCF1A ;XOA CO OCF1A
LDI R17,0X00
OUT TCCR0B,R17 ;DUNG TIMER0
RET
Mode Normal:
Page | 9
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
Mode CTC:
Page | 10
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
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)
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ả
ldi r16, (1 << COM0B1)|(1 << COM0A1) | (1 << WGM00)|(1 << WGM01)
out TCCR0A,r16 // setup TCCR0A
=> setup để hoạt động ở chế độ FPWM (011)
Page | 11
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
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.
COM0A = 10; COM0B = 10 => Xóa OC0A(OC0B)=0 khi đạt kết quả so sánh
Khi TCNT0 đạt OCR0A( OCR0B) thì vẫn sẽ tiếp tục đếm lên tới 255 rồi về lại 0
• OC0A
- Thời gian TCNT0 < OCR0A cũng là thời gian sóng kênh A ở mức 1:
TA = T * (100/256) = 12.5us
- Khoảng thời gian còn lại trong chu kì, sóng kênh A ở mức 0
OC0A có T = 32 us với Duty cycle = 39.06% = > f = 31250Hz
• OC0B
- Thời gian TCNT0 < OCR0B cũng là thời gian kênh B ở mức 1:
TB= T * (75/256) = 9.375us
Page | 12
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
- Khoảng thời gian còn lại trong chu kì, sóng kênh B ở mức 0
OC0A có T = 32 us với Duty cycle = 29.3% = > f = 31250Hz
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ữ
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.
TH1:
Page | 13
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
TH2:
Page | 14
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
TH3:
BÀI 5A
1. Trả lời các câu hỏi
a. Timer 0 làm việc ở mode nào?
Timer 0 hoạt động ở mode FPWM (WGM=7)
b. Giá trị đưa vào các thanh ghi của timer 0 là bao nhiêu? Giải thích
Ta có: f=1KHz
𝑐𝑙𝑘𝐼/𝑂
=> = 1 𝐾𝐻𝑧 (Với mode FPWM (WGM=7))
𝑁(𝑂𝐶𝑅0𝐴+1)
Mà : 𝑐𝑙𝑘𝐼/𝑂 = 8MHz
=> 𝑁(𝑂𝐶𝑅0𝐴 + 1) = 8000 | N là hệ số chia tần số của Timer0
Chọn N=64 => OCR0A=124
Ta có: 𝑂𝐶𝑅0𝐵+1 = 𝐷 = 25% với OCR0A=124 => OCR0B ≈ 30
𝑂𝐶𝑅0𝐴+1
Page | 15
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
Do ở mode FPWM (WGM=7) nên ta đưa vào các thanh ghi timer 0 các giá trị sau :
o OCR0A=124
o OCR0B=30
o TCCR0A=0x23
o TCCR0B=0x0B
2. Trình bày mã nguồn với chú thích.
//bai 5a
.EQU OC0A=3
.EQU OC0B=4
.ORG 0
RJMP MAIN
.ORG 0X40
MAIN:
LDI R16,HIGH(RAMEND) ;DUA STACK LEN DINH SRAM
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,(1<<OC0B)
OUT DDRB,R16
Page | 16
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
BÀI 5B
3. Trả lời các câu hỏi
c. Timer 0 làm việc ở mode nào?
Timer 0 hoạt động ở mode FPWM (WGM=7)
d. Giá trị đưa vào các thanh ghi của timer 0 là bao nhiêu? Giải thích
Ta có: f=1KHz
𝑐𝑙𝑘𝐼/𝑂
=> = 1 𝐾𝐻𝑧 (Với mode FPWM (WGM=7))
𝑁(𝑂𝐶𝑅0𝐴+1)
Mà : 𝑐𝑙𝑘𝐼/𝑂 = 8MHz
=> 𝑁(𝑂𝐶𝑅0𝐴 + 1) = 8000 | N là hệ số chia tần số của Timer0
Chọn N=64 => OCR0A=124
Page | 17
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
Do ở mode FPWM (WGM=7) nên ta đưa vào các thanh ghi timer 0 các giá trị sau :
o OCR0A=124
o TCCR0A=0x23
o TCCR0B=0x0B
Thanh ghi của OCR0B thay đổi liên tục để thay đổi Duty Cycle từ 0-100%
4. Trình bày mã nguồn với chú thích.
//bai 5b
.EQU OC0A=3
.EQU OC0B=4
.ORG 0
RJMP MAIN
.ORG 0X40
MAIN:
LDI R16,HIGH(RAMEND) ;DUA STACK LEN DINH SRAM
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,(1<<OC0B)
OUT DDRB,R16
Page | 18
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
BREQ START_DEC
RCALL SET_OCR0B
DEC R17
BRNE TANG
RCALL DELAY_10MS
INC R16
CPI R16,124 ;KTRA DA DAT MUC 100% CHUA
BRNE START_INC
START_DEC:
LDI R17,4
GIAM:
RCALL DELAY_10MS
DEC R16 ;GIAM GIA TRI OCR0B
;MOI LAN GIAM THI DUTY CYCLE TANG 0.8%
CPI R16,0
BREQ START_INC
RCALL SET_OCR0B
DEC R17
BRNE GIAM
RCALL DELAY_10MS
DEC R16
CPI R16,0 ;KTRA DA VE 0% HAY CHUA
BRNE START_DEC
RJMP START
SET_OCR0B:
OUT OCR0B,R16
RET
DELAY_10MS:
Page | 19
BÁO CÁO
Nhóm: 1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
Page | 20
LAB 2-2
GIAO TIẾP LED 7 ĐOẠN VÀ LED MA TRẬN
MỤC TIÊU:
THAM KHẢO:
BÀI 2
d) 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
e) 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
d) Kết nối port của AVR vào dip Switch, giả sử đó là PORTA
e) Viết chương trình hiện giá trị PORTA * 9 lên 4 LED 7 đoạn.
f) 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.
Page | 21
BÁO CÁO
Nhóm:1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
BÀI 2
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?
Ta có: f=50Hz => T=1/4*f=5ms
Vậy 1 LED sẽ sáng 1 lần trong 5ms
b. Cấu hình timer như thế nào để có độ trễ này
Sử dụng timer 0 để tạo delay, sử dụng mode CTC với hệ số chia là 1024,
hệ số đếm lả 38
3. Mã nguồn và chú thích
//bai1
/*
PORTD NOI VOI IC 74HC573
PB0 NOI VOI CHAN LE0
PB1 NOI VOI CHAN LE1
*/
.ORG 0
RJMP MAIN
.ORG 40
MAIN:
SER R16
OUT OUTLED_DDR,R16
LDI R16,(1<<nLE0)|(1<<nLE1)
OUT SL_LED_DDR,R16
START:
RCALL SCAN_4LA
RJMP START
Page | 22
BÁO CÁO
Nhóm:1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
;
SCAN_4LA:
LDI R18, 4 ;SO LAN QUET LED
LDI R19, 0xF7 ;MA quét led anode
;bat đau LED3
CLR R20 ;TAO THANH GHI TRUNG GIAN DÙNG TRA
BANG
LOOP:
LDI R17, 0xFF ;TAT LED
OUT OUTLED, R17
SBI SL_LED ,nLE1 ;mo U5
NOP
CBI SL_LED ,nLE1 ;khóa U5
MOV R17,R20
RCALL GET_7SEG ;lay ma
OUT OUTLED, R17 ;xuat ma
SBI SL_LED ,nLE0 ;mo U4
NOP
CBI SL_LED ,nLE0 ;khóa U4
INC R20
RCALL DELAY_5MS
SEC ;C=1 de quay
ROR R19 ;quet led ke tiep
DEC R18 ;ktra so lan quet
BRNE LOOP
RET
;
; Define delay function using Timer0 in CTC mode with CLK/1024
DELAY_5MS:
PUSH R17
PUSH R16
LDI R16,38 ; TOP
OUT OCR0A,R16 ;GIA TRI SO SANH KENH A
LDI R16, (1 << WGM01)
OUT TCCR0A,R16
Page | 23
BÁO CÁO
Nhóm:1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
Page | 24
BÁO CÁO
Nhóm:1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
BÀI 3
2. Trả lời các câu hỏi
Ta có: PORTA có giá trị max là 255(FF) => PORTA*9 đạt giá trị lớn nhất là 2295
Ta sư dụng chương trình con DIV16_8 (phép chia số có 2 byte cho 10) để tách thành 4 chữ
số thập phân, sau đó lưu 4 số đó vào SRAM.
3. Mã nguồn và chú thích
• Khi ngõ vào là 27 => Kết quả nhận được là 243
Page | 25
BÁO CÁO
Nhóm:1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
Page | 26
BÁO CÁO
Nhóm:1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
//bai2
/*
PORTA NOI VOI DIP SWITCH
PORTD NOI VOI IC 74HC573
PB0 NOI VOI CHAN LE0
PB1 NOI VOI CHAN LE1
*/
.ORG 0
RJMP MAIN
.ORG 40
Page | 27
BÁO CÁO
Nhóm:1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
MAIN:
CLR R16
OUT SWITCH_DIR,R16
SER R16
OUT OUTLED_DDR,R16
OUT SWITCH_OUT,R16
LDI R16,(1<<nLE0)|(1<<nLE1)
OUT SL_LED_DDR,R16
START:
RCALL GET_SW
RCALL MULTIPLE
RCALL TACH_SO
RCALL SCAN_4LA
RJMP START
;
GET_SW:
IN REG_IN,SWITCH
COM REG_IN
RET
;
MULTIPLE:
LDI R22,9
MUL REG_IN,R22 ;KQ LUU TAI R1:R0
MOV KQ_L,R0
MOV KQ_H,R1
RET
;
TACH_SO:
LDI XH,HIGH(DIGIT<<1)
LDI XL,LOW(DIGIT<<1)
LDI COUNT,4
LDI R17,0
Page | 28
BÁO CÁO
Nhóm:1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
CLEAR_BONHO:
ST X+,R17
DEC COUNT
BRNE CLEAR_BONHO
LDI SOCHIA,10
DIV:
RCALL DIV16_8 ;CHIA SO 2 BYTE CHO 10
ST -X,SODU
CPI KQ_L,0
BRNE DIV
RET
;
DIV16_8:
LDI COUNT,16 ;CO 16 BIT
CLR SODU
SH_NXT:
CLC ; C=0=BIT THƯƠNG SỐ
LSL KQ_L ; DỊCH TRÁI SBC_L, BIT0=C=THƯƠNG SỐ
ROL KQ_H ; QUAY TRÁI SỐ BỊ CHIA 8 BIT CAO, C= BIT7
ROL SODU ; DỊCH BIT7 SBC CAO VÀO DƯ SỐ
BRCS OV_C ; TRÀN BIT C=1, CÒN CHIA ĐƯỢC
SUB SODU,SOCHIA ; TRỪ DƯ SỐ VỚI SỐ CHIA
BRCC GT_TH ; C=0 CÒN CHIA ĐƯỢC ; BỎ QUA LỆNH TIẾP THEO
ADD SODU,SOCHIA ; C=1 KHÔNG CHIA ĐƯỢC NỮA ,CỘNG LẠI SỐ CHIA VÀO SỐ DƯ
RJMP NEXT
OV_C:
SUB SODU,SOCHIA ; TRỪ DƯ SỐ VỚI SỐ CHIA
GT_TH:
SBR KQ_L,1 ; CHIA ĐƯỢC , THƯƠNG SỐ =1
NEXT:
DEC COUNT ; ĐẾM SỐ LẦN DỊCH SBC
BRNE SH_NXT ; CHƯA ĐỦ TIẾP TỤC DỊCH BIT
RET
;
SCAN_4LA:
LDI R18, 4 ;SO LAN QUET LED
LDI R19, 0xF7 ;MA quét led anode
;bat đau LED3
LDI XH,HIGH(DIGIT<<1)
LDI XL,LOW(DIGIT<<1)
LOOP:
Page | 29
BÁO CÁO
Nhóm:1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
LD R17,X+
RCALL GET_7SEG ;lay ma
OUT OUTLED, R17 ;xuat ma
SBI SL_LED ,nLE0 ;mo U4
NOP
CBI SL_LED ,nLE0 ;khóa U4
INC R20
RCALL DELAY_5MS
SEC ;C=1 de quay
ROR R19 ;quet led ke tiep
DEC R18 ;ktra so lan quet
BRNE LOOP
RET
;
; Define delay function using Timer0 in CTC mode with CLK/1024
DELAY_5MS:
PUSH R17
PUSH R16
LDI R16,38 ; TOP
OUT OCR0A,R16 ;GIA TRI SO SANH KENH A
LDI R16, (1 << WGM01)
OUT TCCR0A,R16
LDI R16,(1 << CS02) | (1 << CS00)
OUT TCCR0B,R16 ;SETUP CHE DO CTC (010),
PRESCALER = 1024
WAIT:
SBIS TIFR0,OCF0A
RJMP WAIT
SBI TIFR0,OCF0A
POP R16
Page | 30
BÁO CÁO
Nhóm:1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
POP R17
RET
;
GET_7SEG:
LDI ZH, HIGH(TABLE<<1)
LDI ZL, LOW(TABLE<<1)
ADD ZL, R17
LDI R17, 0
ADC ZH, R17
LPM R17, Z ;lay ma led
RET
;
TABLE:
.DB 0xC0, 0xF9, 0xA4, 0xB0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90
BÀI 4
1. Trả lời các câu hỏi
a. Mô tả kết nối trên kit
b. Để có tần số quét 25Hz thì một cột LED sáng trong bao lâu?
Ta có: f=25Hz => T=1/8*f=5ms
Vậy mỗi cột LED sáng trong 5ms
c. Sự khác nhau khi quét ở tần số 25Hz và 125Hz
Khi quét ở tần số 125Hz thì sang đều và mượt hơn ở tần số 25Hz
2. Mã nguồn chương trình với chú thích
Page | 31
BÁO CÁO
Nhóm:1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
.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
rcall shiftregister_initport
rcall shiftregister_cleardata
rcall initTimer1CTC
sei
call ledmatrix_portinit
;
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
nop ; Wait for a
short time
Page | 32
BÁO CÁO
Nhóm:1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
Page | 33
BÁO CÁO
Nhóm:1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
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..0)
; Output: None
;
ledmatrix_display_col:
push r16 ; Save the temporary register
push r27
clr r16
out LEDMATRIXPORT,r16
Page | 34
BÁO CÁO
Nhóm:1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
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
ret ; Return from the function
;
initTimer1CTC:
push r16
ldi r16, high(5000) ; Load the high yte into the temporary register
sts OCR1AH, r16 ; Set the high byte of the timer 1 compare value
ldi r16, low(5000) ; 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) ; CHIA 8, MODE CTC
sts TCCR1B, r16 ;
ldi r16, (1 << OCIE1A); Load the value 0b00000010 into the temporary
register
sts TIMSK1, r16 ; Enable the timer 1 compare A interrupt
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
Page | 35
BÁO CÁO
Nhóm:1
Nhóm môn học: L22 Môn thí nghiệm: Vi xử lý
call ledmatrix_display_col
inc r26
cpi r26,8
brne timer1_COMP_ISR_CONT
ldi r26,0 ;if r26 = 8, 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
Page | 36