08-Nov-2008
sensor ultrasonic
Sensor ultrasonik adalah sensor yang bekerja berdasarkan prinsip pantulan gelombang suara dan digunakan untuk mendeteksi keberadaan suatu objek tertentu di depannya, frekuensi kerjanya pada daerah diatas gelombang suara dari 40 KHz hingga 400 KHz.
Prinsip kerja Sensor Ultrasonik
Sensor ultrasonik terdiri dari dari dua unit, yaitu unit pemancar dan unit penerima. Struktur unit pemancar dan penerima sangatlah sederhana, sebuah kristal piezoelectric dihubungkan dengan mekanik jangkar dan hanya dihubungkan dengan diafragma penggetar. Tegangan bolak-balik yang memiliki frekuensi kerja 40 KHz – 400 KHz diberikan pada plat logam. Struktur atom dari kristal piezoelectric akan berkontraksi (mengikat), mengembang atau menyusut terhadap polaritas tegangan yang diberikan, dan ini disebut dengan efek piezoelectric. Kontraksi yang terjadi diteruskan ke diafragma penggetar sehingga terjadi gelombang ultrasonik yang dipancarkan ke udara (tempat sekitarnya), dan pantulan gelombang ultrasonik akan terjadi bila ada objek tertentu, dan pantulan gelombang ultrasonik akan diterima kembali oleh oleh unit sensor penerima. Selanjutnya unit sensor penerima akan menyebabkan diafragma penggetar akan bergetar dan efek piezoelectric menghasilkan sebuah tegangan bolak-balik dengan frekuensi yang sama.
Besar amplitudo sinyal elekrik yang dihasilkan unit sensor penerima tergantung dari jauh dekatnya objek yang dideteksi serta kualitas dari sensor pemancar dan sensor penerima. Proses sensing yuang dilakukan pada sensor ini menggunakan metode pantulan untuk menghitung jarak antara sensor dengan obyek sasaran. Jarak antara sensor tersebut dihitung dengan cara mengalikan setengah waktu yang digunakan oleh sinyal ultrasonik dalam perjalanannya dari rangkaian Tx sampai diterima oleh rangkaian Rx, dengan kecepatan rambat dari sinyal ultrasonik tersebut pada media rambat yang digunakannya, yaitu udara.
Waktu di hitung ketika pemencar aktif dan sampai ada input dari rangkaian penerima dan bila pada melebihi batas waktu tertentu rangkaian penerima tidak ada sinyal input maka dianggap tidak ada halangan didepannya
Facebook & Twitter Connect
Guesthackers Community
Guesthackers Community
!doctype>
Minggu, 18 April 2010
Timer/Counter dan Interupsi
Timer/Counter
Timer berfungsi untuk mengatur waktu kerja yang dibutuhkan AT89S51/52, tersedia dua buah timer yaitu Timer 0 dan Timer 1, masing-masing timer terdiri dari 16 bit counter yang dapat diprogram.
Timer/Counter yang dioperasikan sebagai timer dapat digunakan untuk menghitung waktu dari sebuah kejadian. Nilai timer bertambah tiap machine cyle (12 pulsa clock) sehingga kecepatan bertambahnya ialah 1/12 dari frekwensi osilator. Dengan menggunakan Timer/Counter sebagai counter, maka Kit mikrokontroler akan selalu menghitung munculnya kejadian yang ditandai dengan adanya trigger. User tinggal memeriksa nilai counter pada saat yang ditentukan. Register-register Timer yang tersedia ialah :
TMOD (Timer Mode Register)
Register yang digunakan untuk mengatur timer/counter terdapat pada Timer Mode (TMOD) dan Timer Control (TCON). TMOD tidak dapat diakses secara bit (not bit addressable), beralamat di 89H. Gambar dibawah ini memperlihatkan alamat dan pembagian register TMOD
Gambar 4.1 Register TMOD
Penjelasan dari gambar di atas ialah :
Ø Gate: Timer akan berjalan bila bit ini set dan INT0 (untuk Timer 0) atau INT1 (untuk Timer 1) berkondisi high
Ø C/T: 1 = Counter 0 = Timer
Ø M1 & M0: Untuk memilih mode timer, seperti pada Tabel 4.1:
Tabel 4.1 Mode Operasi Timer /Counter
M1
M0
Mode Operasi
0
0
0
Timer/Counter 13 bit
0
1
1
Timer /Counter 16 bit
1
0
2
Timer/Counter 8 bit auto reload
1
1
3
Split timer mode untuk timer/counter 0
1
1
3
Timer/Counter 1 berhenti
4.1.2 THx dan TLx
THx dan TLx (x adalah nomor Timer).Merupakan Register yang menunjukkan nilai dari timer di mana masing-masing Timer mempunyai dua buah register yaitu:
- THx untuk high byte
- TLx untuk low byte
· TH0 : Timer 0 High Byte terletak pada alamat 8AH
· TL0 : Timer 0 Low Byte terletak pada alamat 8BH
· TH1 : Timer 1 High Byte terletak pada alamat 8CH
· TL1 : Timer 1 Low Byte terletak pada alamat 8DH
Misal register Timer/Counter 0 diisi dengan nilai 814AH dan register Timer/Counter 1 diisi dengan nilai 0CF32H, maka instruksinya sebagai berikut :
MOV TH0,#81H
MOV TL0,#4AH
MOV TH1,#0CFH
MOV TL1,#32H
4.1.3 TCON (Timer Control Register)
Pada register ini, hanya 4 bit saja yaitu TCON.4, TCON.5, TCON.6 dan TCON.7 saja yang mempunyai fungsi berhubungan dengan timer.
Gambar 4.2 Register TCON
Tabel 4.2 menampilkan penjelasan dari Timer control .
Tabel 4.2 Timer Control
Bit
Alamat bit
Simbol
Penjelasan
TCON.7
8FH
TF1
Timer/Counter 1 overflow flag
TCON.6
8EH
TR1
Timer 1 Run Control Bit
TCON.5
8DH
TF0
Timer /Counter 0 overflow flat
TCON.4
9CH
TR0
Timer 0 Run Control Bit
TCON.3
8BH
IE1
External Interrupt 1 Edge flag
TCON.2
8AH
IT1
External interrupt 1 type control bit
TCON.1
89H
IE0
External Interrupt 0 Edge flag
TCON.0
88H
IT0
External interrupt 0 Type control bit
Penjelasan dari gambar dan tabel diatas ialah :
Ø TCON.7 atau TF1: Timer 1 Overflow Flag yang akan set bila timer overflow. Bit ini dapat di-clear oleh software atau oleh devais pada saat program menuju ke alamat yang ditunjuk oleh interrupt vektor.
Ø TCON.6 atau TR1: 1 = Timer 1 aktif, 0 = Timer 1 non aktif
Ø TCON.5 atau TF0: Sama dengan TF1
Ø TCON.4 atau TR0: Sama dengan TR1
Jika Timer/Counter yang diprogram akan digunakan sebagai sumber interrupt, maka IE dan /atau IP juga harus diatur. Misal kedua Timer/Counter digunakan sebagai sumber interrupt dengan prioritas Timer/Counter 1, maka instruksinya :
MOV IP,#80H
MOV IE,#8AH
atau
SETB PT1
SETB ET1
SETB ET0
SETB EA
Mode Timer
Mode Timer terdiri dari:
Mode 0 Timer 13 bit
Pada Mode 0, disediakan terutama untuk menjaga kompatibilitas dengan prosesor 8048. pada Mode 0, register TLx (TL0 atau TL1) hanya digunakan 5 bit terendah saja sedangkan register THx (TH0 atau TH1) tetap selebar 8 bit. TLx akan terus bertambah hingga bernilai 1FH. Overflow akan terjadi jika ada perubahan dari FF1FH ke 0000H. Nilai THx dan TLx dapat diubah oleh user setiap saat dalam program.
Mode 1 Timer 16 bit
Mode 1 pada 89C51 semua bit TLx digunakan, sehingga mode 1 merupakan timer/counter 16 bit. TLx akan bertambah hingga bernilai FFH. Pada saat ada perubahan nilai TLx dari FFh ke 00H, THx akan bertambah 1. Nilai maksimal THx dan TLx ialah FFFFH (THx=FFH dan TLx =FFH). Overflow akan terjadi jika ada perubahan dari FFFFH ke 0000H.
Gambar 4.3 Timer/Counter Mode 1
Misalnya Timer/Counter 0 digunakan sebagai timer dalam mode 2 dengan external control dan Timer/Counter 1 digunakan sebagai counter dalam mode 1 dengan internal control, maka instruksinya :
MOV TMOD,#5AH
Sedangkan untuk menjalankan kedua timer, instruksinya :
MOV TCON, #50H
atau
SETB TR0
SETB TR1
Mode 2 Timer 16 bit di 89S52
Mode 2 ialah timer/counter 16 bit yang dapat beroperasi sebagai timer atau event counter. Timer 2 mempunyai 3 mode yaitu capture, auto-reload dan baud rate generator. Timer 2 terdiri dari 2 buah register 8 bit yaitu TH2 dan TL2. Berikut table Mode 2 pada 89S52.
Tabel 4.3 Timer Mode 2 89S52
RCLK+TCLK
CP/RL2
TR2
MODE
0
0
1
16 bit auto reload
0
1
1
18 bit capture
1
x
1
Baud Rate Generator
x
x
0
Off
Pada mode capture, 2 pilihan dipilih oleh bit EXEN2 di T2CON. Jika EXEN2=0, Timer 2 menjadi 16 bit timer atau counter dimana tergantung dari overflow set bit TF2 di T2CON. Bit ini dapat digunakan untuk membuat sebuah interupsi.
Gambar 4.4 Mode Capture
Timer 2 dapat diprogram untuk menghitung naik/mundur ketika dikonfigurasikan sebagai mode 16 bit auto-reload. Fitur ini dipanggil oleh bit DCEN (Down Counter Enable) yang berada di SFR T2MOD.
Gambar 4.5 Timer 2 Mode Auto reload (DCEN=0)
Timer 2 sebagai baud rate generator dengan menset TCLK dan/atau RCLK di T2CON. Sbeagai catatan, baud rate untuk mengirim dan menerima dapat berbeda jika Timer 2 digunakan untuk mengirim atau memancarkan dan Timer 1 digunakan untuk fungsi lainnya. Menset RCLK dan /atau TCLK membantu Timer 2 berada pada mode baud rate generator
Gambar 4.6 Mode baud rate generator
Mode 3
Pada Mode 3 di 89C51, Timer/Counter 0 akan menjadi 2 timer/counter 8 bit, sedangkan Timer/Counter 1 akan berhenti. TL0 akan menjadi timer/counter 8 bit yang dikendalikan oleh bit control Timer/Counter 0 (meliputi GATE, C/T’, TR0, INT0, dan TF0). TH0 akan menjadi timer 8 bit (bukan counter) yang dikendalikan oleh bit control timer/counter 1 (meliputi TR1 dan TF1).Timer /Counter 1 masih dapat dioperasikan dalam mode selain mode 3.
Penerapan Timer/Counter
Timer bekerja memerlukan sumber detak dengan menghubungkan pin T0 (P3.4) sebagai input detak. Jika digunakan sumber detak internal, input detak berasal dari osilator yang telah dibagi 12. Untuk pengaturan Timer dengan software maka bit penentu keaktifan ialah Rtx sedangkan kondisi dari Bit Gate harus berlogika 0. Pengaturan Timer dengan hadware, penentu keaktifan ialah INTx sedangkan kondisi Bit Gate dan TRx harus berlogika 1.
Timer ini sering digunakan untuk mengatur baud rate dari port serial. Dengan mengubah bit SMOD yang terletak pada register PCON menjadi set (kondisi awal pada saat sistem reset adalah clear) maka baud rate pada Mode 1, 2 dan 3 akan berubah menjadi dua kali lipat.
Contoh program berikut ialah penggunaan fasilitas Timer pada mikrokontroler . Untuk menggunakan Timer/Counter 0 sebagai timer mode 1, maka GATE, C/T dan M1 untuk Timer 0 pada TMOD berlogika 0 dan M0 berlogika 1 sehingga TMOD bernilai 01H. Sedangkan untuk menjalankan Timer 0, maka TR0 (TCON.4) berlogika 1 sehingga TCON bernilai 10H. Pada contoh dibawah ini Timer 0 diberi nilai awal 2CH untuk TH0 dan 00H untuk TL0 sehingga Timer 0 akan selalu dimulai dari nilai 2C00H. Karena frekwensi timer tinggi, maka digunakan faktor pengali 10H yang berada pada R0.
Langkah-langkah :
· Hubungkan Port 1 DT-51 dengan “PORT OUTPUT” DT-51 Trainer Board
· Hubungkan “CONTROL” DT-51 dengan “CONTROL“ DT-51 Trainer Board
· Buat program berikut :
Program timer untuk Led berkedip (timer.asm)
$MOD51
CSEG
ORG 4000H
LJMP START
ORG 400BH
COUNT: INC R0
CJNE R0,#10H,OUT1
SETB P1.5
LOOP: MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,LOOP
CLR P1.5
MOV R0,#00H
OUT1: MOV TH0,#2CH
MOV TL0,#00H
RET1
;inisialisasi
ORG 4200H
START: MOV SP,#30H
MOV R0,#00H
MOV TMOD,#01H
MOV TH0,#2CH
MOV TL0,#00H
MOV TCON,#10H
MOV P1,#00H
MOV IE,#82H
SJMP $
END
Jika program dijalankan, akan menampilkan nyala LED Bit 5 berkedip dimana baru akan dinyalakan atau dipadamkan setelah interupsi oleh Timer 0 sebanyak 16 x. Perhatikan pada saat interupsi, program akan melompat ke alamat vector 000BH tetapi oleh DT51 akan langsung dipindah ke alamat 400BH.
Contoh berikut menggunakan Timer/Counter 0 Counter Mode 2, langkah-langkahnya :
* Hubungkan Port 1 DT-51 dengan Port output DT-51 trainer board menggunakan kabel tipe Y.
* Hubungkan Control DT-51 dengan Control DT-51 Trainer board (sebagai sumber tegangan dan koneksi T0) menggunakan kabel tipe X
* Hubungkan IS3 MinSys dengan T0 pada DT-51 Trainer board
* Hubungkan DT-51 dengan PC menggunakan kabel serial
* Ketik program berikut :
Program Counter Mode 2 (mode2.asm)
$MOD51
CSEG
ORG 4000H
LJMP START
ORG 400BH
MOV P1, #00H
SETB P1.5
PUSH 5
PUSH 6
PUSH 7
MOV R7,#0FH
LUPA: MOV R6,#0FFH
LUPB: MOV R5,#0FFH
DJNZ R5,$
DJNZ R6,LUPB
DJNZ R7,LUPA
POP 7
POP 6
POP 5
RETI
ORG 4100H
DELAY:MOV R7,#04H
LUP1: MOV R6,#0FFH
LUP2: MOV R5,#0FFH
DJNZ R5,$
DJNZ R6,LUP2
DJNZ R7,LUP1
RET
;inisialisasi
START: MOV SP,#30H
MOV TMOD,#06H
MOV TH0,#0FAH
MOV TL0,#0F6H
SETB TR0
CLR TF0
MOV IE,#82H
;Program Utama
LOOP1: MOV P1,#00110011B
ACALL DELAY
MOV P1,#11001100B
ACALL DELAY
SJMP LOOP1
END
Program akan menampilkan nyala LED bergantian antara data 00110011b dengan 11001100b. Pada saat terjadi interupsi, maka LED bit 5 akan menyala sejenak. Untuk menggunakan Timer/Counter 0 sebagai counter mode 2, maka GATE dan M0 untuk Timer 0 pada TMOD berlogika 0 dan C/T dan M1 berlogika 1, sehingga TMOD bernilai 00000110b atau 06H. Untuk menjalankan counter 0, maka TR0(TCON.4) berlogika 1, sehingga TCON bernilai 0010000b atau 10H. Perintah CLR TF0 digunakan untuk memberikan interrupt flag sebelum interupsi diaktifkan. Untuk mengaktifkan interrupt counter 0, maka EA (IE.7) dan ET0(IE.1) berlogika 1, sehingga IE bernilai 10000010b atau 82H. Pada contoh program diatas, counter 0 diberi nilai awal F6H untuk TL0, sehingga membutuhkan 10 x penekakan keypad IS3 untuk menghasilkan interupsi pertama. Dan sebagai nilai reload pada TH0 diberi nilai FAH, sehingga hanya membutuhkan 6 x penekanan keypad IS3.
Penerapan lainnya, misal jika kita ingin membuat bunyi dengan frekwensi 1Hz, periodanya ialah T=1/f, perioda yang dihasilkan ialah 1 detik. Dengan demikian perioda port tinggi ialah 0.5 detik dan perioda port rendah ialah 0.5 detik.
Gambar 4.7 Rangkaian driver speaker
Assumsikan bahwa frekwensi detak 12 MHz, maka tundaan maksimum yang dicapai ialah 65535 x 1 uS =0.065 detik. Untuk itu timer digunakan sebagai penghasil tundaan selama 0.01 detik (10.000 x 1 uS). Dengan pembagi 50 akan didapat tundaan 0.01 detik x 50 =0.5 detik. Nilai untuk TH0 dan TL0 ialah :
65535 -10.000=55535D=D8EFH
Nilai untuk TH0 ialah D8H dan untuk TL0 ialah EFH. Berikut contoh program penghasil bunyi di speaker:
Listing Program 6. Penghasil bunyi di speaker (bunyi.asm)
$MOD51
ORG 00H ; MENGGUNAKAN ALAMAT AWAL MIKRO
…
MULAI: SETB P1.0
ACALL TUNDA
CLR P1.0
ACALL TUNDA
SJMP MULAI
TUNDA: MOV R0,#0
LAGI: MOV TMOD, #01
MOV TH0, #0D8H
MOV TL0, #0EFH
SETB TR0
ULANG: NOP
JBC TF0, HITUNG
SJMP ULANG
HITUNG: INC R0
CJNE R0, #100, LAGI
RET
END
Interupsi
Program yang sedang dijalankan oleh mikrokontroler AT89S51/52 dapat dihentikan untuk sementara yang dikenal dengan instilah interupsi. Jika AT89S51/52 mendapat permintaan interupsi maka program counter (PC) akan diisi alamat dari vector interupsi, kemudian AT89S51/52 melaksanakan rutin pelayanan interupsi mulai dari alamat tersebut setelah selesai maka AT89S51/52 akan kembali ke pelaksanaan program utama yang ditinggalkan. Mikrokontroler AT89S51/52 menyediakan 6 sumber interupsi yaitu 2 buah interupsi eksternal (INT 0 dan INT 1), 3 buah interupsi timer (Timer 0, Timer 1, dan Timer 2), dan sebuah interupsi port serial.
Interupsi ialah suatu sela yang terjadi pada saat program sedang berjalan. Mirip halnya dengan interupsi yang terjadi pada saat rapat yang sedang berlangsung. Interupsi berguna jika terdapat suatu rutin yang dijalankan hanya pada waktu tertentu yang bersifat asinkron.
Berikut Interrupt Enable pada MCS-51:
Tabel 4.4 Interrupt Enable
Bit
Alamat bit
Simbol
Penjelasan
IE.7
0AFH
EA
Enable All
-
-
-
Reserved
-
-
-
Reserved
IE.4
0ACH
ES
Serial Interrupt Enable Bit
IE.3
0ABH
ET1
Timer/Counter 1 Enable bit
IE.2
0AAH
EX1
External Interrupt 1 enable Bit
IE.1
0A9H
ET0
Timer /Counter 0 Enable Bit
IE.0
0A8H
EX0
External Interrupt 0 Enable Bit
Jika terjadi interupsi, maka interrupt flag akan bernilai 1 pada bit yang menunjukkan sumber interrupt. Jika CPU menemukan adanya interrupt pada saat sampling, proses selanjutnya ialah CPU akan menjalankan instruksi LCALL yang akan menyimpan Program Counter (PC) ke stack dengan urutan 8 bit terendah terlebih dahulu. Jika sumber interupsi berasal dari Timer/Counter atau External interrupt, interrupt flag yang bersangkutan akan dibersihkan.
Pastikan juga user mengamankan nilai register dengan menggunakan PSW, ACC, B, R0-R7 dan DPTR. Selain itu, register yang di-PUSH pertama harus di-POP terakhir. Selain itu, gunakan RETI agar fungsi kembali ke alamat semula.
Contoh program berikut merupakan Penggunaan INT0 dengan interrupt enable.
Langkah-langkahnya :
* Hubungkan port 1 dt-51 dengan “PORT OUTPUT” DT-51 trainer board menggunakan kabel Tipe Y
* Hubungkan “Control” DT-51” MinSys dengan “Control “DT-51 trainer board
* Hubungkan “IS1” dengan “INT0” pad DT-51 trainer board
* Hubungkan DT-51 MinSys dengan PC menggunakan kabel serial
Buat proram berikut :
Program Interrupt Enable (ie.asm)
$MOD51
CSEG
ORG 4000H
LJMP START
ORG 4003H
RL A
MOV P1,A
MOV R7,#04H
LOOPA: MOC R6, #0FFH
LOOPB: MOV R5,#0FFH
DJNZ R5,$
DJNZ R6,LOOPB
DJNZ R7,LOOPA
RETI
ORG 4200H
;inisialisasi
START: MOV SP,#30H
MOV TCON,#01H
MOV P1,#01H
MOV IE,#81H
SJMP $
END
Program diatas akan menampilkan nyala LED dari Bit 0 dan bergeser ke kiri setiap ada penekanan keypad “IS1”. Untuk mengunakan INT0 dengan falling edge trigger maka INT0 (TCON.0) berlogika 1, sehingga TCON bernilai 00000001b(01H). Untuk mengaktifkan interrupt, maka EX0 (IE.0) dan EA(IE.7) berlogika 1 sehingga IE bernilai 10000001b (81H), terlihat juga bahwa pada saat interupsi program melompat ke alamat vector 0003H yang oleh DT-51 langsung dipindah ke alamat 4003H. Fungsi DJNZ digunakan untuk mengurangi satu dan lompat jika hasilnya bukan nol.
Contoh penggunaan interupsi lainnya, program berikut akan menggunakan INT0 dan INT1 dengan Interrupt Priority.
Langkah-langkahnya :
1. Hubungkan Port 1 DT-51 dengan Port Ouput DT-51 Trainer board menggunakan kabel tipe Y
2. Hubungkan Control DT-51 MinSys dengan Control DT-51 Trainer board menggunakan kabel tipe X
3. Hubungkan IS1 dengan INT0 dan IS2 dengan INT1 pada DT-51 trainer board
4. Hubungkan DT-51 MinSys dengan PC menggunakan kabel serial
5. Ketik program berikut :
Program INT0 dan INT1 (inprio.asm)
$MOD51
CSEG
ORG 4000H
LJMP START
ORG 4003H
LJMP INTER0
ORG 4013H
LJMP INTER1
ORG 4100H
INTER0: MOV P1,#0H
SETB P1.0
LCALL LDELAY
CLR P1.0
RETI
INTER1: MOV P1,#0H
SETB P1.7
LCALL DELAY
CLR P1.7
RETI
ORG 4200H
LDELAY: PUSH 7
PUSH 6
PUSH 5
MOV R7, #24H
LUPA: MOV R6, #0FFH
LUPB: MOV R5, #0FFH
DJNZ R5, $
DJNZ R6, LUPB
DJNZ R7, LUPA
POP 5
POP 6
POP 7
RET
SDELAY: PUSH 7
PUSH 6
PUSH 5
MOV R7, #04H
LUP1: MOV R6, #0FFH
LUP2: MOV R5, #0FFH
DJNZ R5, $
DJNZ R6, LUP2
DJNZ R7, LUP1
POP 5
POP 6
POP 7
RET
;inisialisasi
START: MOV SP,#30H
MOV TCON, #05H
MOV IP, #04H
MOV IE, #85H
;Program Utama
LOOP1: MOV P1,#01010101B
ACALL SDELAY
MOV P1, #10101010B
ACALL SDELAY
SJMP LOOP1
END
Progam akan menampilkan nyala LED yang bergantian. Setiap kali ada penekanan keypad IS1, hanya LED bit 0 yang akan menyala. Setiap kali ada penekanan keypad IS2, hanya led bit 7 yang akan menyala. Untuk menggunakan INT0 dan INT1 dengan falling edge trigger (transisi dari high ke low), maka IT1(TCON.2) dan IT0 (TCON.0) berlogika 1, sehingga TCON bernilai 00000101b atau 05H. Untuk memindah INT1 ke tingkat prioritas lebih tinggi, maka PX1 (IP.2) berlogika 1 sehingga IP bernilai 00000100b atau 04H.
Untuk mengaktifkan INT0 dan INT1, maka EX0(IE.0), EX1(IE.2), dan EA (IE.7) berlogika 1, sehingga IE bernilai 10000101b atau 85H. Rutin interrupt pada alamat vector 4003H dan 4013H dipindah ke alamat lain dengan perintah LJMP. Hal ini dilakukan agar rutin dapat lebih panjang tanpa khawatir menerjang alamat vector berikutnya. Perhatikan bahwa penekanan keypad IS2 dapat menginterupsi rutin penekanan keypad IS1, tetapi tidak sebaliknya. Hal ini dikarenakan INT1 berada pada tingkat prioritas lebih tinggi. Perhatikan juga bahwa SDELAY menggunakan alamat yang sama dengan LDELAY. Untuk menghindari kekacauan nilai, maka diperlukan PUSH dan POP.
LATIHAN :
1. Jelaskan cara kerja timer/counter di AT89C51 dan AT89S52
2. Buat tampilan animasi menggunakan 7 segment trainer board, sebagai contoh berikut akan menampilkan angka ‘7’ dan ‘5’ di 7 segment trainer board
$MOD51
PORTC EQU 2002H
CW EQU 2003H
CSEG
ORG 4000H
LJMP START
DELAY: MOV R6,#0FH
LUP: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,LUP
RET
START: MOV SP,#30H
MOV DPTR,#CW
MOV A,#80H;konfigurasi Port A,B dan C
MOVX @DPTR,A
LOOP:
;menampilkan angka 5 di 7 segment 1
MOV DPTR,#PORTC
MOV A,#80H
MOV @DPTR,A
MOV P1,#6DH
LCALL DELAY
;menampilkan angka 7 di segment 2
MOV A,#40H
MOV @DPTR,A
MOV P1,#07H
LCALL DELAY
SJMP LOOP
END
Jika tidak ada kesalahan, program akan menampilkan angka 7 pada segment 2 dan angka 5 pada segment 1 secara serentak tanpa berkedip. Pada program tersebut, D01 terhubung dengan Port C bit ke 6 (PC.6) dan D02 terhubung dengan Port C bit ke 7 (PC.7). Untuk menampilkan angka 7 pada segment 2, maka D02 berlogika 0 dan D01 berlogika 1, jadi data 7 segment yang dikirim bernilai 00000111b atau 07H.
Untuk menampilkan angka 5 pada segment 1, maka D02 bernilai 1 dan D01 berlogika 0, maka data yang dikirim ke port 1 bernilai 01101101b atau 6DH.
3. Jelaskan fungsi interupsi dan efeknya bagi program yang sedang berjalan
4. Buatlah program untuk menampilkan led di port 1 dengan CO1 yang dihubungkan ke T1 pada DT-51 trainer board dan jumper Pulse Generator pada 1KHz, dengan syarat:
1. Semua led dimulai dari keadaan padam
2. Gunakan Timer/Counter 0 sebagai Timer mode 1
3. Setiap timer 0 berjalan selama 1 detik, register counter 1 ditampilkan ke LED secara bergantian.
4. Sebelum keluar dari Interrupt Service Routine Timer 0, kembalikan semua register kedua Timer/Counter menjadi 0000H lagi.
5. Ulangi lagi latihan tersebut dengan jumper “Pulse Generator” pada 10KHz.
5. Buat program jika P1.1 diberi logika 1, maka Port A akan menampilkan nyala lampu Running LED ke arah kiri, sedangkan jika p1.2 yang diberi logika 1, maka port B akan menampilkan nyala lampu Running LED ke arah kanan.
6. Buat program untuk menampilkan LED di port B dengan toggle switch di port C untuk kondisi :
a. Jika toggle switch “bit 2” berlogika “1”, maka semua LED akan padam
b. Jika toggle switch “Bit 2” berlogika ‘0’, program akan memeriksa kondisi toggle switch “Bit 5”
c. Jika toggle switch “Bit 2” berlogika ‘0’ dan toggle switch “Bit 5” berlogika ‘0’, led “Bit 2” menyala.
d. Jika toggle switch “Bit 2” berlogika ‘0’ dan toggle switch “Bit 5” berlogika ‘1’, LED “Bit 5” menyala.
Timer berfungsi untuk mengatur waktu kerja yang dibutuhkan AT89S51/52, tersedia dua buah timer yaitu Timer 0 dan Timer 1, masing-masing timer terdiri dari 16 bit counter yang dapat diprogram.
Timer/Counter yang dioperasikan sebagai timer dapat digunakan untuk menghitung waktu dari sebuah kejadian. Nilai timer bertambah tiap machine cyle (12 pulsa clock) sehingga kecepatan bertambahnya ialah 1/12 dari frekwensi osilator. Dengan menggunakan Timer/Counter sebagai counter, maka Kit mikrokontroler akan selalu menghitung munculnya kejadian yang ditandai dengan adanya trigger. User tinggal memeriksa nilai counter pada saat yang ditentukan. Register-register Timer yang tersedia ialah :
TMOD (Timer Mode Register)
Register yang digunakan untuk mengatur timer/counter terdapat pada Timer Mode (TMOD) dan Timer Control (TCON). TMOD tidak dapat diakses secara bit (not bit addressable), beralamat di 89H. Gambar dibawah ini memperlihatkan alamat dan pembagian register TMOD
Gambar 4.1 Register TMOD
Penjelasan dari gambar di atas ialah :
Ø Gate: Timer akan berjalan bila bit ini set dan INT0 (untuk Timer 0) atau INT1 (untuk Timer 1) berkondisi high
Ø C/T: 1 = Counter 0 = Timer
Ø M1 & M0: Untuk memilih mode timer, seperti pada Tabel 4.1:
Tabel 4.1 Mode Operasi Timer /Counter
M1
M0
Mode Operasi
0
0
0
Timer/Counter 13 bit
0
1
1
Timer /Counter 16 bit
1
0
2
Timer/Counter 8 bit auto reload
1
1
3
Split timer mode untuk timer/counter 0
1
1
3
Timer/Counter 1 berhenti
4.1.2 THx dan TLx
THx dan TLx (x adalah nomor Timer).Merupakan Register yang menunjukkan nilai dari timer di mana masing-masing Timer mempunyai dua buah register yaitu:
- THx untuk high byte
- TLx untuk low byte
· TH0 : Timer 0 High Byte terletak pada alamat 8AH
· TL0 : Timer 0 Low Byte terletak pada alamat 8BH
· TH1 : Timer 1 High Byte terletak pada alamat 8CH
· TL1 : Timer 1 Low Byte terletak pada alamat 8DH
Misal register Timer/Counter 0 diisi dengan nilai 814AH dan register Timer/Counter 1 diisi dengan nilai 0CF32H, maka instruksinya sebagai berikut :
MOV TH0,#81H
MOV TL0,#4AH
MOV TH1,#0CFH
MOV TL1,#32H
4.1.3 TCON (Timer Control Register)
Pada register ini, hanya 4 bit saja yaitu TCON.4, TCON.5, TCON.6 dan TCON.7 saja yang mempunyai fungsi berhubungan dengan timer.
Gambar 4.2 Register TCON
Tabel 4.2 menampilkan penjelasan dari Timer control .
Tabel 4.2 Timer Control
Bit
Alamat bit
Simbol
Penjelasan
TCON.7
8FH
TF1
Timer/Counter 1 overflow flag
TCON.6
8EH
TR1
Timer 1 Run Control Bit
TCON.5
8DH
TF0
Timer /Counter 0 overflow flat
TCON.4
9CH
TR0
Timer 0 Run Control Bit
TCON.3
8BH
IE1
External Interrupt 1 Edge flag
TCON.2
8AH
IT1
External interrupt 1 type control bit
TCON.1
89H
IE0
External Interrupt 0 Edge flag
TCON.0
88H
IT0
External interrupt 0 Type control bit
Penjelasan dari gambar dan tabel diatas ialah :
Ø TCON.7 atau TF1: Timer 1 Overflow Flag yang akan set bila timer overflow. Bit ini dapat di-clear oleh software atau oleh devais pada saat program menuju ke alamat yang ditunjuk oleh interrupt vektor.
Ø TCON.6 atau TR1: 1 = Timer 1 aktif, 0 = Timer 1 non aktif
Ø TCON.5 atau TF0: Sama dengan TF1
Ø TCON.4 atau TR0: Sama dengan TR1
Jika Timer/Counter yang diprogram akan digunakan sebagai sumber interrupt, maka IE dan /atau IP juga harus diatur. Misal kedua Timer/Counter digunakan sebagai sumber interrupt dengan prioritas Timer/Counter 1, maka instruksinya :
MOV IP,#80H
MOV IE,#8AH
atau
SETB PT1
SETB ET1
SETB ET0
SETB EA
Mode Timer
Mode Timer terdiri dari:
Mode 0 Timer 13 bit
Pada Mode 0, disediakan terutama untuk menjaga kompatibilitas dengan prosesor 8048. pada Mode 0, register TLx (TL0 atau TL1) hanya digunakan 5 bit terendah saja sedangkan register THx (TH0 atau TH1) tetap selebar 8 bit. TLx akan terus bertambah hingga bernilai 1FH. Overflow akan terjadi jika ada perubahan dari FF1FH ke 0000H. Nilai THx dan TLx dapat diubah oleh user setiap saat dalam program.
Mode 1 Timer 16 bit
Mode 1 pada 89C51 semua bit TLx digunakan, sehingga mode 1 merupakan timer/counter 16 bit. TLx akan bertambah hingga bernilai FFH. Pada saat ada perubahan nilai TLx dari FFh ke 00H, THx akan bertambah 1. Nilai maksimal THx dan TLx ialah FFFFH (THx=FFH dan TLx =FFH). Overflow akan terjadi jika ada perubahan dari FFFFH ke 0000H.
Gambar 4.3 Timer/Counter Mode 1
Misalnya Timer/Counter 0 digunakan sebagai timer dalam mode 2 dengan external control dan Timer/Counter 1 digunakan sebagai counter dalam mode 1 dengan internal control, maka instruksinya :
MOV TMOD,#5AH
Sedangkan untuk menjalankan kedua timer, instruksinya :
MOV TCON, #50H
atau
SETB TR0
SETB TR1
Mode 2 Timer 16 bit di 89S52
Mode 2 ialah timer/counter 16 bit yang dapat beroperasi sebagai timer atau event counter. Timer 2 mempunyai 3 mode yaitu capture, auto-reload dan baud rate generator. Timer 2 terdiri dari 2 buah register 8 bit yaitu TH2 dan TL2. Berikut table Mode 2 pada 89S52.
Tabel 4.3 Timer Mode 2 89S52
RCLK+TCLK
CP/RL2
TR2
MODE
0
0
1
16 bit auto reload
0
1
1
18 bit capture
1
x
1
Baud Rate Generator
x
x
0
Off
Pada mode capture, 2 pilihan dipilih oleh bit EXEN2 di T2CON. Jika EXEN2=0, Timer 2 menjadi 16 bit timer atau counter dimana tergantung dari overflow set bit TF2 di T2CON. Bit ini dapat digunakan untuk membuat sebuah interupsi.
Gambar 4.4 Mode Capture
Timer 2 dapat diprogram untuk menghitung naik/mundur ketika dikonfigurasikan sebagai mode 16 bit auto-reload. Fitur ini dipanggil oleh bit DCEN (Down Counter Enable) yang berada di SFR T2MOD.
Gambar 4.5 Timer 2 Mode Auto reload (DCEN=0)
Timer 2 sebagai baud rate generator dengan menset TCLK dan/atau RCLK di T2CON. Sbeagai catatan, baud rate untuk mengirim dan menerima dapat berbeda jika Timer 2 digunakan untuk mengirim atau memancarkan dan Timer 1 digunakan untuk fungsi lainnya. Menset RCLK dan /atau TCLK membantu Timer 2 berada pada mode baud rate generator
Gambar 4.6 Mode baud rate generator
Mode 3
Pada Mode 3 di 89C51, Timer/Counter 0 akan menjadi 2 timer/counter 8 bit, sedangkan Timer/Counter 1 akan berhenti. TL0 akan menjadi timer/counter 8 bit yang dikendalikan oleh bit control Timer/Counter 0 (meliputi GATE, C/T’, TR0, INT0, dan TF0). TH0 akan menjadi timer 8 bit (bukan counter) yang dikendalikan oleh bit control timer/counter 1 (meliputi TR1 dan TF1).Timer /Counter 1 masih dapat dioperasikan dalam mode selain mode 3.
Penerapan Timer/Counter
Timer bekerja memerlukan sumber detak dengan menghubungkan pin T0 (P3.4) sebagai input detak. Jika digunakan sumber detak internal, input detak berasal dari osilator yang telah dibagi 12. Untuk pengaturan Timer dengan software maka bit penentu keaktifan ialah Rtx sedangkan kondisi dari Bit Gate harus berlogika 0. Pengaturan Timer dengan hadware, penentu keaktifan ialah INTx sedangkan kondisi Bit Gate dan TRx harus berlogika 1.
Timer ini sering digunakan untuk mengatur baud rate dari port serial. Dengan mengubah bit SMOD yang terletak pada register PCON menjadi set (kondisi awal pada saat sistem reset adalah clear) maka baud rate pada Mode 1, 2 dan 3 akan berubah menjadi dua kali lipat.
Contoh program berikut ialah penggunaan fasilitas Timer pada mikrokontroler . Untuk menggunakan Timer/Counter 0 sebagai timer mode 1, maka GATE, C/T dan M1 untuk Timer 0 pada TMOD berlogika 0 dan M0 berlogika 1 sehingga TMOD bernilai 01H. Sedangkan untuk menjalankan Timer 0, maka TR0 (TCON.4) berlogika 1 sehingga TCON bernilai 10H. Pada contoh dibawah ini Timer 0 diberi nilai awal 2CH untuk TH0 dan 00H untuk TL0 sehingga Timer 0 akan selalu dimulai dari nilai 2C00H. Karena frekwensi timer tinggi, maka digunakan faktor pengali 10H yang berada pada R0.
Langkah-langkah :
· Hubungkan Port 1 DT-51 dengan “PORT OUTPUT” DT-51 Trainer Board
· Hubungkan “CONTROL” DT-51 dengan “CONTROL“ DT-51 Trainer Board
· Buat program berikut :
Program timer untuk Led berkedip (timer.asm)
$MOD51
CSEG
ORG 4000H
LJMP START
ORG 400BH
COUNT: INC R0
CJNE R0,#10H,OUT1
SETB P1.5
LOOP: MOV R6,#0FFH
DJNZ R6,$
DJNZ R7,LOOP
CLR P1.5
MOV R0,#00H
OUT1: MOV TH0,#2CH
MOV TL0,#00H
RET1
;inisialisasi
ORG 4200H
START: MOV SP,#30H
MOV R0,#00H
MOV TMOD,#01H
MOV TH0,#2CH
MOV TL0,#00H
MOV TCON,#10H
MOV P1,#00H
MOV IE,#82H
SJMP $
END
Jika program dijalankan, akan menampilkan nyala LED Bit 5 berkedip dimana baru akan dinyalakan atau dipadamkan setelah interupsi oleh Timer 0 sebanyak 16 x. Perhatikan pada saat interupsi, program akan melompat ke alamat vector 000BH tetapi oleh DT51 akan langsung dipindah ke alamat 400BH.
Contoh berikut menggunakan Timer/Counter 0 Counter Mode 2, langkah-langkahnya :
* Hubungkan Port 1 DT-51 dengan Port output DT-51 trainer board menggunakan kabel tipe Y.
* Hubungkan Control DT-51 dengan Control DT-51 Trainer board (sebagai sumber tegangan dan koneksi T0) menggunakan kabel tipe X
* Hubungkan IS3 MinSys dengan T0 pada DT-51 Trainer board
* Hubungkan DT-51 dengan PC menggunakan kabel serial
* Ketik program berikut :
Program Counter Mode 2 (mode2.asm)
$MOD51
CSEG
ORG 4000H
LJMP START
ORG 400BH
MOV P1, #00H
SETB P1.5
PUSH 5
PUSH 6
PUSH 7
MOV R7,#0FH
LUPA: MOV R6,#0FFH
LUPB: MOV R5,#0FFH
DJNZ R5,$
DJNZ R6,LUPB
DJNZ R7,LUPA
POP 7
POP 6
POP 5
RETI
ORG 4100H
DELAY:MOV R7,#04H
LUP1: MOV R6,#0FFH
LUP2: MOV R5,#0FFH
DJNZ R5,$
DJNZ R6,LUP2
DJNZ R7,LUP1
RET
;inisialisasi
START: MOV SP,#30H
MOV TMOD,#06H
MOV TH0,#0FAH
MOV TL0,#0F6H
SETB TR0
CLR TF0
MOV IE,#82H
;Program Utama
LOOP1: MOV P1,#00110011B
ACALL DELAY
MOV P1,#11001100B
ACALL DELAY
SJMP LOOP1
END
Program akan menampilkan nyala LED bergantian antara data 00110011b dengan 11001100b. Pada saat terjadi interupsi, maka LED bit 5 akan menyala sejenak. Untuk menggunakan Timer/Counter 0 sebagai counter mode 2, maka GATE dan M0 untuk Timer 0 pada TMOD berlogika 0 dan C/T dan M1 berlogika 1, sehingga TMOD bernilai 00000110b atau 06H. Untuk menjalankan counter 0, maka TR0(TCON.4) berlogika 1, sehingga TCON bernilai 0010000b atau 10H. Perintah CLR TF0 digunakan untuk memberikan interrupt flag sebelum interupsi diaktifkan. Untuk mengaktifkan interrupt counter 0, maka EA (IE.7) dan ET0(IE.1) berlogika 1, sehingga IE bernilai 10000010b atau 82H. Pada contoh program diatas, counter 0 diberi nilai awal F6H untuk TL0, sehingga membutuhkan 10 x penekakan keypad IS3 untuk menghasilkan interupsi pertama. Dan sebagai nilai reload pada TH0 diberi nilai FAH, sehingga hanya membutuhkan 6 x penekanan keypad IS3.
Penerapan lainnya, misal jika kita ingin membuat bunyi dengan frekwensi 1Hz, periodanya ialah T=1/f, perioda yang dihasilkan ialah 1 detik. Dengan demikian perioda port tinggi ialah 0.5 detik dan perioda port rendah ialah 0.5 detik.
Gambar 4.7 Rangkaian driver speaker
Assumsikan bahwa frekwensi detak 12 MHz, maka tundaan maksimum yang dicapai ialah 65535 x 1 uS =0.065 detik. Untuk itu timer digunakan sebagai penghasil tundaan selama 0.01 detik (10.000 x 1 uS). Dengan pembagi 50 akan didapat tundaan 0.01 detik x 50 =0.5 detik. Nilai untuk TH0 dan TL0 ialah :
65535 -10.000=55535D=D8EFH
Nilai untuk TH0 ialah D8H dan untuk TL0 ialah EFH. Berikut contoh program penghasil bunyi di speaker:
Listing Program 6. Penghasil bunyi di speaker (bunyi.asm)
$MOD51
ORG 00H ; MENGGUNAKAN ALAMAT AWAL MIKRO
…
MULAI: SETB P1.0
ACALL TUNDA
CLR P1.0
ACALL TUNDA
SJMP MULAI
TUNDA: MOV R0,#0
LAGI: MOV TMOD, #01
MOV TH0, #0D8H
MOV TL0, #0EFH
SETB TR0
ULANG: NOP
JBC TF0, HITUNG
SJMP ULANG
HITUNG: INC R0
CJNE R0, #100, LAGI
RET
END
Interupsi
Program yang sedang dijalankan oleh mikrokontroler AT89S51/52 dapat dihentikan untuk sementara yang dikenal dengan instilah interupsi. Jika AT89S51/52 mendapat permintaan interupsi maka program counter (PC) akan diisi alamat dari vector interupsi, kemudian AT89S51/52 melaksanakan rutin pelayanan interupsi mulai dari alamat tersebut setelah selesai maka AT89S51/52 akan kembali ke pelaksanaan program utama yang ditinggalkan. Mikrokontroler AT89S51/52 menyediakan 6 sumber interupsi yaitu 2 buah interupsi eksternal (INT 0 dan INT 1), 3 buah interupsi timer (Timer 0, Timer 1, dan Timer 2), dan sebuah interupsi port serial.
Interupsi ialah suatu sela yang terjadi pada saat program sedang berjalan. Mirip halnya dengan interupsi yang terjadi pada saat rapat yang sedang berlangsung. Interupsi berguna jika terdapat suatu rutin yang dijalankan hanya pada waktu tertentu yang bersifat asinkron.
Berikut Interrupt Enable pada MCS-51:
Tabel 4.4 Interrupt Enable
Bit
Alamat bit
Simbol
Penjelasan
IE.7
0AFH
EA
Enable All
-
-
-
Reserved
-
-
-
Reserved
IE.4
0ACH
ES
Serial Interrupt Enable Bit
IE.3
0ABH
ET1
Timer/Counter 1 Enable bit
IE.2
0AAH
EX1
External Interrupt 1 enable Bit
IE.1
0A9H
ET0
Timer /Counter 0 Enable Bit
IE.0
0A8H
EX0
External Interrupt 0 Enable Bit
Jika terjadi interupsi, maka interrupt flag akan bernilai 1 pada bit yang menunjukkan sumber interrupt. Jika CPU menemukan adanya interrupt pada saat sampling, proses selanjutnya ialah CPU akan menjalankan instruksi LCALL yang akan menyimpan Program Counter (PC) ke stack dengan urutan 8 bit terendah terlebih dahulu. Jika sumber interupsi berasal dari Timer/Counter atau External interrupt, interrupt flag yang bersangkutan akan dibersihkan.
Pastikan juga user mengamankan nilai register dengan menggunakan PSW, ACC, B, R0-R7 dan DPTR. Selain itu, register yang di-PUSH pertama harus di-POP terakhir. Selain itu, gunakan RETI agar fungsi kembali ke alamat semula.
Contoh program berikut merupakan Penggunaan INT0 dengan interrupt enable.
Langkah-langkahnya :
* Hubungkan port 1 dt-51 dengan “PORT OUTPUT” DT-51 trainer board menggunakan kabel Tipe Y
* Hubungkan “Control” DT-51” MinSys dengan “Control “DT-51 trainer board
* Hubungkan “IS1” dengan “INT0” pad DT-51 trainer board
* Hubungkan DT-51 MinSys dengan PC menggunakan kabel serial
Buat proram berikut :
Program Interrupt Enable (ie.asm)
$MOD51
CSEG
ORG 4000H
LJMP START
ORG 4003H
RL A
MOV P1,A
MOV R7,#04H
LOOPA: MOC R6, #0FFH
LOOPB: MOV R5,#0FFH
DJNZ R5,$
DJNZ R6,LOOPB
DJNZ R7,LOOPA
RETI
ORG 4200H
;inisialisasi
START: MOV SP,#30H
MOV TCON,#01H
MOV P1,#01H
MOV IE,#81H
SJMP $
END
Program diatas akan menampilkan nyala LED dari Bit 0 dan bergeser ke kiri setiap ada penekanan keypad “IS1”. Untuk mengunakan INT0 dengan falling edge trigger maka INT0 (TCON.0) berlogika 1, sehingga TCON bernilai 00000001b(01H). Untuk mengaktifkan interrupt, maka EX0 (IE.0) dan EA(IE.7) berlogika 1 sehingga IE bernilai 10000001b (81H), terlihat juga bahwa pada saat interupsi program melompat ke alamat vector 0003H yang oleh DT-51 langsung dipindah ke alamat 4003H. Fungsi DJNZ digunakan untuk mengurangi satu dan lompat jika hasilnya bukan nol.
Contoh penggunaan interupsi lainnya, program berikut akan menggunakan INT0 dan INT1 dengan Interrupt Priority.
Langkah-langkahnya :
1. Hubungkan Port 1 DT-51 dengan Port Ouput DT-51 Trainer board menggunakan kabel tipe Y
2. Hubungkan Control DT-51 MinSys dengan Control DT-51 Trainer board menggunakan kabel tipe X
3. Hubungkan IS1 dengan INT0 dan IS2 dengan INT1 pada DT-51 trainer board
4. Hubungkan DT-51 MinSys dengan PC menggunakan kabel serial
5. Ketik program berikut :
Program INT0 dan INT1 (inprio.asm)
$MOD51
CSEG
ORG 4000H
LJMP START
ORG 4003H
LJMP INTER0
ORG 4013H
LJMP INTER1
ORG 4100H
INTER0: MOV P1,#0H
SETB P1.0
LCALL LDELAY
CLR P1.0
RETI
INTER1: MOV P1,#0H
SETB P1.7
LCALL DELAY
CLR P1.7
RETI
ORG 4200H
LDELAY: PUSH 7
PUSH 6
PUSH 5
MOV R7, #24H
LUPA: MOV R6, #0FFH
LUPB: MOV R5, #0FFH
DJNZ R5, $
DJNZ R6, LUPB
DJNZ R7, LUPA
POP 5
POP 6
POP 7
RET
SDELAY: PUSH 7
PUSH 6
PUSH 5
MOV R7, #04H
LUP1: MOV R6, #0FFH
LUP2: MOV R5, #0FFH
DJNZ R5, $
DJNZ R6, LUP2
DJNZ R7, LUP1
POP 5
POP 6
POP 7
RET
;inisialisasi
START: MOV SP,#30H
MOV TCON, #05H
MOV IP, #04H
MOV IE, #85H
;Program Utama
LOOP1: MOV P1,#01010101B
ACALL SDELAY
MOV P1, #10101010B
ACALL SDELAY
SJMP LOOP1
END
Progam akan menampilkan nyala LED yang bergantian. Setiap kali ada penekanan keypad IS1, hanya LED bit 0 yang akan menyala. Setiap kali ada penekanan keypad IS2, hanya led bit 7 yang akan menyala. Untuk menggunakan INT0 dan INT1 dengan falling edge trigger (transisi dari high ke low), maka IT1(TCON.2) dan IT0 (TCON.0) berlogika 1, sehingga TCON bernilai 00000101b atau 05H. Untuk memindah INT1 ke tingkat prioritas lebih tinggi, maka PX1 (IP.2) berlogika 1 sehingga IP bernilai 00000100b atau 04H.
Untuk mengaktifkan INT0 dan INT1, maka EX0(IE.0), EX1(IE.2), dan EA (IE.7) berlogika 1, sehingga IE bernilai 10000101b atau 85H. Rutin interrupt pada alamat vector 4003H dan 4013H dipindah ke alamat lain dengan perintah LJMP. Hal ini dilakukan agar rutin dapat lebih panjang tanpa khawatir menerjang alamat vector berikutnya. Perhatikan bahwa penekanan keypad IS2 dapat menginterupsi rutin penekanan keypad IS1, tetapi tidak sebaliknya. Hal ini dikarenakan INT1 berada pada tingkat prioritas lebih tinggi. Perhatikan juga bahwa SDELAY menggunakan alamat yang sama dengan LDELAY. Untuk menghindari kekacauan nilai, maka diperlukan PUSH dan POP.
LATIHAN :
1. Jelaskan cara kerja timer/counter di AT89C51 dan AT89S52
2. Buat tampilan animasi menggunakan 7 segment trainer board, sebagai contoh berikut akan menampilkan angka ‘7’ dan ‘5’ di 7 segment trainer board
$MOD51
PORTC EQU 2002H
CW EQU 2003H
CSEG
ORG 4000H
LJMP START
DELAY: MOV R6,#0FH
LUP: MOV R7,#0FFH
DJNZ R7,$
DJNZ R6,LUP
RET
START: MOV SP,#30H
MOV DPTR,#CW
MOV A,#80H;konfigurasi Port A,B dan C
MOVX @DPTR,A
LOOP:
;menampilkan angka 5 di 7 segment 1
MOV DPTR,#PORTC
MOV A,#80H
MOV @DPTR,A
MOV P1,#6DH
LCALL DELAY
;menampilkan angka 7 di segment 2
MOV A,#40H
MOV @DPTR,A
MOV P1,#07H
LCALL DELAY
SJMP LOOP
END
Jika tidak ada kesalahan, program akan menampilkan angka 7 pada segment 2 dan angka 5 pada segment 1 secara serentak tanpa berkedip. Pada program tersebut, D01 terhubung dengan Port C bit ke 6 (PC.6) dan D02 terhubung dengan Port C bit ke 7 (PC.7). Untuk menampilkan angka 7 pada segment 2, maka D02 berlogika 0 dan D01 berlogika 1, jadi data 7 segment yang dikirim bernilai 00000111b atau 07H.
Untuk menampilkan angka 5 pada segment 1, maka D02 bernilai 1 dan D01 berlogika 0, maka data yang dikirim ke port 1 bernilai 01101101b atau 6DH.
3. Jelaskan fungsi interupsi dan efeknya bagi program yang sedang berjalan
4. Buatlah program untuk menampilkan led di port 1 dengan CO1 yang dihubungkan ke T1 pada DT-51 trainer board dan jumper Pulse Generator pada 1KHz, dengan syarat:
1. Semua led dimulai dari keadaan padam
2. Gunakan Timer/Counter 0 sebagai Timer mode 1
3. Setiap timer 0 berjalan selama 1 detik, register counter 1 ditampilkan ke LED secara bergantian.
4. Sebelum keluar dari Interrupt Service Routine Timer 0, kembalikan semua register kedua Timer/Counter menjadi 0000H lagi.
5. Ulangi lagi latihan tersebut dengan jumper “Pulse Generator” pada 10KHz.
5. Buat program jika P1.1 diberi logika 1, maka Port A akan menampilkan nyala lampu Running LED ke arah kiri, sedangkan jika p1.2 yang diberi logika 1, maka port B akan menampilkan nyala lampu Running LED ke arah kanan.
6. Buat program untuk menampilkan LED di port B dengan toggle switch di port C untuk kondisi :
a. Jika toggle switch “bit 2” berlogika “1”, maka semua LED akan padam
b. Jika toggle switch “Bit 2” berlogika ‘0’, program akan memeriksa kondisi toggle switch “Bit 5”
c. Jika toggle switch “Bit 2” berlogika ‘0’ dan toggle switch “Bit 5” berlogika ‘0’, led “Bit 2” menyala.
d. Jika toggle switch “Bit 2” berlogika ‘0’ dan toggle switch “Bit 5” berlogika ‘1’, LED “Bit 5” menyala.
Tag printah membuat robot sederhana
$MOD51
ORG 00H
;inisialisasi awal
BEGIN: MOV P3,#00H ;Port2 0x00 (motor stop)
MOV P1,#03H ;Port0.0 dan Port0.1 logika 1 (rendah aktif)
;bisa juga MOV P1,#00000011B (dalam biner)
ACALL TUNDA_1S ;tunda dulu
ROTASI:SJMP MAIN
TESTDRIVE: ACALL MAJU ;robot maju 3 detik
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL MUNDUR ;robot mundur 3 detik
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL B_KANAN ;robot belok kanan 3 detik
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL B_KIRI ;robot belok kiri 3 detik
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL ROTASI ;robot rotasi 3 detik
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL TUNDA_1S
MOV P3,#00H ;test drive selesai
ACALL TUNDA_1S ;diam 1 detik (siap" neh)
MAIN: ACALL MAJU ;default robot maju
ACALL TUNDA ;tunda 100ms
JNB P1.0,S_KIRI ;cek sensor kiri
JNB P1.1,S_KANAN ;cek sensor kanan
SJMP MAIN ;looping terus menerus
S_KIRI: JNB P1.1,S_DUA ;cek dlu kanan jg tersentuh atau tdk?
ACALL B_KANAN ;sensor kiri tersentuh belok kanan
ACALL TUNDA_1S
SJMP MAIN
S_KANAN: ACALL B_KIRI ;sensor kanan tersentuh belok kiri
ACALL TUNDA_1S
SJMP MAIN
S_DUA: ACALL MUNDUR ;sensor kiri n kanan tersentuh robot mundur
ACALL TUNDA_1S
ACALL ROTASI ;setelah mundur robot rotasi
ACALL TUNDA_1S
ACALL TUNDA_1S
SJMP MAIN ;ke program utama
S_DEPAN:ACALL K_DEPAN;SENSOR DEPAN TERSENTUH HIDUPKAN KIPAS
ACALL TUNDA_1S
ACALL TUNDA_1S
SJMP MAIN
MAJU: MOV P3,#0011 ;konfigurainya coba" aja
RET
MUNDUR: MOV P3,#1010
RET
B_KANAN: MOV P3,#1011
RET
B_KIRI: MOV P3,#0100
K_DEPAN: MOV P2,#1111
RET
;-----------------------------------
; TUNDA
;-----------------------------------
TUNDA_1S: ACALL TUNDA_05S ; tunda selama 1 S
ACALL TUNDA_05S
RET
TUNDA_05S: MOV A,#100 ; tunda selama 0,5 S
TUNDA_LOOP: LCALL TUNDA_MODE
DJNZ ACC,TUNDA_LOOP
RET
TUNDA: MOV A,#20 ; tunda selama 100 mS
TUNDAX: LCALL TUNDA_MODE
DJNZ ACC,TUNDAX
RET
TUNDA_MODE: PUSH TMOD ; tunda selama 5 mS
MOV TMOD,#21H
MOV TH0,#0EDH
MOV TL0,#0FFH
SETB TR0
TUNDA_5MS: JBC TF0,TUNDA_OK
SJMP TUNDA_5MS
TUNDA_OK: CLR TR0
POP TMOD
RET
END
ORG 00H
;inisialisasi awal
BEGIN: MOV P3,#00H ;Port2 0x00 (motor stop)
MOV P1,#03H ;Port0.0 dan Port0.1 logika 1 (rendah aktif)
;bisa juga MOV P1,#00000011B (dalam biner)
ACALL TUNDA_1S ;tunda dulu
ROTASI:SJMP MAIN
TESTDRIVE: ACALL MAJU ;robot maju 3 detik
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL MUNDUR ;robot mundur 3 detik
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL B_KANAN ;robot belok kanan 3 detik
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL B_KIRI ;robot belok kiri 3 detik
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL ROTASI ;robot rotasi 3 detik
ACALL TUNDA_1S
ACALL TUNDA_1S
ACALL TUNDA_1S
MOV P3,#00H ;test drive selesai
ACALL TUNDA_1S ;diam 1 detik (siap" neh)
MAIN: ACALL MAJU ;default robot maju
ACALL TUNDA ;tunda 100ms
JNB P1.0,S_KIRI ;cek sensor kiri
JNB P1.1,S_KANAN ;cek sensor kanan
SJMP MAIN ;looping terus menerus
S_KIRI: JNB P1.1,S_DUA ;cek dlu kanan jg tersentuh atau tdk?
ACALL B_KANAN ;sensor kiri tersentuh belok kanan
ACALL TUNDA_1S
SJMP MAIN
S_KANAN: ACALL B_KIRI ;sensor kanan tersentuh belok kiri
ACALL TUNDA_1S
SJMP MAIN
S_DUA: ACALL MUNDUR ;sensor kiri n kanan tersentuh robot mundur
ACALL TUNDA_1S
ACALL ROTASI ;setelah mundur robot rotasi
ACALL TUNDA_1S
ACALL TUNDA_1S
SJMP MAIN ;ke program utama
S_DEPAN:ACALL K_DEPAN;SENSOR DEPAN TERSENTUH HIDUPKAN KIPAS
ACALL TUNDA_1S
ACALL TUNDA_1S
SJMP MAIN
MAJU: MOV P3,#0011 ;konfigurainya coba" aja
RET
MUNDUR: MOV P3,#1010
RET
B_KANAN: MOV P3,#1011
RET
B_KIRI: MOV P3,#0100
K_DEPAN: MOV P2,#1111
RET
;-----------------------------------
; TUNDA
;-----------------------------------
TUNDA_1S: ACALL TUNDA_05S ; tunda selama 1 S
ACALL TUNDA_05S
RET
TUNDA_05S: MOV A,#100 ; tunda selama 0,5 S
TUNDA_LOOP: LCALL TUNDA_MODE
DJNZ ACC,TUNDA_LOOP
RET
TUNDA: MOV A,#20 ; tunda selama 100 mS
TUNDAX: LCALL TUNDA_MODE
DJNZ ACC,TUNDAX
RET
TUNDA_MODE: PUSH TMOD ; tunda selama 5 mS
MOV TMOD,#21H
MOV TH0,#0EDH
MOV TL0,#0FFH
SETB TR0
TUNDA_5MS: JBC TF0,TUNDA_OK
SJMP TUNDA_5MS
TUNDA_OK: CLR TR0
POP TMOD
RET
END
Langganan:
Postingan (Atom)