Posted by : Niam Tamami January 22, 2011

Penghitung Frekuensi merupakan alat yang memanfaatkan prinsip menghitung banyaknya pulsa tiap 1 sekon.Pulsa sendiri diartikan  sebagai perubahan logika dari high ke low, atau sebaliknya.Kali ini saya akan menjelaskan cara pembuatan frekuensi counter dengan memanfaatkan fitur MCS51 yaitu : timer dan counter.

Apakah perbedaan timer dan counter?Untuk memahami hal ini, akan saya jelaskan mengenai sistem kerja dari Alat ini.Banyaknya pulsa akan di-counter "dihitung" selama 1 sekon "diset timer selama 1 sekon". Dari pengertian tersebut dapat kita ketahui definisi counter dan timer. Counter merupakan penghitung dimana jeda antara hitungan tidak ditentukan, berbeda dengan timer, timer merupakan pewaktu dimana tiap perubahannya memiliki nilai yang pasti.

MCS51 menyediakan 2 timer, timer 0 dan timer 1.Untuk tiap tiap mode, dapat diset dalam register timer mode "TMOD".Dalam program saya ini, timer 1 difungsikan sebagai counter 16bit dimana masukan counter lewat port3.5, kemudian timer 0 difungsikan sebagai interupt yang berfungsi mengupdate data ke lcd jika timer mencapai 1 second.

Lcd dalam hal ini dipasang di port2, dan masukan pulsa di PORT3.5


Berikut Program Assemblynya
Download Frekuensi.asm

;=====================================================================
;penghitung frekuensi
;input p3.5
;lcd port2
;=====================================================================
RS bit P2.0
RW bit P2.1
E bit P2.2
LCD_DATA equ P2
P_LCD equ R7
ORG 0H
SJMP START
org 0BH ; alamat interrupt timer0
LJMP TIM_INT
       ;

Dari potongan program di atas dapat kita ketahui bahwa LCD dihubungkan pada PORT2 dan settingannya adalah RS di bit P2.0, RW di P2.1, E di P2.2. Data dari LCD di simpan di R7.Menggunakan timer0 interupt dimana alamat 0Bhex digunakan sebagai alamat rutin interrupt.
START :
CLR P2.1
CALL DELAY
CALL DELAY
CALL LCD_INIT
MOV A,#80H
CALL TULIS_PERINTAH
MOV A,#01H
CALL TULIS_PERINTAH
ACALL TULIS
MOV R1,#0H
MOV A,#8DH
CALL TULIS_PERINTAH
ACALL TULIS2
CALL INIT_TIMER
WHILE1:
SJMP WHILE1

Sedangkan program di atas menyatakan bahwa pertama kali dipanggil rutin LCD init, kemudian memerintahkan kursor di posisi (0,0) dengan cara menulis perintah 80hex.Perintah 01hex dipanggil untuk instruksi clear screen.Setelah itu tulisan “Frekuensi” pada 0,0 LCD   dan “kHz”  pada 0,13 LCD ditulis.

TULIS :
MOV DPTR,#STRING
MOV A,#0
NEXT_CHAR :
PUSH ACC
MOVC A,@A+DPTR
ACALL PUT_CHAR
POP ACC
INC A
CJNE A,#10,NEXT_CHAR
RET

Rutin ini adalah rutin penulis kata “Frekuensi”. Program mengarahkan alamat dari database tulisan frekuensi kemudian data perkarakter dikirimkan ke LCD hingga jumlah karakter = 10
TULIS2 :
MOV DPTR,#STRING2
MOV A,#0
NEXT_CHAR2 :
PUSH ACC
MOVC A,@A+DPTR
ACALL PUT_CHAR
POP ACC
INC A
CJNE A,#3,NEXT_CHAR2
RET

Rutin ini adalah rutin penulis kata “kHz”. Program mengarahkan alamat dari database tulisan frekuensi kemudian data perkarakter dikirimkan ke LCD hingga jumlah karakter = 3
LCD_INIT:
CLR RS
MOV A,#33H
CALL TULIS_PERINTAH
MOV A,#32H
CALL TULIS_PERINTAH
MOV A,#2FH
CALL TULIS_PERINTAH
MOV A,#0EH
CALL TULIS_PERINTAH
MOV A,#06H
CALL TULIS_PERINTAH
RET

Rutin ini adalah rutin inisialisasi LCD dimana perintah dapat dilihat pada tabel di bawah ini:



INIT_TIMER :
;20 x 0.05 = 1 s
       MOV TL0,#0B0H
       MOV TH0,#03CH
       MOV TL1,#00H
       MOV TH1,#00H
       MOV TMOD,#01010001b
;timer0 = timer 16 bit, timer1 = counter16 bit
       SETB ET0 ; timer 0 interrupt
       SETB ET1
       SETB EA  ; SEMUA Interuppt
       SETB TR0 ; start timer 0
       SETB TR1 ; start timer 1
       Ret
Ini merupakan rutin init dari timer dan interrupt. Nilai register TH0=#03CH, TL0=#0B0H menunjukan bahwa timer akan overflow saat nilainya 0.05 sekon. Kemudian di set mode timer 16 bit timer untuk timer 0 dan 16 bit counter untuk timer 1

Data hitungan counter timer tersimpan dalam register TH1 dan TL1.TH1 dan TL1 merupakan register yang bernilai 8 bit, sehingga didapatkan perhitungan bahwa nilai total pulsa yang dihitung adalah TH1*256^1+TL1*256^0.Sehingga untuk mendapatkan frekuensi 1 kHZ maka TH1/4. Dimana untuk mendapatkan nilai TH yaitu dengan cara 1000hz/ 256 = 4. Dan untuk mendapatkan timer selama 1 sekon dengan cara:
Detik= (65535-THTL) * 1,085 uS. Timer yang digunakan yaitu timer 1 dimana terbagi menjadi 2 dengan 8bit TH1 dan 8bit TL1. Interrupt timer 65535 yaitu dengan cara:
SETB ET0
SETB EA
Posisi alamat rutin interrupt:
EX0 0003H
ET0 000BH
EX1 0013H
ET1 001BH
ES 0023H

TIM_INT :
     MOV TL0,#0B0h
     MOV TH0,#03Ch
     INC R1
CJNE R1,#20,STOPINTERUPT
MOV R1,#0
MOV A,#8BH
ACALL TULIS_PERINTAH
MOV A,TH1
MOV B,#4
DIV AB
ACALL BIN2ASCII
     ACALL STOPCOUNTER
     ACALL RESETCOUNTER
STOPINTERUPT:
       RETI
UPDATEDATA:
       MOV R6,TL1
       MOV R7,TH1
       RET
STOPCOUNTER:
       CLR TR0
       CLR TR1
       RET
RESETCOUNTER:
        MOV TL1,#9CH
        MOV TH1,#0
        SETB TR0
        SETB TR1
        RET
Ini adalah rutin interrupt saat timer0 overflow, pertama tama diberikan nilai isi ulang untuk timer dan ditunggu nilai R1 hingga 20 kali agar tepat 1 detik data ditampilkan. Jika R1 = 20 maka R1 dinolkan, memposisikan cursor LCD 0,9 kemudian memproses nilai counter TH1 dengan membagi dengan 4.Mengapa harus dibagi dengan angka 4?Hal ini dikarenakan :

Misal  counter dalam 1 detik menghitung 2000 pulsa, maka :
TH1 = 07 , TL1= D0
Dengan demikian membagi TH1 dengan 4 akan didapat nilai pembulatan = 2, dan ditampilkan dalam LCD nilai frekuensi = 2 kHz.

Frekuensi Counter ini error dimulai saat nilai 8 kHz, berikut data lengkapnya

FG 5V (KHZ) REGISTER MCS51 LCD (KHZ) Error
TH1 TL1
1 03 E8 1 0.0%
2 07 D0 2 0.0%
3 0B B8 3 0.0%
4 0F A0 4 0.0%
5 13 88 5 0.0%
7 1B 58 7 0.0%
8 1F 40 9 12.5%
9 23 28 10 11.1%
10 27 10 11 10.0%
16 3E 80 18 12.5%

Dari data di atas dapat kita ketahui bahwa error berulang tiap nilainya berkelipatan 8, nilai error terus turun hingga kelipatan 8 lagi dan berulang nilai errornya.Hal ini disebabkan karena nilai sisa pembagian TH1 yang tidak di olah.

TULIS_PERINTAH:
CLR RS
CLR RW
PUSH ACC
ANL A,#0F0H
MOV LCD_DATA,A
SETB E
CLR E
CALL DELAY
POP ACC
SWAP A
ANL A,#0F0H
MOV LCD_DATA,A
SETB E
CLR E
CALL DELAY
RET
Rutin ini adalah rutin penulis perintah pada LCD, dimana saat mentrasfer nilai dari perintah, nilainya ditransfer 4bit MSB dahulu kemudian 4bit LSB dengan syarat RS dan RW bernilai 0.Agar data bisa masuk di memory LCD data dipersiapkan dahulu, lalu harus ada perubahan logika ENABLE dari high ke low, baru data dapat masuk ke LCD.

PUT_CHAR:
SETB RS
CLR RW
PUSH ACC
ORL A,#01H
ANL A,#0F1H
MOV LCD_DATA,A
SETB E
CLR E
CALL DELAY
POP ACC
SWAP A
ORL A,#01H
ANL A,#0F1H
MOV LCD_DATA,A
SETB E
CLR E
CALL DELAY
RET
Rutin ini adalah rutin penulis data pada LCD, dimana saat mentrasfer nilai dari perintah, nilainya ditransfer 4bit MSB dahulu kemudian 4bit LSB dengan syarat RS bernilai 1 dan RW bernilai 0. Agar data bisa masuk di memory LCD data dipersiapkan dahulu, lalu harus ada perubahan logika ENABLE dari high ke low, baru data dapat masuk ke LCD.

BIN2ASCII :
MOV B,#100
DIV AB
ADD A,#48
MOV A,B
MOV B,#10
DIV AB
ADD A,#48
MOV A,B
ADD A,#48
ACALL PUT_CHAR
MOV A,#0
RET
Ini adalah rutin untuk mengonversi biner dalam data ASCII yang ditampilkan ke LCD.Dengan membagi data biner dengan 100 maka akan didapat nilai ratusan dari biner tadi, kemudian data sisa pembagian di bagi 10 untuk mendapatkan nilai puluhan dari data biner, terakhir adalah menambah data sisa pembagian dengan 48 untuk mendapat data ASCIInya kemudian ditampilkan dalam LCD.
DELAY:
MOV R5,#70H
DELAY1:
DJNZ R6,$
DJNZ R5,DELAY1
RET
STRING :
DB 'Frekuensi='
STRING2 :
DB 'kHz'
END
Rutin di atas adalah rutin delay dan database kata.


Download Frekuensi.asm

Leave a Reply

Subscribe to Posts | Subscribe to Comments

Entri Populer

tweet

- Copyright © 2013 blog.nitbot.com -Metrominimalist- Powered by Blogger - Designed by Johanes Djogan -