PERANCANGAN TRANSMITTER PADA FLOWMETER PADDLEWHEEL BERBASIS MIKROKONTROLER AT90S2313 LAPORAN TUGAS AKHIR Disusun oleh: Rian Amanda 13200084/C Program studi: Teknik Elektronika DEPARTEMEN TEKNIK ELEKTRO FAKULTAS TEKNOLOGI INDUSTRI INSTITUT TEKNOLOGI BANDUNG 2005
88
Embed
PERANCANGAN TRANSMITTER PADA FLOWMETER · PDF filePERANCANGAN TRANSMITTER PADA FLOWMETER PADDLEWHEEL BERBASIS MIKROKONTROLER AT90S2313 Laporan Tugas Akhir Oleh : Rian Amanda 13200084/Teknik
This document is posted to help you gain knowledge. Please leave a comment to let me know what you think about it! Share it to your friends and learn new things together.
Transcript
PERANCANGAN TRANSMITTER PADA FLOWMETER PADDLEWHEEL
BERBASIS MIKROKONTROLER AT90S2313
LAPORAN TUGAS AKHIR
Disusun oleh:
Rian Amanda
13200084/C
Program studi: Teknik Elektronika
DEPARTEMEN TEKNIK ELEKTRO
FAKULTAS TEKNOLOGI INDUSTRI
INSTITUT TEKNOLOGI BANDUNG
2005
PERANCANGAN TRANSMITTER PADA FLOWMETER PADDLEWHEEL
BERBASIS MIKROKONTROLER AT90S2313
Laporan Tugas Akhir
Oleh :
Rian Amanda
13200084/Teknik Elektronika
Telah diterima dan disahkan untuk memenuhi persyaratan memperoleh gelar
SARJANA TEKNIK ELEKTRO
INSTITUT TEKNOLOGI BANDUNG
Bandung, 5 September 2005
Disahkan Oleh:
Pembimbing I Pembimbing II
Prof .Dr. Ir.Adang Suwandi Ahmad Ir. Syahirul Hakim Ad Dairi
NIP 130672118 NIP 13199525
ABSTRAK
Tujuan tugas akhir ini adalah merancang sistem waktu nyata untuk mengukur laju
aliran (debit) air dalam pipa. Sistem pengukur ini merupakan bagian dari kit sistem
kendali proses. Parameter masukan alat pengukur ini adalah periode dari pulsa yang
dihasilkan sensor paddlewheel. Dalam Tugas Akhir ini diasumsikan sensor paddlewheel
bersifat ideal artinya kecepatan linier paddlewheel sebanding dengan laju aliran.
Data dari sensor akan diolah oleh mikrokontroler dan hasilnya ditampilkan oleh
LCD. Bila mendapat permintaan untuk mengirim data hasil perhitungan maka
mikrokontroler akan mengirimkan hasil perhitungan terakhir kapada alat device) yang
meminta. Alat-alat pada sistem kendali proses ini terhubung satu sama lain melalui sebuah
bus komunikasi serial.
Proses pengambilan data, penghitungan, penampilan LCD, dan komunikasi diatur
oleh program yang disebut kernel hybrid. Kernel hybrid bertugas mengatur kapan tugas-
tugas tersebut dikerjakan berdasarkan kejadian pemicu dan selang waktu. Batas laju aliran
air yang dapat terukur tergantung pada diameter pipa dan frekuensi paddlewheel, adapun
frekuensi maksimum yang dapat diukur adalah 5,8 Hz atau 143.7ml/s.
Kata kunci: debit,system waktu nyata ,kernel hybrid, sensor paddlewheel
i
ABSTRACT
The main purpose of this Final Project is to realize a Real Time System to measure
water volumetric flow rate (debit) in pipe. This system is commonly called “transmitter”
and part of the process control system kit. The period from paddlewheel censor transducer
is measured in order to yield water flow rate value. This final project assumes the
paddlewheel censor is ideal thus the relation between water flow rate and paddlewheel
linear speed is proportional.
Microcontroller will calculate wavelength data from censor, put water flow rate
result to LCD panel and send it to other device when asked through serial communication
bus. All tasks above is managed by hybrid kernel program which responsible to determine
when the task will be executed. Kernel will executed tasks based on their priority so that
the more critical tasks will be guaranteed to be done first and the less priority tasks will be
delayed, nevertheless there is one task which is executed based on its time period that is the
LCD update task.
The maximum paddlewheel frequency that can be measured is 5.8 Hz, which is
proportional to volumetric flow 143.7 mililiter/second when its relation is depend on pipe
diameter and relative velocity distribution across pipe.
Keyword : volumetric flow, real time system, hybrid kernel, paddlewheel censor
ii
KATA PENGANTAR
Puji Syukur kepada Allah SWT penulis ucapkan karena berkat rahmat dan
hidayah-Nya penulis dapat melaksanakan kuliah di kampus hingga mengerjakan tugas
akhir ini dengan baik.
Judul laporan TA ini adalah “perancangan transmitter flowmeter paddlewheel
berbasis mikrokonrtoller AT90S2313”. Laporan ini merupakan hasil pengerjaan Tugas
akhir di Departemen Teknik Elektro ITB, disusun sebagai syarat kelulusan S1 di
Departemen Teknik Elektro ITB. Pada kesempatan ini penulis sudah sepantasnya
mengucapkan terima kasih yang sebesar-besarnya kepada:
• Ibu, Reza dan Lola yang selalu mendukung dan mendoakan penulis selama kuliah
di ITB.
• Pamanku “Ma’ Buwh” yang telah membantu dalam berbagai hal.
• Bapak Prof. Adang Suwandi Ahmad sebagai pembimbing satu, yang telah
meluangkan waktu untuk membantu penulis menyelesaikan Tugas Akhir ini.
• Bapak Ir. Syahirul Hakin Ad Dairi sebagai pembimbing dua, yang telah
memberikan bimbingan dan fasilitas bagi penulis untuk menyelesaikan Tugas
Akhir ini.
• Bapak Ir. Sumasono, yang telah banyak membantu penulis dalam memecahkan
masalah yang terasa pelik bagi penulis.
• Segenap dosen Departemen Teknik Elektro ITB yang berperan besar memberi
ilmu pengetahuan kepada penulis selama kuliah.
• Staf Tata Usaha Departemen Teknik Elektro ITB dan Tata Usaha Laboratorium
Teknik Elektronika ITB.
• Ade Sholihuddin dan Agung Surya yang telah bersama-sama dengan penulis
mengerjakan tugas akhir ini, senang bekerjasama dengan kalian.
• Teman-teman mahasiswa Elektro, khususnya Elektro 2000.
• Teman-teman kos yang konyol-konyol namun dapat diajak bertukar pikiran.
• Seluruh pihak yang telah memberikan bantuan dan dorongan.
Semoga laporan Tugas Akhir ini dapat bermanfaat dan dapat digunakan untuk
pengembangan dan penelitian lebih lanjut. Penulis menyadari terdapat banyak kekurangan
iii
dan kesalahan dalam penulisan laporan ini. Untuk itu penulis menyambut baik kritik dan
saran. Akhir kata penulis memohon maaf bila ada kata-kata yang tidak berkenan. Terima
Kasih.
Bandung, Agustus 2005
Penulis
iv
DAFTAR ISI
ABSTRAK………………………………………………........……………………………..i
ABSTRACT…………………………………………………........………………………...ii
KATA PENGANTAR………………………………………………........………………..iii
DAFTAR ISI…………………………………………………………........……………….iv
DAFTAR GAMBAR………………………………………...……………........…………vii
DAFTAR TABEL………………………………………….……………………........……ix
DAFTAR PERSAMAAN......................................................................................................x
Parameter untuk menghitung debit seperti , dan hanya bisa didapat dari
pengujian. Untuk memudahkan perhitungan diasumsikan nol, maka debit tinggal
bergantung kepada sehingga hubungan antara debit dan frekuensi berbanding lurus.
Jadi untuk mendapatkan debit, konstanta k dikali dengan .
ck ak 0v
0v
ck
ck
Awalnya mikrokontroler mendeteksi transisi naik sinyal input. Timer-1 segera
dinyalakan setelah terdeteksi ada transisi naik dan baru berhenti setelah ada transisi naik
berikutnya. Kemudian nilai count terakhir timer-1 akan diproses sehingga menghasilkan
frekuensi. Cara tersebut peka terhadap bouncing dari sinyal input. Untuk menghilangkan
Bab III Perancangan dan Implementasi 30
pengaruh bouncing harus ditambah delay beberapa saat. Jadi setelah terdeteksi ada transisi
naik maka timer-1 dinyalakan maka tunggu sesaat baru keluar dari rutin interupsi.
Gambar 3.12 Flowchart pengukuran frekuensi paddlewheel
Operasi Pembagian 24 bit FixedPoint
Operasi ini merupakan bagian dari task pengukuran periode Operasi pembagian 24
bit fixed point dipilih karena ukuran kode yang kecil bila dibandingkan dengan operasi
floating point 32bit. Selain ukuran, operasi fixed point memerlukan waktu eksekusi yang
jauh lebih singkat daripada floating point.
Kedua sifat fixed point diatas(ukuran dan waktu eksekusi) cocok
diimplementasikan pada mikrokontroller AT90S2313 karena ukuran flash memory yang
tersedia hanya 2kB dan mikrokontroller harus cukup cepat melakukan operasi
penghitungan karena sistem embedded ini harus dapat menanggapi perubahan input dan
permintaan update data secara real time (event triggered).
Bab III Perancangan dan Implementasi 31
Gambar 3.13 Flowchart operasi pembagian 24 bit fixed point
Konversi Biner ke ASCII
Pada mikrokontroller semua perhitungan terjadi dalam basis 2. Karena isi register
AVR 8 bit maka ada 8 digit biner untuk setiap operasi. Sedangkan untuk keperluan display
dibutuhkan data dalam format decimal, pada display LCD data yang dikiirmkan
menggunakan format ASCII, sehingga data format decimal tadi harus dikonversi dulu
menjadi ASCII. Hal ini dapat dilakukan dengan menambahkan 30h ke tiap digit decimal.
Di bawah ini adalah flowchart konversi 2 byte binary menjadi decimal.
Bab III Perancangan dan Implementasi 32
Gambar 3.14 Konversi 2 Byte Binary ke desimal
Konversi Desimal ke ASCII
Setelah format menjadi desimal selanjutnya format data diubah lagi menjadi
ASCII. Di bawah ini adalah diagram alir (flowchart) konversi decimal ke ASCII
Bab III Perancangan dan Implementasi 33
Gambar 3.15 Konversi Desimal ke ASCII
3.3.3.2 Task Pemeriksaan Data Serial
Pada jaringan RS485 sebuah node akan mengirim data ke semua node lain. Misal
ada 4 node dalam sebuah jaringan, node1 ingin mengirim data ke node3, maka node1
mengirim data melalui bus yang terhubung ke semua node, akibatnya node 2,3,dan4
menerima data yang sama. Jadi tiap data yang dikirim harus berisi informasi node sumber
dan node tujuan. Setiap node hanya menanggapi data untuknya saja. Jadi untuk setiap
pengiriman data disertakan juga alamat pengirim, alamat tujuan dan lain-lain sehingga
menjadi sebuah paket pesan (message). Di bawah ini adalah protokol pesan yang kami
pakai.
Gambar 3.16 Paket data pada protokol
Tabel 3.3 Isi tiap byte pada pesan yang dikirim
Byte Jenis Isi1 Start 2552 Jumlah 5 atau 83 Source ID 1 sd 44 Destination ID 1 sd 45 Command 0 sd 66 Data1 0 sd 2557 Data2 0 sd 2558 Data3 0 sd 2559 Checksum 0 sd 25510 Stop 250
Bab III Perancangan dan Implementasi 34
Tabel 3.4 Keterangan byte command dan byte ID
Command Keterangan Alat ID Alat name 0 Reset 1 Controller 1 Meminta kirim data 2 Valve driver 2 Kirim data 3 Flowmeter 3 Set katup absolut 4 Level meter 4 Buka katup relatif 5 Tutup katup relatif 6 Hentikan katup
200 Checksum error
Prioritas interupsi UART satu tingkat dibawah prioritas tertinggi. Sistem ini harus
cukup tanggap dengan dalam melakukan komunikasi dengan alat (device) lain. Setiap
mendapat interupsi RXC (Receive complete) mikrokontroler akan memeriksa apakah data
yang masuk merupakan byte start, bila iya maka urutan byte selanjutnya akan disimpan di
memori. Setelah semua tersimpan akan diperiksa byte checksum, jika benar akan diperiksa
byte sumber dan tujuan, jika keduanya cocok dilanjutkan dengan memeriksa byte
command apakah minta kirim data atau simpam data ke EEPROM. Jika byte command
berisi perintah minta kirim data maka mikrokontroler akan mengirim urutan byte ke alat
sumber yang berisi data hasil perhitungan. Jika byte command berisi perintah simpan data
ke EEPROM, maka byte data tersebut dicopy dari SRAM ke EEPROM. Jika byte
command bukan keduanya maka command tersebut tidak diproses dan mikrokontroler
kembali menunggu interupsi untuk memeriksa byte start. Di bawah ini adalah Flowchart
pemeriksaan data serial.
Bab III Perancangan dan Implementasi 35
Gambar 3.17 Flowchart periksa komunikasi serial
Bab III Perancangan dan Implementasi 36
3.3.3.3 Task Batas Waktu (time-out) Pengukuran Periode
Task ini dipicu oleh interupsi timer-1 compare match berfungsi membatasi panjang
gelombang yang diukur. Bila transmitter tidak menerima data baru lebih dari satu detik
maka kemungkinan besar paddlewheel memang tidak berputar, atau mungkin transduser
reed switch rusak.
Gambar 3.18 Flowchart batas waktu pengukuran panjang gelombang
Untuk itu perlu rutin yang dapat mendeteksi hal tersebut, yaitu dengan cara
membandingkan isi timer-1 dengan nilai tertentu yang mewakili 1 detik. Frekuensi timer-
1=10800Hz, maka selama 1 detik timer-1 akan menghitung sampai 10800kali. Jadi isi
timer-1 dibandingkan dengan 10800, bila sudah mencapai nilai tersebut maka kernel akan
mengeksekusi task menampilkan ’00,000’ pada LCD.
3.3.3.4 Task Update Display LCD
Task ini berfungsi menentukan kapan update display LCD dilakukan. Bila
interupsi timer-0 overflow terjadi 10 kali maka kernel memeriksa apakah ada perhitungan
baru, bila ada maka hasil perhitungan akan ditampilkan pada display LCD. Pengecekan
‘data baru’ penting karena task update LCD memerlukan waktu sekitar 3 ms untuk
menulis karakter-karakter pada LCD, bila data tidak berubah maka tampilannya di LCD
tidak perlu diubah. Berikut flowchart task interupsi timer-0:
Bab III Perancangan dan Implementasi 37
Gambar 3.19 Task update LCD
Flowchart Inisialisasi LCD
Untuk menggunakan sebuah modul LCD, harus dilakukan inisialisasi terlebih
dahulu untuk menentukan panjang data, jumlah baris LCD yang aktif dan bentuk font.
Inisialisasi dilakukan cukup sekali saja pada pemakaian LCD. Flowchart pada gambar 3.12
menunjukkan proses yang selalu terjadi saat inisialisasi modul LCD dilakukansebelum
masuk ke bagian pengaturan mode. Sistem harus menunggu selama 15 ms atau lebih
setelah catu daya mencapai tegangan 4,5 volt
Bab III Perancangan dan Implementasi 38
Gambar 3.20 Inisialisasi LCD
Setelah proses inisialisasi maka modul LCD siap menerima data untuk ditampilkan
pada layer LCD. Task tulis LCD hanya dieksekusi bila syarat tick timer-0 dan flag tanda
ada hasil perhitungan baru terpenuhi. Berikut flowchart tulis karakter (update) ke LCD:
Bab III Perancangan dan Implementasi 39
Gambar 3.21 Tulis karakter ke LCD
3.4 Alokasi Register dan Memori
AT90S2313 menyediakan 32 byte multipurpose register,128 byte SRAM dan
EEPROM. Register R16-R32 mendukung operasi immediate(seperti CPI, ANDI, dan ORI)
namun tidak demikian register R0-R15. Register R0-R15 hanya mendukung operasi antara
dua register. R16-R32 dapat digunakan untuk operasi yang menggunakan data dari flash
memory.
Register Fungsi R0 Tempat data sementara untuk komunikasi serial R1 R2 R3 R4 R5 R6 R7
Operasi Pembagian
Bab III Perancangan dan Implementasi 40
R8 R9
Konversi Heksa Menjadi Desimal
R10 R11 Checksum R12 R13 R14
Tempat Data dan Alamat EEPROM
R15
R16 R17
Dapat dipakai semua task
R18 R19 R20 R21
Operasi Pembagian (membutuhkan immediate addressing)
R22 R23
Pewaktuan Display LCD
R24 Status INT0 dan UART R25
R26(XL) R27(XH)
Operasi Pembagian (membutuhkan pointer SRAM)
R28(YL) R29(YH)
Pointer SRAM
R30(ZL) R31(ZH)
Pointer SRAM dan Flash(khusus LCD)
Gambar 3.22 Alokasi Register
SRAM digunakan sebagai penyimpan data sementara bila tidak ada tempat lagi di
Register. Proses baca-tulis SRAM membutuhkan pointer untuk menunjukkan alamatnya,
register yang dapat digunakan sebagai pointer SRAM adalah register X,Y, dan Z. SRAM
juga digunakan sebagai tempat penyimpanan stack (informasi saat operasi jump). Stack
dimulai di alamat SRAM paling bawah dan akan mengisi alamat diatasnya bila ada data
baru. Alamat data sementara diusahakan jauh dari alamat mulai stack, jika tidak stack
dapat menimpa data sementara sehingga mengacaukan task yang bersangkutan. Di bawah
E. Source Code Program ;======================================== .include"2313def.inc" .def xm =r1 .def reml =r2 ;remainderl .def remm =r3 .def remh =r4 ;.def divresl=r26 ;division result ;.def divresm=r27 .def divresh=r7 .def rBin2H =r8 ;dipakai rutin division .def rBin2L =r9 .def chs =r11 ;checksum, rutin check_uart .def eep_addr =r13 .def eep_data =r14 ;**************************************** .def temp =r16 ;Multi purpose register,semuanya data sementara .def tempa =r17 ; .def dividendL=r18 ;konstanta .def dividendM=r19 .def dividendH=r20 .def loopcounter=r21 .def tempb =r22 ;untuk counter timer0 overflow isr(tdk boleh diubah) .def statusjuga =r23;utk timing disp lcd .def status =r24 ;penting!!!, dipake ISR ;bit 0 : 0=falling edge ,1 =rising edge ;bit1-7 untuk uart .equ baudrate=11 ;143=4800bps 11=57600 5=115200bps .equ prescale=0x05 ;.equ prescale=0x01 .equ kL =0x30 ;konstanta frekuensi/kecepatan=149970 .equ kM =0xd0 ;kl duty cycle 50% k=5265C0 .equ kH =0x59 .equ mem =0x0060 ;alamat bin2ascii, alamat data lcd .equ uart_address=0x0070 .equ eeprom_address=0x0080 ;tempat konstanta k eeprom di sram ;lcd parameter************************ .EQU ftakt =11059200 ; Frequency STK500 internal clock .EQU cdivtc1 =6875 ; Dibvider for TC1 .EQU cdiv1s =67 ; Divider for 1 s .EQU pLcdPort =PORTb ; LCD connected to PORT A .EQU pLcdDdr =DDRb ; Datenrichtungsregister LCD-Port .DEF rint =R15 ; Interrupt temp register
.EQU cLcdWrite=0b11111111 ; Data direction write the LCD .EQU cLcdDummy=0b00111000 ; Dummy-Function-Word .EQU mLcdRs =0b00000001 ; RS-Bit Mask .EQU bLcdEn =2 ; Enable Bit .EQU c1s =200 ; Wait at start-up time (200 * 5 ms) .EQU c5ms =ftakt/1000 ; 1 ms Wait after each control word .EQU c50us =ftakt/100000 ; 10 us Wait after each char .MACRO enactive nop nop nop nop nop nop nop .ENDMACRO ;**************************************** .cseg .org $0000 rjmp reset .org $0001 rjmp int0_ISR ;external interupt service .org $0004 rjmp tim_comp1 ;buat timeout timer1 .org $0006 rjmp tim_ovf0 ;coop task .org $0007 rjmp uart_rxc ;uart service reset: ldi temp,low(ramend) out spl,temp clr tempb clr statusjuga clr status rcall clear_sram rcall lcd4init rcall port_init rcall init_int0_rising rcall display_mem rcall dispdate rcall load_eeprom ;eeprom->mem rcall init_timer_service rcall start_timer0 ;start timer0 service ldi temp,baudrate ;setting baud rate out UBRR,temp
sbi ucr,7 sbi ucr,4 sei ldi temp,0x31 mov r0,temp rcall b_transmit loop: rjmp loop ;**************************************** int0_ISR: ;(prioritas no 1) sbrs statusjuga,1 rjmp rise1_handler ;status=0 rjmp fall1_handler ;status=1 rise1_handler: rcall start_timer1 ldi temp,20 rise1_delay: rcall LcdDelay5ms dec temp cpi temp,0 brne rise1_delay rcall init_int0_falling ori statusjuga,0b00000010 reti fall1_handler: sbrs statusjuga,2 rjmp belum_fall rjmp rise2_handler belum_fall: ldi temp,1 fall1_delay: rcall LcdDelay5ms dec temp cpi temp,0 brne fall1_delay rcall init_int0_rising ori statusjuga,0b00000100 reti rise2_handler: ldi temp,0x00 ;matiin timer1 utk debugging out TCCR1B,temp in XL,TCNT1L in XM,TCNT1H ;in temp,tcnt1h ;cpi temp,1 ;brlo fall2_deb rcall start_timer1 ldi temp,20 rise2_delay: rcall LcdDelay5ms dec temp cpi temp,0 brne rise2_delay rcall hitung_frekuensi rcall init_int0_falling ori statusjuga,0b00000001 ;brarti udah ada data baru andi statusjuga,0b11111011 ;spy di int selanjutnya meriksa fall dulu
fall2_end: reti fall2_deb: ldi temp,0x05 ;matiin timer1 utk debugging out TCCR1B,temp reti ;**************************************** tim_comp1: ldi temp,0x40 ;timcompare n tim0ov disable out timsk,temp sei rcall nolkan ;rcall start_timer1 ldi temp,0x42 ;timcompare n tim0ov enable out timsk,temp reti nolkan: clr xl clr xh clr divresh ldi temp,5 ldi tempa,0x30 ;isi ram 0060-0065 dengan "0" rcall y_awal clear_2: st y+,tempa dec temp brne clear_2 ;rcall display_mem ;andi statusjuga,0b11111000 ;ulang dari awal clr statusjuga ldi temp,1 or statusjuga,temp ;nandain ada data baru ret ;**************************************** tim_ovf0: ;update tulisan di lcd setiap 0.25s sei ;enable semua interupsi lain wdr inc tempb cpi tempb,10 brsh display_lcd_ok reti display_lcd_ok: sbrs statusjuga,0 ;ada perubahan lambda kalo iya disp mem reti wdr rcall display_mem clr tempb clr statusjuga reti ;**************************************** uart_rxc: sbrc status,1 ;bit1=0-->belum dapat start rjmp tentukanjumlahdata
in temp,udr cpi temp,255 ldi temp,0x00 ;timcompare n tim0ov disable out timsk,temp sei brne check_uart_keluar ori status, 0b00000010 clr tempa rcall uart_sram_init check_uart_keluar: ldi temp,0x42 ;timcompare n tim0ov enable out timsk,temp reti tentukanjumlahdata: sbrc status,2 rjmp simpanSRAM simpanjumlah: in temp,udr mov tempa,temp cpi tempa,9 brsh check_uart_restart1 ori status, 0b00000100 simpanSRAM: in temp,udr st y+,temp dec tempa breq check_uart rcall reenable1 reti check_uart_restart1: andi status,0b11111001 reenable1: sbi ucr,7 sbi ucr,4 ldi temp,0x42 ;timcompare n tim0ov enable out timsk,temp reti check_uart: rcall uart_sram_init andi status,0b11111001 rcall uart_sram_init checksum: clr chs clr tempa ld tempa,y ulangchs: ld r0,y+ add chs,r0 dec tempa cpi tempa,1 brne ulangchs mov r0,chs rcall b_transmit ld r0,y cp chs,r0 brne checksumerror ldi yl,low(uart_address+1) ldi yh,high(uart_address) ld tempa,y+ cpi tempa,1 brne check_uart_restart1
;**************************************** clear_sram: rcall y_awal ldi temp,0x00 ldi tempa,0x6e clear_lagi: st y+,temp dec tempa brne clear_lagi ret port_init: ldi temp,0xff out ddrb,temp ldi temp,0x00 out ddrd,temp ldi temp,0x04 ;ldi temp,0x00 ;tanpa pullup out portd,temp ;sbi portd,2 ret init_int0_falling: ldi temp,0x40 ;INT0: On INT1: Off out GIMSK,temp ldi temp,0x02 ;INT0 Mode: Falling Edge out MCUCR,temp ldi temp,0x40 ;write 1 to erase intf0 out GIFR,temp ret init_int0_rising: ldi temp,0x40 ;INT0: On INT1: Off out GIMSK,temp ldi temp,0x03 ;INT0 Mode: Rising Edge out MCUCR,temp ldi temp,0x40 out GIFR,temp ret start_timer0: ldi temp,prescale ;prescale 1024 out TCCR0,temp ldi temp,0x05 out TCNT0,temp ret start_timer1: ldi temp,0x00 out TCCR1A,temp ldi temp,prescale;prescale ck/1024 out TCCR1B,temp ldi temp,0x00 out TCNT1H,temp ;2^16-10800=0xd5d0 ldi temp,0x00 out TCNT1L,temp ret init_timer_service:
ldi temp,0x42 ;enable timer1 compare n tim0 ovf int out timsk,temp ldi temp,0x2a out OCR1AH,temp ldi temp,0x30 out OCR1AL,temp ret ;**************************************** y_awal: ldi yl,low(mem) ldi yh,high(mem) ret ;**************************************** hitung_frekuensi: clr xh ;rcall load_eeprom ;rcall load_eeprom2reg ldi dividendL,kL ldi dividendM,kM ldi dividendH,kH DIVW21U: ;rutin pembagian 16bit fixed point clr reml clr remm clr remh ldi loopcounter,24 DIVW21U1: lsl dividendL ;R26=dividendL rol dividendM rol dividendH ;R27=dividendH rol reml rol remm rol remh sub reml,xl ;xl=divisorL sbc remm,xm ;xm=divisorM sbc remh,xh ;xh=divisorH brcc DIVW21U2 add reml,xl adc remm,xm adc remh,xh rjmp DIVW21U3 DIVW21U2: sbr dividendL,1 DIVW21U3: dec loopcounter brne DIVW21U1 mov xl,dividendL mov xh,dividendM mov divresh,dividendH adiw xh:xl,50 adiw xh:xl,30 rcall ubahformat ret ubahformat: push zl push zh ldi zh,high(mem) ;initiate z ldi zl,low(mem) rcall Bin2ToAsc5 ;call routine
pop zl pop zh ret Bin2ToDigit: clr temp ; digit count is zero Bin2ToDigita: cp xh,rBin2H ; Number bigger than decimal? brcs Bin2ToDigitc ; MSB smaller than decimal brne Bin2ToDigitb ; MSB bigger than decimal cp xl,rBin2L ; LSB bigger or equal decimal brcs Bin2ToDigitc ; LSB smaller than decimal Bin2ToDigitb: sub xl,rBin2L ; Subtract LSB decimal sbc xh,rBin2H ; Subtract MSB decimal inc temp ; Increment digit count rjmp Bin2ToDigita ; Next loop Bin2ToDigitc: st z+,temp ; Save digit and increment ret ; done Bin2ToBcd5: push xh ; Save number push xl ldi temp,HIGH(10000) ; Start with tenthousands mov rBin2H,temp ldi temp,LOW(10000) mov rBin2L,temp rcall Bin2ToDigit ; Calculate digit ldi temp,HIGH(1000) ; Next with thousands mov rBin2H,temp ldi temp,LOW(1000) mov rBin2L,temp rcall Bin2ToDigit ; Calculate digit ldi temp,HIGH(100) ; Next with hundreds mov rBin2H,temp ldi temp,LOW(100) mov rBin2L,temp rcall Bin2ToDigit ; Calculate digit ldi temp,HIGH(10) ; Next with tens mov rBin2H,temp ldi temp,LOW(10) mov rBin2L,temp rcall Bin2ToDigit ; Calculate digit st z,xl ; Remainder are ones sbiw ZL,4 ; Put pointer to first BCD pop xl ; Restore original binary pop xh ret ; and return Bin2ToAsc5:
rcall Bin2ToBcd5 ; convert binary to BCD ldi temp,4 ; Counter is 4 leading digits mov rBin2L,temp Bin2ToAsc5a: ld temp,z ; read a BCD digit tst temp ; check if leading zero brne Bin2ToAsc5b ; No, found digit >0 ldi temp,'0' ; overwrite with blank st z+,temp ; store and set to next position dec rBin2L ; decrement counter brne Bin2ToAsc5a ; further leading blanks ld temp,z ; Read the last BCD Bin2ToAsc5b: inc rBin2L ; one more char Bin2ToAsc5c: subi temp,-'0' ; Add ASCII-0 st z+,temp ; store and inc pointer ld temp,z ; read next char dec rBin2L ; more chars? brne Bin2ToAsc5c ; yes, go on sbiw ZL,5 ; Pointer to beginning of the BCD ret ; done ;**************************************** ; Transmiting routine b_transmit: sbi portb,3 sbi UCR,txen b_transmit1: sbis USR,UDRE ;is UART transmitter ready? rjmp b_transmit1 out UDR,r0 ;sent out char cbi UCR,txen cbi portb,3 ret ;**************************************** ; Receiving routine b_receive: sbi UCR,rxen b_receive1: sbis USR,RXC rjmp b_receive1 in r0,UDR cbi UCR,rxen ret ;**************************************** dispdate: clr temp ; Set LCD home position ldi ZH,HIGH(2*datet) ; display Date-Text ldi ZL,LOW(2*datet) rcall Lcd4ZTxt ; Display null-terminated string
disptime: ldi temp,0x43 ; LCD Cursor to start of line 2 ldi ZH,HIGH(2*kgs) ; Display Time-Text ldi ZL,LOW(2*kgs) rcall Lcd4ZTxt ; Display null-terminated string ret ; Fertig datet: .DB "Flow=",0x00;,0x00 kgs: .DB " ml/s",0x00;,0x00 koma: .DB ",",0x00 resp: clr temp ; Set LCD home position ldi ZH,HIGH(2*okf) ; display Date-Text ldi ZL,LOW(2*okf) rcall Lcd4ZTxt ; Display null-terminated string ret ; Fertig okf: .DB "ok =",0x00,0x00 ;**************************************** Lcd4Init: rcall y_awal ldi temp,0x30 ;karakter 0 st y+,temp ldi temp,0x30 ;karakter 0 st y+,temp ldi temp,0x30 ;karakter 0 st y+,temp ldi temp,0x30 ;karakter 0 st y+,temp ldi temp,0x30 ;karakter 0 st y+,temp ldi temp,0x20 ;karakter spasi st y+,temp rcall LcdDelay1s ; Wait a second for the LCD ldi temp,cLcdWrite ; Data direction to output out pLcdDdr,temp ldi temp,cLcdDummy ; Dummy to catch LCD rcall Lcd4Set ; send three times with 5 ms delay rcall LcdDelay5ms ldi temp,cLcdDummy rcall Lcd4Set rcall LcdDelay5ms ldi temp,cLcdDummy rcall Lcd4Set rcall LcdDelay5ms ldi temp,0b00100000 ; Function Set to 4 Bit rcall Lcd4Ctrl ; output on the Control Port LCD ldi temp,0b00010100 ; Cursor display shift rcall Lcd4Ctrl
ldi temp,0b00001100 ; LCD on rcall Lcd4Ctrl ldi temp,0b00000110 ; Entry mode rcall Lcd4Ctrl Lcd4Clear: ldi temp,0b00000001 ; Set Lcd Clear rcall Lcd4Ctrl Lcd4Home: ldi temp,0b00000010 ; Set LCD Home Position ; ; Output of temp on the Control-Port of the LCD ; Lcd4Ctrl: push temp ; save byte andi temp,0xF0 ; clear lower nibble rcall Lcd4Set ; output upper nibble pop temp ; restore byte swap temp ; swap lower and upper nibble andi temp,0xF0 ; clear lower nibble rcall Lcd4Set ; output lower nibble rjmp LcdDelay5ms ; done. ; ; Display the packed BCD in temp on the LCD ; Lcd4PBcd: push temp ; Save on stack swap temp ; Higher to lower nibble rcall Lcd4PBcd1 ; Output nibble pop temp ; Restore from stack Lcd4PBcd1: andi temp,0x0F ; Mask upper nibble ori temp,0x30 ; Nibble to ASCII ; ; Display char in temp on the LCD ; Lcd4Chr: push temp ; save char on stack andi temp,0xF0 ; clear lower nibble sbr temp,mLcdRs ; Set RS-Bit rcall Lcd4Set ; output nibble pop temp ; get char from stack swap temp ; swap nibbles andi temp,0xF0 ; clear lower nibble sbr temp,mLcdRs ; Set RS-Bit rcall Lcd4Set ; output nibble rjmp LcdDelay50us ; ready ; ; Send nibble in temp to LCD ; Lcd4Set: out pLcdPort,temp ; Byte to output port nop sbi pLcdPort,bLcdEn ; Set Enable-Bit
enactive ; Delay macro cbi pLcdPort,bLcdEn ; Clear Enable Bit nop ret ; ; Delay by 1 second on start-up ; LcdDelay1s: ldi temp,c1s ; 200 * 5 ms wait LcdDelay1s1: rcall LcdDelay5ms dec temp brne LcdDelay1s1 ret ; ; Delay by 5 ms following each Control Word ; LcdDelay5ms: push ZH ;tdk begitu penting, karena tdk menginterup uart push ZL ldi ZH,HIGH(c5ms) ldi ZL,LOW(c5ms) LcdDelay5ms1: sbiw ZL,1 brne LcdDelay5ms1 pop ZL pop ZH ret ; ; Delay by 50 Microseconds after each Char ; LcdDelay50us: ldi temp,c50us LcdDelay50us1: nop dec temp brne LcdDelay50us1 ret ; ; Display at the position in temp the string starting at Z (null-term.) ; Lcd4ZTxt: sbr temp,0b10000000 ; Set DD-RAM-Adress rcall Lcd4Ctrl Lcd4ZTxt1: lpm ; Get a char tst R0 ; Null-Char? breq Lcd4ZTxtR mov temp,R0 rcall Lcd4Chr ; display the cahr in temp adiw ZL,1 ; next char rjmp Lcd4ZTxt1 ; do it again Lcd4ZTxtR: ret ; Display at the position in temp the string starting at y (null-term.) Lcd4ZMem: sbr temp,0b10000000 ; Set DD-RAM-Adress rcall Lcd4Ctrl Lcd4ZTxt1Mem: dec tempa
ld R0,z+ ; Get a char dec zl tst R0 ; Null-Char? breq Lcd4ZTxtRMem mov temp,R0 rcall Lcd4Chr ; display the cahr in rmp adiw zL,1 ; next char cpi tempa,0 breq Lcd4ZTxtRMem rjmp Lcd4ZTxt1Mem ; do it again Lcd4ZTxtRMem: ret ; Display temp chars from SRAM starting at Z on the LCD ; Lcd4RTxt: mov R0,temp ;R0 is counter Lcd4RTxt1: ld temp,Z+ ;read char rcall Lcd4Chr dec R0 brne Lcd4RTxt1 ret display_mem: clr temp ;Set LCD home position ldi ZH,HIGH(2*datet);display Date-Text ldi ZL,LOW(2*datet) rcall Lcd4ZTxt ;Display null-terminated string ldi tempa,3 ldi temp,0x05 ;alamat ddram(baris 1) ldi zH,HIGH(mem) ldi zL,LOW(mem) rcall Lcd4ZMem ldi temp,0x40 ;LCD Cursor to start of line 2 ldi ZH,HIGH(2*koma) ;Display Time-Text ldi ZL,LOW(2*koma) rcall Lcd4ZTxt ; ldi tempa,2 ldi temp,0x41 ;alamat ddram(baris 2) ldi zH,HIGH(mem) ldi zL,LOW(mem+2) rcall Lcd4ZMem ldi temp,0x43 ;LCD Cursor to start of line 2 ldi ZH,HIGH(2*kgs) ;Display Time-Text ldi ZL,LOW(2*kgs) rcall Lcd4ZTxt ;Display null-terminated string ret
;********************************** eeprom_write: sbic EECR,EEWE ;if EEWE not clear rjmp eeprom_write ; wait more out EEAR,eep_addr ;output address out EEDR,eep_data ;output data sbi EECR,EEMWE sbi EECR,EEWE ;set EEPROM Write strobe ;This instruction takes 4 clock cycles since ;it halts the CPU for two clock cycles nop nop nop nop nop ret eeprom_read: sbic EECR,EEWE ;if EEWE not clear rjmp eeprom_read ; wait more out EEAR,eep_addr ;address sbi EECR,EERE nop nop nop in eep_data,EEDR ret load_eeprom: ;eeprom ke sram ldi yl,low(eeprom_address) ldi yh,high(eeprom_address) ldi tempa,3 ;3 kali loop ldi temp,0x00 ;alamat load_eeprom_lagi: mov eep_addr,temp ;set alamat eeprom rcall eeprom_read st y+,eep_data ;pindahin ke sram 0x0080 dec tempa breq load_eeprom_end inc temp rjmp load_eeprom_lagi load_eeprom_end: ret load_eeprom2reg: ;sram ke register yang dipake rutin division ldi yl,low(eeprom_address) ldi yh,high(eeprom_address) ld dividendH,y+ ;pindahin dari sram ke reg ld dividendM,y+ ;dari sram+1
ld dividendL,y ;dari sram+2 ret ;last edit:19ag05
PERANCANGAN TRANSMITTER PADA FLOWMETER PADDLEWHEEL
BERBASIS MIKROKONTROLER AT90S2313
Rian Amanda, 13200084, Departemen Teknik Elektro, Fakultas Teknologi Industri,
Institut Teknologi Bandung
Abstract - Tujuan tugas akhir ini adalah merancang
transmitter yang real time untuk mengukur laju aliran
(debit) air dalam pipa. Sistem pengukur ini merupakan
bagian dari kit sistem kendali proses. Parameter
masukan alat pengukur ini adalah periode dari pulsa
yang dihasilkan sensor paddlewheel, kemudian diolah
dan hasilnya ditampilkan oleh LCD dan dapat dikirim
melalui bus komunikasi serial. Proses pengambilan
data, penghitungan, penampilan LCD, dan komunikasi
diatur oleh program yang disebut kernel hybrid.
Frekuensi maksimum yang dapat diukur adalah 5,8 Hz
atau 143,7ml/s .
I. PENDAHULUAN Pembuatan kit eksperimenter ini merupakan
pengembangan dari kit yang telah tersedia sebelumnya
di lab LSS. Pengurangan biaya dilakukan dengan
memperkecil ukuran kit dan mengganti bahan
pembuatan namun diusahakan tidak mengurangi
kualitas keseluruhan. Peningkatan performa dilakukan
dengan menambahkan jenis sensor fluida,
menambahkan rangkaian kontroler, menjadikan output
sensor real time, dan memungkinkan kit untuk
dioperasikan melalui komputer.
II. TINJAUAN PUSTAKA 2.1 Metoda Pengukuran Pada Sensor Paddlewheel
Besaran yang diambil dari sensor paddlewheel adalah
frekuensi sinyal akibat buka-tutup reed switch.
2.2 Sistem Tertanam (Embedded System )
Embedded System mempunyai setidaknya
sebuah pemroses yang dapat diprogram (biasanya
dalam bentuk chip mikrokontroler, mikroprosesor, atau
Digital Signal Processor) yang oleh pengguna tidak
dikenali sebagai computer [14].
2.3 Sistem Waktu Nyata ( Real Time System)
Real Time System adalah sistem yang dapat
merespon kejadian di dunia nyata (melalui sensor)
secara langsung [14].
2.3.3 Jenis Real Time System:
Event Triggered System
Event Triggered System merupakan suatu
sistem yang akan mengeksekusi program jika ada
permintaan berupa kejadian (event)[14].
Time Triggered System
Pada Time triggered system prosesor akan
mengeksekusi task dalam rentang waktu tertentu[14].
Time triggered system biasa dikenal dengan nama
cooperative system.
Sistem hibrida (Hybrid System)
Hybrid system merupakan gabungan dari
preemptive system dan cooperative system [12]. Pada
hybrid system terdapat minimal 1 task preemptive dan 1
task cooperative.
2.4 MikrokontrolerAVR AT90S2313
Pertimbangan utama penulis menggunakan
AVR AT90S2313 adalah kecepatan proses, mampunyai
baud rate generator, 2 buah pewaktu, ketersediaan
EEPROM dan harga yang relatif murah.
2.5 Komunikasi serial
Device UART mengubah data dari format 8 bit
menjadi 1 bit per-satuan waktu pada port serial seperti
RS 232 [12]. Alat yang dapat menangani lebih dari 2
node adalah RS 485.
2.6 Display LCD PC1601A [13]
PC1601 adalah modul display LCD dot
matrix dengan konfigurasi 16 karakter dalam satu baris.
Setip karakter dibentuk oleh 8 baris pixel dan 5 kolom
pixel (baris terakhir pixel adalah kursor).
III. PERANCANGAN DAN IMPLEMENTASI Transmitter terdiri dari perangkat keras
(hardware) dan perangkat lunak (software). Diagram
blok transmitter terdapat pada Gambar 1.
Gambar 1. Diagram blok sistem pengukuran laju aliran air Transmitter terdiri dari dua bagian yaitu
implementasi hardware dan perancangan software.
Penulis lebih condong memilih “implementasi
hardware” karena hardware transmitter sederhana dan
banyak diambil utuh dari referensi yang ada.
Penulis lebih condong memilih “perancangan
software” karena software TA ini “dibuat dari nol”
meskipun ada beberapa rutin yang diambil dari
referensi.
3.1 Implementasi Perangkat Keras
Implementasi hardware mengacu pada batasan
masalah pada BAB I, yaitu menekankan pada
minimalisasi biaya pembuatan dengan cara
menggunakan komponen sesedikit mungkin,
menggunakan PCB 1 lapis (single layer). .
3.2 Perancangan Perangkat Lunak
Ada empat task yang dikerjakan
1. Task interupsi eksternal diberi prioritas tertinggi
karena hal utama yang diukur adalah periode dari
sensor. Task ini tidak boleh tertunda oleh task lain.
2. Task komunikasi serial adalah task yang sensitif
terhadap interupsi dari task lain. Bila task sedang
menerima byte dari luar dan terinterupsi maka task akan
gagal memeriksa data serial.
3. Task timeout pengukuran periode dipicu oleh
interupsi timer-1 compare. Bila timer-1 sudah
menghitung selama sedetik maka laju aliran dianggap
nol. Penundaan terlama tidak berarti bila dibanding satu
detik.
4. Task update display LCD dieksekusi berdasarkan
interupsi timer-0. Task update LCD ini dieksekusi bila
interupsi timer-0 sudah terjadi 10 kali dan pada saat itu
ada flag perubahan hasil perhitungan. Penundaan
terlama tidak terlalu terasa bagi mata.
3.3 Implementasi Perangkat Lunak
Pada saat sistem dinyalakan kernel
menginisialisasi port direction, timer interrupt, UART
baud rate, dan modul LCD.
3. 3.1 Task pengukuran periode
Dilakukan dengan mengukur lamanya waktu
antara transisi naik/turun dari sensor. Setelah terdeteksi
ada transisi naik maka timer-1 dinyalakan baru keluar
dari rutin interupsi setelah menunggu sesaat. Flowchart
pengukuran frekuensi paddlewheel dapat dilihat pada
Gambar 2.
Gambar 2. Flowchart pengukuran frekuensi paddlewheel
3.3.2 Task pemeriksaan data serial
Tiap data yang dikirim harus berisi informasi
node sumber dan node tujuan. Paket data protokol ada
pada Gambar 3.
Gambar 3. Paket data pada protokol
Flowchart periksa komunikasi serial dapat
dilihat pada Gambar 4.
Gambar 4. Flowchart periksa komunikasi serial
3.3.3 Task batas pengukuran periode
Task ini dipicu interupsi “timer-1 compare
match” berfungsi membatasi periode yang diukur. Bila
transmitter tidak menerima data baru lebih dari satu
detik maka kemungkinan besar paddlewheel memang
tidak berputar.
3.3.4 Task update display LCD
Task ini berfungsi menentukan kapan update
display LCD dilakukan. Bila interupsi timer-0 overflow
terjadi 10 kali maka kernel memeriksa apakah ada
perhitungan baru, bila ada maka hasil perhitungan akan
ditampilkan pada display LCD.
BAB IV. PENGUJIAN DAN ANALISIS 4.1 Pengujian karakteristik reed switch pada
berbagai macam frekuensi
Pengujian ini dilakukan untuk, megetahui karakteristik
sensor reed switch seperti bentuk sinyal terhadap
frekuensi paddlewheel. Untuk menguji hal ini, kedua
kaki reed switch dihubungkan ke resistor pull-up.
4.1 Pengujian dengan masukan dari pembangkit
sinyal (Goodwill Instrument GFG-80220G).
Pengujian ini untuk mensimulasikan masukan
dari sensor. Sebelum pengujian dilakukan, penulis
menambahkan waktu tunda (delay) pada program
pengukur periode untuk mengurangi efek bouncing.
Pembangkit sinyal
Alat ukur
osiloskop
Gambar 5. Skema pengujian dengan pembangkit sinyal
Penulis mengasumsikan hasil ukur osiloskop
(Scopemeter PM9750) paling akurat diantara 3 alat di
atas. Bila pembangkit sinyal menunjukkan 2 Hz maka
seharusnya alat ukur menunjukkan setengahnya yaitu.
Hasil pengujian alat ukur dengan masukan sensor
terdapat pada Tabel 1 dan secara grafik pada Gambar 6. Tabel 1. Perbandingan hasil ukur osiloskop dengan hasil alat ukur
Sampel Hasil Ukur Osiloskop(Hz)
Hasil Ukur
Alat (Hz)
1 0.952381 0.937
2 1.4285714 1.348
3 1.9047619 1.891
4 2.3809524 2.355
5 2.8571429 2.851
6 3.3333333 3.389
7 3.8095238 3.752
8 4.2857143 4.33
9 4.7619048 4.83
10 5.2380952 5.389
y = 1.0379x - 0.1037
0
1
2
3
4
5
6
7
0 2 4 6
Hasil ukur osiloskop
Hasi
l uku
r ala
t
Series1Linear (Series1)
Gambar 6. Kurva hasil ukur alat vs hasil ukur osiloskop
Dari Gambar 6 didapat persamaan:
Hasil Ukur = 1,0379 fmasukan – 0.1037..........................1
Persamaan 1 dipergunakan untuk menghitung keluaran
ideal pengukur yang akan dijadikan referensi dalam
perhitungan galat (error) pengukuran. Galat
pengukuran dapat dihitung dengan persamaan.2. Hasil