Tag

, , , , ,

Bulan kemarin sudah selesai mengajukan proposal Kerja Praktek. Duh.. paling males deh, padahal robot untuk Tugas Akhir saja belum selesai dibuat. Hah.. ya sudahlah, yang jelas tetap akan dibuat. So.. kemarin mikir-mikir, apa yach yang mau saya kerjain? Akhirnya beberapa hari yang lalu kepikiran juga untuk menyelesaikan tugas kantor untuk proyek Otomatisasi plus mengintegrasikan dengan software ERP (Enterprise Resource Program) yang sudah dibuat sebelumnya.

Rencana untuk Kerja Praktek, saya bakalan mengambil tema Microcontroller. Aplikasinya cuman sekedar counter yang menghitung jumlah barang yang diproduksi oleh masing-masing mesin. Counter dari uC tersebut akan bisa berkomunikasi dengan komputer via RS-232. Nah.. data counter tadi akan digunakan untuk masuk ke data program ERP sehingga bisa digunakan untuk banyak hal. Salah satunya yang bakalan saya sorot adalah untuk penghitungan bonus dari team/karyawan yang bekerja pada suatu mesin. Sehingga kedepan penghitungan bonus tidak lagi melihat arsip-arsip absensi plus data barang yang berhasil terproduksi. Cukup sekali pencet keluar deh tuh bonus team/orang yang dimaksud. Jelas dengan adanya data ini, dapat pula digunakan standar untuk meningkatkan Man Hour-nya ataupun Machine Hour-nya.

Ok.. gak banyak “cing-cong” ini program yang saya tulis di microcontroller-nya menggunakan Text Editor di Linux (Pico), dengan compilernya GCC (Linux). Dan alhamdulillah setelah diujicoba, berhasil berkomunikasi dengan baik dengan sang komputer. Hm… pelan.. pelan.. aja yang penting harus sudah membuat dokumentasinya. ^_^ Besok lanjut lagi memposting program komputernya menggunakan JAVA.

/*
SERIAL5.C
Author        : Insan Sains
Last Modified : 06 Mei 2008
Application   : PRODUCTION COUNTER
Chip uC          : ATMega 8535
Clock Source  : 4 MHz
Compiler      : GCC (Gnu Linux)
--------------------------------------------------------------------
Modul yang digunakan      : DT Combo AVR-51 (Innovative Electronics)
Port input yang digunakan : PORT C (pin 0)
Port output (indikator)   : PORT B
Program ini akan membaca data yang masuk melalui PORT C
(sebagai indikatornya, apa yang dibaca oleh PORT C akan
ditampilkan di PORT B)
Kemudian data ini akan dikirim ke komputer via RS-232
Program ini pula dapat membaca data yang masuk ke uC
Bila data yang diterima oleh uC adalah karakter "R"
maka akan mereset counter.
*/

/* INISIALISASI UNIT YANG DIGUNAKAN */
#include
#include
#include
#include 

/* DEFINISI VARIABLE GLOBAL */
#define F_CPU 4000000UL

/* FUNCTION DAN PROCEDURE YANG DIGUNAKAN */
void delay_ms(unsigned int ms) {
    while (ms) {
        _delay_ms(1);
        ms--;
    }
}

/* PROGRAM UTAMA */
void main(void) {
    /* Inisialisasi USART
    Format Frame : 8 data, 1 stop, No Parity
    USART Receiver = Enable
    USART Transmitter = Enable
    USART Mode = Asynchronous
    */
    UCSRA=0x00;
    UCSRB=0x18;
    UCSRC=0x86;

    /* Tentukan Baud Rate
    USART Baud Rate = 9600 bps
    Untuk Clock Kristal 4 MHz
    Note : Walaupun Baud Rate di uC di set ke 9600 bps
    tapi baud rate di komputer harus 19200 bps
    belum ada penjelasan teknis mengenai hal ini
    yang jelas ketika menggunakan sistem operasi Linux
    hal ini harus diperhatikan.
    */
    UBRRH=0x00;
    UBRRL=0x19;

    /* Inisialisasi port
        PORT B sebagai output
        PORT C (pin 0) sebagai input
    */
    DDRB=0xFF;
    PORTB=0xFF;
    DDRC=0xFE;
    PORTC=0xFE;

    /* Inisialiasi variable yang digunakan */
        unsigned int nilai=0;
    unsigned char mystring[10];
    char ReceivedByte;

    /* ITOA = integer to Array
    perintah untuk mengubah angka ke huruf (dalam bentuk array)
     serial uC hanya menerima & mengirim karakter (bukan angka)
    */
    itoa(nilai,mystring,10);

    /* Looping selamanya */
    int i;
    while(1) {

        /* Lakukan selama tidak ada data yang masuk ke serial uC */
        while ((UCSRA & (1 << RXC)) == 0) {

        /* Bila PIN C aktif (0 karena aktif low), maka aktifkan counter
        kemudian kirim ke komputer melalui serial RS-232
        */
        if (PINC==0xFE){

            // Untuk mengatasi debouncing
            while (PINC==0xFE) {
                delay_ms(25);
            }

            // increment-kan nilai
            nilai++;

            //Pengiriman perkarakter ke USART
            //itoa = integer to array
            itoa(nilai,mystring,10);
            for (i=0; i<=strlen(mystring)-1; i++) {
                UDR=mystring[i];
                loop_until_bit_is_set(UCSRA,UDRE);
            }

            //Menampilkan nilai counter ke port output
            PORTB=~nilai;

            //Ini untuk apa yach?
            //mungkin untuk menunggu kesiapan USART!
            UDR=0x0A;

        } // menutup jika ada data masuk ke PIN C (0)

    }  // menutup selama tidak ada data yang masuk ke USART

    /* Disini berarti ada data yang masuk ke USART uC */

    // Baca data yang masuk ke sebuah variable
    ReceivedByte = UDR;

    // Pastikan data sudah terkirim ke uC
    while ((UCSRA & (1 << UDRE)) == 0) {};

        // Jika ingin menampilkan data yang dibaca oleh uC
        // maka ini harus diaktifkan
        //UDR = ReceivedByte;
        //PORTB = ~ReceivedByte;

        /* Khusus dalam program ini
        Bila mendapatkan karakter "R" maka reset counter
        */
        if (ReceivedByte == 'R') {
            nilai = 0;
            PORTB = ~nilai;
            UDR = '0';
        }
    }
}

Download source code (PDF)

Note : Sebenarnya di AVR sendiri sudah punya fasilitas untuk TImer/Counter, tapi berhubung saya belum mempelajarinya, jadi masih pake cara yang klasik. Kalo ada yang tahu, tolong dibantu ya!