Introduction Programming Timers: Timer0 Timer1 Timer2 Counter Kusuma Wardana, M.Sc. 2
Banyak aplikasi yg membutuhkn pencacah (counter) atau membangkitkn time delay Oleh karena itu, terdapat counter register pd uC AVR
Amati Gb berikut:
Kusuma Wardana, M.Sc. 4
Ketika kita ingin mencacah suatu event
maka kita menghubungkan sumber luar (external event source) ke clock pin dari
counter register
Kemudian, jk terjadi kejadian dr luar isi dr
counter dinaikkan (incremented) Dgn demikian, isi dr counter register
menyatakan berapa banyak kejadian yg terjadi
Ketika kita ingin mmbangkitkan time delay kita menghubungkan osilator dgn clock pin dr counter
Ketika osilator „tick‟ isi register dinaikkan Isi dr counter register mewakili jmlh tick
6 Kusuma Wardana, M.Sc.
Salah satu cara utk membangkitkan time delay adlh:
1. Clear isi counter register saat waktu start dimulai
2. Tunggu sampai counter mencapai nilai tertentu
Contoh:
Misal uC memiliki clock 1MHz. Dlm uC, isi dr register akan naik setiap 1 mikrosekon.
Jadi, jika kita ingin sebuah delay selama 100 us, maka kita hrs meng-clear counter dan tunggu sampai counter memiliki nilai 100
Cara lain utk membangkitkan time delay adlh dgn prinsip overflow
Pd uC tiap counter memiliki flag
Flag diset ketika overflow, kemudian dpt di-clear-kan menggunakan software
Load counter register dan biarkan sampai overflow dan biarkan flag diset.
Contoh:
Misal uC memiliki clock 1 MHz dan memiliki 8-bit counter register. Jika ingin membuat time delay 3 uS, kita dpt me-load register dgn isi $FD, dan tunggu sampai counter diset
setelah 3 tick
Setelah tick pertama isi = $FE, setelah tick kedua isi = $FF dan setelah tick ketiga = overflow (isi register menjd $00 dan flag diset)
AVR memiliki 1 sampai 6 timer (Timer 0,
1,2,3,4 dan 5), tergantung keluarga AVR tsb Timer ini bisa bertindak sbg:
1. Counter utk kejadian dunia luar
Di AVR timer/counter adalah 8-bit dan 16-bit
Utk Atmega16 trdpt 3 timer (Timer0, Timer1 dan Timer2):
Timer0 dan Timer2 8-bit
Timer1 16-bit
Dgn memahami 1 jenis mikrokontroler, kita dpt dgn mudah memahami jenis lainnya
Setiap timer memerlukan sumber clock
Sumber clock dapat internal atau eksternal
Jika menggunakan internal frekuensi dr kristal dimasukkan ke timer, dan bisa
digunakan sbg pembangkit delay. Oleh karena itu dikenal sbg timer
Jika menggunakan eksternal kita
memasukkan sumber pulsa ke salah satu kaki pd uC, dan dikenal sbg counter
Stiap timer memiliki TCNTn (Timer/CouNTer) Jd, pd uC ATmega16 kita memiliki TCNT0, TCNT1 dan TCNT2 Isi dr timer/counter dpt dilihat melalui TCNTn
Stp timer memiliki flag TOVn (Timer
OVerflow)
Jika overflow, maka TOVn akan diset
(bernilai 1)
Stiap timer memiliki TCCRn (Timer/Counter Control Register) TCCR utk menset mode operasi Contoh: kita dpt mengatur apakah Timer0 akan bekerja
Stp timer jg memiliki reg OCRn (Output
Compare Register) Isi dr OCRn
dibandingkan dgn isi dr TCNTn.
Jika sama, maka OCFn (Output
Compare Flag) akan diset
Register Timer
berada pada I/O register memory
Oleh karena itu, kita dpt mengakses
menggunakan
instruksi IN dan OUT
$0000 $0001 $0020 General purpose RAM (SRAM) R0 R1 R2 $001F $005F R31 .. . TWBR TWSR SPH SREG .. . General Purpose Registers Standard I/O Registers $00 $01 $3E $3F $0060 .. . .. . Data Address Space I/O Address .. . 8 bit
I/O Register: Kusuma Wardana, M.Sc. 20 Name Address I/O Mem. $00 $20 TWBR $01 $21 TWSR $04 $24 ADCL $05 $25 ADCH $02 $22 TWAR $03 $23 TWDR $06 $26 ADCSRA $07 $27 ADMUX $08 $28 ACSR $09 $29 UBRRL $0A $2A UCSRB $0B $2B UCSRA $0C $2C UDR $0D $2D SPCR $0E $2E SPSR $0F $2F PIND $10 $30 DDRD $11 $31 PORTD $12 $32 PINC $13 $33 DDRC $14 $34 PORTC $15 $35 PINB $16 $36 DDRB $17 $37 PORTB $18 $38 PINA $19 $39 DDRA $1A $3A PORTA $1B $3B EECR $1C $3C EEDR $1D $3D EEARL $1E $3E EEARH $1F $3F SPDR Name Address
I/O Mem. Name
Address I/O Mem. UBRRC $20 $40 UBRRH $21 $41 WDTCR $22 $42 ASSR $23 $43 OCR2 $24 $44 TCNT2 $25 $45 TCCR2 $26 $46 ICR1L $27 $47 ICR1H $28 $48 OCR1BL $29 $49 OCR1BH OCR1AH $2B $4B SFIOR $30 $50 OCDR $31 $51 OSCCAL $32 $52 TCCR0 $33 $53 MCUCSR $34 $54 MCUCR $35 $55 TWCR $36 $56 SPMCR $37 $57 TIFR $38 $58 TIMSK $39 $59 TCNT1L $2C $4C TCNT1H $2D $4D TCCR1B $2E $4E TCCR1A $2F $4F TCNT0 $3A $5A GICR $3B $5B OCR0 $3C $5C SPL $3D $5D SPH $3E $5E GIFR OCR1AL
Contoh:
Load TCNT0 dengan nilai 25. Kemudian salin isi dr TCNT0 tsb ke R19.
Jawab:
LDI R20, 25 ;R20 = 25
OUT TCNT0, R20 ;TCNT0 = R20 IN R19, TCNT0 ;R19 = TCNT0
TCNT0 (Timer/Counter0)
Timer0 8-bit register Jd, TCNT0 8-bit
TCCR0 (Timer/Counter Control Register 0)
TCCR0 8-bit register
Contoh:
Carilah nilai TCCR0 jika kita menginginkan Timer0 pd mode normal, tidak memakai
prescaler. Sumber detak sama dgn sumber detak AVR
Jawab:
Mode normal D6 dan D3 = 00
TIFR (Timer/Counter Interrupt Flag Register)
TIFR 8-bit register
Berisi flag dari Timer-timer yg berbeda
Perhatian!
Jika kita ingin meng-clear-kan Timer0, maka kita harus menuliskan nilai 1 pd register TIFR Mengapa? Karena dlm satu register
terdapat flag dr berbagai timer Contoh: clear-kan Timer0
LDI R20, 0x01
OUT TIFR, R20 ;TIFR = 0b00000001
Normal Mode
Pd mode ini, isi dr timer/counter akan dinaikkan pd setiap detak-nya
Register akan menghitung sampai max 0xFF. Jika overflow, maka akan kembali ke 0x00
Langkah2 memprogram Timer0 pd Mode Normal utk time delay, sbb:
1. Load reg TCNT0 dgn nilai awal tertentu
2. Atur reg TCCR0 utk mengindikasikan mode mana yg
digunakan, jg prescaler
3. Monitor flag TOV0 utk melihat apakah diset. Keluar dr
loop jika TOV0 tinggi
4. Stop timer dgn memutus sumber clock, menggunakan
perintah:
LDI R20, 0x00
OUT TCCR0, R20; stop timer, mode=normal
5. Clear flag TOV0 utk putaran berikutnya
6. Kembali ke langkah 1
Contoh:
Buatlah square wave (gelombang kotak) dgn 50% duty cycle (porsi HIGH dan LOW sama) dan keluarkan di PORTB.5
Timer0 digunakan utk membangkitkan time delay
Analisislah program tsb!
Hitunglah delay yg dibangkitkan oleh timer. Asumsi XTAL = 8MHz
Jawab:
Kusuma Wardana, M.Sc. 36
.INCLUDE “M16DEF.INC”
.MACRO INITSTACK ;set up stack LDI R20, HIGH(RAMEND) OUT SPH, R20 LDI R20, LOW(RAMEND) OUT SPL, R20 .ENDMACRO INITSTACK LDI R16, 1<<5 ;R16 = 0x20 (utk PB5) SBI DDRB, 5 ;PB5 sbg output LDI R17,0
BEGIN : RCALL DELAY ;panggil delay
EOR R17, R16 ;toggele D5 pd R17 OUT PORTB, R17 ;toggle PB5
RJMP BEGIN ;--- Timer0 delay
DELAY : LDI R20, 0xF2 ;R20 = 0xF2 OUT TCNT0, R20 ;load Timer0 LDI R20, 0x01
OUT TCCR0, R20 ;Timer0, normal, no pre, int clk AGAIN : IN R20, TIFR ;read TIFR
SBRS R20, TOV0 ;jk TOV0=1, skip inst slanjutny RJMP AGAIN
LDI R20, 0x00 OUT TCCR0, R20
Analisis Program:
Nilai 0xF2 di-load ke TCNT0
TCCR0 diseting dan Timer0 mulai start
Timer0 mulai mencacah naik, dr F2, F3 … FF
1 clock lg membuatnya mnjd 0, dan TOV0 =1. pd titik ini SBRS R20, TOV0 bypass
perintah RJMP AGAIN Timer0 di-stop
TOV0 di-clear
38 Kusuma Wardana, M.Sc.
XTAL = 8 MHz. Maka periode dr clock adlh T=1/8 MHz= 0,125 mikrosekon.
Delay yg dihasilkan = jumlah cacah x 0,125 us Jumlah cacah 0xFF – 0xF2 = 0x0D (13
dec)
Kita hrs menambah 1 clock ketika lompat dr FF ke 00 dan menset flag TOV0.
Menemukan Nilai yg akan di-Load ke uC Asumsi kita tahu lama delay yg kita
inginkan
Pertanyaannya, brp nilai yg harus di-load ke register TCNT0?
Topik ini adalah materi yg sangat penting untuk memahami timer/counter shg dpt memanfaatkannya dgn tepat!
Bbrp langkah utk menemukan nilai TCNT0, sbb:
1. Hitung waktu periode dr clock:
𝑇𝑐𝑙𝑜𝑐𝑘 = 1 𝐹𝑇𝑖𝑚𝑒𝑟
2. Bagi waktu delay yg diinginkan dgn Tclock 3. Lakukan operasi 256-n, dmn n adalah nilai
Contoh:
Asumsi kita memiliki XTAL = 8MHz. Buatlah program utk membangkitkan gelombang kotak dgn periode 12.5 mikrosekon pd
PORTB.3
Asumsi duty cycle 50%. Gunakan ATmega32
Jawab:
Utk gel kotak dgn T=12.5 us, kita hrs
menyediakan time delay sbesar 6.25 us. Karena XTAL = 8MHz, maka counter akan naik setiap 0.125 us. Ini berarti bahwa kita memerlukan 6.25/0.125 = 50 clock. Nilai yg kita load ke TCNT0 adlh: 256 – 50 = 206 =
Jawab:
Kusuma Wardana, M.Sc. 46
.INCLUDE “M16DEF.INC”
.MACRO INITSTACK ;set up stack LDI R20, HIGH(RAMEND) OUT SPH, R20 LDI R20, LOW(RAMEND) OUT SPL, R20 .ENDMACRO INITSTACK LDI R16, 0x08 ;R16 = 0b00001000 (utk PB3) SBI DDRB, 3 ;PB3 sbg output LDI R17,0
BEGIN : RCALL DELAY ;panggil delay
EOR R17, R16 ;toggle D3 OUT PORTB, R17 ;toggle PB3 RJMP BEGIN
;--- Timer0 delay
DELAY : LDI R20, 0xCE ;R20 = 0xCE OUT TCNT0, R20 ;load Timer0 LDI R20, 0x01
OUT TCCR0, R20 ;Timer0, normal, no pre, int clk AGAIN : IN R20, TIFR ;read TIFR
SBRS R20, TOV0 ;jk TOV0=1, skip inst slanjutny RJMP AGAIN
LDI R20, 0x00 OUT TCCR0, R20
Contoh:
Asumsi kita memiliki XTAL = 8MHz. Sekarang modifikasilah program sebelumnya utk
membangkitkan gelombang kotak dgn frekuensi 16kHz pd PORTB.3
Jawab:
Ikutilah langkah2 berikut:
1.
Time period:
T = 1/F
= 1/16kHz =
62.5 us
2.Kita
bagi 2
utk delay HIGH dan LOW
31.25 us
3.
31.25 us/0.125 us = 250
256-250 =
6
= 0x06
(hex)
Prescaler
Ukuran dr time delay tergantung pd 2 faktor:
1. Frekuensi kristal
2. Jumlah bit register (dlm hal ini 8-bit utk
Timer0)
Kedua faktor ini diluar kontrol programmer karena sudah ditentukan oleh pabrikan
Contoh:
Dengan menggunakan TCNT0,
modifikasilah program sebelumnya untuk mendapatkan time delay maksimum!
Kalkulasi time delay dan frekuensi yg dibangkitkan
Jawab:
Kusuma Wardana, M.Sc. 52
.INCLUDE “M16DEF.INC”
.MACRO INITSTACK ;set up stack LDI R20, HIGH(RAMEND) OUT SPH, R20 LDI R20, LOW(RAMEND) OUT SPL, R20 .ENDMACRO INITSTACK LDI R16, 0x08 ;R16 = 0b00001000 (utk PB3) SBI DDRB, 3 ;PB5 sbg output LDI R17,0
BEGIN : RCALL DELAY ;panggil delay
EOR R17, R16 ;toggle D3 OUT PORTB, R17 ;toggle PB3 RJMP BEGIN
;--- Timer0 delay
DELAY : LDI R20, 0x00 ;R20 = 0x00 OUT TCNT0, R20 ;load Timer0 LDI R20, 0x01
OUT TCCR0, R20 ;Timer0, normal, no pre, int clk AGAIN : IN R20, TIFR ;read TIFR
SBRS R20, TOV0 ;jk TOV0=1, skip inst slanjutny RJMP AGAIN
LDI R20, 0x00 OUT TCCR0, R20
Utk mencapai maks, maka TCNT0 hrs di-load dgn 0x00 akan bergerak dr 00 sampai FF
Total = 256 langkah
Maka delay = (256-0) x 0.125 us = 32 us
Karena delay maks, maka frekeunsi akan min: F = 1/(2x32 us) = 15.625 kHz
Dgn menggunakan skenario ini maks delay yg diperoleh menggunakan Timer0 hanya 32us.
Bgmn jika kita ingin menggunakan delay yg lebih lama?
Amati gb berikut:
Jika prescaler tdk digunakan sumber clock timer akan berasal dr XTAL
Jika menggunakan prescaler clock
sumber akan dibagi sesuai dgn pembagi yg diinginkan
Contoh:
Asumsi digunakan prescaler 1:64. Temukanlah frekuensi dr timer jika digunakan XTAL:
a) 8 MHz b) 16 MHz c) 10 MHz
Jawab:
Solusi diperlihatkan pd ilustrasi sbb:
a) 1/64 x 8 MHz = 125 kHz T = 1/125 kHz = 8 us b) 1/64 x 16 MHz = 250 kHz T = 1/250 kHz = 4 us c) 1/64 x 10 MHz = 156.2 kHz T = 1/156 kHz =
6.4us
Contoh:
Temukan nilai TCCR0 jika kita ingin
memprogram Timer0 pd mode normal dgn prescaler 64 menggunakan clock internal
Jawab:
Contoh:
Asumsi kita memiliki XTAL = 8 MHz. Tulislah program utk membangkitkan gelombang kotak dgn frekuensi 125 Hz pd PORTB.3.
Gunakan Timer0 pd ATmega32, Normal
mode, dan prescaler 256.
Jawab:
Ikutilah langkah2 berikut:
1. Periode gel kotak: T = 1/125 Hz = 8ms
2. ½ dr 8ms utk HIGH dan ½ -nya lg utk LOW
3. (4ms/0.125us)/256 = 125 256-125 = 131=0x83 4. TCNT0 = 0x83
Jawab:
Kusuma Wardana, M.Sc. 64
.INCLUDE “M32DEF.INC”
.MACRO INITSTACK ;set up stack LDI R20, HIGH(RAMEND) OUT SPH, R20 LDI R20, LOW(RAMEND) OUT SPL, R20 .ENDMACRO INITSTACK LDI R16, 0x08 ;R16 = 0b00001000 (utk PB3) SBI DDRB, 3 ;PB5 sbg output LDI R17,0
BEGIN : RCALL DELAY ;panggil delay
EOR R17, R16 ;toggle D3 OUT PORTB, R17 ;toggle PB3 RJMP BEGIN
;--- Timer0 delay
DELAY : LDI R20, 0x83 ;R20 = 0x83 OUT TCNT0, R20 ;load Timer0 LDI R20, 0x04
OUT TCCR0, R20 ;Timer0, normal, pre256,int clk AGAIN : IN R20, TIFR ;read TIFR
SBRS R20, TOV0 ;jk TOV0=1, skip inst slanjutny RJMP AGAIN
LDI R20, 0x00 OUT TCCR0, R20
Assembler dan Nilai Negatif
Kita mengetahui bahwa TCNT0 = 8-bit, dan assembler dpt menghitung nilai utk TCNT0 Contoh:
LDI R20, -100
Karena -100 = 9C, maka R20 = 9C (dlm hex)
Contoh:
Pelajari program berikut. (a) Temukanlah frekuensi yg dibangkitkan dan (b) duty
cycle dr gelombang kotak tsb. Asumsi XTAL = 8 MHz
Jawab:
Pelajari program berikut. (a) Temukanlah frekuensi yg dibangkitkan dan (b) duty
cycle dr gelombang kotak tsb. Asumsi XTAL = 8 MHz, dan digunakan ATmega32
.INCLUDE “M32DEF.INC”
LDI R16, HIGH(RAMEND) OUT SPH, R16
LDI R16, LOW(RAMEND)
OUT SPL, R16 ;init stack pointer
LDI R16, 0x20 SBI DDRB, 5 LDI R18, -150
BEGIN : SBI PORTB, 5 ;PB5 = 1
OUT TCNT0, R18 ;load Timer0
CALL DELAY
OUT TCNT0, R18 ;reload Timer0
CALL DELAY
Kusuma Wardana, M.Sc. 70
--delay menggunakan Timer0
DELAY: LDI R20, 0x01
OUT TCCR0, R20 ;start Timer0, Normal mode
;int clock, no prescaler
AGAIN: IN R20, TIFR ;baca TIFR
SBRS R20, TOV0 ;monitor TOV0 flag
;skip jika HIGH RJMP AGAIN
LDI R20, 0x00
OUT TCCR0, R20 ;stop timer
LDI R20, 1<<TOV0
OUT TIFR, R20 ;clear flag TOV0
TCNT0 = 8-bit
Krn kita me-load 150 clock, maka:
subrutin DELAY = 150 x 0.125 us = 18,75 us.
Porsi HIGH adlh 2 kali porsi LOW 66% duty
cycle
Periode T = porsi HIGH + porsi LOW = (2x18.75us)+(18.75us) = 56.25 us
Maka, Frekuensi = (1/T) = (1/56.25) = 17.77 kHz ATmega32
Clear Timer0 on Compare Match (CTC) Mode Programming
OCR0 digunakan pd CTC mode
Pd CTC mode timer mencacah naik sampai nilai TCNT0 sama dgn OCR0
Jika TCNT0 sama dgn OCR0 maka flag OCF0 akan di-set
Jawab:
Kusuma Wardana, M.Sc. 74
.INCLUDE “M32DEF.INC”
.MACRO INITSTACK ;set up stack LDI R20, HIGH(RAMEND) OUT SPH, R20 LDI R20, LOW(RAMEND) OUT SPL, R20 .ENDMACRO INITSTACK LDI R16, 0x08 ;R16 = 0b00001000 (utk PB3) SBI DDRB, 3 ;PB5 sbg output LDI R17,0
BEGIN : OUT PORTB, R17 ;clear PORTB
RCALL DELAY ;panggil delay
EOR R17, R16 ;toggle D3
OUT PORTB, R17 ;toggle PB3
RJMP BEGIN ;--- Timer0 delay
DELAY : LDI R20, 0x00 ;R20 = 0x00
OUT TCNT0, R20 ;load Timer0
LDI R20, 9
Kusuma Wardana, M.Sc. 76
AGAIN : IN R20, TIFR ;read TIFR
SBRS R20, TOV0 ;jk TOV0=1, skip inst slanjutny RJMP AGAIN
LDI R20, 0x00 OUT TCCR0, R20
LDI R20, (1<<TOV0)
OUT TIFR, R20 ;clear TOV0 dgn menulis 1
Sama halnya dgn Timer0 sama2 8-bit Perbedaan Timer0 dan Timer2, sbb:
1. Timer2 dpt digunakan sbg “real time
counter”.
Hal ini dilakukan dgn menghubungkan kristal sbesar 32.768kHz ke pin TOSC1 dan
TOSC2 dan set bit AS2
Pd Timer0, jika CS02:CS00 diset 110 dan 111, maka akan mencacah input eksternal.
Namun, pd Timer2, multiplexer akan memilih prescaler yg berbeda
Dgn kata lain, nilai yg sama pd bit CS utk
Timer0 dan Timer2 akan menghasilkan prescaler yg berbeda
Contoh:
Temukan nilai TCCR2 jika kita ingin memprogram Timer2 pd:
Mode normal
Prescaler 64 menggunakan clock internal
Contoh:
Dgn menggunakan Timer2, buatlah
program utk membangkitkan delay sebesar 1920 us. Gunakan prescaler 64. asumsi XTAL = 8 MHz
Jawab:
Clock Timer = 8 MHz/64 = 125 kHz Timer period = 1/125 kHz = 8 us
Kusuma Wardana, M.Sc. 88
;--- Timer2 delay
DELAY : LDI R20, -240 ;R20 = 0x10
OUT TCNT2, R20 ;load Timer2
LDI R20, 0x04
OUT TCCR2, R20 ; Timer2, normal, presc = 64
AGAIN : IN R20, TIFR ;read TIFR
SBRS R20, TOV2 ;jk TOV2=1, skip inst slanjutny RJMP AGAIN
LDI R20, 0x00
OUT TCCR2, R20 ;stop Timer2 LDI R20, (1<<TOV2)
OUT TIFR, R20 ;clear TOV0 dgn menulis 1 RET
Contoh:
Menggunakan mode CTC, tulislah program utk membangkitkan delay sebesar 8ms.
Jawab:
Dengan menggunakan XTAL = 8 MHz, output dr prescaler yg berbeda sbb:
Prescaler yg memungkinkan adlh 256 dan 1024 ingat Timer2 = 8-bit
Kita gunakan prescaler 256 menghindari nilai desimal (dengan koma)
Utk menunggu 250 clock, kita load OCR2 dgn 250-1 = 249
Kusuma Wardana, M.Sc. 92
;--- Timer2 delay
DELAY : LDI R20, 0x00 ;R20 = 0x00
OUT TCNT2, R20 ;load Timer0
LDI R20, 249
OUT OCR0, R20 LDI R20, 0x0E
AGAIN : IN R20, TIFR ;read TIFR
SBRS R20, OCF2 ;jk OCF2=1, skip inst slanjutny RJMP AGAIN
LDI R20, 0x00
OUT TCCR2, R20 ;stop Timer2
LDI R20, (1<<OCF2)
OUT TIFR, R20 ;clear flag OCF2
Timer1 16-bit timer
Dibagi mnjd 2 byte TCNT1L dan TCNT1H
Jg memiliki register kontrol bernama TCCR1A dan TCCR1B
Skematik Timer1
Jg memiliki register kontrol bernama
TCCR1A dan TCCR1B
Memiliki register OCR yg terpisah dan
independen
Jika TCNT1 = OCR1A
maka OCF1A akan set Jika TCNT1 = OCR1B
Timer/counter Control Register 1 B
Timer1 Operation Modes
Normal Mode (WGM13:10 = 0000)
Timer mencacah sampai max ($FFFF) kemudian kembali ke $0000
Timer1 Operation Modes
CTC Mode (WGM13:10 = 0100)
Timer mencacah sampai sama dgn isi register OCR1A membangkitkan flag OCF1A
Contoh:
Temukanlah nilai TCCR1A dan TCCR1B jika kita ingin memprogram Timer 1 pada mode 0 (normal mode), tanpa prescaler.
Jawab: TCCR1A = 0000 0000 WGM11 = 0 WGM10 = 0 TCCR1B = 0000 0001 WGM13 = 0 WGM12 = 0 CS12:10 = 001 (no prescaler) Kusuma Wardana, M.Sc. 106
Contoh:
Berdasarkan penggalan program berikut, temukanlah frekuensi gelombang kotak yg dibangkitkan. Asumsi menggunakan XTAL = 8 MHz
;--- Timer1 delay DELAY : LDI R20, 0xD8 OUT TCNT1H, R20 ;TCNT1H = 0xD8 LDI R20, 0xF0 OUT TCNT1L, R20 ;TCNT1L = 0xF0 LDI R20, 0x00 OUT TCCR1A, R20 ;WGM11:10 = 00 LDI R20, 0x01
OUT TCCR1B, R20 ;WGM13:12 = 00, normal, pre =1
AGAIN : IN R20, TIFR ;read TIFR
SBRS R20, TOV1 ;jk TOV1=1, skip inst slanjutny RJMP AGAIN
LDI R20, 0x00
OUT TCCR1B, R20 ;stop Timer1 LDI R20, 0x04
OUT TIFR, R20 ;clear TOV1
RET
108 Kusuma Wardana, M.Sc.
Jawab:
WGM13:10 = 0000 = 0x00 timer bekerja pd mode normal (puncak = 0xFFFF)
FFFF + 1 – D8F0 = 0x2710 10.000 clock XTAL = 8 MHz periode = 0.125 us
Maka delay = 10.000 X 0.125us = 1.25 ms
Contoh:
Temukanlah nilai TCCR1A dan TCCR1B jika kita ingin memprogram Timer 1 pada mode 4 (CTC mode), tanpa prescaler. Gunakan clock dr kristal AVR
Jawab: TCCR1A = 0000 0000 WGM11 = 0 WGM10 = 0 TCCR1B = 0000 1001 WGM13 = 0 WGM12 = 1 CS12:10 = 001 (no prescaler)
Contoh:
Berdasarkan penggalan program berikut, temukanlah frekuensi gelombang kotak yg dibangkitkan. Asumsi menggunakan XTAL = 8 MHz
;--- Timer1 delay DELAY : LDI R20, 0x00 OUT TCNT1H, R20 ;TCNT1H = 0x00 OUT TCNT1L, R20 ;TCNT1L = 0x00 --> TCNT1 = 0 OUT OCR1AH, R20 LDI R20, 159
OUT OCR1AL, R20 ;OCR1A = 159 = 0x9F
LDI R20, 0x00
OUT TCCR1A, R20 ;WGM11:10 = 00
LDI R20, 0x09
Kusuma Wardana, M.Sc. 114
AGAIN : IN R20, TIFR ;read TIFR
SBRS R20, OCF1A ;jk OVF1A=1, skip inst slanjutny RJMP AGAIN
LDI R20, (1<<OCF1A)
OUT TIFR, R20 ;clear flag OCF1A LDI R19, 0x00
OUT TCCR1B, R19 ;stop timer
OUT TCCR1A, R19 RET
Jawab:
WGM13:10 = 0100 = 0x04 timer bekerja pd mode CTC (puncak = OCR1A)
159 + 1 = 160 clock
XTAL = 8 MHz periode = 0.125 us Maka delay = 160 X 0.125us = 20 ms
AVR Timer jg dpt digunakan utk
mencacah, mendeteksi & mengukur waktu kejadian yg terjd di luar AVR
Ketika Timer digunakan sbg Timer AVR menggunakan XTAL sbg sumber frekuensi
Jika digunakan sbg counter terdpt pulsa dr luar yg menaikkan isi register TCNTx
Set CS02:00 mnjd 6 dan 7 sbg counter
Contoh:
Asumsikan kita memiliki pulsa clock 1 Hz yg dimasukkan ke pin T0 (PB0). Tuliskan
program pd Counter0 utk mencacah pulsa falling edge. AVR bekerja pd mode normal. Tampilkan state dr TCNT0 pd PORTC
Kusuma Wardana, M.Sc. 120
PORTC dihub. dgn 8 buah LED dan input pulsa 1 Hz pd T0 (PB0)
.INCLUDE “M32DEF.INC”
CBI DDRB, 0 ;T0 (PB0) sbg input LDI R20, 0xFF
OUT DDRC, R20 ;PORTC sbg output LDI R20, 0x06
OUT TCCR0, R20 ;sbg counter, falling edge AGAIN: IN R20, TCNT0
OUT PORTC, R20 ;PORTC = TCNT0 IN R16, TIFR
SBRS R16, TOV0 ;monitor flag TOV0
RJMP AGAIN ;lakukan terus slama flag Timer = 0 LDI R16, 1<<TOV0
Contoh:
Sekarang asumsikan kita menggunakan Timer1. Pulsa clock dimasukkan pd pin T1 (PB1). Buatlah program utk menghitung
jumlah pulsa pd falling edge dan tampilkan state dr TCNT1 pd PORTC dan PORTD
PORTC dihub. dgn 8 buah LED dan input pulsa 1 Hz pd T0 (PB0)
124
.INCLUDE “M32DEF.INC”
CBI DDRB, 1 ;T1 (PB1) sbg input
LDI R20, 0xFF
OUT DDRC, R20 ;PORTC sbg output
OUT DDRD, R20 ;PORTD sbg output
LDI R20, 0x00 OUT TCCR1A, R20 LDI R20, 0x06
OUT TCCR1B, R20 ;sbg counter, falling edge
AGAIN: IN R20, TCNT1L ;R20 = TCNT1L
OUT PORTC, R20 ;PORTC = TCNT1L
IN R20, TCNT1H
OUT PORTD, R20 ;PORTd = TCNT1H
IN R16, TIFR
SBRS R16, TOV1 ;monitor flag TOV1
RJMP AGAIN ;lakukan terus slama flag Timer = 0
LDI R16, 1<<TOV1
OUT TIFR, R16 ;clear TOv1
RJMP AGAIN ;tetap pd keadaan ini
Mazidi, Naimi and Naimi, 2011, The AVR
Microcontroller and Embedded System: Using
Assembly and C, Prentice Hall
www.atmel.com/
Morton, John, 2007, AVR: An Introductory
Course, Newnes Publisher
Gadre, Dhananjaya, 2001, Programming and
Customizing the AVR Microcontroller,
McGraw-Hill
Daniel J.Pack and Steven F.Barrettt, 2008,
Atmel AVR Microcontroller Primer:
Programming and Interfacing, Morgan &
Claypool Publisher