Hi anh em, mình mới tập tành học avr
Mình dùng avrmega32, thạch anh 16Mhz, để tạo delay 1s như đoạn code sau:
Theo mình tính toán, dùng timer 16-bit đếm.
16Mhz = 15625 x 1024 => với set mode cho TCCR1B = 101 (tức là f/1024)
thì TCNT1 cần 15625.
Dùng overflow interrupt => TCNT1 = 65536-15625 = 0xc2f7
Nhưng khi nạp vào mạch thật thì thấy delay lâu hơn rất nhìu (cỡ mười mấy s)
Mình ko hỉu vì sao nữa, xin các cao thủ chỉ giúp.
Dưới đây là tóm tắt chương trình
.org 0x000
rjmp Init
.org 0x012
rjmp OverFlow1
.org 0x020
;----------------------------
Init:
ser R16
out DDRB, R16
clr R16
out PortB, R16
ldi r16,0b00000100 ;overflow enable
out TIMSK,r16
; Counter = 0xc2f7 -----------
; ffff-c2f7 = 1s
ldi r16,0xc2
out TCNT1H,r16
ldi r16,0xf7
out TCNT1L,r16
; Normal mode ----------------
ldi r16,0b00000000
out TCCR1A,r16
ldi r16,0b00000101 ;f/1024
out TCCR1B,r16
sei
;----------------------------------------
MAIN:
LDI R16, 0B11111111
OUT PORTB, R16
RCALL Delay1s
LDI R16, 0B00000000
OUT PORTB, R16
RCALL Delay1s
RJMP MAIN
;-----------------------------------------
OverFlow1:
set
reti
;-----------------------------------------
Delay1s:
clt
ldi r16,0xc2
out TCNT1H,r16
ldi r16,0xf7
out TCNT1L,r16
Loop:
brtc Loop
ret
Mình dùng avrmega32, thạch anh 16Mhz, để tạo delay 1s như đoạn code sau:
Theo mình tính toán, dùng timer 16-bit đếm.
16Mhz = 15625 x 1024 => với set mode cho TCCR1B = 101 (tức là f/1024)
thì TCNT1 cần 15625.
Dùng overflow interrupt => TCNT1 = 65536-15625 = 0xc2f7
Nhưng khi nạp vào mạch thật thì thấy delay lâu hơn rất nhìu (cỡ mười mấy s)
Mình ko hỉu vì sao nữa, xin các cao thủ chỉ giúp.
Dưới đây là tóm tắt chương trình
.org 0x000
rjmp Init
.org 0x012
rjmp OverFlow1
.org 0x020
;----------------------------
Init:
ser R16
out DDRB, R16
clr R16
out PortB, R16
ldi r16,0b00000100 ;overflow enable
out TIMSK,r16
; Counter = 0xc2f7 -----------
; ffff-c2f7 = 1s
ldi r16,0xc2
out TCNT1H,r16
ldi r16,0xf7
out TCNT1L,r16
; Normal mode ----------------
ldi r16,0b00000000
out TCCR1A,r16
ldi r16,0b00000101 ;f/1024
out TCCR1B,r16
sei
;----------------------------------------
MAIN:
LDI R16, 0B11111111
OUT PORTB, R16
RCALL Delay1s
LDI R16, 0B00000000
OUT PORTB, R16
RCALL Delay1s
RJMP MAIN
;-----------------------------------------
OverFlow1:
set
reti
;-----------------------------------------
Delay1s:
clt
ldi r16,0xc2
out TCNT1H,r16
ldi r16,0xf7
out TCNT1L,r16
Loop:
brtc Loop
ret
Comment