SISTEM MINIMUM 8051

SISTEM MINIMUM 8051
Modul ini berisi perancangan dan contoh implementasi sistem minimum mikrokontroler 8051. Perancangan system itu sendiri nantinya akan terbagi menjadi dua yaitu perancangan perangkat keras (hardware) dan perancangan perangkat lunak (software).
14.1. Perancangan Hardware
Bagian hardware akan dibagi lagi menjadi bagian yang membentuk modul – modul rangkaian. Diantaranya:
Main MCU modul.
Target modul 7 – Segment.
Target modul motor DC.
Target modul motor stepper.
Target modul keypad.
I/O komunikasi serial (dengan PC).
Masing – masing target modul akan bersifat independent dengan pengendalian yang terpusat pada Main MCU. Dengan kata lain semua target modul akan menjadi bagian I/O atau input – output dari Main MCU. Untuk lebih jelasnya dapat dilihat dari diagram blok berikut ini.

Gambar 14.1 Blok Diagram implementasi sistem minimum.

14.1.1 Perancangan Modul Main MCU
Pada modul ini terdapat microcontroller sebagai CPU. Microcontroller yang digunakan adalah keluarga dari MCS’ 51 yaitu AT89C52. Dipilihnya jenis ini dengan alasan bahwa microcontroller ini mempunyai 3 buah Timer / Counter di dalamnya yang masing – masing independent. Pada aplikasi system ini microcontroller akan dioperasikan pada expanded mode. Karena dioperasikan pada mode tersebut maka microcontroller akan membutuhkan External Program Memory (ROM), External Data Memory (RAM), serta tambahan peripheral untuk mengekspansi port I/O nya.

Gambar 14.2 Konfigurasi Expanded Mode AT89C52
Expanded mode pada MCS’ 51 dioperasikan menghubungkan pin EA (External Addressing) IC AT89C52 ke ground. Kemudian microcontroller dirangkaikan dengan IC 74HC573 yang berfungsi sebagai latch alamat A0 – A7 dengan pin ALE sebagai sinyal controlnya..
Pada External Program Memory (ROM) akan dipergunakan IC ROM bertipe 27C512 yang berkapasitas total 64 kb. Dengan kata lain, memory program akan dialokasikan secara maksimal sesuai maksimal pengalamatan memory program AT89C52 dengan pin PSEN pada microcontroller sebagai sinyal control IC ROM. Pada External Data Memory (RAM) akan dipergunakan IC RAM bertipe 62C256 dengan kapasitas total 32 kb.

(b)
Gambar 14.3 Konfigurasi IC Memory. (a) Konfigurasi RAM External. (b) Konfigurasi ROM External.

Pada bagian External Data, pin RD dan WR di pergunakan sebagai sinyal baca dan tulis ke IC RAM 62C256. Pada bagian External Data ini perlu dilakukan address decoding untuk menentukan jangkauan alamat memory data. Address decoding ini dilakukan dengan mengumpankan pin A15 IC microcontroller ke pin CE IC RAM 62C256.

Kapasitas IC RAM 62C256 (sebesar 32Kb) akan menempati jangkauan alamat 0000h-7FFFh. Jika pin A15 IC microcontroller tersebut aktif, maka microcontroller tersebut tidak akan mengakses IC RAM.
Kemudian rangkaian MCU akan ditambahkan dengan IC peripheral, yaitu IC PPI 82C55 (sebanyak 2 buah) untuk mengekspansi port I/O. Alokasi alamat IC 82C55 akan menempati alamat setelah alamat IC RAM yaitu setelah alamat 7FFFh. Masing-masing alamat IC PPI akan dikendalikan oleh bit Address dari pin address microcontroller. Seperti halnya IC RAM kedua IC peripheral ini membutuhkan address decoding. Address decoding ini akan dilakukan dengan mengkonfigurasikan rangkaian microcontroller dan IC decoder 74HC138 dengan pin address microcontroller sebagai input dan sinyal kendali IC decoder tersebut. Selanjutnya IC decoder tersebut akan dipergunakan sebagai address decoding untuk IC – IC peripheral lainnya.

Gambar 14.4 Konfigurasi rangkaian PPI

Seperti pada gambar terlihat bahwa IC PPI 1 akan menempati alamat 1010-XXXX-XXXX-XX00 sampai dengan 1010-XXXX-XXXX-XX11. dan IC PPI 2 akan berada di alamat 1011-XXXX-XXXX-XX00 sampai dengan 1011-XXXX-XXXX-XX11. Penambahan 2 buah IC PPI 82C55 ini akan menghasilkan ekspasi port I/O sebanyak 48 bit. Port I/O ini dihubungkan optional supaya pada aplikasinya bias digunakan sebagai input maupun sebagai output tanpa merubah rangkaian hardware nya.
Jika port digunakan sebagai output, maka komponen yang dipasang adalah IC ULN2803A yang merupakan 8 Darlington array. Dan jika port digunakan sebagai input, maka IC ULN2803A tersebut diganti dengan 8 resistor array sebesar 100?.

(b)
Gambar 14.5 Konfigurasi Port I/O. (a) sebagai ouput. (b) sebagai input.

Selanjutnya pada modul MCU ini akan ditambahkan dengan IC RTC (Real Time Clock) yang berfungsi sebagai pencatat dan penyimpan data tangal dan waktu. Tipe IC RTC yang akan dipakai adalah RTC DS12C887. Seperti pada IC PPI dan RAM, pada IC RTC ini juga dilakukan pengalamatan.
Pengalamatan dilakukan dengan mengumpankan satu buah output IC decoder ke pin CS dari IC RTC. Dan pin AD0 – AD7 RTC dihubungkan ke pin AD0 – AD7 microcontroller. Dengan menghubungkan pin ALE ke pin AS sebagai sinyal control nya.

Gambar 14.6 Konfigurasi rangkaian RTC DS12C887
Seperti yang sudah dijelaskan sebelumnya bahwa, IC RTC ini mempunyai 2 macam bus mode. Yaitu MOTOROLA BUS dan INTEL BUS. Karena dalam aplikasi ini adalah berbasiskan MCS’ 51 dari INTEL maka, pin MOT harus di’floating’ atau di’ground’kan untuk memilih mode bus INTEL.
IC RTC ini juga memiliki jangkauan alamat seperti halnya pada IC RAM dan PPI. Dengan mengkonfigurasikan IC RTC seperti pada gambar maka jangkauan alamat IC RTC adalah 1000 – XXXX – 0000 – 0000 sampai dengan 1000 – XXXX – 1111 – 1111.
Pada modul Main MCU ini juga dilengkapi dengan rangkaian ‘Watch dog’ yang berfungsi sebagai rangkaian pengaman sekaligus reset dari keseluruhan system. Rangakaian ini akan mencegah terjadinya ‘program crash’. Maksudnya, jika hal tersebut terjadi maka rangkaian ini akan otomatis me-reset system dan program akan kembali dari awal. Berikut adalah gambar rangkaiannya.

Gambar 14.7 Rangkaian Watch Dog.

Rangkaian watch dog ini dibuat dengan mengkonfigurasikan IC 74HC123 sebagai detector pulsa yang hilang. Rangkaian ini mendapatkan umpan input dari Port B7 IC PPI 1. Dalam penerapannya, program MCU harus memberikan pulsa secara periodic melalui pin ini. Besarnya minimum lebar pulsa yang harus di berikan bergantung pada harga C dan R external yang dihubungkan dengan IC 74HC123 tersebut. Pada aplikasinya di rangkaian ini lebar pulsa yang harus dikeluarkan adalah ? 1sec (min.).
Output dari rangkaian ini akan diumpankan ke pin RESET IC microcontroller, IC PPI, IC RTC. Dimana RESET IC microcontroller dan IC PPI menggunakan output invert dari 74HC123. Sedangkan RESET IC RTC menggunakan pin output normalnya.

14.1.2 Perancangan Modul 7-Segment.
Modul selanjutnya yang akan di rancang pada aplikasi tugas akhir ini adalah modul display 7 – Segment. Modul 7 – Segment akan dibuat dengan kapasitas 8 digit dan menggunakan metode shift – register SIPO (Serial In Paralel Out). Keunggulan memakai metode ini adalah:
Menghemat Port I/O karena transfer data bersifat serial.
Proses update tidak harus sesegera mungkin secara periodic harus dilakukan.karena data yang ditampilkan akan di’latch’.
Sedangkan metode ini juga mempunyai kelemahan yaitu:
Daya listrik yang dibutuhkan cukup besar karena penyalaan LED setiap digit dinyalakan bersamaan.
Untuk setiap segment LED harus disediakan 1 byte data memory.

Gambar 14.8 Rangkaian Modul 7 – Segment

Pada aplikasi rangkaian ini IC Shift – Register yang digunakan adalah IC 74HC595 yang merupakan IC 8 – bit Shift – Register dengan 3 – State output. Dan tipe 7 – Segment yang dipakai adalah tipe Common Anode.
Pada bagian logic control, serial data diumpakan ke pin 14 (SER) IC 74HC595 (1) sedangkan serial data IC berikutnya mendapatkan umpan dari output QH IC 74HC595 sebelumnya yang merupakan serial data output. Clock diumpankan ke pin 11 (SRCK) IC 74HC595 yang di hubungkan secara parallel dengan IC 74HC595 lainnya. Sedangkan latch diumpankan ke pin 12 (RCK) IC 74HC595 yang selanjutnya juga dihubungkan parallel dengan IC 74HC595 lainnya. Selanjutnya pin E yang merupakan pin aktivasi output dari IC 74HC595 dihubungkan secara permanent ke ‘ground’. Dan pada pin SCLR IC 74HC595 diumpakan ke rangkain power up reset dengan resistor 10K dan capacitor 10uF untuk mendapatkan reset output pada saat power up.
Sedangkan bagian output logic di’drive’ dengan menggunakan IC ULN2803 yang merupakan 8 Transistor Array. Untuk membatasi arus LED maka output IC ULN2803 dipasang resistor seri dengan perhitungan:

Jika menggunakan resistor array sebesar 1K?, dihitung ulang menjadi:

Arus LED sebesar 11,1 mA akan memberikan luminasi cahaya yang cukup terang dan jelas.

14.1.3 Perancangan Modul DC Motor.
Pada aplikasi ini, modul DC motor yang dirancang akan mempunyai parameter pengontrolan yaitu kecepatan dan arah putaran. Pengontrolan kecepatan putar dilakukan dengan metode PWM (Pulse Width Modulation). Dan control arahnya bisa dilakukan dengan membuat rangkaian H – bridge driver.

Gambar 14.9 Rangkaian Driver Motor DC
Untuk men’drive’ arus motor sehingga bisa berputar, maka transistor harus dalam keadaan saturasi. Untuk memberikan keadaan keadaan saturasi tersebut, maka arus basis transistor perlu di tentukan harga minimalnya.
Tipe transistor yang dipakai adalah tipe TIP122, yang mempunyai hfe atau penguatan arus sebesar 1000(datasheet), Icmax = 5A. Namun dalam aplikasi kali ini, arus yang akan mengalir ke motor akan dibatasi sampai dengan 0,5A. dengan kata lain arus yang akan mengalir dari collector ? 1A. Jadi Ib minimal yang harus mengalir adalah:

Untuk memberikan umpan arus basis tersebut, digunakan opto coupler PC817. opto coupler ini mempunyai Vce on saturasi sebesar 0,1 V.

Gambar 14.10 Rangkaian ‘driver’ basis transistor

Jika tegangan saturasi transistor Q adalah ? 1V, maka saat Q1,Q5,Q3 ‘on’ tegangan yang diterima motor adalah:
Vm = 12 – VcesatQ1 – VcesatQ5 – VcesatQ3
= 12 – 1 – 1 – 1 = 9 Volt.
Maka tegangan total c-e opto PC817 dan RA adalah sama dengan tegangan saturasi transistor Q. maka besarnya RA untuk mendapatkan arus basis 0,5mA adalah:

Maka dipilih resistor sebesar 1K supaya tidak menghasilkan arus yang terlalu kecil. Jika harga resistor tersebut dihitung kembali akan menghasilkan arus sebesar:

Gambar 14.11 Skema lengkap ‘driver’ motor

Untuk mengatur arah motor maka dipakai IC 74HC14 untuk melindungi rangkaian dari short-circuit jika transistor yang berdekatan sama – sama ‘on’. Jika motor bergerak ke arah A, maka transistor yang ‘on’ haruslah Q4,Q2,Q3. begitu pula sebaliknya jika kearah B maka Q1,Q5,Q3 yang ’on’. Pin ‘MOTOR ENABLE’ dan ‘MOTOR DIRECTION’ ini kemudian langsung dihubungkan ke output port I/O setelah terlebih dulu di’pull-up’ dengan resistor 10K ke Vcc 5Volt.

14.1.4 Perancangan Modul Motor Stepper.
Modul motor Stepper ini menggunakan motor stepper yang mempunyai 4 buah coil di dalamnya. Dan mampu aktif dengan diberi tegangan 5 Volt / 12 Volt.
Masing masing kutub coil akan langsung dihubungkan ke output port I/O yang berupa output open-colector ULN2803. Tentunya rangkaian motor stepper ini membutuhkan dioda sebagai proteksi dari GGL balik dari coil. Rangkaian selengkapnya adalah.

Gambar 14.12 Rangkaian Stepper Motor driver

14.1.5 Perancangan Modul Keypad.
Modul Keypad yang akan dirancang menggunakan keypad matrix 3X4 line. Dengan konfigurasi ini, maka jumlah digit yang dihasilkan ada 12 kombinasi. Yaitu kombinasi “0” – “9”, “*”, “#”. Setelah dilakukan pengetesan, maka didapatkan rangkaian switch di dalam keypad sebagai berikut.

Gambar 14.13 Rangkaian dalam Keypad Matrix
Output pin – pin keypad tersebut selanjutnya dihubungkan ke output dan input port I/O untuk dilakukan scanning dengan program. Pin 8,7,6 dihubungkan ke ouput I/O port dan yang lainnya ke input I/O port.

14.1.6 Perancangan Komunikasi Serial.
Komunikasi serial yang akan dibuat dalam aplikasi ini adalah jenis komunikasi UART Standard RS232C. Sedangkan koneksinya menggunakan koneksi DB9 female standard PC.

Gambar 14.14 Koneksi data serial dengan DB9 Female

Sedangkan ‘driver chip’nya menggunakan IC MAX232CPE untuk mengkonversi logika TTL ke level RS232C.

Gambar 14.15 Rangkaian ‘Driver-chip’ MAX232CPE
Dari gambar terlihat bahwa, pin TX dari CPU dihubungkan ke pin 11 IC MAX232CPE dan pin 12 IC MAX232CPE dihubungkan ke pin RX CPU. Untuk menghubungkan ke konektor DB9 maka pin 14 IC MAX232CPE dihubungkan ke pin 2 DB9 dan pin 13 IC MAX232CPE diumpankan ke pin 3 DB9.
Untuk rangkaian chipnya, 4 buah kapasitor dirangkaikan seperti pada gambar yang besar kapasitasnya 1 µF sesuai dengan standard RS232C.

14.2 Perancangan Software
Untuk menjalankan aplikasi software yang akan digunakan adalah dengan pemrograman bahasa C. Hal ini bertujuan untuk memudahkan pengguna / user dalam mengaplikasikan modul – modul yang dibuat. Sebagai complier digunakan software “KEIL µVision2”.
Pada prinsipnya, semua instruksi pengolah untuk mengontrol target modul akan dilakukan oleh transfer data melalui port serial. Data dari port serial yang berupa protocol akan diterjemahkan menjadi acuan untuk menjalankan target modul. Selain itu juga, protocol serial ini akan digunakan untuk memilih meu modul target mana yang akan dikontrol.

Gambar 14.16 Alur keseluruhan program

Pada perancangan software ini, dibagi menjadi beberapa bentuk modul software. Mereka adalah:
Pendefinisian variable
Pendefinisian Interrupt
Background program
Routine Serial
Routine Scanning keypad
Routine motor stepper
Routine motor DC
Routine display 7 segment
Routine RTC
Inisialisasi
Fungsi ‘main()’
Pembuatan fungsi – fungsi aplikasi

14.2.1 Pendefinisian Variable
Pendefinisian variable diperlukan untuk mengidentifikasi variable – variable yang akan digunakan, terutama variable yang bersifat ‘xdata’. Variabel ‘xdata’ disini adalah suatu variable yang bersifat external data memory diluar alamat RAM yang merupakan perangkat peripheral seperti port I/O PPI, dan alamat – alamat register RTC.
Dengan mengacu pada perancangan hardware, maka alamat – alamat variable tersebut bisa ditentukan.

#define AT _at_ //membuat nama lain dari _at_
#define ABSOLVAR xdata unsigned char volatile

ABSOLVAR RTC_REG_A AT 0x800A; //variable – variable register RTC
ABSOLVAR RTC_REG_B AT 0x800B;
ABSOLVAR RTC_REG_C AT 0x800C;
ABSOLVAR RTC_REG_D AT 0x800D;
ABSOLVAR RTC_HOUR AT 0x8004;
ABSOLVAR RTC_MINUTE AT 0x8002;
ABSOLVAR RTC_SECOND AT 0x8000;
ABSOLVAR RTC_DAY AT 0x8006;
ABSOLVAR RTC_DATE AT 0x8007;
ABSOLVAR RTC_MONTH AT 0x8008;
ABSOLVAR RTC_YEAR AT 0x8009;

ABSOLVAR IO1PA AT 0x9000;
ABSOLVAR IO1PB AT 0x9001;
ABSOLVAR IO1PC AT 0x9002;
ABSOLVAR IO1CW AT 0x9003; //control word PPI 1

ABSOLVAR IO2PA AT 0xA000;
ABSOLVAR IO2PB AT 0xA001;
ABSOLVAR IO2PC AT 0xA002;
ABSOLVAR IO2CW AT 0xA003; //control word PPI 2

Jadi jika dalam program dituliskan
IO1CW = 0x80;
Maka, alamat 0x9003 yang merupakan register control word dari PPI I diisikan dengan data 0x80.
Karena alamat – alamat diatas adalah alamat dari external peripheral, maka perlu dibuatkan suatu buffer data untuk CPU. Buffer tersebut haruslah bertipe data sama dengan tipe data external peripheral yaitu karakter tak bertanda atau ‘unsigned char’.
unsigned char lcdinstbuff; //buffer untuk instruksi LCD
unsigned char lcddatabuff; //buffer untuk data LCD

unsigned char IO1PAMEM; //buffer untuk Port – port PPI I
unsigned char IO1PBMEM;
unsigned char IO1PCMEM;

unsigned char IO2PAMEM; //buffer untuk port – port PPI II
unsigned char IO2PBMEM;
unsigned char IO2PCMEM;

Variable – variable yang telah didefinisikan tersebut selanjutnya disimpan dengan nama file ‘decoder.h’.
Variable selanjutnya yang perlu didefinisikan adalah variable untuk menampung alamat awal fungsi dan variable acknowledge untuk keperluan watchdog system.
Variable penampung alamat fungsi bertujuan untuk, memudahkan perpindahan looping program. Alamat fungsi yang akan diwakilkan oleh variable tersebut adalah fungsi yang bertipe ‘void’.

typedef void(*PROC)();
//mendefinisikan nama lain dari fungsi bertipe ‘Void’
PROC c,pc; //memndefinisikan nama variable dari ‘PROC’

Nama variable PROC yang akan digunakan di dalam program adalah variable ‘c’ dan ‘pc’. Jadi, jika ingin menjalankan fungsi bertipe void, pemrogram hanya menuliskan.
pc = c = serial_main_menu;
while (1)
pc();

Jika program tersebut dijalankan, maka fungsi yang bernama serial_main_menu() akan dijalankan terus – menerus.
Variabel watchdog system dituliskan dengan tipe data integer. Hal ini untuk mendapatkan flexibilitas waktu eksekusi dari looping program.
unsigned int bkgndwdcnt=0;
Selanjutnya variable – variable tersebut akan di ketik dan disimpan dalam file bernama “main.h”.

14.2.2 Pendefinisian Interrupt
Pada program aplikasi ini, interrupt yang akan digunakan adalah interrupt serial, timer 0, dan timer 1. Ketiga sumber interupsi ini akan diaktifkan secara bersamaan dalam looping program. Penggunaan interupsi secara bersamaan selanjutnya akan diatur menggunakan Interrupt Priority. Mengenai pengaktifan seluruh interupsi (bit EA), akan dilakukan diakhir inisialisasi dan akan dijelaskan pada bagian Inisialisasi.

14.2.2.1 Pendefinisian Interupsi Serial
Penggunaan interupsi serial dalam aplikasi ini dibutuhkan untuk mengatur komunkasi melalui port serial. Komunikasi serial yang akan dipakai dalam aplikasi ini adalah jenis asynchronous dua arah dengan menggunakan serial komunikasi mode 1. Baud rate yang dipakai adalah sebesar 9600 bps. Dalam membangkitkan baud rate tersebut akan dipergunakan timer 2 dari MCU. Penggunaan timer 2 sebagai generator baud rate dipilih karena timer 1 selanjutnya akan dipakai untuk aplikasi yang lain seperti timer 0.
Untuk menggunakan timer 2 sebagai generator baud rate maka pengaturan dilakukan dengan mengakses register T2CON dalam inisialisasi yang ditunjukkan dalam table berikut.

Tabel 14.1 Susunan bit Register T2CON untuk pengaturan baud rate
BIT SIMBOL LOGIKA KETERANGAN
T2CON.7 TF2 0 Bit timer 2 overflow flag
T2CON.6 EXF2 0 External flag
T2CON.5 RCLK 1 Aktifkan receive clock
T2CON.4 TCLK 1 Aktifkan transmit clock
T2CON.3 EXEN2 0 Timer 2 external tidak digunakan
T2CON.2 TR2 1 Jalankan timer 2
T2CON.1 C/
0 Aktif sebagai interval timer
T2CON.0 CP/
0 Mode auto reload

Berdasarkan table diatas, maka nilai yang harus diisikan pada register T2CON adalah 0x34.
Guna mendapatkan nilai dari TL2, TH2, RCAP2L, dan RCAP2H dalam menghasilkan baud rate sebesar 9600 bps, digunakan persamaan.

Dengan Ferq. Oscilator = 22,1184 Mhz, maka persamaannya menjadi.

Jika nilai 65464 dikonversi ke bilangan hexadecimal, maka nilai Timer2Overflow = 0xFFB8 atau FFB8H. Dengan nilai ini maka bisa ditetapkan untuk nilai RCAP2H = TH2 = 0xFF dan nilai RCAP2L = TL2 = 0xB8.
Selanjutnya untuk pemilihan mode serial, digunakan mode 1 yaitu tipe 8-bit UART. Untuk memilih mode tersebut, maka register SCON harus di inisialisasikan seperti dalam table berikut.

Tabel 14.2 Susunan bit Register SCON untuk pengaturan mode 1 serial
BIT SIMBOL LOGIKA KETERANGAN
SCON.7 SM0 0 Serial Port mode bit 0
SCON.6 SM1 1 Serial Port mode bit 1
SCON.5 SM2 0 Serial Port mode bit 0
SCON.4 REN 1 Diset untuk menerima karakter
SCON.3 TB8 0 Transmit Bit ke – 8 tidak digunakan
SCON.2 RB8 0 Receive Bit ke – 8 tidak digunakan
SCON.1 TI 0 Clear flag untuk mengirim
SCON.0 RI 0 Clear flag untuk menerima

Berdasarkan table diatas, maka nilai yang harus diisikan pada register SCON adalah 0x50.
Untuk mengaktifkan interupsi serial maka bit ‘ES’ pada register IE harus diset (ES = 1).
Secara lengkap inisialisasi interupsi serial akan ditunjukkan pada potongan program berikut ini. Selanjutnya fungsi inisialisasi tersebut akan diketik dan disimpan dalam file bernama “serial.c”.

void serialinit()
{
TL2 = 0xb8; // 9600 bps at 22.1184 MHz
TH2 = 0xff; // or 4800 bps at 11.0592 MHz
RCAP2L = 0xb8;
RCAP2H = 0xff;
T2CON = 0x34; // timer2 as baud rate generator
SCON = 0x50; // enable serial com mode1 = 8 bit UART
ES = 1; // enable serial interrupt
}

14.2.2.2 Pendefinisian Interupsi Timer 1
Interupsi timer 1 akan digunakan sebagai aplikasi pewaktu 10 ms. Untuk itu perlu dilakukan inisialisasi pada register TMOD. Mode timer yang digunakan adalah mode 1 yang merupakan mode 16-bit timer.
Tabel dibawah ini menunjukkan pengaktifan bit – bit pada register TMOD untuk mengaktifkan timer 1 dengan pengoperasian mode 1.

Tabel 3.3 Susunan bit Register TMOD untuk pengaturan Timer mode 1
BIT SIMBOL LOGIKA KETERANGAN
TMOD.7 Gate 1 0 Tidak diperlukan control dari luar
TMOD.6 C/
0 Dipilih untuk operasi timer
TMOD.5 M1 0 Mode 1, 16 – bit Timer
TMOD.4 M0 1
TMOD.3 Gate 0 0
Untuk Timer 0
TMOD.2 C/
0
TMOD.1 M1 0
TMOD.0 M0 0

Berdasarkan table diatas maka, nilai yang harus diisikan pada register TMOD adalah 0x10 atau 10H.
Selanjutnya untuk mendapatkan pewaktu interupsi sebesar 10ms atau 0,01s, nilai pada register TH1/TL1 akan dihitung dengan menggunakan perhitungan sebagai berikut.

Dengan menggunakan frekuensi oscillator sebesar 22,1184 Mhz, perhitungannya menjadi.

Jika nilai tersebut di konversikan menjadi bilangan hexadecimal maka akan didapatkan nilai TH1&TL1 = 0xB800 atau B800H. Sehingga untuk nilai register TH1 = 0xB8 dan untuk register TL1 = 0x00.
Untuk mengakifkan interupsi timer 1, bit ‘ET1’ pada register ‘IE’ harus di set (ET1 = 1).
Secara lengkap inisialisasi interupsi timer 1 akan ditunjukkan pada potongan program berikut ini. Selanjutnya fungsi inisialisasi tersebut akan diketik dan disimpan dalam file bernama “timer1.c”.

void timer1init()
{
TMOD |= 0x10; // di’or’kan karena akan dilakukan inisialisasi timer yang lainnya
TH1 = 0xb8;
TL1 = 0x00;
ET1 = 1;
TR1 = 1;
}

Untuk membuat ISR dari interupsi timer 1, perlu dibuat satu fungsi yang bertugas untuk menjalankan instruksi apa saja yang dilakukan pada saat timer 1 overflow. Di badan fungsi tersebut dijalankan program aplikasi yang membutuhkan pewaktuan secara periodic dan juga terdapat instruksi Toggle untuk rangkaian watch dog. Pada akhir fungsi tersebut dituliskan reload dari register TH1 dan TL1. Pejelasan mengenai alur instruksi Toggle watch dog akan dijelaskan pada bagian berikutnya.
void tmr1 (void) interrupt TF1_VECTOR using 2 //ISR Timer 1
{
…………… /////////////////////////////////////////
if (++bkgndwdcnt<300) //
{ // badan fungsi ISR Timer 1
IO1PBMEM ^= 0x80; //
IO1PB = IO1PBMEM; //
} //////////////////////////////////////
TH1 = 0xb8; TL1 = 0x00;
}
Selanjutnya fungsi ISR tersebut akan diketik dan disimpan juga dalam file bernama “timer1.c”.

14.2.2.3 Pendefinisian Interupsi Timer 0
Seperti Timer 1, Timer 0 akan pula diaplikasikan pada program. Hanya saja nilai pewaktuannya sebesar 1ms. Untuk itu perlu dilakukan pula inisialisasi pada register TMOD. Mode timer yang digunakan adalah sama seperti Timer 1 yaitu mode 1 yang merupakan mode 16-bit timer.

Tabel 14.4 Susunan bit Register TMOD untuk pengaturan Timer mode 0
BIT SIMBOL LOGIKA KETERANGAN
TMOD.7 Gate 1 0 Untuk Timer 1
TMOD.6 C/
0
TMOD.5 M1 0
TMOD.4 M0 0
TMOD.3 Gate 0 0 Tidak diperlukan control dari luar
TMOD.2 C/
0 Dipilih untuk operasi timer
TMOD.1 M1 1 Mode 1, 16 – bit Timer
TMOD.0 M0 0

Berdasarkan table diatas maka, nilai yang harus diisikan pada register TMOD adalah 0x01 atau 01H.
Selanjutnya untuk mendapatkan pewaktu interupsi sebesar 1ms atau 0,001s, nilai pada register TH1/TL1 akan dihitung dengan menggunakan perhitungan sebagai berikut.

Dengan menggunakan frekuensi oscillator sebesar 22,1184 Mhz, perhitungannya menjadi.

Untuk pembulatan maka nilai yang diambil adalah TH1&TL1 = 63693 Jika nilai tersebut dikonversikan menjadi bilangan hexadecimal maka akan didapatkan nilai TH1&TL1 = 0xF8CD atau F8CDH. Sehingga untuk nilai register TH1 = 0xF8 dan untuk register TL1 = 0xCD.
Untuk mengakifkan interupsi timer 0, bit ‘ET0’ pada register ‘IE’ harus di set (ET0 = 1).
Secara lengkap inisialisasi interupsi timer 0 akan ditunjukkan pada potongan program berikut ini. Selanjutnya fungsi inisialisasi tersebut akan diketik dan disimpan dalam file bernama “timer0.c”.

void timer0init()
{
TMOD |= 0x01; // di’or’kan karena akan dilakukan inisialisasi timer yang lainnya
TH0 = 0xf8;
TL0 = 0xcd;
ET1 = 1;
TR1 = 1;
}

Untuk membuat ISR dari interupsi timer 0, perlu dibuat satu fungsi yang bertugas untuk menjalankan instruksi apa saja yang dilakukan pada saat timer 0 overflow. Pada akhir fungsi tersebut juga dituliskan reload dari register TH0 dan TL0.

void tmr1 (void) interrupt TF0_VECTOR using 2 //ISR Timer 0
{
…………… /////////////////
…………… //badan fungsi ISR Timer 0
……………. /////////////////
TH0 = 0xf8;
TL0 = 0xcd;
}

Selanjutnya fungsi ISR tersebut akan diketik dan disimpan juga dalam file bernama “timer0.c”.

14.2.3 Perancangan Background Program
Di dalam background program, segala instruksi yang berkenaan dengan kinerja hardware dan alur looping program dikerjakan. Jadi fungsi tersebut harus dijalankan di setiap saat di mana fungsi looping dijalankan. Fungsi ini diberi return type bertipe ‘bit’
Dalam fungsi background ini terdapat isntruksi yang meg’acknowledge’ nilai counter dari proses toggle watch dog yang dikerjakan dalam fungsi interupsi Timer 1. Proses acknowledge ini dilakukan dengan meng’clear’ kan nilai variable ‘bkgndwdcnt’ (bkgndwdcnt=0). Proses ini akan membuat nilai dari variable ‘bkgndwdcnt’ tidak akan sampai pada nilai 300 dan proses toggle akan terus berjalan sehingga rangkaian watch dog tidak akan me’reset’ system. Untuk itu fungsi yang sedang looping harus terus menjalankan fungsi ini paling tidak untuk jeda waktu sekitar 3 detik.
Bagian pengatur looping program memanfaatkan dua buah variable yang bertipe ‘*void’ (pc & c) yang sebelumnya telah didefinisikan di file main.h.

Gambar 14.17 Alur penentuan nilai variable ‘*void’

Dari alur program di atas terlihat bahwa, program akan memberikan nilai return = 1 pada fungsi jika nilai variable pc & c tetap sama atau tidak berubah. Hal ini menjelaskan bahwa didalam looping program yang sedang dikerjakan tidak ada perpindahan looping fungsi.
Jika dari hasil perbandingan nilai pc c maka, dalam looping program terdapat perpindahan looping fungsi. Hal ini membuat nilai return akan sama dengan 0.
bit bkgnd()
{
…………….
…………….
bkgndwdcnt = 0;
if (pc!=c)
{
c = pc;
return 0;
}
else
return 1;
}

Potongan program diatas akan ditulis dan disimpan dalam file bernama main.c. Selanjutnya penjelasan tentang penggunaan fungsi ‘bkgnd()’ dalam aplikasi akan ditunjukkan dalam pembuatan program aplikasi pada bagian selanjutnya.

14.2.4 Perancangan Routine Serial
Prosedur komunikasi serial yang dibuat haruslah dapat menerima dan mengolah karakter huruf dan angka. Untuk itu dalam pembuatan routine ini akan banyak melibatkan operasi karakter. Dengan menggunakan Standart Library dari bahasa C operasi – operasi karakter tersebut akan mudah sekali dibuat.
Protocol serial yang akan dibuat akan disesuaikan dengan target modul yang akan dikontrol. Jadi pengguna akan bisa mengaplikasikan protocol serial sesuai keinginan.
Setiap frame data serial akan disekat menggunakan karakter titik (“.”) dan diakhiri dengan penekanan tombol ENTER (“ ”).

Gambar 14.18 Alur pengolahan data dari port serial
Pada alur program di atas akan terlihat dengan jelas penggunaan dari fungsi interupsi serial. Dalam fungsi ini data akan terima dengan mendeteksi serial flag (RI = 1). Dalam fungsi ini juga akan mendeteksi flag pengiriman data (TI = 1) dan segera meng’clear’ kan flag tersebut. Berikut potongan program dalam fungsi interupsi serial seluruhnya dalam program.
void scommain() interrupt SIO_VECTOR using 2
{
if(RI)
{
scombuf = SBUF;
scomflg |= 1; // byte received. scomflg should be clear
RI = 0;
}
else if(TI)
{
scomflg &= ~(2); // byte has been sent
TI = 0;
}
}

Setelah data diterima, selanjutnya akan ditampung terlebih dulu di array. Kapasitas dari array yang disediakan dalam aplikasi ini adalah 110 byte. Jadi pengguna akan lebih fleksibel dalam membuat protocol instruksi untuk mengontrol masing – masing modul target. Variable array tersebut didefinisikan dengan tipe data ‘unsigned char’.Dalam fungsi interupsi tersebut data tidak langsung dimasukkan dalam array, tetapi ditampung sementara dalam variable ‘scombuf’. Dengan mengaktifkan flag (scomflag |= 1) maka fungsi ‘getcmd()’ selanjutnya akan mengenali adanya penerimaan byte.
Dalam fungsi ‘getcmd()’ tersebut, data yang sudah diterima akan dikirimkan kembali ke PC melalui port serial. Hal ini bertujuan sebagai umpan balik bahwa data sudah diterima oleh MCU.
Pengolahan data akan dilakukan jika dalam penerimaan data dideteksi adanya karakter tombol ENTER yang dalam kode ASCII berkarakter 13H atau 0x13. Berikut adalah potongan program selengkapnya dari fungsi ‘getcmd()’.
void getCmd(void)
{
// check serial
if(!(scomflg & 1))
return;
if(scombuf == 13) // ENTER
{
sendstr("\r\n");
if(scbx)
{
scmdbuf[scbx] = '\0';
scomflg |= 0x04;
}
scbx = 0; //inisialisasi index scombuf untuk memecah frame dari awal
}
else
{
scmdbuf[scbx] = (char)scombuf;
scbx++;
sendch(scombuf);
}
scomflg &= ~1;
}
Dalam fungsi tersebut juga terlihat bahwa setelah karakter ENTER diterima, maka index selanjutnya dari byte array penampung akan diterminasi oleh karakter ‘NULL’ (‘\0’). Fungsi getcmd() ini akan dijalankan terus – menerus, untuk itu fungsi ini akan dijalankan dalam background program (‘bkgnd()’).
Fungsi selanjutnya yang akan digunakan dalam program adalah fungsi ‘parsecmd()’. Fungsi ini bertugas untuk memecah setiap frame data yang dikirimkan.
Seperti yang telah dijelaskan sebelumnya, setiap frame data akan disekat menggunakan karakter titik (“.”) dalam setiap pengiriman data dari PC. Dalam fungsi ini karakter – karakter titik tersebut akan dikenali dan setiap frame data yang diterminasi oleh karakter titik tersebut akan diambil kemudian ditempatkan ke array lain (‘scparsed’) untuk diolah sebagai instruksi atau parameter data.
Terminasi karakter titik kemudian akan digantikan dengan karakter ‘\0’ dalam variable array ‘scparsed’ tersebut. Hal ini bertujuan untuk memudahkan pengolahan instruksi atau data dengan fungsi standar C.
Dari alur program di bwah ini terlihat bahwa fungsi ‘parseCmd()’ digunakan untuk memecah frame data yang dikirim lewat port serial. Hasil dari fungsi tersebut ditempatkan pada array yang bernama ‘scparsed’. Jadi pada penggunaannya, array ‘scparsed’ ini akan harus selalu dibaca oleh program setelah fungsi ‘parseCmd()’ dijalankan. Berikut adalah potongan program fungsi ‘parseCmd()’.
bit parseCmd(void)

Gambar 14.19 Alur fungsi ‘parsecmd()’

{
register bit br = 1;

scp = 0;
while(1)
{
scparsed[scp] = scmdbuf[scbx];
scp++; scbx++;
if(scmdbuf[scbx]=='.')
{
scparsed[scp] = '\0';
scbx++;
return 1;
}
if(scmdbuf[scbx]=='\0')
{
scparsed[scp] = '\0';
if(br) return 1;
return 0;
}
}
return 1;
}

Selain routine mengenai pengolahan data yang diterima, routine lain yang bisa digunakan adalah routine pengiriman karakter dari MCU ke PC. Routine ini harus bisa mengirimkan karakter ke PC secara berkesinambungan melalui port serial.
Untuk mengirimkan byte yang berurutan sekaligus, perlu dibuatkan fungsi yang bisa mengakomodir pengriman data string. Fungsi tersebut akan mengrimkan data array string dari sebuah fungsi jika fungsi tersebut dijalankan dengan memuat argument string di fungsi tersebut.

Gambar 14.20 Alur program pengiriman data serial
Fungsi yang digunakan untuk mengirim data serial tersebut adalah fungsi ‘sendstr’. Fungsi tersebut mempunyai argument yang berupa data string yang kemudian akan dikirimkan ke PC melalui transfer serial.
void sendstr(char* str)
{
register unsigned char i=0;

while(str[i] != '\0')
{
sendch(str[i]);
i++;
}
}
Dari potongan program diatas, jika pemrogram akan mengirimkan data serial maka cukup menuliskan pada contoh.
……..
……..
sendstr(“Universitas Mercu Buana”);

14.2.5 Perancangan Routine Scanning Keypad
Pada salah satu target modul dalam aplikasi ini terdapat penggunaan keypad matrix. Untuk itu perlu dibuatkan suatu routine untuk mengakomodasi pengaturan input dari penekanan tombol pada keypad tersebut.
Pengecekan tombol – tombol pada keypad bisa dilakukan dengan cara memasukkan terminal – terminal dari keypad tersebut ke Port PPI yang bisa difungsikan menjadi input dan output. Dalam hal ini port PPI yang bisa dipakai adalah Port C. Port tersebut akan diinisialisasikan sebagai 4-bit input dan 4-bit output.
Program scanning keypad ini pada dasarnya terbagi atas 2 fungsi. Fungsi pertama berfungsi sebagai pendeteksi tombol yang ditekan dan sekaligus penghilang efek ‘debounce’ dari proses mekanika saklar. Fungsi yang kedua berfungsi untuk melakukan ‘decode’ dari tombol yang ditekan.
Fungsi yang pertama bernama fungsi ‘kphit’. Fungsi ini betipe nilai return bit. Fungsi ini akan bernilai = 0 jika dalam pengecekan tidak ditemukan tombol yang ditekan sedangkan akan bernilai 1 jika ditemukan adanya tombol yang ditekan. Fungsi ini juga melakukan prosedur delay untuk meredam bounce yang terjadi pada proses penekanan saklar.
Untuk memudahkan melakukan routine tersebut, maka dibuat suatu struktur data yaitu ‘Keypad’.

typedef struct _keypad {
unsigned char debouncecnt;
unsigned char flg; //b0=lowdetect; b1=detect finished;
} Keypad;
Keypad keypad;

Inisialisasi di atas mendefinisikan variable ‘keypad’ mempunyai field yaitu ‘debouncecnt’ dan ‘flg’. Field ‘deboucecnt’ bertugas untuk menjalankan counter untuk proses delay debounce. Proses delay ini memanfaatkan Timer 1 untuk penghitungan prescaller nya. Field yang kedua adalah ‘flg’ yang berfungsi untuk sebagai flag status dari proses keseluruhan debounce. Program selengkapnya ditunjukkan oleh potongan program berikut.

bit kphit()
{
IO2PC &= ~rowscan;
IO2PCMEM = IO2PC;
if((IO2PCMEM&0x0F)!=0x0F)
{
if (!(keypad.flg&0x01))
{
keypad.debouncecnt=8;
keypad.flg=0x01;
}
if ((keypad.debouncecnt==0)&&(keypad.flg&0x01))
{
keypad.flg=0x02;
return 1;
}
}
else
{
IO2PC |= 0xF0;
rowscan *= 2;
if (rowscan==0x80)
rowscan=ROW3;
}
return 0;
}

Fungsi yang kedua bernama ‘getch()’. Fungsi tersebut mempunyai nilai return yang bertipe ‘char’. Nilai return tersebut akan merepresentasikan hasil dari penekanan keypad. Nilai yang dihasilkan dari fungsi ini akan menunjukkan karakter dari tombol yang diwakilkan. Karakter tersebut akan bernilai ‘0’ – ‘9’ dan juga karakter ‘*’ dan ‘#’.
Nilai penekanan tombol akan bisa terbaca dari hasil scanning yang dilakukan oleh fungsi ‘kphit()’. Hasil dari scanning tersebut akan di’latch’ dalam variabel memory dan di’masking’. Hasil masking data tersebut akan digunakan untuk memilih karakter yang akan dihasilkan.

Gambar 14.21 Alur pemberian karakter pada fungsi ‘getch’

Fungsi ‘getch()’ ini hanya bisa dikerjakan setelah menjalankan fungsi ‘kphit()’. Jadi dalam aplikasinya fungsi ‘getch()’ ini selalu berdampingan dengan fungsi ‘kphit()’. Berikut adalah potongan program lengkap dari fungsi ‘getch()’.

char getch()
{
char key_in='\0';
unsigned char tempio;

if (!(keypad.flg&0x02))
return key_in;

keypad.flg=0;
tempio = IO2PCMEM&0x0F;
switch (tempio)
{
case LINE1:
switch (rowscan)
{
case ROW3:
key_in = '3';
break;
case ROW2:
key_in = '2';
break;
case ROW1:
key_in = '1';
break;
}
break;
case LINE2:
switch (rowscan)
{
case ROW3:
key_in = '6';
break;
case ROW2:
key_in = '5';
break;
case ROW1:
key_in = '4';;
break;
}
break;
case LINE3:
switch (rowscan)
{
case ROW3:
key_in = '9';
break;
case ROW2:
key_in = '8';
break;
case ROW1:
key_in = '7';
break;
}
break;
case LINE4:
switch (rowscan)
{
case ROW3://'#'
key_in = '#';
break;
case ROW2:
key_in = '0';
break;
case ROW1:
key_in = '*';
break;
}
break;
}

return key_in;
}
Selanjutnya kedua fungsi tersebut bersama variable pendukungnya diketik dan disimpan dalam file bernama ‘Keypad.c’.

14.2.6 Perancangan Routine Motor Stepper
Modul target yang selanjutnya akan dibuatkan routine nya adalah modul motor stepper. Motor stepper yang digunakan dalam aplikasi ini mempunyai jumlah step 200 step untuk satu putaran penuh.
Pada pengontrolan motor stepper ini akan diaplikasikan mode pengontrolan besar sudut dan jumlah step dengan dua arah (CW & CCW). Selain itu mode pengontrolan akan mengaplikasikan mode half-step dan juga full-step.
Dalam pengoperasiannya routine ini juga dapat menentukan perioda pulsa clock yang dipergunakan untuk menjalankan stepper. Jadi dalam pengoperasiannya pengguna dapat menentukan langsung perioda clock yang akan dipakai.
Sebelum membuat routine motor stepper, terlebih dahulu dibuatkan struktur data yang berisikan variable – variable yang digunakan.

typedef struct _steppermotor {
unsigned int stepcount;
unsigned char pulsetm;
unsigned char flg;
} Stepper;

Stepper stepper;

Field stepcount akan digunakan sebagai penghitung jumlah step. Field ini menggunakan tipe data integer sehingga nantinya jumlah putaran yang bisa dilakukan akan bisa mencapai sekitar 100000 derajat putaran.
Field pulsetm berfungsi sebagai variable pewaktuan dari perioda clock yang digunakan. Karena routine ini dijalankan dalam fungsi Timer 0, maka nilai pewaktuan akan mengacu pada nilai perkalian dari 1 ms. Field ini menggunakan tipe data karakter tak bertanda (unsigned char), jadi nilai dari perioda clock maksimum yang bisa dijalankan adalah sekitar 255 ms.
Field flg digunakan sebagai flag dalam routine ini. Flag ini akan menentukan mode kerja dari motor stepper tersebut. Field ini menggunakan tipe data karakter tak bertanda yang dapat memuat 8 – bit informasi flag. Definisi dari informasi setiap bit akan dijelaskan dalam table berikut.
Tabel 14.5 Perincian Field flg dalam routine stepper
BIT Fungsi KETERANGAN
D7 -
Reserved
D6 -
D5 -
D4 -
D3 Mode Torsi 0 = full step, 1 = half step
D2 Update arah putar 0 = inisialisasi bit perputaran, 1 = perputaran berlangsung
D1 Arah putar 0 = CW, 1 = CCW
D0 Enable 0 = motor stop, 1 = aktifkan motor

Dalam pergeseran bit untuk menjalankan motor akan digunakan look up table yang berupa array dari nilai – nilai pergeseran bit. Ada dua jenis Array yang digunakan, yang pertama untuk melakukan putaran full step, sedangkan yang lainnya untuk putaran half step.
const unsigned char steppattern[4] = {0x10,0x20,0x40,0x80};
const unsigned char halfstepattern[8] = {0x10,0x30,0x20,0x60,0x40,0xC0,0x80,0x90};
Putaran dilakukan dengan cara menaik – turunkan nilai index dari array tersebut. Nilai – nilai dari variable array tersebut didasarkan pada konektifitas rangkaian MCU dengan modul motor stepper.

Gambar 14.22 Alur Routine motor stepper

Karena routine motor stepper ini dijalankan pada fungsi Timer maka, seluruh variable local yang digunakan pada routine ini bertipe static. Program selengkapnya mengenai routine motor stepper ini akan ditujukkan oleh potongan program berikut ini. Selanjutnya potongan program berikut dengan semua definisi variable yang digunakan diketik dan disimpan dalam file yang bernama ‘stepper.c’.
void steppermotor_engine()
{
static unsigned int stepper_prescaller=1;
static unsigned int stepcount=0;
static char i=0;

if ((stepper.flg&0x02)&&!(stepper.flg&0x04))
i=0;
else if (!(stepper.flg&0x02)&&!(stepper.flg&0x04))
{
i = stepper.flg&0x08 ? 7 : 3;
}

if (stepper.flg&0x01)
{
stepper.flg |= 0x04;
if (--stepper_prescaller==0)
{
stepper_prescaller = stepper.pulsetm;
IO2PAMEM = stepper.flg&0x08 ? (IO2PAMEM &= ~0xF0) | halfstepattern [i] : (IO2PAMEM &= ~0xF0) | steppattern [i];
IO2PA = IO2PAMEM;
if (stepper.flg&0x02)
{
if (stepper.flg&0x08)
{
if (++i>=8)
i=0;
}
else
{
if (++i>=4)
i=0;
}
}
else if (!(stepper.flg&0x02))
{
if (--i<0)
i = stepper.flg&0x08 ? 7 : 3;
}

if (++stepcount>stepper.stepcount)
{
IO2PAMEM &=~0xF0;
IO2PA = IO2PAMEM;
stepper.flg = 0;
}
}
}
else
{
stepper_prescaller=1;
stepcount=0;
IO2PAMEM &=~0xF0;
IO2PA = IO2PAMEM;
}
}

14.2.7 Perancangan Routine Motor DC
Pada aplikasi selanjutnya akan dibuatkan juga routine untuk menjalankan modul Motor DC. Seperti hal nya motor stepper, routine motor DC ini juga menggunakan pewaktuan Timer 0.
Routine yang akan dibuat akan mengacu pada rangkaian modul motor DC dengan system pengoperasian dengan PWM. Namun dalam routine ini juga akan diberikan pengaturan periode dari pulsa PWM secara manual. Selain itu juga routine yang dibuat akan bisa mengatur arah putaran (CW atau CCW).
Sebagai variable pendukung maka akan dibuatkan struktur data untuk motor DC ini.
typedef struct Mot_DC {
unsigned int period;
unsigned int tm_off;
unsigned int tm_on;
unsigned char flg; //b0 = motor enable; b1 = '0' 0ff, '1' on,
} motorDC;

motorDC motcount;

Field period digunakan sebagai pencatat prescaller waktu untuk memberikan perioda dari pulsa PWM. Field ini bertipe data integer tak bertanda maka waktu perioda maksimum yang bisa digunakan adalah sampai 65,535 detik. Tetapai dalam aplikasi ini perioda tersebut akan dibatasi sampai 500 ms saja.
Field tm_on dan tm_off akan mencatat pewaktuan ‘on’ dan ‘off’ motor. Field tm_on akan mencatat prescaller waktu untuk ‘on’, sedangkan tm_off untuk ‘off’. Kedua field ini bertipe data integer tak bertanda untuk menyesuaikan dengan waktu periode.
Field flg akan digunakan sebagai flag dalam routine. Posisi bit D0 untuk mengaktifkan motor, sedangkan posisi D1 untuk memberi tanda bahwa motor sedang ‘on’ atau ‘off’. Field flg ini bertipe data karakter tak bertanda.

Gambar 14.23 Alur Routine Motor DC
Seperti halnya motor stepper, penggunaan variable local dalam routine ini juga bersifat static variable. Potongan program selanjutnya adalah routine selengkapnya dari motor DC. Kemudian seluruh routine berikut dengan variable yang didefinisikan diketik dan disimpan dalam file yang bernama ‘motor DC.c’.
void MotorDC_engine()
{
static unsigned char motorcnt=0;

if (motcount.flg&0x01)
{
switch (motcount.flg&0x02)
{
case 0x00:
if(motorcnt==0)
{
motorcnt=motcount.tm_on;
IO1PAMEM |= 0x04;
IO1PA = IO1PAMEM;
motcount.flg|=0x02;
}
else
motorcnt--;
break;
case 0x02:
if(motorcnt==0)
{
motorcnt=motcount.tm_off;
IO1PAMEM &= ~0x04;
IO1PA = IO1PAMEM;
motcount.flg&=~0x02;
}
else
motorcnt--;
break;
}
}
else
motorcnt=0;
}

14.2.8 Perancangan Routine display 7 segment
Pada aplikasi tugas akhir ini juga akan dibuatkan routine untuk menjalankan modul 7 segment. Routine yang dibuat akan bisa menampilkan karakter huruf dan angka pada display, namun tak tertutup kemungkinan juga bisa untuk menciptakan berbagai animasi menggunakan 7 segment display.
Sesuai dengan system pada hardware, display 7 segment dinyalakan dengan menggunakan metode shift register. Penyalaan akan dilakukan dengan memetakan sejumlah byte data parallel dari buffer ke buffer lainnya. Buffer pertama digunakan untuk menampung data yang diambil dari look up table. Sedangkan buffer kedua digunakan sebagai hasil pemetaan dan dikeluarkan lewat port PPI.
Buffer pertama berupa array yang berukuran 8 byte data. Ukuran array tersebut menyesuaikan jumlah display 7 segment yang berjumlah 8 digit. Array ini adalah array lapis atas yang diakses langsung oleh program utama jika ingin menampilkan karakter pada display. Urutan byte data pada array akan ditunjukkan oleh gambar berikut.

Gambar 14.24 Susunan data buffer lapis 1 pada display

Buffer kedua bernama ‘dispport’ yang merupakan physical buffer. Data pada buffer ini akan digunakan langsung oleh port untuk menyalakan display. Buffer ini berukuran 64 byte yang masing – masing byte nya akan menyalakan 1 buah segment LED yang memerlukan hanya 1 bit dari masing – masing byte array ini.
Kedua buffer ini selanjutnya dihubungkan oleh sebuah fungsi yang bernama ‘upddisp()’. Fungsi ini bertipe ‘void’ dan bertugas untuk memetakan data pada buffer ‘dispbuff’ ke buffer ‘dispport’.

Gambar 14.25 Alur program fungsi ‘upddisp()’
Berikut adalah potongan program lengkap dari fungsi ‘upddisp()’.
void upddisp()
{
register unsigned char i,j,k,m;

k = 63;
for(i=0;i<8;i++)
{
j=0x01;
do
{
m = dispport[k];
dispport[k] = dispbuff[i] & j? m&~0x20 : m|0x20;

k--;
j *= 2;
}
while (j);
}
}
Data yang diisikan ke buffer ‘dipbuff’ merupakan data dari array look up table yaitu array ‘dis7seg’. Array ini berukuran 128 byte dan berisikan data penyalaan 7 segment yang indexnya disesuaikan dengan format data karakter ASCII yang mungkin untuk ditampilkan pada display 7 segment. Jadi, pengisian buffer ‘dispbuff’ dapat dilakukan dengan meng’copy’ kan data pada array ‘dis7seg’ yang ditentukan indexnya. Seperti pada contoh dibawah ini, pada display akan menampilkan tulisan ‘-LINGGA-’.
dispbuff [7] = dis7seg[‘-‘];
dispbuff [6] = dis7seg[‘L’];
dispbuff [5] = dis7seg[‘I’];
dispbuff [4] = dis7seg[‘n’];
dispbuff [3] = dis7seg[‘G’];
dispbuff [2] = dis7seg[‘G’];
dispbuff [1] = dis7seg[‘A’];
dispbuff [0] = dis7seg[‘-‘];
upddisp();

Selanjutnya, data yang sudah dipetakan ke buffer ‘dispport’ tersebut akan dikeluarkan ke port melalui prosedur sebuah fungsi bernama ‘outport()’. Fungsi ini dijalankan untuk memberikan update penyalaan display 7 segment.
Data dikeluarkan melalui port parallel secara serial sinkron. Setiap data yang dikeluarkan, port membangkitkan sinyal clock. Setelah data terkirim semua sebanyak 64 bit, port juga akan membangkitkan sinyal latch.

Gambar 14.26 Alur program fungsi ‘outport()’
Dari alur diatas maka dapat dibuat fungsi ‘outport yang bertipe ‘void’. Berikut adalah potongan program selengkapnya dari fungsi outport().
void outport()
{
register unsigned char i,ck=0x80;

IO1PC = IO1PCMEM = 0xC0;
for(i=0;i<64;i++)
{
IO1PCMEM &= ~0x20;
IO1PCMEM |= (dispport[i]&0x3F);
IO1PC = IO1PCMEM;
IO1PCMEM ^= ck; IO1PC = IO1PCMEM;
IO1PCMEM ^= ck; IO1PC = IO1PCMEM;
}
ck = 0x40;
IO1PCMEM ^= ck; IO1PC = IO1PCMEM;
IO1PCMEM ^= ck; IO1PC = IO1PCMEM;
}
Fungsi outport tersebut harus dijalankan terus menerus dengan tujuan untuk menjamin keadaan logika dari rangkaian modul 7 segment dapat stabil dalam menyalakan display. Oleh karena itu fungsi outport tersebut akan jalankan pada fungsi ‘bkgnd()’. Selanjutnya seluruh potongan program, inisalisasi variable, dan array look up table ditulis dan disimpan dalam file bernama ‘sevensegment.c’

14.2.9 Perancangan Routine RTC
RTC digunakan sebagai pembangkit data waktu dan tanggal. Untuk mengatur transfer data dari dan ke RTC, perlu dibuatkan satu prosedur untuk menanganinya.
Untuk menampung data – data RTC, dibuatkan satu struktur data untuk RTC. Struktur tersebut akan memuat data – data nilai, alamat dan flag dari setiap register RTC yang digunakan.
typedef struct _RTC_
{
unsigned char value;
unsigned int addr;
unsigned char flg;
} RTC;

#define MAXRTCDATA 14
#define RTCSTADDR 0x8000

#define SECOND 0
#define SECOND_AL 1
#define MINUTE 2
#define MINUTE_AL 3
#define HOUR 4
#define HOUR_AL 5
#define DAY 6
#define DATE 7
#define MONTH 8
#define YEAR 9
#define REG_A 10
#define REG_B 11
#define REG_C 12
#define REG_D 13

Field ‘value’ digunakan untuk menampung data nilai dari RTC itu sendiri. Field ini bertipe data karakter tak bertanda karena data yang akan diakses berkapasitas 8 – bit.
Field ‘addr’ digunakan untuk menampung data alamat dari setiap register RTC. Sesuai dengan perancangan hardware sebelumnya, alamat dari register – register RTC akan menempati jangkauan 0x8000 sampai 0x800D (alamat maksimum register RTC 12C887). Oleh karena itu Field ‘addr’ ini diberi tipe data integer tak bertanda untuk menampung data alamat dari jangkauan tersebut.
Filed ‘flg’ digunakan untuk menyimpan flag dari setiap register RTC yang digunakan. Flag ini merupakan flag dari informasi transfer data RTC ke MCU. Field ini diberi tipe data karakter tak bertanda yang dapat menampung maksimum 8 – bit informasi flag. Bit – 0 dari flag ini digunakan sebagai tanda bahwa register RTC yang diakses perlu diupdate.
Fungsi pertama yang akan dibuat adalah fungsi untuk melaksanakan prosedur inisialisasi dari RTC. Fungsi ini diberi nama ‘initRTC’.Fungsi ini bertugas untuk mengisikan nilai pada register control pada RTC.
Register pertama yang akan diakses adalah register A. Pengaturan bit – bit pada register A akan diperlihatkan oleh table berikut.
Tabel 14.6 Pengaturan bit control dari register A pada RTC
BIT SYMBOL LOGIKA KETERANGAN
D7 UIP 0 Read Only
D6 DV2 0
Membentuk pola 010 untuk mengkatifkan internal oscillator
D5 DV1 1
D4 DV0 0
D3 RS3 0
Square wave Output tidak dipakai
D2 RS2 0
D1 RS1 0
D0 RS0 0

Berdasarkan table diatas maka nilai yang harus diisikan pada register A adalah 20H atau 0x20.
Register selanjutnya yang perlu diakses adalah register B. Pengaturan bit – bit pada register B akan diperlihatkan oleh table berikut.
Tabel 14.7 Pengaturan bit control dari register A pada RTC
BIT SYMBOL LOGIKA KETERANGAN
D7 SET 0 Proses update dibutuhkan
D6 PIE 0 Tidak memakai interupsi periodic
D5 AIE 0 Tidak memakai interupsi alarm
D4 UIE 0 Tidak memakai update interupsi periodic
D3 SQWE 0 Tidak digunakan
D2 DM 1 Mode Binary
D1 24/12 1 Mode 24H
D0 DSE 0 Tidak digunakan

Berdasarkan table, maka nilai yang harus diisikan pada register B adalah 06H atau 0x06.
Sebelum mengatus register control dari RTC tersebut, sebelumnya proses inisialisasi melakukan pengisian alamat masing – masing register pada Field ‘addr’ pada struktur RTC. Selanjutnya pengaksesan pada setiap register RTC bisa dilakukan dengan menggunakan alamat soft code. Program selengkapnya untuk inisialisasi RTC ditunjukkan pada potongan program berikut.
void initRTC()
{
register unsigned char i;
unsigned int startaddr=0;

startaddr = RTCSTADDR;
for (i=0;i //header file untuk SFR CPU 8052
#include //

#include //standard header untuk string control
#include //standard header untuk standard I/O
#include //header untuk fungsi konversi string
#include //header fungsi - fungsi operasi string

#include "decoder.h" //pendefinisian external peripheral e.g PPI, dll
#include "main.h" //pendefinisian variable yang ada di main.C
#ifdef _SERIAL_
#include "serial.c" //fungsi dan interrupt serial ada di sini
#endif
#ifdef _RTC_
#include "RTC.c" //fungsi - fungsi RTC
#endif
#ifdef _KEYPAD_
#include "Keypad.c" //fungsi - fungsi operasi keypad matrix
#endif
#ifdef _sevensegment_
#include "sevensegment.c"//fungsi dan routine 7 segment
#endif
#ifdef _MOTORDC_
#include "motorDC.c" //fungsi dan routine menjalankan Motor DC
#endif
#ifdef _STEPPER_
#include "stepper.c" //fungsi dan routine menjalankan motor stepper
#endif
#include "program_aplikasi.c" // contoh contoh aplikasi program ada disini
#ifdef _EXT0_
#include "ex_int0.c" //fungsi interrupt external0
#endif
#ifdef _EXT1_
#include "ex_int1.c" //fungsi interrupt external1
#endif
#ifdef _TMR0_
#include "timer0.c" //fungsi dan interrupt timer 0
#endif
#ifdef _TMR1_
#include "timer1.c" //fungsi dan interrupt timer 1
#endif

void initPPI()
{
IO1CW = 0x80;
IO2CW = 0x83; //c upper out, c lower in
IO1PCMEM = 0xC0;
IO1PAMEM = IO1PA = 0x00;
IO2PAMEM = IO2PA = 0xF0;
}

void init_utility()
{
P1 = 0x00;
initPPI();
#ifdef _RTC_
initRTC();
#endif
#ifdef _EXT0_
ext0init ();
#endif
#ifdef _EXT1_
ext1init ();
#endif

#ifdef _TMR0_
timer0init();
PT0=1;
#endif
#ifdef _TMR1_
timer1init();
PT1=1;
PT0=0;
#endif
#ifdef _SERIAL_
serialinit();
PT1=0;
PT0=0;
PS=1;
#endif
EA = 1; //enable semua interrupt
}

Dalam fungsi ini juga dituliskan prioritas interupsi. Pada aplikasi ini, prioritas interupsi serial menempati prioritas paling tinggi diikuti interupsi Timer 1 dan Timer 0. Pada akhir inisialisasi sinyal EA untuk meng enable kan semua interupsi diaktifkan.
Selanjutnya pendefinisian Pre-processor dan semua inisialisasi ini ditulis dan disimpan dalam file main.c bersama dengan fungsi bkgnd().

Perancangan Fungsi ‘main()’
Pada fungsi ‘main()’ terletak fungsi program utama. Setelah dilakukan sinyal RESET pada rangkaian, register PC pada MCU akan menuju alamat 0000h dan compiller akan mengatur pelompatan ke fungsi ini secara otomatis.
Pada fungsi ini terdapat pemanggilan fungsi delay untuk menunggu sinyal – sinyal dari rangkaian stabil. Kemudian barulah dilakukan pemanggilan fungsi inisialisasi. Selanjutnya fungsi akan melakukan pemanggilan terhadap looping program utama. Pada aplikasi ini looping program utama akan menuju fungsi aplikasi ‘serial_main_menu()’. Potongan program dari fungsi main() dan fungsi delay() akan ditunjukkan oleh potongan program berikut ini.
void delay()
{
unsigned int i=0xFFFF;
do
{
i--;
}
while (i);
}

main()
{
delay();
init_utility();
pc = c = serial_main_menu;
while (1)
pc();
}
Selanjutnya fungsi main() dan fungsi delay() tersebut ditulis dan disimpan pada file main.c.

14.2.12 Pembuatan fungsi – fungsi aplikasi
Dalam pembuatan fungsi aplikasi ada beberapa hal yang perlu diperhatikan. Diantaranya adalah, penampatan fungsi bkgnd(), dan kerangka pada fungsi aplikasi itu sendiri. Berikut adalah contoh kerangka dari fungsi aplikasi.
void fungsi_aplikasi() small reentrant //menandakan fungsi bersifat reentrant atau recursive
{
…………. //deklarasi variable local yang dipakai

do
{
…………. //badan fungsi
}
while(bkgnd()); //fungsi background ditempatkan disini
………….. //de-inisialisasi fungsi jika keluar dari looping program
}

Fungsi bkgnd() ditempatkan sebagai status dari kondisi ‘do-while’. Kondisi ini akan menyebabkan looping program dalam fungsi aplikasi tersebut akan berakhir dan akan menuju looping program pada fungsi aplikasi lainnya jika pada looping ‘do-while’ terdapat perubahan nilai dari pointer fungsi. Berikut adalah contohnya.
void fungsi_aplikasi_1() small reentrant //Kepala fungsi aplikasi 1
{
…….. //inisialisasi fungsi
do //looping do-while dimulai
{
………………… //badan fungsi
If(…….)
pc = fungsi_aplikasi_2; //looping akan menuju fungsi aplikasi 2
…………
}
While(bkgnd());
}

Jika pada program aplikasi terdapat penulisan seperti diatas maka, looping program akan berpindah dari fungsi_aplikasi_1() ke fungsi_aplikasi_2(). Hal ini bisa terjadi jika kondisi ‘if’ terpenuhi. Jika terjadi hal tersebut maka, pembacaan nilai variable ‘pc’ akan berbeda nilainya dengan variable ‘c’ pada fungsi bkgnd(). Hal itu menyebabkan fungsi bkgnd() akan mengeluarkan nilai ‘0’ atau false dan menyebabkan kondisi ‘do-while’ dalam fungsi aplikasi tidak terpenuhi maka, program akan keluar dari fungsi aplikasi tersebut dan menuju fungsi aplikasi lainnya sesuai yang dituliskan di variable ‘pc’.
Fungsi aplikasi ini bisa dibuat untuk menjalankan modul – modul target yang ada dengan menggunakan pengontrolan dari komunikasi serial PC, serta menggunakan tools dan library yang sudah dibuat. Selanjutnya fungsi – fungsi aplikasi ini dituliskan dalam file program_aplikasi.c.

Untuk dapat merequest file lengkap yang dilampirkan pada setiap judul, anda harus menjadi special member, klik Register untuk menjadi free member di Indoskripsi.

Semua Special Member dapat mendownload data yang ada di download area.
NB: Ada kemungkinan data yang diposting di website ini belum ada filenya, karena dikirim oleh member biasa dan masih menunggu konfirmasi dari member yang bersangkutan. Untuk memastikan data ada atau tidak silahkan login di download area.

CARI CONTENT WEB :

FREE JOURNAL UNTUK MELENGKAPI REFERENSI KARYA ILMIAH ANDA, FREE? KLIK DISINI
HOT DOWNLOAD MAKALAH, FULL PAPER? KLIK DISINI
PELUANG KERJA UNTUK FRESH GRADUATE, MAHASISWA TINGKAT AKHIR, BARU LULUS KULIAH? KLIK DISINI
BUTUH BEASISWA STUDY, BEASISWA PENELITIAN, INFO BEASISWA TERBARU? KLIK DISINI
INGIN KULIAH S2 JARAK JAUH? KLIK DISINI




Jika tertarik untuk memasang iklan di website ini, silahkan klik menu contact
Silahkan baca syarat dan ketentuannya

Design by xactive -