• Tidak ada hasil yang ditemukan

Materi 8: AVR Timer Programming

N/A
N/A
Protected

Academic year: 2021

Membagikan "Materi 8: AVR Timer Programming"

Copied!
126
0
0

Teks penuh

(1)
(2)

Introduction Programming Timers: Timer0 Timer1 Timer2 Counter Kusuma Wardana, M.Sc. 2

(3)
(4)

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

(5)

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

(6)

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.

(7)

Salah satu cara utk membangkitkan time delay adlh:

1. Clear isi counter register saat waktu start dimulai

2. Tunggu sampai counter mencapai nilai tertentu

(8)

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

(9)

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.

(10)

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)

(11)

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

(12)

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

(13)
(14)

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

(15)

Stiap timer memiliki TCNTn (Timer/CouNTer) Jd, pd uC ATmega16  kita memiliki TCNT0, TCNT1 dan TCNT2 Isi dr timer/counter dpt dilihat melalui TCNTn

(16)

Stp timer memiliki flag TOVn (Timer

OVerflow)

Jika overflow, maka TOVn akan diset

(bernilai 1)

(17)

Stiap timer memiliki TCCRn (Timer/Counter Control Register) TCCR  utk menset mode operasi Contoh: kita dpt mengatur apakah Timer0 akan bekerja

(18)

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

(19)

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

(20)

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

(21)

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

(22)
(23)
(24)

TCNT0 (Timer/Counter0)

Timer08-bit register Jd, TCNT0  8-bit

(25)

TCCR0 (Timer/Counter Control Register 0)

TCCR08-bit register

(26)
(27)
(28)

Contoh:

Carilah nilai TCCR0 jika kita menginginkan Timer0 pd mode normal, tidak memakai

prescaler. Sumber detak sama dgn sumber detak AVR

(29)

Jawab:

Mode normal D6 dan D3 = 00

(30)

TIFR (Timer/Counter Interrupt Flag Register)

TIFR8-bit register

Berisi flag dari Timer-timer yg berbeda

(31)
(32)

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

(33)

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

(34)

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

(35)

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

(36)

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

(37)

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

(38)

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.

(39)

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.

(40)
(41)
(42)

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!

(43)

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

(44)

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

(45)

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 =

(46)

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

(47)

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

(48)

Contoh:

Asumsi kita memiliki XTAL = 8MHz. Sekarang modifikasilah program sebelumnya utk

membangkitkan gelombang kotak dgn frekuensi 16kHz pd PORTB.3

(49)

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)

(50)

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

(51)

Contoh:

Dengan menggunakan TCNT0,

modifikasilah program sebelumnya untuk mendapatkan time delay maksimum!

Kalkulasi time delay dan frekuensi yg dibangkitkan

(52)

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

(53)

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

(54)

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

(55)

Dgn menggunakan skenario ini  maks delay yg diperoleh menggunakan Timer0 hanya 32us.

Bgmn jika kita ingin menggunakan delay yg lebih lama?

(56)

Amati gb berikut:

(57)

Jika prescaler tdk digunakan  sumber clock timer akan berasal dr XTAL

Jika menggunakan prescaler  clock

sumber akan dibagi sesuai dgn pembagi yg diinginkan

(58)

Contoh:

Asumsi digunakan prescaler 1:64. Temukanlah frekuensi dr timer jika digunakan XTAL:

a) 8 MHz b) 16 MHz c) 10 MHz

(59)

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

(60)

Contoh:

Temukan nilai TCCR0 jika kita ingin

memprogram Timer0 pd mode normal dgn prescaler 64 menggunakan clock internal

(61)

Jawab:

(62)

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.

(63)

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

(64)

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

(65)

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

(66)

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)

(67)

Contoh:

Pelajari program berikut. (a) Temukanlah frekuensi yg dibangkitkan dan (b) duty

cycle dr gelombang kotak tsb. Asumsi XTAL = 8 MHz

(68)

Jawab:

Pelajari program berikut. (a) Temukanlah frekuensi yg dibangkitkan dan (b) duty

cycle dr gelombang kotak tsb. Asumsi XTAL = 8 MHz, dan digunakan ATmega32

(69)

.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

(70)

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

(71)

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

(72)

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

(73)

Jika TCNT0 sama dgn OCR0  maka flag OCF0 akan di-set

(74)

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

(75)

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

(76)

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

(77)
(78)
(79)
(80)

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

(81)

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

(82)
(83)
(84)

Contoh:

Temukan nilai TCCR2 jika kita ingin memprogram Timer2 pd:

Mode normal

Prescaler 64 menggunakan clock internal

(85)
(86)

Contoh:

Dgn menggunakan Timer2, buatlah

program utk membangkitkan delay sebesar 1920 us. Gunakan prescaler 64. asumsi XTAL = 8 MHz

(87)

Jawab:

Clock Timer = 8 MHz/64 = 125 kHz Timer period = 1/125 kHz = 8 us

(88)

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

(89)

Contoh:

Menggunakan mode CTC, tulislah program utk membangkitkan delay sebesar 8ms.

(90)

Jawab:

Dengan menggunakan XTAL = 8 MHz, output dr prescaler yg berbeda sbb:

(91)

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

(92)

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

(93)

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

(94)
(95)

Timer116-bit timer

Dibagi mnjd 2 byte  TCNT1L dan TCNT1H

Jg memiliki register kontrol bernama TCCR1A dan TCCR1B

(96)

Skematik Timer1

(97)

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

(98)
(99)
(100)

Timer/counter Control Register 1 B

(101)
(102)
(103)

Timer1 Operation Modes

Normal Mode (WGM13:10 = 0000)

Timer mencacah sampai max ($FFFF) kemudian kembali ke $0000 

(104)

Timer1 Operation Modes

CTC Mode (WGM13:10 = 0100)

Timer mencacah sampai sama dgn isi register OCR1A  membangkitkan flag OCF1A

(105)

Contoh:

Temukanlah nilai TCCR1A dan TCCR1B jika kita ingin memprogram Timer 1 pada mode 0 (normal mode), tanpa prescaler.

(106)

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

(107)

Contoh:

Berdasarkan penggalan program berikut, temukanlah frekuensi gelombang kotak yg dibangkitkan. Asumsi menggunakan XTAL = 8 MHz

(108)

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

(109)

Jawab:

WGM13:10 = 0000 = 0x00  timer bekerja pd mode normal (puncak = 0xFFFF)

FFFF + 1 – D8F0 = 0x271010.000 clock XTAL = 8 MHz  periode = 0.125 us

Maka delay = 10.000 X 0.125us = 1.25 ms

(110)

Contoh:

Temukanlah nilai TCCR1A dan TCCR1B jika kita ingin memprogram Timer 1 pada mode 4 (CTC mode), tanpa prescaler. Gunakan clock dr kristal AVR

(111)

Jawab: TCCR1A = 0000 0000 WGM11 = 0 WGM10 = 0 TCCR1B = 0000 1001 WGM13 = 0 WGM12 = 1 CS12:10 = 001 (no prescaler)

(112)

Contoh:

Berdasarkan penggalan program berikut, temukanlah frekuensi gelombang kotak yg dibangkitkan. Asumsi menggunakan XTAL = 8 MHz

(113)

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

(114)

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

(115)

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

(116)
(117)

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

(118)

Set CS02:00 mnjd 6 dan 7  sbg counter

(119)
(120)

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)

(121)

.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

(122)
(123)

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)

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

(125)
(126)

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

Referensi

Dokumen terkait

Simulasi menggunakan ETAP 7.0.0 dapat menunjukkan bahwa besarnya harmonisa tegangan pada main substation akan berkurang apabila faktor daya sistem meningkat

Sodišče se je zato odločilo, da izvedenci, kot strokovnjaki za preiskovanje sledov obuval, s svojim znanjem in izkušnjami pomagajo pri odpravi dvoma ali so zaseţeni Kamenikovi

TABELA 5: SESTAVA GIBLJIVIH SREDSTEV SESTAVA GIBLJIVIH SREDSTEV Zaloge Dolgoročne terjatve iz poslovanja Kratkoročne terjatve iz poslovanja Kratkoročne finančne naložbe Denarna

Persamaan transpor pencemar didapat dari sebuah elemen volume media rpori yang diturunkan dari hukum kekekalan massa merupakan Persamaan Diferensial Parsial (PDP).

Dari banyak survey yang telah dilakukan terhadap mata pelajaran matematika, didapatkan hasil bahwa mata pelajaran matematika merupakan mata pelajaran yang tidak disukai

Sindrom Guillain-Barre (SGB) adalah suatu polineuropati yang dapat bersifat ascending dan akut yang sering terjadi setelah 1 sampai 3 minggu setelah infeksi akut pada

melakukan manipulasi, membantu melakukan manipulasi, dan/atau memalsukan data yang berkaitan dengan jasa yang diberikan sebagaimana dimaksud dalam Pasal 30 ayat (1) huruf

Pada batas tertentu pesantren tergolong di antara lembaga pendidikan keagamaan swasta yang leading , dalam arti berhasil merintis dan menunjukkan keberdayaan baik