Pemrograman USART Pada Mikrokontroler AVR (AVR Studio 4)

Universal Asynchronous Receiver/Transmitter

Suatu waktu mungkin kita akan membutuhkan beberapa mikrokontroler untuk saling berkomunikasi atau berkomunikasi dengan dengan perangkat lain seperti PC dalam perancangan sistem elektronika. USART bisa dijadikan salah satu pilihannya.

Penggunaan USART untuk komunikasi antar mikrokontroler adalah dengan menghubungkan pin RX pada TX lawan dan pin TX pada RX lawan. Begitu pula jika mikrokontroler berkomunikasi dengan PC. Akan tetapi, karena level teganan pada PC berbeda dengan mikrokontroler maka dibutuhkan suatu rangkaian untuk menyesuaikannya. Biasanya digunakan rangkaian standar RS232.

EXAMPLE

Deklarasi library

#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <stdint.h>

Library bisa ditambahka sesuai kebutuhan penggunaan.

___________________________________________________________________

Fungsi Inisialisasi USART

void USART_Init( )
{
// Set baud rate

// Operating Mode Asynchronous Normal mode (U2X = 0)
// Equation for Calculating UBRR Value UBRR = (fosc/16BAUD) – 1

//fosc 4MHz UBRR = 25 Desimal = 19 Hex

UBRRH=0x00;
UBRRL=0x19;
//UCSRA

// Bit 7 – RXC: USART Receive Complete 0

// Bit 6 – TXC: USART Transmit Complete 0

// Bit 5 – UDRE: USART Data Register Empty 0

// Bit 4 – FE: Frame Error 0

// Bit 3 – DOR: Data OverRun 0

// Bit 2 – PE: Parity Error 0

// Bit 1 – U2X: Double the USART transmission speed 0

// Bit 0 – MPCM: Multi-processor Communication Mode 0

UCSRA=0x00;

//UCSRB

// Bit 7 – RXCIE: RX Complete Interrupt Enable 0

// Bit 6 – TXCIE: TX Complete Interrupt Enable 0

// Bit 5 – UDRIE: USART Data Register Empty Interrupt Enable 0

// Bit 4 – RXEN: Receiver Enable 1

// Bit 3 – TXEN: Transmitter Enable 1

// Bit 2 – UCSZ2: Character Size 0

// Bit 1 – RXB8: Receive Data Bit-8  0

// Bit 0 – TXB8: Transmit Data Bit-8 0
UCSRB=0x18;

//UCSRC

// Bit 7 – URSEL: Register Select 1

// Bit 6 – UMSEL: USART Mode Select 0 Asynchronous Operation

// Bit 5:4 – UPM1:0: Parity Mode 0|:0 Disabled

// Bit 3 – USBS: Stop Bit Select 0 1-bit

// Bit 2:1 – UCSZ1:0: Character Size 1:1 8-bit

// Bit 0 – UCPOL: Clock Polarity 0
UCSRC=0x86;
}

___________________________________________________________________________________

Fungsi USART  RECEIVE

unsigned char USART_Receive( void )
{
// Wait for data to be received
while ( !(UCSRA & (1<<RXC)) );
// Get and return received data from buffer
return UDR;
}

____________________________________________________________________________________

Fungsi USART TRANSMIT

void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) );
/* Put data into buffer, sends the data */
UDR = data;
}

____________________________________________________________________________________

Pseudo code komunikasi USART

#include library

void inisialisasi_USART(){…}

unsigned char USART_receive(){…}

void USART_transmit(){…}

int main(void)
{

inisialisasi_USART();

unsigned char data_terima = USART_receive();

unsigned char data_kirim;

USART_Transmit( data_kirim )

}

Daftar Pustaka:

Datasheet atmega8, Atmel Corporation, http://www.atmel.com.

Table 52. Equations for Calculating Baud Rate Register Setting
Operating Mode
Equation for Calculating
Baud Rate(1)
Equation for Calculating
UBRR Value
Asynchronous Normal mode
(U2X = 0)
Asynchronous Double Speed
Mode (U2X = 1)
Synchronous Master Mode
BAUD
fOSC
16(UBRR + 1)
= ————————————– UBRR
fOSC
16BAUD
= ———————– – 1
BAUD
fOSC
8(UBRR + 1)
= ———————————– UBRR
fOSC
8BAUD
= ——————– – 1
BAUD
fOSC
2(UBRR + 1)
= ———————————– UBRR
fOSC
2BAUD
= ——————– – 1

109 Responses to Pemrograman USART Pada Mikrokontroler AVR (AVR Studio 4)

  1. Pingback: Aplikasi Komunikasi Serial pada PC Menggunakan Visual C# 2010 / Express « WanGReadY

  2. amak yunus says:

    wah bagus nih. bisa gak mas dimuat secara lengkap baik dari sisi slave mapun masternya untuk program sederhana. trims

    • wangready says:

      Klo sya biasanya pke sprti ini, utk program yg terhubung dg hyperterminal PC. Mikro menerima data lalu mengirim data yg sama ke PC. Utk pengaturan master slavenya bisa disesuaikan:
      #include
      #include
      #include
      #include

      void USART_Init( )
      {
      // Set baud rate

      // Operating Mode Asynchronous Normal mode (U2X = 0)
      // Equation for Calculating UBRR Value UBRR = (fosc/16BAUD) – 1

      //fosc 4MHz UBRR = 25 Desimal = 19 Hex

      UBRRH=0×00;
      UBRRL=0×19;
      //UCSRA

      // Bit 7 – RXC: USART Receive Complete 0

      // Bit 6 – TXC: USART Transmit Complete 0

      // Bit 5 – UDRE: USART Data Register Empty 0

      // Bit 4 – FE: Frame Error 0

      // Bit 3 – DOR: Data OverRun 0

      // Bit 2 – PE: Parity Error 0

      // Bit 1 – U2X: Double the USART transmission speed 0

      // Bit 0 – MPCM: Multi-processor Communication Mode 0

      UCSRA=0×00;

      //UCSRB

      // Bit 7 – RXCIE: RX Complete Interrupt Enable 0

      // Bit 6 – TXCIE: TX Complete Interrupt Enable 0

      // Bit 5 – UDRIE: USART Data Register Empty Interrupt Enable 0

      // Bit 4 – RXEN: Receiver Enable 1

      // Bit 3 – TXEN: Transmitter Enable 1

      // Bit 2 – UCSZ2: Character Size 0

      // Bit 1 – RXB8: Receive Data Bit-8 0

      // Bit 0 – TXB8: Transmit Data Bit-8 0
      UCSRB=0×18;

      //UCSRC

      // Bit 7 – URSEL: Register Select 1

      // Bit 6 – UMSEL: USART Mode Select 0 Asynchronous Operation

      // Bit 5:4 – UPM1:0: Parity Mode 0|:0 Disabled

      // Bit 3 – USBS: Stop Bit Select 0 1-bit

      // Bit 2:1 – UCSZ1:0: Character Size 1:1 8-bit

      // Bit 0 – UCPOL: Clock Polarity 0
      UCSRC=0×86;
      }

      unsigned char USART_Receive( void )
      {
      // Wait for data to be received
      while ( !(UCSRA & (1<<RXC)) );
      // Get and return received data from buffer
      return UDR;
      }

      void USART_Transmit( unsigned char data )
      {
      /* Wait for empty transmit buffer */
      while ( !( UCSRA & (1<<UDRE)) );
      /* Put data into buffer, sends the data */
      UDR = data;
      }

      int main(void)
      {
      unsigned char data_buff;
      USART_Init( );

      while(1)
      {
      data_buff = USART_Receive();
      USART_Transmit(data_buff );
      }
      return 1;
      }

  3. Hyan Tandra says:

    mas, saya mau tanya cara membuat interface USART dengan rangkaian pengiriman data melalui transmisi inframerah gimana ya???
    saya udah searching” tp masih bingung memulai codingnya dr mana???
    Mohon bantuaan..
    Makasih..

    • wangready says:

      Klo untuk komunikasi dgn perangkat lain yg berbasis inframerah, ada baiknya awal2 diketahui dulu parameter USART-nya yang ada pada perangkat inframerah. Misal baudrate, parity bit, apakah signalnya dimodulasi atau tidak. Mungkin bisa dicoba dengan pertama-tama menangkap sinyal yang dikirim perangkat tersebut lalu dilihat pada osiloscop. Dengan begitu bisa dianalisis bentuk sinyal yang digunakan parameternya seperti apa. Mkn bisa dilihat pada site berikut tentang transmisi pada remote TV. http://www.sbprojects.com/knowledge/ir/sirc.htm

  4. dontchange says:

    klo saya punya inputan dari keypad dan menampilkannya di LCD lalu dikirim ke PC bagaimana alurnya yaa mas??mohon pncerahan thx

    • wangready says:

      Bisa dicoba alur berikut.
      1.Scan keypad: kirim logic ke baris keypad, lalu scan pada kolom dengan input mikrokontroler. Lakukan pada setiap baris dan jangan lupa tambah nilai delay (kira2 300ms) sebagai nilai tunggu agar mikro tidak mendeteksi input terlalu cepat (jeda). Dengan begitu maka input tombol keypad sudah didapat. Aksi dari scan tadi bisa diapresiasikan berupa nilai tertentu pada sebuah variabel, misal tipe data int, dengan nama keypad. Jika angka 1 yang ditekan maka kita set nila keypad = 1, dst.
      2.Tampilkan hasil input tadi pada LCD. Setelah kita dapatkan nilai variabel yang kita dapatkan dari scan keypad, maka data dari variabel tadi bisa kita tampilkan pada LCD. misal lcd_printf(“%d”, keypad);
      3.Kirim data dari mirokontroler ke PC, bisa menggunakan UART untuk serial RS232. Data keypad tadi dikirim ke PC. misal: pintf(“%d”,keypad);. Untuk mengujinya, data yang diterima pada PC bisa dicapture menggunakan aplikasi hyperterminal.
      4.Jangan lupa, agar mikrokontroler berada terus dalam kondisi pengecekkan, maka semua proses tersebut berada dalam perulangan while(1).

      • Hendratno says:

        mas kalo kirim banyak karakter sekaligus gimana?
        karakter yang diinputkan dari keypad, ditampung terlebih dahulu. kemudian dengan satu tombol, digunakan untuk mengirimkan data yang ditampung tadi.

      • wangready says:

        misal sudah ada fungsi keypad nya mode interrupt dan mikro akan mengirim pada saat ditekan ‘#’…
        char data[32];
        int i;
        .
        .
        .
        while(1)
        {
        for(i=0;i<32;i++)
        data[i] = 0; //clear semua data
        for(i=0;i<32;i++)
        {
        data[i]=baca_keypad();
        if(data[i]=='#')
        {
        data[i] = 0;
        break;
        }
        }
        puts(data);
        }

  5. S-PHI-T says:

    kalo perintah lcd_printf() itu yang harus di”include” itu headernya apa ya???

  6. S-PHI-T says:

    tolong dong tampilin 1 program sederhana yang memakai perintah lcd_printf()…!!! Misalnya buat nampilin hasil dari 7 dibagi 3…. Makasih

    • wangready says:

      #include “lcd_lib.h”
      #include <stdio.h

      int main(void)
      {
      uint8_t buff[33],a =7,b =3;
      double c;
      LCDinit();

      c = (double)a/(double)b;
      sprintf(buff,"c = %.5f",c);
      LCDstring(buff,33);
      while(1);
      return 0;
      }

  7. Riand ... says:

    MAS ,,, Mw tanya … hehe ..

    Sya buat sistem parkir sederhana menggunakan kamera dan barrier gate (motor servo) dengan ATmega16…

    KASUS :

    Sya udah buat GUI dengan VC# 2008 dan saya ingin eksekusi semua perintah (capture image kamera Real Time, pengenalan pola dan save to DB) dari tombol fisik yang ada di mikrokontroler …
    Untuk image hasil capture cam selanjutnya akan saya proses untuk pengenalan pola plat kendaraan dan jenis kendaraan dan hasilnya ditampilkan pada sebuah LABEL di form yang sama…
    Apabila semua hasil sudah di tampilkan maka akan di simpan dalam database (sql server 2005 ED) …

    ALUR KERJA SISTEM :

    TOMBOL FISIK (push) –> MIKRO –> PC ( eksekusi GUI event – capture camera, recognition & save to DB) –> MIKRO –> SERVO (Barrier Gate – open gate)

    PERTANYAAN SAYA :

    1. Bagaimana cara untuk mengEKSEKUSIi semua TASK di GUI tsb dari mikro oleh sebuah TOMBOL FISIK ??

    2. Tapi sebelum semua eksekusi perintah si GUI terpenuhi (picture box, texbox, etc = not null), maka GUI TIDAK AKAN mengirim perintah kembali ke mikro untuk membuka barrier gate (servo) !!!

    3. Bagaimana cara MENGIRIM perintah ke mikro untuk mengGERAKkan servo (open gate), setelah semua terpenuhi ???

    Mohon bantuannya Mas …

    Boleh juga bila ada SOURCE CODE + Alur Kerjanya (step by step tutorial) …
    Klo’ tidak merepotkan minta tolong di kirim ke e-Mail saya (riand.saputra@gmail.com) ya Mas …

    Makasih atas perhatiannya Mas …

    • wangready says:

      mngkin artikel berikut bisa membantu https://wangready.wordpress.com/2011/02/12/aplikasi-komunikasi-serial-pada-pc-menggunakan-visual-c-2010-express/.
      jawab:
      1. PC menerima data. data tersebut dicek saja menggunakan aplikasi timer. mungkin bisa diset untuk memeriksa buffer data yg datang tiap 100ms. Semua proses bisa disimpan di bagian timer saja.
      2. bagian membuka gate, bisa ditaro di akhir kode yg disimpan di bagian timer.
      3. perintah bisa berupa kode saja. lebarnya kalo tidak salah cuma bisa 7 bit dari PC. coba saja misal, kirim huruf ‘a’ untuk buka dan ‘b’ untuk tutup, nanti berarti yg diterima di mikro adalah bilangan ascii nya yaitu 97=0x61=’a’ dan 98=0x62=’b’, nanti oleh mikro diterjemahkan lagi untuk mengirim pwm ke servo (jika servo analog).
      semoga bisa membantu…

  8. robotgedex says:

    mau tanya ni mas,,,
    saya bikin program dgn komunikasi usart,,
    gimana ya mas caranya saat saya tekan huruf “a” di keyboard saya beri comand ke mikro untuk mengambil data sensor suhu menggunakan port ADC mikro.
    lalu saat saya tekan tombol keyboard “b”, pengiriman melalui USART berhenti, tidak lagi mengirim.
    saya udah coba ambil data sensornya, tapi belum bisa memberi perintah “berhenti” untuk mengambil data suhu nya…
    mohon bantuanya mas….
    triima kasih baanyaak….

    • wangready says:

      klo agan pake CodevisionAVR mungkin bisa dicoba kode berikut.

      unsigned char data_receive; //deklarasi kan variabel ini
      .
      .
      .
      while(1)
      {
      /* Wait for data to be received */
      while ( !(UCSRA & (1<<RXC)) )
      {
      if(data_receive == 'a')putchar(read_adc(0));//jika 'a' kirim data dari adc 0
      else if(data_receive == 'b');//jika 'b' diam
      }
      data_receive=UDR;/* Get received data from buffer */
      }

      kode ini bersumber dari datasheet ATmega8535, url atmel.com/Images/doc2502.pdf, di halaman 155…

  9. agan2 mohon bantuannya yah..saya mw bikin program buat kompresi citra digital yg formatnya bmp pk algoritma huffman..stelah dkompresi, citra digital itu nantinya akan disteganografikan dgn data suhu dgn metode LSB..saya pake mikon atmega 8535..agan2 ada yg tau source code buat code vision avr nya gak??atau mungkin agan2 ad yg punya cara yg lbh gmpg utk pengaplikasiannya??kyk pk arduino atau ap gt??mohon saran nya..makasih..

    • wangready says:

      mikon atmega nya cuman buat ngambil data suhu aja ya buat dikirim ke PC?
      biasanya kalo sensor suhu pake LM35. koneksinya pake ADC. cuman setau saya responnya lambat. yg cepet mah bisa pake Thermal Array TPA81. koneksinya pake I2C.

  10. Lintang says:

    mas contoh di atas untuk mengirim data dg hyperterminal PC. Mikro menerima data lalu mengirim data yg sama ke PC,.

    bila saya menggunakan 2 mikro,.
    mikro 1 membaca data adc,.
    mikro 2 menampilkan data adc pada lcd karakter,.

    2 mikro tersebut memanfaatkan uart untuk berkomunikasi,.

    yang sudah saya lakukan, pada penerima tidak mau menampilkan data adc,.

    bisa kasih contoh code untuk uart berkomunikasi data adc,. sehingga bisa tampil pada lcd karakter,.

    thanks,.

    • wangready says:

      pastikan konfigurasi uart nya gk ketuker, Tx1 ke Rx2, Tx2 ke Rx1, disilang…
      kalo pake kompiler codevisionAVR, misal:
      mikro 1:
      while(1)
      {
      putchar(read_adc(0));//kirim nilai ADC0 melalui serial
      delay_ms(500);//menunggu mikro 2 mengeksekusi data dan LCD
      }
      mikro 2:
      while(1)
      {
      sprintf(kata,”adc= %d”,getchar());//membuat data string
      lcd_clear();//bersihkan layar lcd
      lcd_gotoxy(0,0);//set koordinat
      lcd_puts(kata);//kirim karakter ke LCD
      }

  11. imam says:

    mas saya mau nanyak,,kalau saya mau mengirim 2 data dari mikro ke PC secara bersamaan gmn ya cara nya??
    misal saya mau mengirim data yang berasal dari ADC0 dan ADC1 dimana kedua data ini berbeda tapi saya mau mengirim nya secara bersamaan dan nanti nya dapat saya tampilkan hasil konversi data nya di kolom(combo box) yang berbeda pada software saya??? kebetulan saya pakai VB.6 dan saya ingin menggunakan USB sebagai media pengiriman data nya

    mohon bantuan dan pencerahan nya mas

    thanks

    • wangready says:

      kirimnya perpaket aja mas, coba liat postingan ini https://wangready.wordpress.com/2012/06/25/transmit-data-paket/ , trus nanti pas nerima di PC nya baru diuraikan kembali datanya, klo saya biasanya intinya datanya diberi kepala data, baru kemudian data yang penting mengikuti, misal data ke-1 buat ADC0 dan ke-2 berikutnya ADC1…
      atau bisa juga dibuat sekali kirim, caranya ADC0 dan ADC1 datanya yang diambil hanya 4 bit MSB(most significant bit), mengurangi sedikit resolusi data, kemudian digabung, baru setelah diterima PC diuraikan lagi….
      misal mengirim dari mikro…
      data = (read_adc(1)&0xF0)|((read_adc(0)&0xF0)>>4);
      putchar(data);
      dan nanti data di PC diolah lg…
      data_adc0 = (data_receive&0x0F)<<4;
      data_adc1 = data_receive&0xF0;
      dengan catatan semua data adalah uint8 atau unsigned char, 8 bit….

  12. mikro says:

    mas, saya mau nanya, rencana nya data ATmega 16 sy mw kirim k kmputer dengan wireless, apa beda coding nya dengn d atas???? dan bgmn cara mngecekny d komputer kl sdh terhubung k kmputer??? mksh mas.

    • wangready says:

      kalo dari kodingan nya sepertinya sama saja, cuma yang dimodif kan media transfer datanya dari kabel jadi radio, jadi itu berkaitan dengan hardware…..kecuali kalau pake modul elektronik lain yang punya protokol data yang berbeda, biasanya punya format setting khusus yang dijelaskan di datasheet…kalau mas pake codevision code USART nya bisa digenerate otomatis, kalo yang di atas pake software AVR Studio 4, AVR GCC, harus diketik manual…untuk mengecek data yang masuk port serial di komputer bisa pake aplikasi hyperterminal, bisa juga dicek aja pake osiloskop di pin USART nya…

  13. Bahrul Ulum says:

    mas… saya ada problem dengan problem dengan program yang saya buat, mohon dikoreksi dmna letak kesalahan n solusinya.

    program yg saya buat fungsinya untuk mengirim dan menerima data antar mikro pake sensor YS-1020UA sebagai kominikasi antar mikronya. aplikasinya gini mas :
    robot A dihidupkan, program seperti kompas, jarak,dll terkeksekusi dengan baik. begitu juga saat mengirimkan data A ke robot B, tanpa ada masalah. namun pada robot B, ketika dihidupkan untuk pertama kalinya, program lain seperti kompas, jrk, dll nggak bsa berjalan. saat robot B menerima data dari robot A, dapat diterima dgn baik oleh robot B namun tetap nggak bsa jalankan program lain setelah menerima data tersebut; listingnya kyk gini mas :

    Robot A
    while(1)
    {
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf(“welcome”);

    for(a=0;a<5;a++)
    {
    buzzer=1;
    delay_ms(100);
    buzzer=0;
    delay_ms(100);
    }
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("A");
    delay_ms(500);
    putchar('A');

    start :
    baca_kompas();
    sensor_jarak();
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf(kata);
    lcd_gotoxy(0,1);
    lcd_putsf(kata2);
    delay_ms(50);

    maju(255,255);

    goto start;
    };

    }

    Robot B :
    while(1)
    {
    cd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("welcome");

    for(a=0;a<5;a++)
    {
    buzzer=1;
    delay_ms(100);
    buzzer=0;
    delay_ms(100);
    }

    start :
    baca_kompas();
    sensor_jarak();
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf(kata);
    lcd_gotoxy(0,1);
    lcd_putsf(kata2);
    delay_ms(50);

    maju(255,255);

    if(getchar()=='A')
    {
    buzzer=1;
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf("A");
    delay_ms(1000);
    buzzer=0;
    delay_ms(500);
    }

    goto start;
    };
    }

    nah, mohon koreksinya mas…

    • wangready says:

      mas, programnya mas saya gk ngerti soalnya yang transmit sama receive nya cuma ada putchar(“A”) sama getchar(“A”) sedangkan fungsi yg lainnya mas gk posting, kalo kasus robot B gk bisa jalan itu karena robot B menunggu data yang dikirim dari robot A, dikarenakan mas sepertinya pake fungsi UART receive interupt jadi robot B tidak akan menjalankan program lain sebelum data diterima, dan proses ini terus berulang dengan interval waktu (sela waktu transmit robot A + waktu delay getchar di robot B) kira2 seperti itu analisa saya, atau klo gk mas langsung aja ngambil data di register UDR nya jd gk usah pake mode UART receive interupt…
      saran saya, mas ngirim data nya pake protokol, terserah protokolnya apa aja, biar datanya gk tertukar, kalo yang saya udah buat, mas bisa pake ini https://wangready.wordpress.com/2012/06/25/transmit-data-paket/ tinggal panggil aja fungsinya…trus saran lain, kalo bisa program nya dibuat seperti multitasking gtu, biar fungsi kontrol gk terganggu dengan fungsi komunikasi, yg fungsi kontrol bisa disimpan pada fungsi timer interupt overflow, kalo yg komunikasi bisa disimpan di while(1) di main program, metode itu saya dapat dari program modul kontrol posisi HB25 punya parallax klo gk salah….

      • Bahrul Ulum says:

        iya mas…program yang saya buat memang seperti itu, program tersebut saya buat berdasarkan contoh program yg hanya berfungsi mengirim dan mnerima karakter dari mikro A ke mikro B yg di tampilkan pada LCD. di situ hanya dibuat sperti ini mas :

        – Tombol di PORTD.2 jika ditekan maka alat 1 mengirim karakter X
        – Jika alat 2 menerima huruf X maka akan menyalakan relai di PORTC.0
        mikro A:
        #include
        #include

        void main(void)
        {

        unsigned char input;

        PORTC=0x00;
        DDRC=0xFF;

        PORTD=0x00;
        DDRD=0x00;

        UCSRA=0x00;
        UCSRB=0x18;
        UCSRC=0x86;
        UBRRH=0x00;
        UBRRL=0x47;

        while (1)
        {
        input=getchar();
        if(input==’X’) {
        PORTC.0=1;
        }
        }
        }

        mikro B:
        #include
        #include

        void main(void)
        {
        PORTD=0x00;
        DDRD=0x00;

        UCSRA=0x00;
        UCSRB=0x18;
        UCSRC=0x86;
        UBRRH=0x00;
        UBRRL=0x47;

        while (1)
        {
        if(PIND.2==0) {
        putchar(‘X’);
        }
        }
        }

        namun sebenarnya saya ingin membuat program yg bisa mengendalikan robot A atau B, tapi pada saat belum terima data dari robot A atau B, masing2 robot tetap jalankan programnya sendiri. yang mau sya kirimkan data pada komunikasi dua robot ini adalah data kompas dan sensor jarak mas. nah klo mas tadi bilang fungsi lain nggak saya posting saya kurang paham hehe, soalnya memang hanya seperti itu program yg saya buat. klo fungsi USARTnya saya nggak pake interrupt,jd pd settingan di codevision hnya mencentang receiver n transmitter aja. tlg mas bagaimana cara memprogramnya agar kontrol kedua robot nggak terganggu dengan komunkasinya. yg sederhana aja mas msalnya robot A mengirimkan karakter ‘C’ ke robot B, maka robot B akan berbelok ke kanan, begitu juga sebaliknya. namun jika kedua robot belum saling berkomunikasi, maka tetap jalan sesuai programnya masing2…. makasih mas sebelumnya

      • wangready says:

        mas, ini metode yang saya dapat dari kontroller HB-25 untuk membagi tugas kontrol dan komunikasi, kode di bawah ini hanya contoh aja untuk mengaktifkan LED via serial menggunakan karakter A,B,C. saya menggunakan fungsi UART interupt, timer0 interupt overflow. selebihnya mungkin mas bisa modifikasi sesuai kebutuhan.

        /*****************************************************
        Chip type : ATmega8535
        Program type : Application
        Clock frequency : 11.059200 MHz
        Memory model : Small
        External SRAM size : 0
        Data Stack size : 128
        *****************************************************/

        #include

        // Alphanumeric LCD Module functions
        #asm
        .equ __lcd_port=0x15 ;PORTC
        #endasm
        #include

        #define RXB8 1
        #define TXB8 0
        #define UPE 2
        #define OVR 3
        #define FE 4
        #define UDRE 5
        #define RXC 7

        #define FRAMING_ERROR (1<<FE)
        #define PARITY_ERROR (1<<UPE)
        #define DATA_OVERRUN (1<<OVR)
        #define DATA_REGISTER_EMPTY (1<<UDRE)
        #define RX_COMPLETE (1<<RXC)

        // USART Receiver buffer
        #define RX_BUFFER_SIZE 8
        char rx_buffer[RX_BUFFER_SIZE];

        #if RX_BUFFER_SIZE<256
        unsigned char rx_wr_index,rx_rd_index,rx_counter;
        #else
        unsigned int rx_wr_index,rx_rd_index,rx_counter;
        #endif

        // This flag is set on USART Receiver buffer overflow
        bit rx_buffer_overflow;

        // USART Receiver interrupt service routine
        interrupt [USART_RXC] void usart_rx_isr(void)
        {
        char status,data;
        status=UCSRA;
        data=UDR;
        if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
        {
        rx_buffer[rx_wr_index]=data;
        if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
        if (++rx_counter == RX_BUFFER_SIZE)
        {
        rx_counter=0;
        rx_buffer_overflow=1;
        };
        };
        }

        #ifndef _DEBUG_TERMINAL_IO_
        // Get a character from the USART Receiver buffer
        #define _ALTERNATE_GETCHAR_
        #pragma used+
        char getchar(void)
        {
        char data;
        while (rx_counter==0);
        data=rx_buffer[rx_rd_index];
        if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
        #asm("cli")
        –rx_counter;
        #asm("sei")
        return data;
        }
        #pragma used-
        #endif

        // USART Transmitter buffer
        #define TX_BUFFER_SIZE 8
        char tx_buffer[TX_BUFFER_SIZE];

        #if TX_BUFFER_SIZE<256
        unsigned char tx_wr_index,tx_rd_index,tx_counter;
        #else
        unsigned int tx_wr_index,tx_rd_index,tx_counter;
        #endif

        // USART Transmitter interrupt service routine
        interrupt [USART_TXC] void usart_tx_isr(void)
        {
        if (tx_counter)
        {
        –tx_counter;
        UDR=tx_buffer[tx_rd_index];
        if (++tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
        };
        }

        #ifndef _DEBUG_TERMINAL_IO_
        // Write a character to the USART Transmitter buffer
        #define _ALTERNATE_PUTCHAR_
        #pragma used+
        void putchar(char c)
        {
        while (tx_counter == TX_BUFFER_SIZE);
        #asm("cli")
        if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
        {
        tx_buffer[tx_wr_index]=c;
        if (++tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
        ++tx_counter;
        }
        else
        UDR=c;
        #asm("sei")
        }
        #pragma used-
        #endif

        // Standard Input/Output functions
        #include

        unsigned char data_terima;
        // Timer 0 overflow interrupt service routine
        interrupt [TIM0_OVF] void timer0_ovf_isr(void)
        {
        //disini masukan semua kode untuk aktivitas kontrol
        if(data_terima == ‘A’)
        {
        PORTA.0 = 1;
        PORTA.1 = 0;
        PORTA.2 = 0;
        printf(“huruf A diterima\n\r”);
        }
        else if(data_terima == ‘B’)
        {
        PORTA.0 = 0;
        PORTA.1 = 1;
        PORTA.2 = 0;
        printf(“huruf B diterima\n\r”);
        }
        else if(data_terima == ‘C’)
        {
        PORTA.0 = 0;
        PORTA.1 = 0;
        PORTA.2 = 1;
        printf(“huruf C diterima\n\r”);
        }
        else
        {
        PORTA.0 = 1;
        PORTA.1 = 1;
        PORTA.2 = 1;
        printf(“diam\n\r”);
        }
        }

        // Declare your global variables here

        void main(void)
        {
        // Declare your local variables here

        // Input/Output Ports initialization
        // Port A initialization
        // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
        // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
        PORTA=0x00;
        DDRA=0xFF;

        // Port B initialization
        // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
        // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
        PORTB=0x00;
        DDRB=0x00;

        // Port C initialization
        // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
        // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
        PORTC=0x00;
        DDRC=0x00;

        // Port D initialization
        // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
        // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
        PORTD=0x00;
        DDRD=0x00;

        // Timer/Counter 0 initialization
        // Clock source: System Clock
        // Clock value: 10.800 kHz
        // Mode: Normal top=FFh
        // OC0 output: Disconnected
        TCCR0=0x05;
        TCNT0=0x00;
        OCR0=0x00;

        // Timer/Counter 1 initialization
        // Clock source: System Clock
        // Clock value: Timer 1 Stopped
        // Mode: Normal top=FFFFh
        // OC1A output: Discon.
        // OC1B output: Discon.
        // Noise Canceler: Off
        // Input Capture on Falling Edge
        // Timer 1 Overflow Interrupt: Off
        // Input Capture Interrupt: Off
        // Compare A Match Interrupt: Off
        // Compare B Match Interrupt: Off
        TCCR1A=0x00;
        TCCR1B=0x00;
        TCNT1H=0x00;
        TCNT1L=0x00;
        ICR1H=0x00;
        ICR1L=0x00;
        OCR1AH=0x00;
        OCR1AL=0x00;
        OCR1BH=0x00;
        OCR1BL=0x00;

        // Timer/Counter 2 initialization
        // Clock source: System Clock
        // Clock value: Timer 2 Stopped
        // Mode: Normal top=FFh
        // OC2 output: Disconnected
        ASSR=0x00;
        TCCR2=0x00;
        TCNT2=0x00;
        OCR2=0x00;

        // External Interrupt(s) initialization
        // INT0: Off
        // INT1: Off
        // INT2: Off
        MCUCR=0x00;
        MCUCSR=0x00;

        // Timer(s)/Counter(s) Interrupt(s) initialization
        TIMSK=0x01;

        // USART initialization
        // Communication Parameters: 8 Data, 1 Stop, No Parity
        // USART Receiver: On
        // USART Transmitter: On
        // USART Mode: Asynchronous
        // USART Baud rate: 9600
        UCSRA=0x00;
        UCSRB=0xD8;
        UCSRC=0x86;
        UBRRH=0x00;
        UBRRL=0x47;

        // Analog Comparator initialization
        // Analog Comparator: Off
        // Analog Comparator Input Capture by Timer/Counter 1: Off
        ACSR=0x80;
        SFIOR=0x00;

        // LCD module initialization
        lcd_init(16);

        // Global enable interrupts
        #asm(“sei”)

        while (1)
        {
        //disini hanya kode untuk komunikasi
        data_terima = getchar();
        };
        }

  14. Irwan says:

    Salam Kenal…

    Saya ingin membuat interface antara pc dengan mikon ATMEGA 8535, saya belum mengetahui untuk proses pengambilan data dengan banyaknya data lebih dari 1 byte…
    contoh kasus:
    1. Saya ingin mengambil data dari pc untuk diproses di mikon (2 byte data), 1 byte full saya gunakan di PORT C, 1 byte lg saya hanya memerlukan 2 bit terendah untuk diproses.. kira-kira alur proses pemrogramannya seperti apa, dan kalau boleh disertakan dengan contoh program di cvAVR…

    terima kasih sebelumnya

    • wangready says:

      mas kirim aja pake data string, nanti diubah/diolah lg pake mikro. selain itu, bisa juga buat alamat. jadi misal untuk data pertama diawali huruf ‘a’, data kedua diawali huruf ‘b’.
      misal,akan menerima data dengan lebar uint8, perhatikan tabel ASCII, dan gunakan receive interrupt setting:

      kirim data dari pc: ‘a252b1′ maka, di mikro data_PORTC=252 dan data_proses_lain=1; dengan catatan data dikirim berulang dari PC dengan interval waktu menggunakan timer kira2 1 ms

      unsigned char data_buffer[3];
      unsigned char data_PORTC,data_proses_lain;

      while(getchar()!=’a’);
      data_buffer[0] = getchar();
      data_buffer[1] = getchar();
      if((data_buffer[1]>57)&&(data_buffer[1]57)&&(data_buffer[1]57)&&(data_buffer[1]57)&&(data_buffer[1]<48))
      {
      data_buffer[2] = data_buffer[1];
      data_buffer[1] = data_buffer[0];
      data_buffer[0] = '0';
      goto next2_data;
      }
      next2_data:
      data_proses_lain = ((data_buffer[0]-48)*100) + ((data_buffer[1]-48)*10) + (data_buffer[2]-48);

  15. Sukardi says:

    mas, saya mau nanya, rencana nya data ATmega saya mw ditampilkan ke layar Monitor tapi dari pc ke mikronya pake wireless….
    bisa bantu ngga’ gimana programnya..

  16. Bahrul botic says:

    mas,,, gmna cara memprogram dua buah USART kyk di mega128? USART0 untuk ngambil data GPS dan USART1 untuk komunikasi dengan wireless? Yang USART0 hanya pake fungsi getchar-nya saja, sedangkan USART1 pake dua2nya yaitu getchar n putchar… kalo bisa di codevision aja mas, listingnya yg sederhana aja hanya sebagai contoh mas…!

    truzs bagaimana cara mengirim dan menerima data seperti kompas d gps secara wireless mas?

    bagaimana cara kirim data ‘Z’ tapi nggak trus menerus, cuman sekali aja pengiriman data ‘Z’ tadi?

    mohon pencerahannya….

    maaf sudah mengganggu dan ngerepoti mas ,,,, hehe

    • wangready says:

      agan pake wirelessnya apa, kalo yg mempunyai output serial tentu enak buat pemrogramannya…
      mas tinggal setting aja pada saat bikin new project di code wizard, setting USART0 dan satunya pake interupt, nanti akan otomatis ter-generate code/fungsi USART nya. Jadinya putchar() –> untuk mengirim Tx0, getchar() –> untuk menerima Rx0, putchar1() –> untuk mengirim Tx1, getchar1() –> untuk menerima Rx1. misal:
      mengirim–>
      data = 255;
      putchar(data);
      atau
      data = ‘A’
      putchar(data);
      atau khusus untuk USART0 kita bisa pake printf,
      data = 125;
      printf(“data_sensor=%d”,data);
      untuk menerima–>
      data = getchar();
      sebenarnya kalo agan pengen ngirim data banyak dalam sekali kirim agan bisa gabung dalam 8 bit, tapi resiko resolusi dataya ter-reduksi, misal tiap data kita ambil MSB nya
      data_sensor1 = 156;
      data_sensor2 = 243;
      data_kirim = (data_sensor1 & 0xF0)|((data_sensor2 & 0xF0)>>4);
      putchar(data_kirim);
      kalo cuma sekali ngirim berarti prinsipnya buat seperti master dan slave. perangkat slave memberi data ketika master meminta (request).

  17. Arie says:

    mau tanya
    Kalo ngirim kalimat misalnya “tes LCD” dari mikro 1 ke mikro 2, terus mikro 2 nampilin ke LCD kalimat “tes LCD” gimana kodenya?

    • wangready says:

      kalo di mikro agan gk ada program lain agan bisa coba lewat serial:
      mikro1:
      printf(“tes LCD”);
      mikro2:
      lcd_gotoxy(0,0);
      while(1)
      {
      lcd_putchar(getchar());
      }

  18. Arie says:

    makasih

  19. sew says:

    mas, mohon bantuannya.
    saya ingin ON/OFF beberapa LED misal ada 2 led dg mengirim data tombol keyboard dr pc menggunakan komunikasi serial USART. bila dikirim data ‘a/b’ utk on/off led1 dan data ‘c/d’ utk ‘on/off’ led2. juga bagai mana cara menggerakkan putar SERVO jika diberi masukan misal tombol 90 maka servo akan bergerak 90 derajat.
    maturnuwun sebelumnya.

    • wangready says:

      cara sederhana untuk mengolah data terima LED tinggal buat switch case aja gan…
      untuk servo, nilai yang dikirim dibuat selalu ditambah 100. hal ini dimaksudkan agar format pengiriman data menjadi default 3 karakter. jadi jika ingin mengirim 90 ke mikro, yang dikirim adalah 100 + 90, jadi diketik 190.

      data_terima = getchar();
      if((data_terima >= 'a')&&(data_terima <= 'd'))
      {
      	switch(data_terima)
      	{
      		case 'a': led1 = 1; break;
      		case 'b': led1 = 0; break;
      		case 'c': led2 = 1; break;
      		case 'd': led2 = 0; break;
      	}
      }else if((data_terima >= '0')&&(data_terima <= '9'))
      {
      	data_servo[1]=getchar() - '0';
      	data_servo[2]=getchar() - '0';     
      	data_servo[0]=data_terima - '1';
      	sudut_servo = ((unsigned int)data_servo[0]*100) + ((unsigned int)data_servo[1]*10) + (unsigned int)data_servo[2];
              lcd_clear();
              lcd_gotoxy(0,0);
              sprintf(kata,"sudut=%d",sudut_servo);
              lcd_puts(kata);
      }else
      {
              lcd_clear();
              lcd_gotoxy(0,0);
              lcd_putsf("format data salah");               
      }
      
      • sew says:

        saya menggunakan komunikasi serial antar bluetooth dr laptop ke rangkaian alatnya, bagai mana set utk inisialisasi komunikasi serial nya mas.
        haturnuwun atas jawabannya mas.

      • wangready says:

        inisialisasi dimananya gan, d mikro? jika agan menggunakan CodevisionAVR agan gunakan saja codewizard, jadi langsung tergenerate…

  20. ujang fuu says:

    mas,, ,mau tanya nih. saya kan ada modul gps yang serial intterfacenya pake ttl.utk di interface dengan atmega128L
    nah apa bisa langsung saya colokin ke port yang memliki RX dan TX nya,
    kebetulan saya pake codevision avr, apa uart ttl tsb bisa di settng pada code wizardnya tanpa inisialisasi tambahan?
    terus saya udah bikin program untuk baca string gps dan baca lattitude sama longitudenya, kemudian mau saya tampilin ke hyperterminal. kira2 untuk menampilkan pada hyperterminalya tsb perlu program tambahan lain gak ?

    • wangready says:

      setau saya gan atmega128L masih bisa beroperasi di 5V dgn xtal max 8MHz, jadi bisa langsung colokin aja keknya…
      kalo komunikasi UART nya bisa pake code wizard, jadi langsung tergenerate otomatis. cuma kalo soal protokol komunikasi data nya tetap harus bikin sendiri, mungkin itu bisa dilihat di datasheet GPS untuk format datanya nya gan, soalnya saya sndiri blum prnah ngoprek GPS.

  21. syahrir says:

    mas..,,mau nanya..,,punya contoh program enkripsi data di mikro gk? terima kasih

  22. syahrir says:

    mas mau minta tlg nih,, ada contoh program enkripsi data adc pembacaan sensor di mikrokontroler. terima kasih.

  23. mas saya mau tanya nih, kalau mau bikin program untuk hubungin RFID ke ATmega 16 trus d tampilin d LCD kira2 programnya kyak gimana?? setahu saya apa harus d hubungin perantara MAX232 ya?? mohon bantuanya..

    • wangready says:

      kalo agan pake CVAVR kurang lebih programnya bisa seperti ini
      unsigned char kata[16];
      while(1)
      {
      data = getchar();
      lcd_clear();
      lcd_gotoxy(0,0);
      sprintf(kata,”%d”,data);
      lcd_puts(kata); //nampilin dalam bentuk desimal
      }
      tergantung data yang agan kirim sih, itu tergantung perancangan komunikasi agan, pake angka atau text…
      kalo MAX232 itu untuk komunikasi RS232, tegangan -12 sampai +12 Volt. Kalo untuk TTL 0-5V cukup langsung sambung saja…

  24. Aliansyah says:

    mas ada contoh program untuk mengirimkan data dr sismin ke laptop menggunakan bluetooth? soalnya saya sudah mencoba yg dr generate di cvavr tidak terkirim datanya. pdhal bluetooth nya oke.hardware ok. thx

    • wangready says:

      programnya sama aja. Bluetooth yg serial kan? coba cek lg, mungkin CVAVR yg agan gunakan versi evaluation yg menyebabkan tidak bisa tercompile fitur serialnya…

  25. meggy says:

    misi mas…mau nanya…saya mau kirim data menggunakan KYL 1020U dari laptop ke mikro atmega8535..jadi ketka saya tekan dilaptop “->” maka data yang terkirim adalah 2…..dan data 2 diolah dimikro sehinggal mengeluarkan output di PORTA…trimd

  26. rahman says:

    misi mas..mohon bantuanya..
    bagaimana melakukan istruksi untuk mengirim perintah serial dari pc(opencv++) ke arduino.?

    ni sya membuat alat deteksi kantuk pada pengemudi dengan kamera

    yang di pc = jika telah ditemukan kantuk (“alarm active”) maka..

    yang di arduino (hardware)
    1 = bazer akan hidup
    2 = putaran roda semula aktiv menjadi mati (motor dc)
    3 = nampil tulisan lcd “bahaya”

    dngan sangat bertrimakasih jika ada agan yang mau membantu..makasi

  27. andriansyah says:

    gan saya mau tanya dong kalo mau ngirim data dari mikro ke pc lebih dari 1 digit/kata secara bersamaan gmn??
    contoh : printf(“12”);
    kemudian saya cek data yg masuk pake aplikasi vb yg ane buat ternyata data yg masuk bukan 12 secara bersamaan tapi 1-2-1-2-1-2…mohon pencerahan nya gan..

    • wangready says:

      kalo pake VB saya belum nyoba tp kalo pake C# bisa dilihat contohnya di post ini https://wangready.wordpress.com/2013/06/22/membuat-virtual-joystik-c/
      bagian receive event nya
      string kata;
      string[] buff_kata = new string[8];
      //—Event handler untuk DataReceived event—
      private void DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
      {
      try
      {
      kata = serialPort.ReadLine();
      buff_kata = SplitWords(kata);
      if (kata != string.Empty)
      {
      //txtDataReceived.Text = kata;
      txtDataReceived.BeginInvoke(new myDelegate(updateTextBox));
      }
      }
      catch (Exception ex)
      {
      MessageBox.Show(ex.ToString());
      }
      }
      cara ngambil bagian2 datanya yang variabel array buff_kata[] seperti di bawah ini
      buff_val_y = Convert.ToInt32(buff_kata[1]);
      buff_val_x = Convert.ToInt32(buff_kata[2]);
      val_z = Convert.ToInt32(buff_kata[3]);

  28. i.Nadhir says:

    wah @wangready bener” dewa bgt, mudah”an ilmunya berkah,amin.
    mau nanya deh mas, problem saya yaitu :
    Saya mau menghubungkan secara komunikasi serial antara RFID reader dengan ATmega8535.
    Data yang ada di kartu(tag) RFID berupa data ASCII 12 digit, ex : 4D00D5CB5506
    Bagaimana list program untuk menginstruksikan, ketika ATmega menerima data dari kartu RFID(12 digit tersebut), maka ATmega akan menghidupkan suatu pin.

    Minta pencerahannya ya mas.

    • wangready says:

      pake getchar aja gan, pake for, masukin ke data array, buat compare datanya pake fungsi strcmpf, misal
      char huruf[12];//buffer data 12x8bit
      for (i=0;i<12;i++)
      {
      huruf[i] = getchar();
      }
      if (!(strcmpf(huruf,"4D00D5CB5506")))
      {
      PORTA.0 = 1;
      }
      else
      {
      PORTA.0 = 0;
      }

      • i.nadhir says:

        oke,saya coba dulu ya gan.

      • i.nadhir says:

        maaf nih gan mau nanya lg.
        Maklum masih beginner,hehe.
        Fungsi strcmpf-nya kok undefined ya? apa ada yg harus saya tambahkan di list programnya?
        Boleh minta list program yg lengkapnya gan? Soalnya saya bingung kalo dikasih list sepenggal gitu.
        Makasih byk ya gan.

      • wangready says:

        tambahin

        #include <string.h>
        

        gan….Fungsi strcmpf-nya ada di lib itu…
        contoh pemakaiannya kayak gini gan…

        /*****************************************************
        Chip type           : ATmega32
        Program type        : Application
        Clock frequency     : 4.000000 MHz
        Memory model        : Small
        External SRAM size  : 0
        Data Stack size     : 512
        *****************************************************/
        
        #include <mega32.h>   
        #include "LED_lib.c"
        #include "motor_lib.c"
        #include "common_lib.c" 
        #include "serial_com_lib.c"
        #include "servo_motor.c"
          
        #include <string.h>
        char command[32];
        int value;
        void main(void)
        {
        LED_init();
        motor_init();  
        serial_init();
        common_init();
        servo_init();
        
        while (1)
              { 
                scanf("robot=%d:%s",&value,command);     
                if      (!(strcmpf(command,"LED_1")))
                {
                        LED_1 = value;
                        //printf("LED_1 = %d",value);        
                }
                else if (!(strcmpf(command,"LED_2")))
                {
                        LED_2 = value;
                        //printf("LED_2 = %d",value);        
                }  
                else if (!(strcmpf(command,"LED_3")))
                {
                        LED_3 = value;
                        //printf("LED_3 = %d",value);        
                }
                else if (!(strcmpf(command,"LED_4")))
                {
                        LED_4 = value;
                        //printf("LED_4 = %d",value);        
                }
                else if (!(strcmpf(command,"LED_5")))
                {
                        LED_5 = value;
                        //printf("LED_5 = %d",value);        
                }
                else if (!(strcmpf(command,"LED_6")))
                {
                        LED_6 = value;
                        //printf("LED_6 = %d",value);        
                }
                else if (!(strcmpf(command,"LED_7")))
                {
                        LED_7 = value;
                        //printf("LED_7 = %d",value);        
                }
                else if (!(strcmpf(command,"motor_A")))
                {
                        motor_A(value);
                        //printf("motor_A = %d",value);        
                }
                else if (!(strcmpf(command,"motor_B")))
                {
                        motor_B(value);
                        //printf("motor_B = %d",value);        
                }  
                else if (!(strcmpf(command,"servo")))
                {
                        servo_act(value);      
                }
              };
        }
        
        
      • i.Nadhir says:

        Thanks gan, sukses trus buat agan.

      • i.nadhir says:

        #include
        #include
        #define USART_H
        #ifndef STRING_H
        #define STRING_H
        #define F_CPU 8000000UL
        #define USART_BAUDRATE 9600
        #define BAUD_PRESCALE (((F_CPU/(USART_BAUDRATE*8UL)))-1)

        #endif /*STRING_H*/

        void usart_init();
        void getcard_id(void);
        unsigned int usart_getch();
        unsigned char i, card[12];

        void usart_init(){
        UCSRA = (1<<U2X);
        UCSRB = (1<<RXEN) | (1<<TXEN);
        UCSRC = (1<<URSEL) | (1<<USBS) | (1<<UCSZ0) | (1<<UCSZ1) |
        (0<>8);
        UBRRL = BAUD_PRESCALE;
        }

        void getcard_id(void){
        for(i=0;i<12;i++)
        {
        card[i]=usart_getch();
        }
        return;
        }

        unsigned int usart_getch(){
        while ((UCSRA&(1<<RXC))==0);
        return UDR;
        }
        int main(void)
        {
        usart_init();

        uint8_t card[i];
        DDRB = 0xff;

        while(1){
        if (!(strcmpf(card,"4D00D5CB5506")))
        {
        PORTB = 0x0f;
        }
        if (!(strcmpf(card,"4D00C6A6607")))
        {
        PORTB = 0xf0;
        }
        };

        return 0;
        }

        Masih ada 2 error, dgn comment yg sama yaitu: undefine reference to ' strcmpf '.
        Mohon koreksinya gan.

      • wangready says:

        sory gan, saya kira pake CV AVR…
        kalo AVR Studio 4 keknya pake ‘strcmp’ sesuai sama http://www.nongnu.org/avr-libc/user-manual/group__avr__string.html#gaedb0e7bb7333d6122472acddb5df20ac

      • i.nadhir says:

        #include (avr/io.h)
        #include (string.h)

  29. andriansyah says:

    gan mau tanya dong,,kalo dari mikro mau ngirim data ke pc 2 digit ato lebih gmn..
    soalnya saya nyoba ngirim data “A1” ketika di cek data yg dikirim satu persatu jadi A dulu terus 1 gitu selanjutnya..saya ingin nya data yg terkirim k pc A1 bersamaan,,
    program di pc saya menggunakan vb 6..yg harus diubah program di mikro nya ato di pc nya gan? mohon pencerahan nya..

    • wangready says:

      kalo dari mikro nya kirim aja langsung pake fungsi printf jg bisa gan…
      kalo mau kirim 2 data yang berbeda bisa dipisah pake spasi…jadi tiap data dipisah bedasar spasi yang terdeteksi, kalo saya biasanya pake kepala data dulu berupa kata tertentu yang menandakan awal data, supaya lebih mudah mendeteksi kalo error…
      kalo pake VB saya belum nyoba tp kalo pake C# bisa dilihat contohnya di post ini https://wangready.wordpress.com/2013/06/22/membuat-virtual-joystik-c/
      bagian receive event nya,

      string kata;
      string[] buff_kata = new string[8];
      //—Event handler untuk DataReceived event—
      private void DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
      {
      try
      {
      kata = serialPort.ReadLine();
      buff_kata = SplitWords(kata);
      if (kata != string.Empty)
      {
      //txtDataReceived.Text = kata;
      txtDataReceived.BeginInvoke(new myDelegate(updateTextBox));
      }
      }
      catch (Exception ex)
      {
      MessageBox.Show(ex.ToString());
      }
      }
      

      cara ngambil bagian2 datanya yang variabel array buff_kata[] seperti di bawah ini
      buff_val_y = Convert.ToInt32(buff_kata[1]);
      buff_val_x = Convert.ToInt32(buff_kata[2]);
      val_z = Convert.ToInt32(buff_kata[3]);

  30. daud says:

    salam kenal gan. saya lagi buat tugas komunikasi antara 2 buah mikrontroller atmega 8535, dimana mikrokontroller tersebut saling komunikasi untuk deteksi data string, untuk baca data serial saya gunakan perintah getchar dan ini sudah bisa deteksi data namun hanya sebatas karakter, untuk data string gak bisa jalan gan. nanya ni gan, Bagaimana deteksi data string menggunakan bahasa c code vision avr atau bagaimana modifikasi programnya sehingga bisa tampilkan data dari transmiter. Trim gan

  31. Riky_waee says:

    Malam gan, mau naya nih gan.
    Ada problem, saya mau menginstruksiin mikro untuk menerima sebuah data ASCII dan stelah itu menghidupkan suatu pin.
    Bijimane ye gan list programnya? program buat array dan untuk compare nya gimana gan?
    Mohon pencerahannya, trima ksih gan.

  32. Riky_waee says:

    Saya ada data ASCII 6 digit(43AB07) dan sebuah ATmega8535.
    Kemudian saya ingin menginstruksikan untuk ATmega8535 menerima data ASCII 6 digit tersebut kemudian setelah menerima data ASCII tersebut ATmega8535 menghidupkan suatu pin, katakanlah pinA.
    Sedikit yg saya ketahui, itu menggunakan fungsi ARRAY dan meng-comparenya, jadi bagaimana list program untuk fungsi array dan compare-nya, gan? kemudian bagaimana list program untuk ATmega8535 menerima data ASCII tersebut kemudian menghisupkan pin A?
    Mohon pencerahannnya gan.

    • wangready says:

      klo menurut saya, data yg dikirim string aja gan, semisal printf(“HEAD PORTA_ON”) ngirim pake printf
      jadi nanti nerima datanya scanf(“HEAD %s”, data_terima)
      data HEAD adalah kepala data untuk memudahkan memilah data, klo saya biasanya sperti itu…

  33. winna says:

    mas mau tanya, kalo ngirim data adc ke pc itu list program cvavrnya gmana ya, output sensor saya ditampilkan di lcd dan dikirim ke pc (pake visual basic),..tapi saya baru bisa nampilin data adcnya di lcd..

    • wangready says:

      klo ngirim data mikro pake printf.
      klo nerima data di PC saya biasanya pake C#, kodenya

              string kata;
              string[] buff_kata = new string[8];
              //—Event handler untuk DataReceived event—
              private void DataReceived(object sender, System.IO.Ports.SerialDataReceivedEventArgs e)
              {
                  try
                  {
                      kata = serialPort.ReadLine();
                      buff_kata = SplitWords(kata);
                      if (kata != string.Empty)
                      {
                          //txtDataReceived.Text = kata;
                          txtDataReceived.BeginInvoke(new myDelegate(updateTextBox));
                      }
                  }
                  catch (Exception ex)
                  {
                      MessageBox.Show(ex.ToString());
                  }
              }
      

      contohnya disini https://wangready.wordpress.com/2013/06/22/membuat-virtual-joystik-c/

  34. abie says:

    maap gan sebelumnya, mau tanya bisa gak ya setting RTC pake keyboard ps/2 di tiny2313 tp displaynya pake 4 seven-segment?

  35. rias says:

    selamat siang prof,
    saya sedang bikin program transfer data LCD menggunakan dua mikro atmega16, LCD1 ke LCD 2 , dimana lcd 1 akan mentransfer data ke lcd 2, dengan input keypad, bagaimana codung nya ya?
    mohon pencerahan.. terimakasih sebelumnya

  36. mas mau tanya …
    kalo kirim karakter dari keyboard pc ke lcd bagaimana list program untuk ATmega8535 nya gan?

  37. mas mau tanya lg….
    cara nya mikrokontroler bisa komunikasi dengan scda (wonderware) gimana ya mas?
    trimakasih

  38. _day says:

    gan mo tanya kl ane transmit 5 data hex dari komp misal
    {0x24,0x11,0x01,0x02,0x03} ke uC, nah d uC data itu mau d bagi per array pake interrupt
    jadi pengenya data[0]=0x24, data[1]=0x11……..data[4]=0x03……kr2 gmn ya mas routinnya? dan apa si bedanya Usart regular sama yg pake interrupt?..mksi gan

    • wangready says:

      pake for aja gan

      char data[5];
      int i;
      .
      .
      .
      while(1)
      {
        for (i=0;i<5;i++)
         data[i]=0; //bersihkan variabel
       for (i=0;i<5;i++)
       {
         data[i] = getchar();
       }
      }
      

      tapi biar gk miss datanya pake header, misal data yang dikirim selalu diawali hex 0x85 dua kali….tambahin aja pake if di awalnya…
      klo beda yg reguler sama yang interrupt sya jg gk tau persis, pengalaman saya klo yg interrupt itu dia nunggu data masuk, klo data masuk baru lanjut ke rutin bawah. klo yg biasa saya biasanya ngecek di register UDR nya langsung, data=UDR, discan aja UDR nya…klo saya sih biasanya gitu…

  39. adit says:

    mas tolong kasih code untuk pembacaan data RFID pada mikro dan tampil di lcd. mohon bantuannya mas

  40. andrik says:

    maaf mz mau nanyak kalau mau membaca data yang di krim lewat bluetooth tu gimana caranya?
    ama cara mengkomunikasikan modul bluetooth hc-05 dengan mikrokontroller atmega16 gmna caranya mz?

  41. Arief says:

    Mas mau nanya kalo mensinkronkan ATmega 16 dengan mod/ul bluetooth supaya sinyal string dari bluetooth terbaca oleh mikronya caranya gemana ya mas

  42. hasmibaih says:

    Mas saya mau tanya, jadi saya niatnya mau scan respon modem wave com yang pake AT command, singkatnya misalnya kalau di hyperterminal kan kalau ketik “AT” maka modem wavecom kan bakal bales “ok”
    nah disini saya nyoba itu di mikro dengan ngetik otomatis perintah AT command dan melihat respon modem di lcd, dengan kondisi:
    usart0=modem
    nah saya mrogram kok ga keluar apa” ya di lcd nya mas

    berikut perintahnya :

    void scan(void)
    {
    char data[32];
    int i;

    for (i=0;i<32;i++)
    data[i]=0; //bersihkan variabel
    for (i=0;i<32;i++)
    {
    data[i] = getchar();
    if(data[i]==0x0A)//char enter
    break;
    }

    lcd_clear();
    lcd_puts(data);

    }

    void main(void)
    {
    char data[32];
    int i;
    lcd_clear();
    lcd_putsf("M hasmi baih hakim");
    delay_ms(3000);
    putchar1(27);
    putchar(13);
    delay_ms(3000);
    putchar1(63);
    putchar(13);
    delay_ms(3000);
    putchar(13);
    delay_ms(10000);
    lcd_clear();
    printf("AT");
    putchar(13);
    scan();
    lcd_clear();
    lcd_putsf("ATTACH GPRS");
    printf("AT+CGATT=1");
    putchar(13);
    scan();
    delay_ms(5000);
    lcd_clear();
    lcd_putsf("CONNECT TO OPERATOR CELLULAR");
    printf("AT+CSTT=\"AXIS\"");
    putchar(13);
    scan();
    delay_ms(5000);
    lcd_clear();
    lcd_putsf("Wireless Connection");
    printf("AT+CIICR");
    putchar(13);
    scan();
    delay_ms(5000);
    lcd_clear();
    lcd_putsf("REQEST IP ADDRESS");
    printf("AT+CIFSR");
    putchar(13);
    scan();
    delay_ms(5000);

    }

    ini yang salah dimananya ya gan?

    thanks

    • wangready says:

      inisialisasi serial nya udah di cek belum gan? baudrate?… coba tes pake syntax simple biar ketahuan eror nya dimana, simisal nerima karakter ‘A’ LED menyala…kalo dari kode agan di atas sih keknya harusnya jalan…

  43. lambang says:

    mas, saya lg ngerjain proyek akhir saya, pakai easy VR sebagai pengenal suaranya, dan atmega 8535 sebagai slave nya tp saya blum ngerti cara buat program usartnya, saya pakai code visio avr bisa tlg dibantu mas,

  44. bayu says:

    mas saya mau tanya,, saya kan punya project menggunakan RFID dan mikon.a atmega8535 terus saya ingin menghubungkan dengan interface delphi menggunakan serial db9,, itu kira-kira program pengiriman id cardnya gimna ya buat mikonnya..

    makasih mas sebelumnya,,

  45. Nando says:

    Permisi Mas saya mau bertanya,saya mau berencana membuat alat pengirim data dari mikro atmega 32 ke mobile android
    namun saya tidak menggunakan interrupt,mungkin mas bisa bantu memberikan penjelasan tentang tahapan dari interrupt,sepert UDR itu apa UCSRA ,B,C itu apa,dan RXc itu apa?
    mohon bantuan nya mas,terima kasih sebelum nya

  46. maul says:

    mas, mau tanya, misal saya mau ngirim data dari sensor ping, anggap saja nilainya 300, sedangkan kalau mau pakai fungsi putchar kan maksimal cuma 200 an, itu solusinya gimana ya mas ? dibagi 2 dulu lalu dikirim atau ? tolong pencerahannya mas

  47. Bluekyuu39 says:

    Sore mas,, saya baru dalam dunia mikrokontroler. Saya ada tugas untuk melakukan koneksi antara camera berbasis OV528 (RS232) dengan AT128. AT128 diharapkan mengirim data hexa ke camera (mis : 52 00 26 00) dan camera akan merespon (72 00 10 00). nah.. untuk respon tersebut dibaca melalui hyper terminal… bisa dibantu untuk programnya?? terima kasih.

  48. Salam kenal, saya tertarik dengan artikel diatas.
    saya ada tugas untuk membaca data sensor flow water, kemudian datanya ditampilkan pada LCD dan selanjutnya mengirim data ke PC melalui serial. sampai sekarang saya masih belum berhasil. mungkin sodara bisa membantu. tugas saya ini sama persis seperti yang ada pada tutorial ini http://www.seeedstudio.com/wiki/G1/2_Water_Flow_sensor. namun disitu contohnya dalam bahasa arduino. saya tunggu balasannya. terimakasih

  49. Hendra says:

    mas,saya mau tanya dong,saya buat program mengunakan bluetooth HC-05,dan saya koneksikan dengan MCU atmega8 ini contoh program nya…

    /*****************************************************
    This program was produced by the
    CodeWizardAVR V2.05.3 Standard
    Automatic Program Generator
    © Copyright 1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
    http://www.hpinfotech.com

    Project :
    Version :
    Date : 04-Feb-2015
    Author : Rui
    Company : Richi Studio
    Comments:

    Chip type : ATmega8
    Program type : Application
    AVR Core Clock frequency: 8.000000 MHz
    Memory model : Small
    External RAM size : 0
    Data Stack size : 256
    *****************************************************/

    #include

    #ifndef RXB8
    #define RXB8 1
    #endif

    #ifndef TXB8
    #define TXB8 0
    #endif

    #ifndef UPE
    #define UPE 2
    #endif

    #ifndef DOR
    #define DOR 3
    #endif

    #ifndef FE
    #define FE 4
    #endif

    #ifndef UDRE
    #define UDRE 5
    #endif

    #ifndef RXC
    #define RXC 7
    #endif

    #define FRAMING_ERROR (1<<FE)
    #define PARITY_ERROR (1<<UPE)
    #define DATA_OVERRUN (1<<DOR)
    #define DATA_REGISTER_EMPTY (1<<UDRE)
    #define RX_COMPLETE (1<<RXC)

    // USART Receiver buffer
    #define RX_BUFFER_SIZE 8
    char rx_buffer[RX_BUFFER_SIZE];

    #if RX_BUFFER_SIZE <= 256
    unsigned char rx_wr_index,rx_rd_index,rx_counter;
    #else
    unsigned int rx_wr_index,rx_rd_index,rx_counter;
    #endif

    // This flag is set on USART Receiver buffer overflow
    bit rx_buffer_overflow;

    // USART Receiver interrupt service routine
    interrupt [USART_RXC] void usart_rx_isr(void)
    {
    char status,data;
    status=UCSRA;
    data=UDR;
    if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
    {
    rx_buffer[rx_wr_index++]=data;
    #if RX_BUFFER_SIZE == 256
    // special case for receiver buffer size=256
    if (++rx_counter == 0) rx_buffer_overflow=1;
    #else
    if (rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
    if (++rx_counter == RX_BUFFER_SIZE)
    {
    rx_counter=0;
    rx_buffer_overflow=1;
    }
    #endif
    }
    }

    #ifndef _DEBUG_TERMINAL_IO_
    // Get a character from the USART Receiver buffer
    #define _ALTERNATE_GETCHAR_
    #pragma used+
    char getchar(void)
    {
    char data;
    while (rx_counter==0);
    data=rx_buffer[rx_rd_index++];
    #if RX_BUFFER_SIZE != 256
    if (rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
    #endif
    #asm("cli")
    –rx_counter;
    #asm("sei")
    return data;
    }
    #pragma used-
    #endif

    // USART Transmitter buffer
    #define TX_BUFFER_SIZE 8
    char tx_buffer[TX_BUFFER_SIZE];

    #if TX_BUFFER_SIZE <= 256
    unsigned char tx_wr_index,tx_rd_index,tx_counter;
    #else
    unsigned int tx_wr_index,tx_rd_index,tx_counter;
    #endif

    // USART Transmitter interrupt service routine
    interrupt [USART_TXC] void usart_tx_isr(void)
    {
    if (tx_counter)
    {
    –tx_counter;
    UDR=tx_buffer[tx_rd_index++];
    #if TX_BUFFER_SIZE != 256
    if (tx_rd_index == TX_BUFFER_SIZE) tx_rd_index=0;
    #endif
    }
    }

    #ifndef _DEBUG_TERMINAL_IO_
    // Write a character to the USART Transmitter buffer
    #define _ALTERNATE_PUTCHAR_
    #pragma used+
    void putchar(char c)
    {
    while (tx_counter == TX_BUFFER_SIZE);
    #asm("cli")
    if (tx_counter || ((UCSRA & DATA_REGISTER_EMPTY)==0))
    {
    tx_buffer[tx_wr_index++]=c;
    #if TX_BUFFER_SIZE != 256
    if (tx_wr_index == TX_BUFFER_SIZE) tx_wr_index=0;
    #endif
    ++tx_counter;
    }
    else
    UDR=c;
    #asm("sei")
    }
    #pragma used-
    #endif

    // Standard Input/Output functions
    #include

    // Declare your global variables here

    void main(void)
    {
    // Declare your local variables here

    // Input/Output Ports initialization
    // Port B initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTB=0x00;
    DDRB=0x00;

    // Port C initialization
    // Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTC=0x00;
    DDRC=0x00;

    // Port D initialization
    // Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
    // State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
    PORTD=0x00;
    DDRD=0x00;

    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 9600
    UCSRA=0x00;
    UCSRB=0xD8;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x33;

    // Global enable interrupts
    #asm(“sei”)

    while (1)
    {
    if(getchar()==’a’){ PORTB.0=0;}

    else if(getchar()==’b’){PORTB.0=1;}

    else {PORTB=1;}

    }
    }

    saya ingin menyalakan led pada PORTB.0 dengan mengunakan HP android yg telah di program untuk mengirimkan kode char sesuai kode di atas,tetapi tidak berfungsi sama sekali
    Nah,yang mau saya tanyakan adalah apakah code diatas sudah benar?
    kalo bisa tolong di koreksi ya mas…

    terima kasih sebelumnya….

Leave a reply to Bluekyuu39 Cancel reply