You are on page 1of 14

1.

Viết một chương trình tạo chuỗi xung vuông đối xứng ngõ ra PB0 tần số 20KHz,sử dụng
Timer0: (a) Mode NOR (b) Mode CTC Đánh giá sai số xung tạo ra thực tế.
2. Viết một chương trình tạo chuỗi xung vuông đối xứng ngõ ra PC0 tần số 100Hz,sử dụng
Timer0: (c) Mode NOR (d) Mode CTC
.ORG 0
RJMP MAIN
.ORG 0x40
MAIN:
SBI DDRC, 0 ;PC0 xuat
LDI R16, 0
OUT TCCR0A, R16
OUT TCCR0B, R16
LOOP:
RCALL CTC_100HZ ;3MC
IN R16, PORTC ;1MC
LDI R17, 1 ;1MC
EOR R16, R17 ;1MC
OUT PORTC, R16 ;1MC
RJMP LOOP ;2MC
//--------------------------------------------
/*CTC: NOR_100HZ
INPUT: None
OUTPUT: None
Description: Delay 5ms bang timer0 mod NOR, Fosc = 8KHz*/
NOR_100HZ:
LDI R16, -156 ;1MC
OUT TCNT0, R16 ;nap counter 1MC
LDI R16, 4 ;1MC
OUT TCCR0B, R16 ;chon N = 256 1MC
WAIT1:
IN R17, TIFR0 ;1MC
SBRS R17, TOV0 ;check bit TOV0 2/1MC
RJMP WAIT1 ;2MC
OUT TIFR0, R17 ;xoa bit TOV0 1MC
LDI R16, 0 ;1MC
OUT TCCR0B, R16 ;ngung timer0 1MC
RET ;4MC
//--------------------------------------------
/*CTC: CTC_100HZ
INPUT: None
OUTPUT: None
Description: Delay 5ms bang timer0 mod CTC, Fosc = 8KHz*/
CTC_100HZ:
LDI R16, 155 ;1MC
OUT OCR0A, R16 ;nap counter
LDI R16, 2 ;1MC
OUT TCCR0A, R16 ;chon mode CTC 1MC
LDI R16, 4 ;1MC
OUT TCCR0B, R16 ;chon N = 256 1MC
WAIT2:
IN R17, TIFR0 ;1MC
SBRS R17, OCF0A ;Check bit OCF0A = 1
RJMP WAIT2 ;2MC
OUT TIFR0, R17 ;xoa bit ORC0A
LDI R16, 0 ;1MC
OUT TCCR0B, R16 ;ngung timer0
RET ;4MC

3. Lập lại bài 2 với Timer2


T=10ms
Chọn prescale 256
Với mode NOR nạp TCNT2=-156
Với mode CTC nạp OCR0A=155
Khi đó: độ rộng xung = 156*256*125n=4.992ms => T=9.984ms
 Phần trăm sai số =0.16%
4. Lập lại bài 2 với Timer1
.EQU TF=-40000
LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
SBI DDRB,0
CBI PORTB,0
LDI R16,0
STS TCCR1A,R16
LDI R16,0
STS TCCR1B,R16
LDI R16,1
START:
RCALL DELAY_5MS
IN R17,PORTB
EOR R17,R16
OUT PORTB,R17
RJMP START

DELAY_5MS:
LDI R17,HIGH(TF)
STS TCNT1H,R17
LDI R17,LOW(TF)
STS TCNT1L,R17
LDI R17,$01
STS TCCR1B,R17
WAIT:
IN R17,TIFR1
SBRS R17,TOV1
RJMP WAIT
OUT TIFR1,R17
LDI R17,0
STS TCCR1B,R17
RET

.EQU TPA=40000

LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPH,R16

LDI R16,1
SBI DDRB,0
CBI PORTB,0
LDI R17,HIGH(TPA)
STS OCR1AH,R17
LDI R17,LOW(TPA)
STS OCR1AL,R17
LDI R17,0
STS TCCR1A,R17
LDI R17,9
STS TCCR1B,R17
WAIT:
IN R17,TIFR1
SBRS R17,OCF1A
RJMP WAIT
OUT TIFR1,R17
IN R17,PORTB
EOR R17,R16
OUT PORTB,R17
RJMP WAIT

2 bài không có sai số (sai số ít hơn 1HZ). KHÔNG CẦN HIỆU CHỈNH!!.
5. Viết một chương trình tạo chuỗi xung vuông tần số 400Hz CKNV 35% ngõ ra PB5 ,sử dụng
Timer0: (a) Mode NOR
(b) Mode CTC
Đánh giá sai số xung tạo ra thực tế.
a)
MODE NOR
- F = 400HZ => T=2500US => CKNV = 875US => CÒN LẠI = 1625US

MODE 875US SAI SỐ 1625US SAI SỐ 2500US SAI SỐ


CHIA
N=1 LỚN 0 LỚN 0 LỚN 0
N=8 875 0 1625 0 2500 0
N=64 109 3US 203 1US 312 4US
N=256 27 11US 50 25US 78 4US
N=1024 7(LÀM 21US 13 39US 19 68US
TRÒN
LÊN)

 CHỌN N=64 => 8US => SAI SỐ NHỎ NHẤT


 TDH = -109; TDL = -203
6. Lập lại bài 5 với Timer2.
.ORG 0
RJMP MAIN
.ORG 0x40
MAIN:
SBI DDRB, 5
CBI PORTB, 5
LDI R16, 0
STS TCCR2A, R16
STS TCCR2B, R16
LOOP:
RCALL CTC_CKNV35 ;3MC
RJMP LOOP ;2MC
//-------------------------------------------
/*CTC: NOR_CKNV35
INPUT: None
OUTPUT: None
Descripton:Tao xung vuong chan PB5 (chua cau hinh) bang timer2 modeNOR
f = 400Hz, CKNV = 35%*/
NOR_CKNV35:
SBI PORTB, 5 ;set bit cho portB 2MC
LDI R16, -109 ;b?t ??u Delay 0.875ms 1MC
STS TCNT2, R16 ;nap count = 109 2MC
LDI R16, 4 ;1MC
STS TCCR2B, R16 ;nap N = 64 2MC
WAIT1:
IN R17, TIFR2 ;1MC
SBRS R17, TOV2 ;2/1MC
RJMP WAIT1 ;2MC
OUT TIFR2, R17 ;xoa bit TOV2 1MC
LDI R17, 0 ;1MC
STS TCCR2B, R17 ;tat timer2 2MC
/*.................................*/
CBI PORTB, 5 ;dao bit 2MC
LDI R16, -203 ;1MC
STS TCNT2, R16 ;nap count = 203 2MC
LDI R16, 4 ;1MC
STS TCCR2B, R16 ;nap N = 64 2MC
WAIT2:
IN R17, TIFR2 ;1MC
SBRS R17, TOV2 ;2/1MC
RJMP WAIT2 ;2MC
OUT TIFR2, R17 ;xoa bit TOV2 1MC
LDI R17, 0 ;1MC
STS TCCR2B, R17 ;ngung timer2 2MC
RET ;4MC
//-------------------------------------------
/*CTC: CTC_CKNV35
INPUT: None
OUTPUT: None
Descripton:Tao xung vuong chan PB5 (chua cau hinh) bang timer2 modCTC
f = 400Hz, CKNV = 35%*/
CTC_CKNV35:
SBI PORTB, 5
LDI R16, 155
STS OCR2A, R16 ;TOP = 77
LDI R16, 53
STS OCR2B, R16 ;GTSS = 26
LDI R16, 2
STS TCCR2A, R16 ;mod CTC
LDI R16, 5
STS TCCR2B, R16 ;N =128
WAIT3:
IN R17, TIFR2
SBRS R17, OCF2B ;check flag OCF0B
RJMP WAIT3
OUT TIFR2, R17 ;xoa flag OCF0B
CBI PORTB, 5
WAIT4:
IN R17, TIFR2
SBRS R17, OCF2A ;check flag OCF0A
RJMP WAIT4
OUT TIFR2, R17 ;xoa flag OCF0A
LDI R17, 0 ;1MC
STS TCCR2A, R17 ;ngung timer2 2MC
RET
7. Lập lại bài 5 với Timer1
T=1/400=2.5ms
 CKNV=875us
Mode NOR chọn prescale 64
Thời gian mức cao nạp TCNT1H=$FF ; TCNT1L=-110
Thời gian mức thấp nạp TCNT1H=$FF; TCNT1L=-203
Mode CTC chọn prescale 64
Thời gian mức cao nạp OCR1A=109
Thời gian mức thấp nạp OCR1A=202
;
Vậy thời gian xung mức cao=110*64*125ns=880us
 Sai số mức cao = 0.57%
8. Dựa vào hình 7.15 ví dụ 7.6,viết một chương trình thực hiện khi nhấn/nhả SW LED sáng trong
2s:
(a) Sử dụng Timer0 tạo thời gian delay
(b) Sử dụng Tiner1 tạo thời gian delay
SBI DDRC,0
CBI PORTC,0
CBI DDRB,0
SBI PORTB,0

LDI R17,0
STS TCCR0A,R17
LDI R17,0
STS TCCR0B,R17
START: LDI R18,50
BACK: SBIC PINB,0
RJMP START
DEC R18
BRNE BACK
BACK1: LDI R18,50
BACK2: SBIS PINB,0
RJMP BACK1
DEC R18
BRNE BACK2
SBI PORTC,0
RCALL DELAY_2S
CBI PORTC,0
RJMP START

DELAY_2S:
LDI R18,62
LOOP:
LDI R17,-252
OUT TCNT0,R17
LDI R17,5
OUT TCCR0B,R17
WAIT_DELAY:
IN R17,TIFR0
SBRS R17,TOV0
RJMP WAIT_DELAY
OUT TIFR0,R17
LDI R17,0
OUT TCCR0B,R17
DEC R18
BRNE LOOP
RET

.EQU PTA=15624

SBI DDRC,0
CBI PORTC,0
CBI DDRB,0
SBI PORTB,0

LDI R17,0
STS TCCR0A,R17
LDI R17,0
STS TCCR0B,R17

START: LDI R18,50


BACK: SBIC PINB,0
RJMP START
DEC R18
BRNE BACK
BACK1: LDI R18,50
BACK2: SBIS PINB,0
RJMP BACK1
DEC R18
BRNE BACK2
SBI PORTC,0
RCALL DELAY_2S
CBI PORTC,0
RJMP START

DELAY_2S:
LDI R17,HIGH(PTA)
STS OCR1AH,R17
LDI R17,LOW(PTA)
STS OCR1AL,R17
LDI R17,0
STS TCCR1A,R17
LDI R17,(1<<CS00)|(1<<CS02)|(1<<WGM02)
STS TCCR1B,R17
WAIT_DELAY:
IN R17,TIFR1
SBRS R17,OCF1A
RJMP WAIT_DELAY
OUT TIFR1,R17
LDI R17,0
STS TCCR1B,R17
RET
9. Vẽ sơ đồ MCU324P giao tiếp 4 SW khi nhấn tích cực mức 0 và 1 LED đơn(phân cực dòng
10mA khi LED sáng).Viết một chương trình sử dụng Timer tạo thời gian delay,thực hiện các
công việc như sau: - Nhấn SW1 LED sáng trong 2s
- Nhấn SW2 LED sáng chớp tắt 1 lần trong 2s
- Nhấn SW3 LED sáng chớp tắt 2 lần trong 2s
- Nhấn SW2 LED sáng chớp tắt 4 lần trong 2s
Lập vòng liên tục các công việc trên.
10. Viết một chương trình tạo chuỗi xung tuần hoàn có độ rộng thay đổi như hình BT7.10:

.ORG 0
RJMP MAIN
.ORG 0x40
MAIN:
SBI DDRB, 3 ;set output cho PB3
CBI PORTB, 3
LDI ZH, HIGH(TAB<<1)
LDI ZL, LOW(TAB<<1) ;set dia chi TAB
LDI R16, 6 ;set gia tri dem xung
LDI R17, $42
OUT TCCR0A, R17 ;tao xung, toggle OC0A mode CTC
LDI R17, $02
OUT TCCR0B, R17 ;N = 8
WAIT:
IN R17, TIFR0
SBRS R17, OCF0A ;check flag OCF0A
RJMP WAIT
OUT TIFR0, R17 ;xoa flag OCF0A
LPM R17, Z+ ;lay gia tri TAB tao xung
OUT OCR0A, R17 ;nap gia tri TOP cho TCNT0
DEC R16 ;giam R16
BRNE WAIT ;het 6 lan, khoi phuc lai gia tri
LDI R16, 6
LDI ZH, HIGH(TAB<<1)
LDI ZL, LOW(TAB<<1)
RJMP WAIT
TAB:
.DB 39, 54, 69, 84, 99, 54
11. Viết một chương trình tạo 2 chuỗi xung vuông đối xứng tần số f1=1Khz,tần số f2=2Khz: (a)
Sử dụng Timer0 mode CTC xuất xung f1 ra PD0,Timer2 mode CTC xuất xung f2 ra PD1 (b) Sử
dụng Timer0 và Timer2 như câu (a) dùng chức năng tạo sóng xuất xung f1 ra OC0A,xuất xung f2
ra OC2A
Câu a:
Tạo độ rộng xung f1 500us bằng timer0
Tạo độ rộng xung f2 250us bằng timer2
Chọn chế độ CTC2 ở cả 2 timer
Nạp TCCRnA=$02 với n=0,2
Nạp TCCRnB=$03 với n=0,2
 Prescale của timer0=64
 Prescale của timer2=32
 Nạp OCRnA của cả 2 timer=62 => độ rộng xung của timer0 gấp đôi độ rộng xung timer2
 Sai số độ rộng xung = 0.8%
Câu b:
Nạp TCCRnA=$42 với n=0,2 thay vì $02
12. Lập lại bài 11 nhưng chỉ sử dụng Timer0(ngõ ra tùy chọn)
.EQU PTA=30

SBI DDRC,0
CBI PORTC,0
SBI DDRC,1
CBI PORTC,1

LDI R17,PTA
OUT OCR0A,R17
LDI R17,2
OUT TCCR0A,R17
LDI R17,3
OUT TCCR0B,R17
WAITB:
IN R17,TIFR0
SBRS R17,OCF0A
RJMP WAITB
OUT TIFR0,R17
IN R17,PORTC
LDI R16,3
EOR R17,R16
OUT PORTC,R17
WAITA:
IN R17,TIFR0
SBRS R17,OCF0A
RJMP WAITA
OUT TIFR0,R17
IN R17,PORTC
LDI R16,1
EOR R17,R16
OUT PORTC,R17
RJMP WAITB

13. Thiết kế mạch tạo tín hiệu xung PWM tần số fo=3Khz,độ rộng xung thay đổi được từ 1 -
255μs bằng cách cài đặt DIPSW-8 ở ngõ vào.Sử dụng Timer0 mode FPWM,ngõ ra tùy chọn.
14. Lập lại bài 13,sử dụng Timer2 mode PCPWM
15. Từ bài 13(hoặc 14)thêm vào chương trình đo độ rộng xung(thời gian mức 1) (a) Hiển thị giá
trị đo bằng mã Hex ra PortA. (b) *Hiển thị giá trị đo ra LCD ký tự 16x2
16. Dựa vào hình 7.44 ví dụ 7.16,thiết kế mạch tạo tín hiệu xung PWM tần số fo=200Hz,CKNV
thay đổi từ 5% - 95% bằng cách nhấn SW ở ngõ vào,mỗi lần nhấn SW1 tăng 1%,nhấn SW2 giảm
1% .Sử dụng Timer1 mode FPWM,ngõ ra tùy chọn.
.DEF FLAG_REG=R24
.EQU CONT_IN=PINC
.EQU SW_FLG=0
.EQU P_OUT=6
.EQU SW1=0
.EQU SW2=1
.EQU PMIN=30
.EQU PMAX=593
.EQU DELTA=6
.EQU MAXX=624
.ORG 0
RJMP MAIN
.ORG 0X40
MAIN:
LDI R16,HIGH(RAMEND)
OUT SPH,R16
LDI R16,LOW(RAMEND)
OUT SPL,R16
LDI R16,$ff
OUT DDRD,R16
LDI R16,0
OUT DDRC,R16
LDI R17,0X03
OUT PORTC,R17
LDI R16,HIGH(MAXX)
STS OCR1AH,R16
LDI R16,LOW(MAXX)
STS OCR1AL,R16
ldi r16,0
sts ocr1bh,r16
LDI R16,100
STS OCR1BL,R16
LDI R16,0B10100011
STS TCCR1A,R16
LDI R16,0B00011011
STS TCCR1B,R16
LDI R25,DELTA

START:

RCALL GET_SW
SBRS FLAG_REG,SW_FLG
RJMP START
CPI R17,1
BRNE SW2_CHK
LDS R18,OCR1BH
LDS R17,OCR1BL
ADD R17,R25
ADC R18,r1
LDS R21,HIGH(PMAX)
LDS R20,LOW(PMAX)
RCALL COMP16
BRCS UP_SP
LDS R18,HIGH(PMAX)
LDS R17,LOW(PMAX)
UP_SP:
STS OCR1BH,R18
STS OCR1BL,R17
RJMP START
SW2_CHK:
CPI R17,2
BRNE START
LDS R18,OCR1BH
LDS R17,OCR1BL
SUB R17,R25
SBC R18,R1
LDS R21,HIGH(PMIN)
LDS R20,LOW(PMIN)
RCALL COMP16
BRCS DWN_SP
LDS R18,HIGH(PMIN)
LDS R17,LOW(PMIN)
DWN_SP:
STS OCR1BH,R18
STS OCR1BL,R17
RJMP START

GET_SW:
CBR FLAG_REG,(1<<SW_FLG)
BACK0:
LDI R16,50
WAIT0:
IN R17,CONT_IN
ANDI R17,(1<<SW1)|(1<<SW2)
CPI R17,(1<<SW1)|(1<<SW2)
BREQ EXIT_SW
DEC R16
BRNE WAIT0
PUSH R17
BACK1:
LDI R16,50
WAIT1:
IN R17,CONT_IN
ANDI R17,(1<<SW1)|(1<<SW2)
CPI R17,(1<<SW1)|(1<<SW2)
BRNE BACK1
DEC R16
BRNE WAIT1
POP R17
CPI R17,(1<<SW2)
BRNE SW2_CODE
LDI R17,1
RJMP SET_FLG
SW2_CODE: CPI R17,(1<<SW1)
BRNE EXIT_SW
LDI R17,2
SET_FLG: SBR FLAG_REG,(1<<SW_FLG)
EXIT_SW: RET

COMP16:
MOV R22,R18
MOV R23,R21
CPSE R23,R22
JMP JUMP2
JMP JUMP
JUMP2:
SUB R23,R22
JMP RETURN
JUMP:
MOV R22,R17
MOV R23,R20
CPSE R23,R22
JMP JUMP1
JMP RETURN
JUMP1:
SUB R23,R22

RETURN:
RET
17. Lập lại bài 16,sử dụng Timer1 mode PCPWM
18. Từ ví dụ 7.16,động cơ có gắn một bộ đo tốc độ phát ra 100 xung/vòng.Vẽ sơ đồ kết nối bộ đo
tốc độ với MCU và viết thêm chương trình đo tốc độ vòng/phút(rpm),lưu giá trị đo tốc độ vào
R23:R22.

Ý tưởng: sẽ dùng Input capture để nhận diện cạnh lên của xung từ động cơ.
Cho hệ số chia là N = 8.
Khi đó nếu lấy 6000/(ICR1(2)-ICR1(1)) = rpm
.ORG 0
RJMP MAIN
.ORG 0x40
MAIN:
LDI R16, $FF
OUT DDRA, R16
OUT DDRC, R16
LDI R16, 0
STS TCCR1A, R16 ;set timer1 mode NOR
LDI R16, $42
STS TCCR1B, R16 ;set timer1 nhan dien canh len, N = 8
LOOP_1:
IN R17, TIFR1
SBRS R17, 5 ;check flag ICF1 = 1
RJMP LOOP_1
OUT TIFR1, R17 ;xoa flag ICF1
LDS R18, ICR1L
LDS R19, ICR1H ;lay r19:r18 = ICR1 dau
LOOP_2:
IN R17, TIFR1
SBRS R17, 5 ;check flag ICF1 = 1
RJMP LOOP_1
OUT TIFR1, R17 ;xoa flag ICF1
LDS R20, ICR1L
LDS R21, ICR1H ;lay r21:r20 = ICR1 sau
SUB R20, R18
SBC R21, R19 ;gia tri thanh ghi ICR1 truoc - sau
RCALL TO_RPM
RJMP LOOP_1
//--------------------------------------------------------
/*CTC: TO_RPM
INPUT: R21:R20
OUTPUT: R23:R22
Description: Doi tu gia tri so sanh 16bit (N=8, Fosc = 8kHz)sang rmp*/
TO_RPM:
LDI R25, $EA
LDI R24, 60 ;R25:R24 = 60 000
LDI R26, 0
LDI R27, 0 ;R27:R26 thuong so
MOV R3, R27 ;R3 = 0
LDI R28, 1
LOOP:
SUB R24, R20
SBC R25, R21 ;60 000 - R21:R20
BRCC PLUS_1 ;C = 0, R27:R26 + 1
MOVW R22, R26 ;C = 1, R23:R22 <= R27:R26
LDI R28, 10 ;R18 = 10
MUL R22, R28 ;lay bit thap nhan 10
MOV R4, R0 ;chuyen ket qua sang R5:R4
MUL R23, R18 ;lay bit cao nhan 10
ADD R5, R0 ;LAY R5 + R0 (R0 la ket qua bit cao x 10)
MOVW R22, R4 ;tra ve ket qua cho R23:R22
OUT PORTA, R22
OUT PORTC, R23
RET
PLUS_1:
ADD R26, R28
ADC R27, R3
RJMP LOOP

You might also like