Tải bản đầy đủ (.pdf) (43 trang)

Báo cáo thí nghiệm vi xử lý bài báo cáo thí nghiệm lab 2 lab 2 1 dùng timer để tạo delay và tạo xung

Bạn đang xem bản rút gọn của tài liệu. Xem và tải ngay bản đầy đủ của tài liệu tại đây (2.35 MB, 43 trang )

<span class="text_page_counter">Trang 1</span><div class="page_container" data-page="1">

<b>BÁO CÁO THÍ NGHIỆM VI XỬ LÝ </b>

<b>BÀI BÁO CÁO THÍ NGHIỆM LAB 2 </b>

</div><span class="text_page_counter">Trang 2</span><div class="page_container" data-page="2">

<b><small>MỤC TIÊU: </small></b>

➢ 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><small>THAM KHẢO: </small></b>

➢ 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><small>BÀI 1 </small></b>

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.

b) Mơ phỏng, chỉnh sửa chương trình để tạo ra xung chính xác.

<b>c) Kết nối chân PA0 vào oscilloscope để kiểm tra </b>

<b><small>BÀI 2 </small></b>

a) Viết chương trình tạo 1 xung vng 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 vng 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><small>BÀI 2 </small></b>

a) Viết chương trình tạo 1 xung vng 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 vng 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><small>BÀI 3 </small></b>

a) Cho chương trình sau tạo 2 xung PWM trên OC0A và OC0B

<small>callinitTimer0 </small>

</div><span class="text_page_counter">Trang 3</span><div class="page_container" data-page="3">

<small>ldir16, (1 << COM0B1)|(1 << COM0A1) | (1 << WGM00)|(1 << WGM01) out TCCR0A,r16 // setup TCCR0A</small>

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

</div><span class="text_page_counter">Trang 4</span><div class="page_container" data-page="4">

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

</div><span class="text_page_counter">Trang 5</span><div class="page_container" data-page="5">

<b><small>BÀI 1 </small></b>

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 tố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 tố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

<b>a. </b>

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.10<small>6</small> s = 0.125us, suy ra thời gian trễ lớn nhất là 256*0.125us = 32us

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

<b>c. </b>

Cách tính tố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ì F<small>CLKO</small> = 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/ F<small>CLKO</small>)*N.

Để đặt thông số prescaler cho timer 0 ta điều chỉnh các bit CS02:CS00 của thanh ghi TCCR0B:

</div><span class="text_page_counter">Trang 6</span><div class="page_container" data-page="6">

<b>d. Mã nguồn chương trình con tạo xung 500Hz trên chân PA0: </b>

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

</div><span class="text_page_counter">Trang 9</span><div class="page_container" data-page="9">

<b><small>BÀI 2 </small></b>

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

<b>a. </b>

Ở mode Normal, bit TOVx được truy xuất ở thanh ghi TIFRx được set lên 1 bởi phần cứng khi phát hiện tràn timer, tức là khi bộ đếm TCNTx đếm đến giá trị MAX(MAX = 0xFF với timer 0 và timer 2 và MAX=0xFFFF với timer 1), có thêm 1 xung đếm nữa, TCNTx bị tràn trả về 0, lúc này cờ báo tràn TOVn sẽ được phần cứng set lên mức 1.

<b>b. </b>

Ở mode CTC, bit OCFx được truy xuất ở thanh ghi TIFRx được phần cứng set lên 1 trong xung tiêp theo sau sự kiện giá trị bộ đếm TCNTx đếm đến giá trị được lưu trong thanh ghi OCRx.

<b>c. </b>

Trườ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. Giá trị nạp vào thanh ghi TCCR0A là (1<<COM0A0) tương ứng với giá trị 0x40, giá trị nạp vào thanh ghi TCCR0B là (1<<CS00) tương ứng với 0x02.

Trường hợp 2: Tạo 1 xung vng 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.

<b>d. Mã nguồn: </b>

Cả hai trường hợp đều mắc như nhau:

</div><span class="text_page_counter">Trang 10</span><div class="page_container" data-page="10">

Trườ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

</div><span class="text_page_counter">Trang 11</span><div class="page_container" data-page="11">

Kế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 vng 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

</div><span class="text_page_counter">Trang 12</span><div class="page_container" data-page="12">

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)

</div><span class="text_page_counter">Trang 13</span><div class="page_container" data-page="13">

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>a. Kết quả trên dao động ký </b>

<b>b. Giải thích dạng sóng ngõ ra: </b>

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><small>BÀI 4 </small></b>

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>TH1: Timer 0 hoạt động ở chế độ FPWM, CLK0/8. Hoàn toàn như Bài 3 </b>

</div><span class="text_page_counter">Trang 15</span><div class="page_container" data-page="15">

<b>TH2: Timer 0 hoạt động ở chế độ FPWM (TOP = OCR0A), CLK0/8 </b>

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

</div><span class="text_page_counter">Trang 16</span><div class="page_container" data-page="16">

<b>TH3: Timer hoạt động ở chế độ PFPWM </b>

</div><span class="text_page_counter">Trang 17</span><div class="page_container" data-page="17">

<b><small>BÀI 5 </small></b>

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.

<b>1. Trả lời các câu hỏi </b>

<b>a. Timer 0 làm việc ở mode FPWM (với TOP = OCR0A) </b>

<b>b. - Giá trị thanh ghi TCCR0A là r16, (1<<COM0B1) | (1<<WGM01) | (1<<WGM00) tương </b>

ứ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

<b>2. Mã nguồn và chú thích </b>

<b>a. Chương trình tạo ra 1 xung tần số 1KHz, duty cycle 25% trên chân OC0B </b>

;LAB2_1 - Bai_5a: Vietchuong trinh tao ra 1 xung tan so 1KHz, duty ;cycle 25% tren chan OC0B

</div><span class="text_page_counter">Trang 18</span><div class="page_container" data-page="18">

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

; 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

</div><span class="text_page_counter">Trang 22</span><div class="page_container" data-page="22">

<b><small>MỤC TIÊU: </small></b>

➢ Giao tiếp được với LED 7 đoạn ➢ Giao tiếp được với LED ma trận

<b><small>THAM KHẢO: </small></b>

➢ Tài liệu hướng dẫn thí nghiệm, chương 4

➢ Atmel-2505-Setup-and-Use-of-AVR-Timers_ApplicationNote_AVR130.pdf

<b><small>BÀI 1 </small></b>

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><small>BÀI 2 </small></b>

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><small>BÀI 3 </small></b>

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.

</div><span class="text_page_counter">Trang 23</span><div class="page_container" data-page="23">

<b><small>BÀI 1 </small></b>

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

<b>2. Trả lời các câu hỏi </b>

<b>a. Để có tần số quét là 50Hz, một LED sẽ sáng 1 lần 5ms </b>

<b>b. Timer 0 mode Normal (TCCR0A = 0x00). Với thông số CLK0/1024 để mỗi lần đếm lên tốn </b>

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.

</div><span class="text_page_counter">Trang 24</span><div class="page_container" data-page="24">

in r20, LED7SEGLatchDIR ; read the Latch Port direction register

ori r20, (1 << nLE0Pin) | (1 << nLE1Pin)

out LED7SEGLatchDIR, r20

; 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)

</div><span class="text_page_counter">Trang 25</span><div class="page_container" data-page="25">

cbi LED7SEGLatchPORT, nLE1Pin

ret ; Return from the function

</div><span class="text_page_counter">Trang 27</span><div class="page_container" data-page="27">

<b><small>BÀI 2 </small></b>

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

<b>2. Trả lời các câu hỏi: </b>

<b>a. Giá trị PORTA*9 là số có 12 bit. </b>

<b>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, </b>

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.

.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

</div><span class="text_page_counter">Trang 31</span><div class="page_container" data-page="31">

LDI 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

</div><span class="text_page_counter">Trang 32</span><div class="page_container" data-page="32">

<b><small>BÀI 3 </small></b>

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 tố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

</div><span class="text_page_counter">Trang 33</span><div class="page_container" data-page="33">

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 tố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

</div><span class="text_page_counter">Trang 34</span><div class="page_container" data-page="34">

cbi clearSignalPort, clearSignalPin ; Set clear signal pin to low ; Wait for a short time

sbi clearSignalPort, clearSignalPin ; Set clear signal pin to high

; 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

</div><span class="text_page_counter">Trang 35</span><div class="page_container" data-page="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

</div><span class="text_page_counter">Trang 36</span><div class="page_container" data-page="36">

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) ; Load the value 0b00000101 into the temporary register

</div><span class="text_page_counter">Trang 37</span><div class="page_container" data-page="37">

Để đạt được tần số 125Hz, ta tính tốn như sau: Thời gian để qt xong 8 cột là T = 1/f = 1/125 = 8ms

</div><span class="text_page_counter">Trang 38</span><div class="page_container" data-page="38">

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 tố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

</div>

×