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 b Mô phỏng, chỉnh sửa chương trình để tạo ra xung chính xác.. Trả lời các câu hỏi a.. Trì
Trang 1BÁO CÁO THÍ NGHIỆM VI XỬ LÝ
BÀI BÁO CÁO THÍ NGHIỆM LAB 2
LỚP L13 - NHÓM 09 - HK 222 Giảng viên hướng dẫn: Nguyễn Phan Hải Phú
Trang 2MỤ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
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 3ldi r16, (1 << COM0B1)|(1 << COM0A1) | (1 << WGM00)|(1 << WGM01)
out TCCR0A,r16 // setup TCCR0A
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
Trang 4c) 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%
Trang 5BÀ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
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
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
d Mã nguồn chương trình với chú thích
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à 32us Cách tính: Timer 0 có bộ counter 8 bit nên có thể đếm lên tối đa đến khi tràn là 256 lần đếm, với mỗi lần đếm lên tốn 1/8.106 s = 0.125us, suy ra thời gian trễ lớn nhất là 256*0.125us = 32us
b
Khoảnh thời gian trễ lớn nhất có thể tạo ra bởi timer 1 với tần số 8MHz là 8.192 ms Cách tính: Timer 1 có bộ counter lên đến 16 bit nên có thể đếm lên được 65536 lần, với mỗi lần đếm lên cần 0.125 us, suy ra thời gian trễ lớn nhất là 65536*125us = 8.192ms
c
Cách tính toán prescaler: với MCU324P cho dao động nội Fosc = 8MHz, không lập trình chia 8 (cầu chì CLKDIV = 1) thì FCLKO = Fosc = 8MHz Nếu CS02 = 001, N=1, một xung CKLT0 dài 1/8MHz = 0.125us Nếu đặt CS02:CS00 = 010, N = 8, một xung CKLT0 dài (1/8MHz)*8 = 1us Tương tự với giá trị N = 64 (CS02:CS00 = 011), xung CKLT0 dài (1/8MHz)*64 = 8us N = 256 (CS02:CS00 = 100), xung CKLT0 dài (1/8MHz)*256 = 32us N = 1024 (CS02:CS00 = 101), xung CKLT0 dài (1/8MHz) 1024 = 128us Vậy công thức tính chung là (1/ FCLKO)*N
Để đặt thông số prescaler cho timer 0 ta điều chỉnh các bit CS02:CS00 của thanh ghi TCCR0B:
Trang 6d Mã nguồn chương trình con tạo xung 500Hz trên chân PA0:
;LAB2_1 - Bai 1: Viet chuong trinh con delay 1 ms su dung timer 0 Su
;dung chuong trinh con nay de tao xung 500Hz trên chân PA0
Trang 9BÀ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?
b Ở mode CTC, khi nào bit OCFx được set lên 1?
c Giá trị các thanh ghi cấu hình cho timer 0 cho 2 trường hợp
d Mã nguồn chương trình cho hai trường hợp
Trường hợp 2: Tạo 1 xung vuông có chu kỳ 64 us sử dụng timer 1 ở chế độ CTC mode Ngõ ra
sử dụng chân OC0 Giá trị nạp vào thanh ghi TCCR0A là (1<<COM0A0) | (1<<WGM01) tương ứng với giá trị 0x42, giá trị nạp vào thanh ghi TCCR0B là (1<<CS00) tương ứng với 0x02
d Mã nguồn:
Cả hai trường hợp đều mắc như nhau:
Trang 10Trường hợp 1: Tạo 1 xung vuông 64 us sử dụng timer 0 ở chế độ Normal mode Ngõ ra sử dụng chân OC0
;LAB2_1 - Bai 2: TH1: Viet chuong trinh tao 1 xung vuong 64us o che do
;Normal mode Ngo ra su dung chan OC0
Trang 11Kết quả đo được trên dao động ký ở trường hợp 1:
Trường hợp 2: Viết chương trình tạo 1 xung vuông có chu kỳ 64 us sử dụng timer 1 ở chế độ CTC mode Ngõ ra sử dụng chân OC0
; LAB2_1 - Bai_2b: Viet chuong trinh thuc hien tao xung vuong co chu ky
; 64us su dung timer 0 o che do CTC mode Ngo ra su dung chan OC0
Trang 121 Trả lời các câu hỏi
a Dạng sóng trên oscilloscope (chụp và chèn vào)
Trang 13b 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ả
a Kết quả trên dao động ký
b Giải thích dạng sóng ngõ ra:
Giải thích: Timer 0 hoạt động ở chế độ FPWM, CLK0/8, các chân OC0A và OC0B được đưa về mức thấp mỗi khi giá trị counter timer 0 bằng với giá trị OCR0A và OCR0B Giá trị counter timer được reset về 0 khi phát hiện counter đếm quá 0xFF(255) Và chu kỳ được lặp lại mỗi khi counter timer 0 đạt giá trị 0 (OCR0x cập nhật: BOTTOM)
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
TH1: Timer 0 hoạt động ở chế độ FPWM, CLK0/8 Hoàn toàn như Bài 3
Trang 15TH2: Timer 0 hoạt động ở chế độ FPWM (TOP = OCR0A), CLK0/8
Các chân OCR0A và OCR0B được đưa về mức thấp mỗi khi counter timer 0 đạt giá trị của OCR0A và OCR0B Giá trị TOP của counter timer 0 bằng OCR0A, và bắt đầu lại chu kỳ khi counter timer được reset về 0 Nên khi counter vừa đạt giá trị 100 (OCR0A = 100) thì chu kỳ mới cũng vừa bắt đầu, counter bắt đầu đếm lại từ 0 ngay sau đó Nên dạng sóng ngõ ra OC0A không có mức thấp, còn dạng sóng ngõ OC0B hoạt động với chu kỳ 100us với duty cycle = 75% (OCR0B = 75)
Trang 16TH3: Timer hoạt động ở chế độ PFPWM
Trang 17BÀ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
1 Trả lời các câu hỏi
a Timer 0 làm việc ở mode FPWM (với TOP = OCR0A)
b - Giá trị thanh ghi TCCR0A là r16, (1<<COM0B1) | (1<<WGM01) | (1<<WGM00) tương
ứng với 0x23
- Giá trị thanh ghi TCCR0B là (1<<CS01) | (1<<CS00) | (1<<WGM02) tương ứng với 0x0B
- Giá trị thanh ghi OCR0A là 124, OCR0B là 30
2 Mã nguồn và chú thích
a Chương trình tạo ra 1 xung tần số 1KHz, duty cycle 25% trên chân OC0B
;LAB2_1 - Bai_5a: Vietchuong trinh tao ra 1 xung tan so 1KHz, duty
;cycle 25% tren chan OC0B
Trang 18; LAB2_1 - Bai_5c: Ket noi OC0B vao kenh R cua 1 led RGB Viet chuong
;trinh de tang duty cycle tren OC0B tu 0% len 100% roi lai giam xuong
;0, sau 10ms duty cycle tang/giam 1%
.include "m324padef.inc"
.org 0x0000
Trang 22https://doe.dee.hcmut.edu.vn/
MỤC TIÊU:
➢ Giao tiếp được với LED 7 đoạn
➢ Giao tiếp được với LED ma trận
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 3
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
Trang 23https://doe.dee.hcmut.edu.vn/
BÀI 1
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?
b Cấu hình timer như thế nào để có độ trễ này
3 Mã nguồn và chú thích
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 5ms
b Timer 0 mode Normal (TCCR0A = 0x00) Với thông số CLK0/1024 để mỗi lần đếm lên tốn
128us (TCCR0B = (1<<CS02) | (1<<CS00) = 0x05) Giá trị nạp vào thanh ghi TCNT0 là 216 để sau 5ms cờ TOV0 sẽ được set lên 1
Trang 24in r20, LED7SEGLatchDIR ; read the Latch Port direction register
ori r20, (1 << nLE0Pin) | (1 << nLE1Pin)
out LED7SEGLatchDIR, r20
ret
; Display a value on0 a 7-segment LED using a lookup table
; Input: R27 contains the value to display
; R26 contain the LED index (3 0)
Trang 25cbi LED7SEGLatchPORT, nLE1Pin
ret ; Return from the function
Trang 27https://doe.dee.hcmut.edu.vn/
BÀI 2
2 Trả lời các câu hỏi
a Giá trị PORTA * 9 là số có bao nhiêu bit
b Làm thế nào để hiển thị từng chữ số lên 4 LED?
3 Mã nguồn và chú thích
2 Trả lời các câu hỏi:
a Giá trị PORTA*9 là số có 12 bit
b Ta thực hiện phép chia kết quả của PORT DIP SWITCH nhân 9 để ra được chữ số hàng ngàn,
trăm, chục và đơn vị Từ đó ta hiển thị từng số lên LED 7 đoạn bằng quét led
3 Mã nguồn:
.ORG 0
TABLE_7SEG_DATA:
.DB 0XC0, 0XF9, 0XA4, 0XB0, 0X99, 0X92, 0X82, 0XF8, 0X80, 0X90 DB 0X88, 0X83, 0XC6, 0XA1, 0X86, 0X8E
TABLE_7SEG_CONTROL:
.DB 0b00001110, 0b00001101, 0b00001011, 0b00000111
.DEF INPUT = R21
.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
.EQU DIP_SW_PORT = PORTA
.EQU DIP_SW_DIR = DDRA
.EQU DIP_SW_PIN = PINA
.EQU LED_7SEG_PORT = PORTD
Trang 31LDI BL,LOW(10) ;Load low-byte of divisor into BL
LDI BH,HIGH(10) ;Load high-byte of divisor into BH
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 ;
CLC ;Clear Carry Flag so zero shifted into A
RJMP LOOP ;Loop Back
SKIP: SEC ;Set Carry Flag to be shifted into A
Trang 32https://doe.dee.hcmut.edu.vn/
BÀI 3
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?
c Sự khác nhau khi quét ở tần số 25Hz và 125Hz
2 Mã nguồn chương trình với chú thích
2 Mã nguồn chương trình:
Trường hợp 1: Quét ở tần số 25Hz
Để đạt được tần số 25Hz, ta tính toán như sau:
Thời gian để quét xong 8 cột là T = 1/f = 1/25 = 40ms
Thời gian để thực hiện quét 1 cột là: T/8 = 5ms
Trang 33https://doe.dee.hcmut.edu.vn/
Với Timer 1 mode CTC, CLK0/8, ta có counter timer tăng lên 1 mỗi 1us, suy ra ta cần vào lại ngắt mỗi 5000 lần tăng counter tương đương với 5ms như đã tính toán Vậy ta hiệu chỉnh giá trị được lưu trong thanh ghi OCR1AH : OCR1AL là 5000
.include "m324padef.inc" ; Include Atmega324pa definitions
.org 0x0000 ; interrupt vector table
.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
Trang 34cbi 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
brne shiftloop
; Latch data
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 0b11111100, 0b00010010, 0b00010001, 0b00010001, 0b00010010, 0b11111100, 0b00000000, 0b00000000
Trang 35; 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
Trang 36pop 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) ; Load the value 0b00000101 into the temporary register
Trang 37Để đạt được tần số 125Hz, ta tính toán như sau:
Thời gian để quét xong 8 cột là T = 1/f = 1/125 = 8ms
Trang 38https://doe.dee.hcmut.edu.vn/
Thời gian để thực hiện quét 1 cột là: T/8 = 1ms
Với Timer 1 mode CTC, CLK0/8, ta có counter timer tăng lên 1 mỗi 1us, suy ra ta cần vào lại ngắt mỗi 1000 lần tăng counter tương đương với 1ms như đã tính toán Vậy ta hiệu chỉnh giá trị được lưu trong thanh ghi OCR1AH : OCR1AL là 1000
.include "m324padef.inc" ; Include Atmega324pa definitions
.org 0x0000 ; interrupt vector table
.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
Trang 39https://doe.dee.hcmut.edu.vn/
.equ shiftDataPin = 0 ; Set shift data pin to pin 0 of PORTB
; Initialize ports as outputs
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
brne shiftloop
; Latch data
sbi latchPort, latchPin ; Set latch pin to high
cbi latchPort, latchPin ; Set latch pin to low
pop r18
ret
;Lookup table for collumn control
Trang 40https://doe.dee.hcmut.edu.vn/
ledmatrix_col_control: DB 0x80, 0x40, 0x20, 0x10, 0x08, 0x04, 0x02, 0x01
; Lookup table for font
ledmatrix_Font_A: DB 0b11111100, 0b00010010, 0b00010001, 0b00010001, 0b00010010, 0b11111100, 0b00000000, 0b00000000
; J38 connect to PORTD
; clear signal pin to pin 0 of PORTB
; shift clock pin to pin 1 of PORTB
; latch pin to pin 0 of PORTB
; shift data pin to pin 3 of PORTB
Trang 41; Display a Collumn of Led Matrix
; Input: R27 contains the value to display
; R26 contain the Col index (3 0)
pop r16 ; Restore the temporary register
ret ; Return from the function
initTimer1CTC:
push r16
ldi r16, high(1000) ; Load the high byte into the temporary register
sts OCR1AH, r16 ; Set the high byte of the timer 1 compare value
ldi r16, low(1000) ; 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 0b00000101 into the temporary register