LAB 2_1: DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG.. S dử ụng chương trình con này để tạo xung 500 Hz trên chân PA0... Mã nguồn chương trình cho hai trường hợp... c Thay đổi giá trị dip switch
Trang 2LAB 2_1: DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
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
c) K t nế ối chân PA0 vào oscilloscope để kiểm tra
Trang 3Với m t thộ ời gian delay cho trước, ta có giá tr s xung cị ố ần đếm được tính là n=tdelay/(TOSCxN), ch n h s chia N sao cho giá tr n n m tọ ệ ố ị ằ ừ 0 đến 256 và là m t s ộ ốnguyên
n p giá tr cho thanh ghi tránh sai s ) ạ ị ố
- V i n =125 thì ta n p giá -125 cho thanh ghi TCNT0- V i prescaler = 64 thì 3 bit ớ ạ trị ớCS02:CS01:CS00 =011
- V y các giá tr c a các thanh ghi trong timer 0 lậ ị ủ ần lượt là: TCNT0 = -125, TCCR0A = 0x00, TCCR0B = 0x03
Trang 4START:
RCALL DELAY ;delay tpo do rong xung
IN R17,PORTB ;doc PortB
EOR R17,R16 ;dâo bit PBO (do R16=0x01=OBOOOO 0001) OUT PORTB, R17
RJMP START ;lap vong lai
; chuong trinh con delaylms
Trang 5Bà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 ế ố
Trả lời câu h i: ỏ
a Ở mode Normal, khi nào bit TOVx được set lên 1?
- Khi timer tràn t $FF ừ ➔ $00 ho c $FFFF ặ ➔ $0000 thì c TOVn set lên 1b mode CTC, ờ Ởkhi nào bit OCFx được set lên 1?
- Khi timer đạt đến giá tr trong thanh ghi (OCRxA + 1) thì c OCFxA lên 1 ị ờ
- Khi timer đạt đến giá tr trong thanh ghi (OCRxB + 1) thì c OCFxB lên 1 ị ờ
c Giá tr các thanh ghi cị ấu hình cho timer 0 cho 2 trường h p ợ
- Mode NOR TCNT0 = -125, TCCR0A = $00, TCCR0B = $03
- Mode CTC OCR0A = 255, TCCR0A = $02, TCCR0B = $01
d Mã nguồn chương trình cho hai trường hợp
Trang 6LDI R16,0X00
OUT TCCR0A,R16 ; MODE NORMAL OUT TCCR0B,R16 ; DUNG TIMER START:
Trang 7LDI R17,0X01 ;Timer0 chpy, he so chia N=1
OUT TCCR0B,R17
START: RJMP START
Trang 8a) Cho chương trình sau tạo 2 xung PWM trên OC0A và OC0B
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)
Trang 9- 2 kênh đều có t n s sóng là b ng nhau và chu k c a sóng kênh 2 là ngầ ố ằ ỳ ủ ở ắn hơn kênh 1.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
0 FOC0
A FOC0
B
WGM0
2 CS0
2 CS0
1 CS0
Trả lời 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
CS02:CS01:CS00 = 010 tương ứng với b chia 8 ộ
+ Mode 2: WGM02:WGM01:WGM00 = 111 tương ứng với mô th c FPWM ứ
TOP = OCR0A
OCR0X c p nhậ ậ ởt BOTTOM
Trang 10TOV0 = 1 TOP = OCR0A = 100 ở
CS02:CS01:CS00 = 010 tương ứng với b chia 8 ộ
+ Mode 3: WGM02:WGM01:WGM00 = 010 tương ứng với mô th c CTC ứ
Trang 11Trường h p 3: TCCR0A = 0b10100001, TCCR0B = 0b00000010 ợ
=>Trường h p này do OCR0 c p nhợ ậ ật khi đạt top và TOV0=1 khi đạt bottom nên t o d ng xung ạ ạ
ở 2 ngõ ra có dạng như kết quả thu được
a Timer0 làm việc ở mode nào?
- Timer0 hoạt động mode NOR ( TOP: 0xFF) i v i (1) ở đố ớ
- Timer0 hoạt động ở mode FPWM( TOP: OCR0A) đố ới v i (2)
b Giá trị đưa vào các thanh ghi của timer 0 là bao nhiêu? Giải thích
Trang 12Chương trình tạo xung 1kHz, duty cycle 25% trên chân OC0B:
.EQU TP_H=-31 ;giá trị đặt trước mức 1
.EQU TP_L=-94 ;giá trị đặt trước mức 0
Trang 13START: SBI PORTB,4 ;PB4 = 1 1MC
WAIT: SBIS TIFR0,TOV0 ;ch c TOV0=1 báo Timer0 tràn 2/1MC ờ ờ
RET ;
Trang 14Chươ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%:
Trang 15LDI R16, (1<<CS01)|(1<<CS00);Mode CTC va Prescaler = 64 OUT TCCR0B, R16
WAIT_C_H:
IN R17, TIFR0 ;Doc gia tri thanh ghi bao tran
SBRS R17, OCF0A ;Kiem tra co bao tran
RJMP WAIT_C_H ;Chua tran tiep tuc dem
OUT TIFR0, R17 ;Xoa co tran
MOV R16, SIGN_L
OUT OCR0A, R16
WAIT_C_L:
IN R17, TIFR0 ;Doc gia tri thanh ghi bao tran
SBRS R17, OCF0A ;Kiem tra co bao tran
RJMP WAIT_C_L ;Chua tran tiep tuc dem
OUT TIFR0, R17 ;Xoa co tran
Trang 16OUT OCR0A, R16 ;Nap gia tri cho bo dem
LDI R16, (1<<CS01)|(1<<CS00) ;Mode CTC va Prescaler = 64 OUT TCCR0B, R16
WAIT_A:
IN R17, TIFR0 ;Doc gia tri thanh ghi bao tran
Trang 17LAB2-2: GIAO TIẾP LED 7 ĐOẠN VÀ LED MA TR N Ậ
Bài 2:
Trang 18a) 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 ớ ầ ố
Trả lời 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?
- LED s sáng 1 l n trong 5ms ẽ ầ
b Cấu hình timer như thế nào để có độ trễ này
- C u hình timer0 mode NOR v i giá tr n p cho TCNT0 là -156 ấ ớ ị ạ
- Giá tr các thanh ghi c a timer0: TCNT0: -156, TCCR0A: $00, TCCR0B: $04 ị ủ
c Mã ngu n và chú thích ồ
.EQU DATA_DDR = DDRD ; SET UP PORT D la ngo ra
.EQU DATA_OUT = PORTD
Trang 19; -DISPLAY_7SEG -
; input data R18 choose led to display
; input R17 data to display -
; Chon LED hien thi
SBI LE, 0 ; mo cong
NOP
CBI LE, 0 ; khoa cong
; Do bang tim gia data
CLR R16 ; GIA TRI TRUNG GIAN LDI ZH, HIGH(TABLE << 1) ; look-up Led7seg LDI ZL, LOW(TABLE << 1)
ADD ZL, R17
ADC ZH, R16
Trang 20TIMER_DELAY: ; tan so quet 50HZ => CO 4 LED TIMEDELAYFRAME = 200HZ ; 1/200 = 0.05 s = 40 000 (MCs) => use CLK/256 divider with N = 156 pulses
LDI R16, 0
DELAY:
LDI R16, -156 ; input (- n)
LDI R16, $04 ; use CLK/256 prescaler
WAIT:
SBIS TIFR0, TOV0 ; check if TOV = 1
Trang 21Bà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ả
Trả lời câu h i: ỏ
a Giá tr PORTA * 9 là s có bao nhiêu bit ị ố
- Giá tr tị ối đa là 255*9 = 2295 (dec) => 12 bit
b Làm thế nào để ể hi n th t ng ch s lên 4 LED? ị ừ ữ ố
- Phân tách s 12 bit thành 4 s BCD, lố ố ấy mã LED 7 đoạn của 4 số BCD đó để hiển thị lên 4 LED
Trang 23OUT 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
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
Trang 24ADD R20, SONHO CALL SAVE_TRAM_CHUC_DONVI ;Sau dong nay se duoc hang tram vahang nghin cua kqua
PUSH R18 ;Cat hang don vi
MOV R18, R22 ;Lay phan nguyen chia 10 lan 2
CLR R22
L2:
Trang 25PUSH R18 ;Cat hang tram
POP TRAM ;Hang tram
POP CHUC ;Hang chuc
POP DONVI ;Hang don vi
; enable 573 to choose led
;Turn off led
Trang 26; - USE TIMER0 TO DELAY
SET_UP_TIMER: ; 1/200 = 0.05 s = 40 000 (MCs) => use CLK/256 divider with N = 156 puLDI R16, 0
Trang 27Bà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
Trang 28Qué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 ố
Trả lời câu h i: ỏ
a Mô t k t n i trên kit ả ế ố
- L y jumper c p áp cho LED MATRIX ấ ấ
- K t n i PORTD v i Header c a LED MATRIX ế ố ớ ủ
- K t nế ối dây đơn từ PA0-PA3 v i tín hi u CLR, CLK, LATCH, DSI ớ ệ
b Để có tần số quét 25Hz thì một cột LED sáng trong bao lâu?
- Để có t n s quét 25Hz thì m t c t LED sáng trong 5ms ầ ố ộ ộ
c S khác nhau khi quét t n s 25Hz và 125Hz ự ở ầ ố
- B ng mằ ắt thường thì trên kit thí nghi m không th y rõ sệ ấ ự khác nhau nhưng về lý thuyết thì ở
t n s 25Hz LED sầ ố ẽ chớp tắt nhanh hơn 125Hz
Trang 29.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
Trang 30dec r18
brne shiftloop
; Latch data
sbi latchPort, latchPin ; Set latch pin to high
cbi latchPort, latchPin ; Set latch pin to low
; J38 connect to PORTD
; clear signal pin to pin 0 of PORTB
; shift clock pin to pin 1 of PORTB