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

43 8 0
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

Đang tải... (xem toàn văn)

Tài liệu hạn chế xem trước, để xem đầy đủ mời bạn chọn Tải xuống

Thông tin tài liệu

Trang 1

BÁO CÁO THÍ NGHIỆM VI XỬ LÝ

BÀI BÁO CÁO THÍ NGHIỆM LAB 2

Trang 2

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

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

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

BÀI 3

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

callinitTimer0

Trang 3

ldir16, (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 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%

Trang 5

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

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 6

d 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 9

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

a

Ở 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

Ở 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

c

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

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

Trang 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ả

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 15

TH2: 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 16

TH3: Timer hoạt động ở chế độ PFPWM

Trang 17

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

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

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

Trang 22

https://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

THAM KHẢO:

➢ 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ÀI 1

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 2

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 23

https://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 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)

Trang 25

cbi LED7SEGLatchPORT, nLE1Pin

ret ; Return from the function

Trang 27

https://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

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

Trang 32

https://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 33

https://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 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

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

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 38

https://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

Ngày đăng: 03/04/2024, 14:59