You are on page 1of 14

LAB 2-1

DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG

BÀI CHUẨN BỊ
Họ và tên: Đỗ Phùng Tuấn Đạt
MSSV: 2033132
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.

.ORG 0

SBI DDRA,0

LDI R16,0X00;TIMER 0 MODE CTC

OUT TCCR0A,R16

LDI R16,0X00

OUT TCCR0B,R16; TIMER 0 DUNG

START:
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
LDI R18,1

IN R19,PORTA

EOR R19,R18

OUT PORTA,R19

RCALL DELAY_1MS

RJMP START

////

DELAY_1MS:

LDI R17,-125

OUT TCNT0,R17

LDI R17,0X03

OUT TCCR0B,R17// TIMER0 CHAY,HE SO CHIA N=64

WAIT:SBIS TIFR0,TOV0

RJMP WAIT

SBI TIFR0,TOV0; XOA CO T0V0

LDI R17,0X00

OUT TCCR0B,R17; DUNG TIMER

RET
LAB 2-1
DÙNG TIMER ĐỂ TẠO 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

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.

.ORG 0

SBI DDRB,3// OC0=PB3


LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
LDI R16,0X00;TIMER 0 MODE NOR

OUT TCCR0A,R16

LDI R16,0X00

OUT TCCR0B,R16; TIMER 0 DUNG

LDI R18,8

LOOP:IN R17,PORTB

EOR R17,R18

OUT PORTB,R17

RCALL DELAY_64US

RJMP LOOP ////

DELAY_64US:

LDI R17,-2

OUT TCNT0,R17

LDI R17,0X04

OUT TCCR0B,R17// TIMER0 CHAY,HE SO CHIA N=256

WAIT:SBIS TIFR0,TOV0

RJMP WAIT

SBI TIFR0,TOV0; XOA CO T0V0

LDI R17,0X00
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
OUT TCCR0B,R17; DUNG TIMER

RET

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.

.ORG 0
SBI DDRB,3; OC0 = PB3 XUAT
LDI R17,0X00
STS TCCR1A,R17; TIMER 1 MODE CTC4
LDI R17,0X00
STS TCCR1B,R17; TIMER 1 DUNG
MAIN: LDI R17,8
IN R18,PORTB
EOR R18,R17
OUT PORTB,R18
RCALL DELAY_32US
RJMP MAIN DELAY_32US:
LDI R17,HIGH(31)
STS OCR1AH,R17
LDI R16,LOW(31)
STS OCR1AL,R16
LDI R21,0X0A//CTC4 HE SO CHIA 8 0000 1010 STS TCCR1B,R21// TIMER 1 CHAY
LOOP:
SBIS TIFR1,OCF1A
RJMP LOOP
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
SBI TIFR1, OCF1A; XOA CO
RET
c) Kết nối chân OC0 ra oscilloscope và quan sát\
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; bat dau thuc hien chuong trinh

call initTimer0; gọi hàm để khởi tạo timer/counter0 và cấu hình chân đầu ra
OC0A và 0C0B start:

rjmp start; vòng lặp dừng chương trình

initTimer0:

// Set OC0A (PB3) and OC0B (PB4) pins as outputs ldi


r16, (1 << PB3) | (1 << PB4);cấu hình PB3, PB4 là ngõ ra

out DDRB,r16

ldi r16, (1 << COM0B1)|(1 << COM0A1) | (1 << WGM00)|(1 << WGM01)

// lấy giá trị 0110 0000 vào TCCR0A để thiết lập chế độ Fast PWM và không đảo cho
các chân đầu ra OC0A và OC0B

out TCCR0A,r16 // setup TCCR0A

ldi r16, (1 << CS01); Chế độ chi tần 8 cho timer0

out TCCR0B,r16 // setup TCCR0B

ldi r16, 100; lấy giá trị 100 và lưu vào OCR0A để cấu hình TOP cho timer0,
duty cycle 100/255= 39%

out OCR0A,r16 //OCRA = 100

ldi r16, 75 ; 75/255=29%

out OCR0B,r16 //OCRB = 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
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG

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

7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0

1 COM0A1 COM0A0 COM0B1 COM0B0 WGM01 WGM00 FOC0A FOC0B WGM02 CS02 CS01 CS00

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

Timer0, mode hoạt động FPWM (TCCR0A = 1010 0011; TCCR0B = 0000 0010)

Timer0, mode hoạt động FPWM (TCCR0A = 1010 0011; TCCR0B = 0000 1010)

Timer0, mode hoạt động PWM hiệu chỉnh pha (TCCR0A = 1010 0001; TCCR0B = 0000
0010)

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 f=1Khz ➔ T=

1 ms

.ORG 0

SBI DDRB,4// OC0B = PORT XUAT


LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
MAIN:

SBI PORTB,4

RCALL DELAY_HIGH

CBI PORTB,4

RCALL DELAY_LOW

RJMP MAIN

DELAY_HIGH:

LDI R16,0X02

OUT TCCR0A,R16

LDI R16,0X02;

OUT TCCR0B,R16; TIMER0 CHAY, HE SO CHIA N = 1

LDI R16,249 OUT OCR0A,R16 WAIT:

SBIS TIFR0,OCF0A

RJMP WAIT

SBI TIFR0,OCF0A

LDI R16,0X00

OUT TCCR0B,R16

RET

DELAY_LOW:

LDI R16,0X02
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
OUT TCCR0A,R16 LDI R16,0X03

OUT TCCR0B,R16

LDI R16,94

OUT OCR0A,R16

WAIT1:SBIS TIFR0,OCF0A

RJMP WAIT1

SBI TIFR0,OCF0A

LDI R16,0X00

OUT TCCR0B,R16

RET

b) Kết nối vào Oscilloscope và đo dạng sóng ngõ ra

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

Mã nguồn câu 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%.

.ORG 00 // R24 COUNT INC10:


INC R18
CPI R18,125 ; SO SÁNH VOI TOP
BRSH DEC10 ; NEU LON HON BẰNG THÌ NHẢY XUỐNG PHẦN GIẢM
DC
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
INC R24
CPI R24,4 ; BÙ TRỪ SAI SỐ CỨ 4 LẦN 0.25 SAI SỐ DƯ RA THÌ TA TĂN R18 LÊN 1 NỮA
BRNE TT1 ; CHUA DU 4 LẦN ĐỂ BÙ TRỪ SAI SỐ
CLR R24 ; ĐỦ 4 LẦN RỒI CLR COUNT
INC R18 ; ĐỦ 4 LẦN THÌ TĂNG R18 LÊN 1 LẦN NỮA TT1:
RCALL INITTIMER0
RCALL DELAY_10MS ; TẠO 10MS MỖI LẦN THAY ĐỔI DC
RJMP INC10 ; QUAY LẠI TĂNG

DEC10:
DEC R18
CPI R18,0
BRLT INC10
INC R24
CPI R24,4
BRNE TT2
CLR R24
DEC R18
CPI R18,0
BRLT INC10

TT2:
RCALL INITTIMER0
RCALL DELAY_10MS
RJMP DEC10
LDI R22,10 // 1MC
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
L2: LDI R23,200 // 1MC
L1 : NOP // 1MC
DEC R23 // 1MC
BRNE L1 // 2/1 MC
INITTIMER0: // INPUT R18
// SET OC0B (PB4) PINS AS OUTPUTS
LDI R16, (1 << PB4);
OUT DDRB,R16
LDI R16, (1 << COM0B1)|(1 << COM0A1) | (1 << WGM00)|(1 << WGM01)
; SETUP CHO NGÕ RA LÀ OC0B VÀ CHỌN MODE FPWM
OUT TCCR0A,R16 // SETUP TCCR0A
LDI R16, (1 << CS00)|(1 << CS01)|(1 << WGM02)
;CHỌN CLK/64
OUT TCCR0B,R16 // SETUP TCCR0B
LDI R16,124
OUT OCR0A,R16 //OCRA = 124=125-1
OUT OCR0B,R18 //INPUT R18
RET

DELAY_1MS: // CKDIV CHƯA LẬP TRÌNH -> MC =0.125US


DEC R22 // 1MC
BRNE L2 // 2/1MC
RET
DELAY_10MS:
LDI R19,10
LAB 2-1
DÙNG TIMER ĐỂ TẠO DELAY VÀ TẠO XUNG
L3: RCALL DELAY_1MS
DEC R19
BRNE L3
RET

You might also like