• Tidak ada hasil yang ditemukan

Latihan-1: Menggunakan Timer1

Kali ini kita akan membuat sebuah jam digital yang ditampilkan melalui 2x7segmen menggunakan rangkaian yang ditunjukkan pada Gambar 3.5 (format Proteus 7.4 SP3). 7segmen yang digunakan sudah terpadu dengan IC BCD to 7Segmen, sehingga jika masukan BCD adalah 0 sampai dengan 9, maka keluarnya tampilan 7segmen juga 0 sampai dengan 9, sungguh mudah dan menyenangkan. Anda bisa membeli IC 74LS47 (CA) atau 74LS48 (CC) untuk mengkonversi data BCD menjadi data-data untuk 7-segmen, sebagaimana diagram pin untuk ditunjukkan pada Gambar 3.6.

Gambar 3.6. 74LS47 (kiri) dan 74LS48 (kanan)

Karena hanya menggunakan dua digit, selama program berjalan pada ATMega16 hanya ditampilkan detik-nya saja, untuk menampilkan menit dan jam masing-masing bisa menggunakan tombol MENIT dan JAM (perhatikan Gambar 3.3), yang masing-masing terhubungkan ke PORTD.0 dan PORTD.1. Sedangkan untuk mereset jam, bisa digunakan tombol RESET JAM yang terhubungkan ke PORTD.7. Okey, mari kita mulai langkah demi langkah...

Seperti biasanya, diawali dengan mendeklarasikan pustaka, kristal dan 5 variabel yang akan digunakan dalam program kita (baris 6 sampai dengan 10), antara lain:

TEMP digunakan untuk menyimpan data jam, menit atau detik sementara; SECONDS, sudah jelas digunakan untuk menyimpan data detik;

MINUTES, untuk menyimpan data menit; HOURS, untuk menyimpan data jam, dan

KEYS, untuk pembacaan PORTD, apakah ada tombol yang ditekan, sehingga program bisa melakukan proses sesuai dengan tombol yang ditekan.

1: ' program jam.bas 2: '

3: $regfile = "m16def.dat" 4: $crystal = 11059200 5:

6: Dim Temp As Byte 7: Dim Seconds As Byte 8: Dim Minutes As Byte 9: Dim Hours As Byte 10: Dim Keys As Byte 11:

Selanjutnya kita tetapkan sebuah konstanta untuk melakukan penundaan 1 detik tepat! Konstanta ini merupakan nilai pembanding yang nantinya disimpan pada OCR1H dan OCR1L, sehingga saat Timer1, yaitu TCNT1H dan TCNT1L, sama isinya masing-masing dengan OCR1H dan OCR1L, maka akan terjadi interupsi MATCH COMPARE.

Untuk mendapatkan nilai konstanta ini, silahkan gunakan program AvrTimer1Calc.EXE, kemudian masukkan parameter-parameter seperti ditunjukkan pada Gambar 3.7, yaitu ditemukan nilai isi ulangnya adalah 34.288, supaya terjadi 31.250 detak yang setara dengan 1 detik.

Nilai 34.288 ini yang kemudian dituliskan dalam program (baris 12), kemudian diikuti dengan mendeklarasikan fungsi dari timer1 sebagai pewaktu (TIMER) dengan prescaler sebesar 256 (baris 14). Sedangkan dua register untuk pembanding, yaitu OCR1H dan OCR1L masing-masing diisi dengan bagian HIGH dan LOW dari konstanta RELOAD (=34.288), perhatikan baris 16 dan 17:

12: Const Reload = 34286 'periode 1 detik 13:

14: Config Timer1 = Timer , Prescale = 256 15:

16: Ocr1ah = High(reload)

17: Ocr1al = Low(reload) ' nilai reload utk timer1 18:

Langkah selanjutnya adalah mengatur agar terjadi interupsi karena proses pembandingan (telah terjadi kecocokan data antara isi Timer1 TCNT1 dengan data pembanding OCR1AH dan OCR1AL). Untuk itu kita perlu mengatur isi register Timer/Counter1 Control atau TCCR1A, sebagaimana ditunjukkan pada Gambar 3.8.

Gambar 3.7. Program AVR Timer1 Calculator

Gambar 3.8. Register TCCR1A Arti dari masing-masing bit TCCR1A (Gambar 3.8) sebagai berikut:

Bit 7:6 – COM1A1:0: Compare Output Mode for Channel A Bit 5:4 – COM1B1:0: Compare Output Mode for Channel B

o Masing-masing pasangan bit ini (bit 7-6 dan bit 5-4) digunakan untuk mengatur pin OC1A dan OC1B melalui Tabel 4.1

Bit 3 – FOC1A: Force Output Compare for Channel A Bit 2 – FOC1B: Force Output Compare for Channel B

o Untuk memaksa terjadinya Compare Match pada masing-masing kanal (A atau B) dengan cara memberikan logika 1 pada masing-masing tersebut.

o Mengontrol sekuens pencacahan pada pencacah, sebagaimana ditunjukkan pada Tabel 4.2

Tabel 4.1. Compare Output Mode, Non PWM COM1A1/

COM1B1 COM1A0/COM1B0 Keterangan

0 0 Operasi port normal, OC1A/OC1B tidak dihubungkan ke pin PD4 dan PD5 0 1 Togel OC1A/OC1B pada saat terjadi Compare Match

1 0 Reset OC1A/OC1B pada saat terjadi Compare Match 1 1 Set OC1A/OC1B pada saat terjadi Compare Match

Tabel 4.2. Waveform Generation Mode Bit Description

Dalam kasus kita, register TCCR1A kita isi dengan nol, kemudian kita cek juga TCCR1B sebagaimana ditunjukkan pada Gambar 3.9.

Gambar 3.9. Register TCCR1B Arti dari masing-masing bit TCCR1B sebagai berikut:

Bit 7 – ICNC1: Input Capture Noise Canceler

o Untuk aktivasi masukan Capture Noise Canceler atau CNC. Bit 6 – ICES1: Input Capture Edge Select

Bit 5 – Reserved Bit

o Cadangan, tidak digunakan sementara, untuk pengembangan ATMega16 di masa mendatang.

Bit 4:3 – WGM13:2: Waveform Generation Mode o Lihat Tabel 4.2

Bit 2:0 – CS12:0: Clock Select o Lihat Tabel 4.3

Tabel 4.3. Clock Select Bit Description

Dalam kasus latihan ini, kita set TCCR1B.3 pada bagian WGM12-nya supaya Timer1 akan mereset setelah terjadi Compare Match, perhatikan baris 19 dan 20:

19: Tccr1a = 0 ' diskonek OC1A dari T/C1 20: Set Tccr1b.3 ' reset T/C1 setelah compare 21:

Selanjutnya masing-masing PORTA dan PORTD juga kita inisialisasi masing-masing sebagai luaran dan masukan, juga menyiapkan PORTD untuk masukan (baris 24):

22: Config Porta = Output ' porta untuk tampilan 23: Config Portd = Input ' portd untuk tombol 24: Portd = 255 ' semua luaran HIGH 25:

Agar setiap terjadi interupsi Compare Match pada Timer1 dilakukan proses pada bagian tertentu di dalam program maka kita definisikan sebuah label TIMER1_ISR:

26: On Compare1a Timer1_isr 27:

Okey, sekarang kita aktifkan interupsi pembandingnya (baris 26) dan interupsi global-nya (baris 27), perlu diketahui bahwa interupsi adalah sebuah proses yang menunda program yang sedang berjalan untuk mengerjakan sesuatu yang begitu penting, kemudian setelah selesai akan kembali mengerjakan pekerjaan yang sebelumnya ditinggalkan:

28: Enable Compare1a ' aktifkan interupsi timer compare 29: Enable Interrupts ' aktifkan seluruh interupsi

Sampai disini sekarang semua sudah siap, sudah ready! Selanjutnya adalah membuat program untuk rutinitas jam digital sebagaimana kita rencanakan. Intinya adalah selalu menampilkan detik (baris 50) sambil terus menerus memeriksa tombol pada PORTD (baris 32), apakah ditekan tombol RESET, berarti mereset jam, menit dan detik (baris 33 sampai dengan 37), atau tombol JAM, artinya ditampilkan data jam (baris 48), atau tombol MENIT, artinya ditampilkan tombol menit (baris 49). Serta tidak lupa untuk selalu meng-update data-data detik (baris 38 sampai dengan 41), menit (baris 42 sampai dengan 45)dan jam (baris 46):

31: Do

32: Keys = Pind

33: If Keys = &H7F Then ' reset jam 34: Seconds = 0

35: Minutes = 0 36: Hours = 0 37: End If

38: If Seconds = 60 Then ' jika detik sudah overflow 39: Seconds = 0

40: Incr Minutes 41: End If

42: If Minutes = 60 Then ' jika menit sudah overflow 43: Minutes = 0

44: Incr Hours 45: End If

46: If Hours = 24 Then Hours = 0 47: Temp = Makebcd(seconds)

48: If Keys = &HFE Then Temp = Makebcd(minutes)

49: If Keys = &HFD Then Temp = Makebcd(hours) ‘ tampilkan jam 50: Porta = Temp

51: Loop 52:

53: End

Ingat bahwa interupsi Timer1 karena Compare Match terjadi setiap 1 detik sekali (tepat!) dan yang dilakukan adalah (selalu) menaikkan data detik atau SECONDS:

54: Timer1_isr: 55: Incr Seconds 56: Return

Program selengkapnya (file TIMER3.BAS) sebagai berikut:

1: ' program jam.bas 2: '

3: $regfile = "m16def.dat" 4: $crystal = 11059200 5:

6: Dim Temp As Byte 7: Dim Seconds As Byte 8: Dim Minutes As Byte 9: Dim Hours As Byte 10: Dim Keys As Byte 11:

12: Const Reload = 34286 ' periode 1 detik 13:

15:

16: Ocr1ah = High(reload)

17: Ocr1al = Low(reload) ' nilai reload utk timer1 18:

19: Tccr1a = 0 ' diskonek OC1A dari T/C1 20: Set Tccr1b.3 ' reset T/C1 setelah compare 21:

22: Config Porta = Output ' porta untuk tampilan 23: Config Portd = Input ' portd untuk tombol 24: Portd = 255 ' semua luaran HIGH 25:

26: On Compare1a Timer1_isr ' lompat ke timer1_isr saat interupsi 27:

28: Enable Compare1a ' aktifkan interupsi timer compare 29: Enable Interrupts ' aktifkan seluruh interupsi

Dokumen terkait