Selasa, 26 Juni 2012

Menggunakan USART / UART di CodeVision AVR


Sudah lama saya tidak menulis di blog, dan kali ini saya akan berbagi sedikit pengalaman saya mengenai USART/UART di mikrokontroler AVR ATMEGA series. Kesempatan kali ini saya akan menggunakan Atmega8 dan mengaktifkan fitur USARTnya dengan CodeVision AVR versi 1.xx.x

Jalankan aplikasi Codevision kemudian pada menu file pilih new, nanti akan muncul jendela create new file pilih project dan klik OK, akan muncul jendela confirm klik yes,


kemudian akan muncul jendela code wizard AVR

  

 
Pada gambar diatas pilih chip Atmega8 dan clock nya 8MHz, klik usart

 
Buatlah setingan seperti gambar diatas, pada kesempatan ini di gunakan TX(transmiter) dan RX(receiver) tanpa interrupt dengan baud rate 9600 8 bit data, 1 bit stop dan No parity.

Kemudian klik file pilih Generate, save and Exit



Akan muncul jendela save c compiler source file,  

 beri nama file usart (bebas) klik save


 kemudian muncul lagi jendela save c compiler project file,


 beri nama file usart klik save

kemudian akan muncul lagi jendela save file,

beri nama file usart klik save.

Kemudian akan muncul  



Untuk memudahkan saya menjelaskan coba hapus semua program diatas kemudian ganti dengan code berikut :

#include <mega8.h>

// Standard Input/Output functions
#include <stdio.h>// didalam file ini fungsi getchar dan putchar di buat

// Declare your global variables here

void main(void)
{
//ini adalah inisialisasi USART untuk atmega8
// 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=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

while (1)
{
 // Place your code here
If(getchar()==’M’)           // jika RX menerima karakter ’M’  
{                              // maka TX akan mengirim karakter 'A'
putchar(‘A’)
}
   
} ;
}

Kemudian setelah code diatas di copy, compile code tersebut dengan menekan shift+F9 pada keyboard

Maka hasilnya


Klik ok, nah sekarang file .Hex sudah ada, terserah anda mau langsung di upload ke mikrokontroler atau di simulasi.   

Saya simulasi kan dengan PROTEUS dengan skematik sebagai berikut

Pada simulasi klik jendelan virtual terminal kemudian pada keyboard tekan shift+m (‘M’), maka akan muncul ‘A’ pada jendela virtual terminal.     



95 komentar:

  1. mas, saya punya data tipenya int. Bagaimana mengkonversikan ke tipe char?

    Apakah bisa dengan cara di bawah ini :

    //misal aja

    unsigned int i = 4125;
    char data_tx = (char) i;

    //waktu saya compile sih bisa, tapi apakah data yang terkirim benar?Terima kasih.

    adi.

    BalasHapus
    Balasan
    1. di ubah saja dulu string pake itoa

      contoh

      #include

      unsigned char data_string[10];
      unsigned int i=4125;

      ....

      void main()
      {

      while(1)
      {
      itoa(i,data_string)//konversi dari integer ke string

      puts(data_string);//kirim data string

      }
      }

      semoga bisa membantu mas adi

      Hapus
    2. untuk menggunakan fungsi itoa pake library stdlib.h

      Hapus
  2. kok punya saya sudah nemplek plek sama seperti punya anda tp kok ga kluar karakter apa2 di virtual terminal???

    BalasHapus
    Balasan
    1. coba sebutkan langkah2 anda sampai di simulasi dengan proteus!

      Hapus
    2. kasus saya sama mas, virtual terminalnya gak keluar outputnya.
      saya pakai ATMega 8535, di code vision gak ada masalah, pas di proteus virtual terminal Tx saya hubungkan dengan Rx di 8535, Rx nya saya hubungkan Tx mikro. dan hasilnya gak terlihat

      Hapus
    3. sebelum input 'M' dari keyboard jendela virtual terminalnya di klik dulu...

      atau kalau tidak bisa juga, coba setingan clock di mikro sudah sama atau belum dengan setingan clock di program yang di buat dengan codevision...

      cek juga bit rate nya di mikro harus sama dengan di virtual terminal...

      Hapus
    4. maksudnya imput "M" dari keyboard?
      kalo settingan mikro sama proteus udah sama gan, baud rate 9600

      Hapus
  3. kalo di proteusnya muncul warning message "UCRSC0 register is not modelled" penyebabnya apa ya? saya pake ATMEGA32 ma codevision

    BalasHapus
    Balasan
    1. programnya jalan tidak di proteus? bagaimana di code vision? apakah ada warning seperti itu?

      Hapus
  4. Mau tanya mas, saya bkin program persis kaya yang mas posting, tpi pda " If(getchar() == 'M') " ada peringatan "invalid expression

    BalasHapus
    Balasan
    1. program diatas jangan di copy paste, coba diketik ulang manual aja mas... ada karakter yang berbeda jika di copy paste

      Hapus
  5. Mau tanya mas, kalau mau baca data string, ada perintah selain getchar() gak ya??

    BalasHapus
    Balasan
    1. biasanya saya pake getchar. coba cek di librarynya. hehe saya belum pernah pake selain getchar

      Hapus
  6. kalau saya mau menampilkan sebuah kata ke virtual terminal bagaimana? misalnya "aku", saya coba tapi hasilnya tidak sempurna

    BalasHapus
    Balasan
    1. coba cek baud rate, data bits, stop bits dan parity nya sama tidak

      Hapus
  7. begini mas, anda kan vrtual ni, saya coba langsung ke sistem minimum asli, damana di sistem minimum pin tx0 dan rx0 itu tersambung ke pin miso, mosi buat downloader. dengan program yang sama dengan sampean, g keluar apa2 di terminal mas., bisa bantu kah mas? mungkin dengan fuse bit ato apa dah ma?,

    BalasHapus
    Balasan
    1. pakai atmega apa? coba cek baud rate,data bits parity dan stop bits nya sama tidak. program diatas harus di picu dengan input 'M' dari keyboard komputer. coba perhatikan kalimat terakhir artikel diatas

      Hapus
  8. mas saya sudah coba dan berhasil.
    skrg saya inginnya kl di tekan huruf M maka portb.0 berlogika 1.
    apakah nnti di terminalnya akan tampil logika 1?
    soalny ktika saya coba, tdk mncul apa".
    ini listing yg saya buat :
    while (1)
    {
    if (getchar()=='M')
    {
    PORTB.0 = 1;
    }
    };
    }

    BalasHapus
    Balasan
    1. DDRB.0=1;
      while (1)
      {
      if (getchar()=='M')
      {
      PORTB.0 = 1;
      }
      };
      }

      PORTB.0 harus di set menjadi output, dengan menambahkan DDRB.0=1

      Hapus
  9. mw tanya saya punya list gini
    while (1)
    { PORTC.3=PINC.0;
    PORTC.4=PINC.1;
    PORTC.5=~PINC.1;
    PORTC.6=PINC.2;
    }
    misalkan jika saya ingin mengirim data ke komputer dengan keterangan:

    jika PORTC.3==1(berlogika 1) maka kirim ke komputer ('PORTC.3=1')
    ATAU jika PORTC.3==0(berlogika 0) maka kirim ke komputer ('PORTC.3=0')

    jika PORTC.4==1(berlogika 1) maka kirim ke komputer ('PORTC.4=1')
    ATAU jika PORTC.4==0(berlogika 0) maka kirim ke komputer ('PORTC.4=0')

    jika PORTC.5==1(berlogika 1) maka kirim ke komputer ('PORTC.5=1')
    ATAU jika PORTC.5==0(berlogika 0) maka kirim ke komputer ('PORTC.5=0')


    TOlong dibantu .thx

    BalasHapus
    Balasan
    1. Simple nya begini mas,

      if(PINC.0==1)
      {
      putchar('P');
      putchar('O');
      putchar('R');
      putchar('T');
      putchar('C');
      putchar('.');
      putchar('3');
      putchar('=');
      putchar('1');
      }
      else
      {
      putchar('P');
      putchar('O');
      putchar('R');
      putchar('T');
      putchar('C');
      putchar('.');
      putchar('3');
      putchar('=');
      putchar('0');
      }

      YANG LAIN SAMA SEPERTI DIATAS

      Hapus
  10. mas, kalau saya dari visual c# mengirim data 150, lalu diterima di mikro untuk dibandingkan dengan nilain lain.. misalnya if (getchar()<=150) itu bagaimana ya formatnya?

    BalasHapus
    Balasan
    1. 150 tipe data nya integer yaa. bisa langsung

      if(getchar()<=150){};

      atau di simpan ke variable

      unsigned char buffer;

      buffer=getchar();
      if(buffer<=150){};

      Hapus
    2. nah itu mas, cara pengiriman data int lewat serialport visual c# gmn ya mas?

      Hapus
    3. kalau yg sekarang data yg saya kirim dari c# itu berupa text, misalnya saya ketik 5, maka di codevison masih bisa membacanya
      if (getchar()<='5')
      {
      masukProgram();
      }

      utk kasus yg diatas masih bisa, cuma kalau udah perbandingan lebih dua digit , misalnya if (getchar()<='150') akan muncul warning:
      pointless integer comparison with an out of range constant

      bagaimana ya mas?

      Hapus
    4. saya asumsikan mas ini udah ngerti cara kirim lewat serial di C#. begini mas, data text misal mas nya ngetik 150 sebelum di kirim lewat serialport, di conversi dulu ke integer kemudian di konversi lagi ke karakter baru kirim.

      karena 150 itu adalah tipe data string. data string ini di konversi ke integer. dari integer di konversi ke karakter kemudian kirim ke serialport

      Hapus
    5. coding di code vision nya

      if(getchar()<=150) bukan if(getchar()<='150')
      atau
      if(getchar()<=5) bukan if(getchar()<='5')

      karena jika mas tulisnya '5' ini tipe data karakter dan ketika mas ketik '150' ini salah, '150' bukan karakter tapi string. dan getchar() hanya menampung 1 byte atau satu karakter.

      Hapus
    6. berarti getchar hanya menampung 1 byte data mas. kalao kita ingin menambah karakter lg. seperti
      if (getchar()=='makan')
      { }
      apa yg perlu untuk pengenalannya mas?

      Hapus
    7. if(getchar()=='m')
      {
      if(getchar()=='a')
      {
      if(getchar()=='k')
      {
      if(getchar()=='a')
      {
      if(getchar()=='n')
      {

      }

      }

      }
      }
      }

      Hapus
  11. mas, saya mau bertanya.
    saya lagi membuat program remote control dua buah micro [rx dan tx]. jadi txnya itu nanti akan mengirimkan inputan dari push button.
    lalu rx nya akan membaca masukan dari push button dan di tampilkan menggunakan led.
    masalahnya mas, program yang saya buat data yang dikirimkan tx tidak sama dengan yang ditampilkan rx...

    berikut list program Transmitter
    #include
    #include
    #include
    #include
    #asm
    .equ __lcd_port=0x15;PORTC
    #endasm

    // Standard Input/Output functions
    #define ADC_VREF_TYPE 0x40
    // Read the AD conversion result
    unsigned int read_adc(unsigned char adc_input) //membaca sebuah adc dari generator karakter LCD atau RAM tampilan
    {
    ADMUX=adc_input | (ADC_VREF_TYPE & 0xff);
    // Delay needed for the stabilization of the ADC input voltage
    delay_us(10);
    // Start the AD conversion
    ADCSRA|=0x40;
    // Wait for the AD conversion to complete
    while ((ADCSRA & 0x10)==0);
    ADCSRA|=0x10;
    return ADCW;
    }

    unsigned int temp=15;
    char buff[33];
    void main(void)
    {
    PORTA=0XFF;
    DDRA=0X00;
    PORTB=0X00;
    DDRB=0XFF;

    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: Timer 0 Stopped
    // Mode: Normal top=FFh
    // OC0 output: Disconnected
    TCCR0=0x00;
    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=0x00;
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: Off
    // USART Transmitter: On
    // USART Mode: Asynchronous
    // USART Baud Rate: 9600
    UCSRA=0x00;
    UCSRB=0x08;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x19;
    // Analog Comparator initialization
    // Analog Comparator: Off
    // Analog Comparator Input Capture by Timer/Counter 1: Off
    ACSR=0x80;
    SFIOR=0x00;
    // ADC initialization
    // ADC Clock frequency: 31,250 kHz
    // ADC Voltage Reference: AVCC pin
    // ADC High Speed Mode: Off
    // ADC Auto Trigger Source: None
    ADMUX=ADC_VREF_TYPE & 0xff;
    ADCSRA=0x87;
    SFIOR&=0xEF;

    lcd_init(16);
    while (1)
    {
    PORTB=PINA;
    if(PINA.0==0) temp=1;
    if(PINA.1==0) temp=2;
    if(PINA.2==0) temp=3;
    if(PINA.3==0) temp=4;
    if(PINA.4==0) temp=5;
    if(PINA.5==0) temp=6;
    if(PINA.6==0) temp=7;
    if(PINA.7==0) temp=8;
    if(PINA==255) temp=0;
    lcd_gotoxy(0,0);
    sprintf(buff,"LED SING KE %d",temp);
    lcd_puts(buff);
    printf(" %4i",temp); //kirim data serial
    delay_ms(10);
    };
    }

    BalasHapus
    Balasan
    1. push button nya di PINA ya? berarti ada 8 push button ya? itu PORTB untuk LED?

      Hapus
    2. iya gan, rangkaiannya seperti gambar ini gan https://twitter.com/KEKO_G_o_K_i_L/status/552302971883905024/photo/1
      jadi kalau bisa saat push button ditekan. led pada kedua micro dapat menyala dan menyala di pin yang sama

      Hapus
    3. rangkaian sama coding nya ngga nyambung, itu di mikrokontroler U1 harusnya yang terkoneksi TX bukan RX nya

      Hapus
    4. ooo, iya gan. tp masih belum bisa gan, di lcd sudah sama,tp di led nya belum sama...

      Hapus
  12. dan ini program receivernya
    #include
    #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<
    // Declare your global variables here
    void main(void)
    {
    PORTA=0x00;
    DDRA=0x00;
    PORTB=0x00;
    DDRB=0x08;
    PORTC=0x00;
    DDRC=0x00;
    PORTD=0x00;
    DDRD=0x00;
    // Timer/Counter 0 initialization
    // Clock source: System Clock
    // Clock value: 3,906 kHz
    // Mode: Fast PWM top=FFh
    // OC0 output: Non-Inverted PWM
    TCCR0=0x6D;
    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=0x00;
    // USART initialization
    // Communication Parameters: 8 Data, 1 Stop, No Parity
    // USART Receiver: On
    // USART Transmitter: Off
    // USART Mode: Asynchronous
    // USART Baud Rate: 9600
    UCSRA=0x00;
    UCSRB=0x90;
    UCSRC=0x86;
    UBRRH=0x00;
    UBRRL=0x19;
    // 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)
    {
    // Place your code here
    };
    }

    kalau mas ada waktu mohon dikoreksi program saya mas, maklum, saya hanya copas dari internet. kerena saya kurang paham tentang USART ini mas.
    terimakasih .

    BalasHapus
    Balasan
    1. data yang diterima ngga sama nya gimana? di atas tidak ada instruksi untuk menerima data nya...

      Hapus
    2. Komentar ini telah dihapus oleh pengarang.

      Hapus
    3. contoh program untuk instruksi menerima data itu contohnya seperiti apa mas

      Hapus
    4. misal nya fungsi getchar() untuk menerima data

      Hapus
  13. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  14. permisi gan,
    untuk mengirim data integer - /negatif itu gimana coding-nya
    trimakasih

    BalasHapus
  15. Permisi gan mau tanya nie..
    apakah kode diatas bisa untuk komunikasi mengunakan bluetooth
    kalo bisa apakan buffer nya gak akan lansung penuh?

    BalasHapus
  16. Gan, saat saya jalankan program berikut diproteus, pada vitual terminalnya koq ga bisa diketikkan huruf ya, apakah ada settingan yang lain,baudrate,atw yg lain.thanks
    if(getchar()=='m')
    {
    if(getchar()=='a')
    {
    if(getchar()=='k')
    {
    if(getchar()=='a')
    {
    if(getchar()=='n')
    {

    }

    }

    }
    }
    }

    BalasHapus
    Balasan
    1. kalau di proteus kayaknya per byte, program diatas bisa jalan jika menerima string "makan"

      Hapus
    2. sudah berhasil gan. tetapi sewaktu saya terapkan secara langsung hadwarenya, dengan settingan baudrate yg sama antara ATMega8535 dan hyperterminal (sebagai pemberi data), PORTB.0 nya tidak menyala, adakah yang harus diperhatikan lgi. Thanks.
      Gambaran Skematik: PORTD.tx & rx(8535) to pin 11 & 12(max232) dan pin 13&14(max232) to Port DB9(Laptop)

      Hapus
    3. sebelumnya ditambahin ini gan coba DDRB.0=1;

      Hapus
    4. setelah ditambah DDRB.0=1; led nya menyala gan, walaupun belum menerima data:

      DDRB.0=1;
      if(getchar()=='m')
      { if(getchar()=='a')
      { if(getchar()=='k')
      { if(getchar()=='a')
      { if(getchar()=='n')
      {
      PORTB.0=1;
      }
      }
      }
      }

      Hapus
    5. sebelum loop while(1) di dalam fungsi main(), coba tambahkan PORTB.0=0; biar pasti sebelum di beri data pin b.0 di ukur tegangannya dengan voltmeter dan sesudah di beri data juga di ukur.

      Hapus
    6. sudah berhasil gan, ternyata max232 nya rusak, hehehe,,
      thanks gan,
      kalau ada waktu, share ilmunya yang lain gan, krn sngt membantu seperti saya yg masih pemula. thx

      Hapus
  17. ini apa sudah benar cara pemanggilan AT COMMENT memakai program codevision avr

    lcd_clear();
    puts("AT+CMGF=1 \r");
    delay_ms(700);
    lcd_puts("Kirim sms...");

    puts("AT+CMGS=\"083831608711\"\r");
    //----nomor HP tujuan : 0857XXXXXXXX, bisa ganti yang lain
    //----- tunggu 700 ms
    delay_ms(700);

    //----- isi sms yang dikirim
    puts("Tes Kirim SMS");
    //----- kode akhiran untuk perintah kirim sms
    putchar(0x1A);
    //----- tunggu 1 detik
    delay_ms(1000);

    //----- hapus tampilan LCD
    lcd_clear();
    //----- tampilan pada LCD
    lcd_puts("SMS terkirim");
    //----- selesai

    while (1)
    {



    // Place your code here

    }

    BalasHapus
    Balasan
    1. saya belum pernah pakai AT Command, saya koreksi fungsi stdio.h sama lcd aja ya..

      lcd_clear();
      putsf("AT+CMGF=1 \r");
      delay_ms(700);
      lcd_putsf("Kirim sms...");

      putsf("AT+CMGS=\"083831608711\"\r");
      //----nomor HP tujuan : 0857XXXXXXXX, bisa ganti yang lain
      //----- tunggu 700 ms
      delay_ms(700);

      //----- isi sms yang dikirim
      putsf("Tes Kirim SMS");
      //----- kode akhiran untuk perintah kirim sms
      putchar(0x1A);
      //----- tunggu 1 detik
      delay_ms(1000);

      //----- hapus tampilan LCD
      lcd_clear();
      //----- tampilan pada LCD
      lcd_putsf("SMS terkirim");
      //----- selesai

      while (1)
      {



      // Place your code here

      }

      Hapus
  18. Komentar ini telah dihapus oleh pengarang.

    BalasHapus
  19. mas,supaya data yg masuk itu bisa lgsg kosong lg data program yg benar gmn ya mas??

    while(penanda==3)
    {
    h=0;
    while(data[h]!=0x0A)
    {
    temp2=getchar();
    if(temp2=='' || temp2==0x0D || temp2==0x0A|| temp2==0x03)
    break;
    if(temp2!=0x02)
    {
    h++;
    data[h]=temp2;
    sprintf(gbg,"%c",temp2);
    strcat(convert,gbg);
    }

    }
    delay_ms(100);
    penanda=5;
    while ((strcmp (id3,convert) == 0) && (penanda==5))
    {
    delay_ms(50);
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf(" Akses Diterima ");
    delay_ms(200);
    motor();
    surat_off();
    delay_ms(2000);
    lcd_clear();
    strcat(convert," ");
    penanda=0;
    goto menu;

    }
    while (((strcmp (id2,convert) == 0) || (strcmp (id1,convert) == 0)) && (penanda==5))
    {
    delay_ms(50);
    lcd_clear();
    lcd_gotoxy(0,0);
    lcd_putsf(" Akses Ditolak ");
    delay_ms(200);
    lampu_alarm();
    alarm();
    delay_ms(2000);
    lcd_clear();
    lampu_off();
    strcat(convert," ");
    penanda=0;
    goto menu;
    }
    }

    BalasHapus
  20. mau nanya mas, saya buat program komunikasi serial kalo dikasih input "a" dari komputer, mikro kirim data "1" ke komputer sedangkan kalo tidak dikasih input ataupun input tidak samadengan "a" mikro ngirim data "2" ke komputer, ini program yang saya buat;
    if(getchar()!='a'){
    printf("1");
    }
    printf("2");
    tapi setelah di eksekusi mikro hanya kirim "2" ke komputer ketika input diberi tidak sama dengan "a" sedangkan yang saya inginkan mikro terus ngirim "2" walaupun tidak diberi inputan

    BalasHapus
  21. mau nanya mas, saya buat program komunikasi serial kalo dikasih input "a" dari komputer, mikro kirim data "1" ke komputer sedangkan kalo tidak dikasih input ataupun input tidak samadengan "a" mikro ngirim data "2" ke komputer, ini program yang saya buat;
    if(getchar()!='a'){
    printf("1");
    }
    printf("2");
    tapi setelah di eksekusi mikro hanya kirim "2" ke komputer ketika input diberi tidak sama dengan "a" sedangkan yang saya inginkan mikro terus ngirim "2" walaupun tidak diberi inputan
    mohon pencerahnnya mas...

    BalasHapus
    Balasan
    1. 1. itu if(getchar()!='a') bukannya if(getchar()=='a') ya?

      2. dalam fungsi getchar, jika tidak ada masukan ke RX mikro maka akan looping forever sampai ada masukan ke RX. coba pake cara ini http://marizaazhar.blogspot.com/2015/03/trik-keluar-loop-fungsi-getchar-dengan.html

      Hapus
  22. mas saya mau tanya
    dari vb saya punya kodingan kaya gini buat menyalakan led di proteus dengan mengirim X dengan tipe data String

    Private Sub Command1_Click()
    Dim dataKeluar As String
    dataKeluar = "X"
    If Command1.Caption = "ON" Then
    Command1.Caption = "OFF"
    MSComm1.Output = dataKeluar

    nah di codevisionavr saya intinya seperti ini
    char tes;

    while (2){
    tes = getchar();
    if(getchar()=='X'){
    PORTA.0=1;PORTA.1=1;
    }

    tapi di proteus led nya ga nyala. tapi di komponen compim (rs232 di proteus) itu keliatan kalo ada nilai yg masuk
    minta tolong koreksi mas atau sarannya

    BalasHapus
    Balasan
    1. maaf ada kesalahan
      while (2){
      tes = getchar();
      if(tes=='X'){
      PORTA.0=1;PORTA.1=1;
      }

      Hapus
    2. belum bisa juga.
      dari kodingan diatas ada kesalahan ga ya?
      soalnya ngirim nilai dari mikro ke vb lancar

      Hapus
    3. apa saya kirim aja mas full kodingan nya ?

      Hapus
    4. Komentar ini telah dihapus oleh pengarang.

      Hapus
    5. DDRA.1=1;
      DDRA.0=1;
      while(1)
      {
      tes = getchar();
      if(tes=='X'){
      PORTA.0=1;
      PORTA.1=1;
      }

      coba pakai code diatas

      Hapus
    6. sama aja mas
      semua porta saya pake buat output

      Hapus
  23. while (1)
    {
    if(PIND.6==1){
    delay_ms(200);
    lcd_clear();
    data13=0;data14=0;PORTA.2=0;PORTA.3=0;
    data21=0;PORTA.6=0;PORTA.7=0;PORTB.0=0;
    data31=data31+1;
    if(data31==2){data37=data32;};
    if(data31==3){data37=data33;};
    if(data31==4){almt1=data32;almt2=data33;data31=1;}; //END SETTING
    };
    //BT DECREAS
    if(PIND.4==1){
    delay_ms(200);
    if(data31==2){if (data32>1){data32=data32-1;};}; //ST TOILET
    if(data31==3){if (data33>1){data33=data33-1;};};
    };
    //BT INCREAS
    if(PIND.5==1){
    delay_ms(200);
    if(data31==2){if (data32<60){data32=data32+1;};};
    if(data31==3){if (data33<60){data33=data33+1;};};
    };


    if(data31==1){
    //GROUP1 TOILET
    data11=PINC.0;data12=PINC.1;
    //if(data11==1 | data12==1)//{PORTA.1=1;};

    nah disini tadinya saya kasih logika ATAU
    JIKA DATA11==1 ATAU GETCHAR()=='X'
    tapi malah semua button jd ga fungsi sampe kebawah

    if(data11==1){serial='A';putchar(serial);data13=data32*data34;} //set timer cuci tangan
    if(data12==1){serial='B';putchar(serial);data14=data32*data34;} //set timer BAB
    if(data13>0){PORTA.0=1; PORTA.1=1;}
    else{if(data13==0){serial='a';putchar(serial);PORTA.0=0; PORTA.1=0;};};

    if(data14>0){PORTA.2=1;PORTA.3=1;}
    else{if(data14==0){serial='b';putchar(serial);PORTA.2=0; PORTA.3=0;};};

    //GROUP2 LORONG
    data24=PIND.2;data25=PIND.3;
    if(PIND.2==1|PIND.3==1)//{PORTA.5=1;}; //PORT.A.5=penanda inputan sensor
    if(data24==1|data25==1){serial='C';putchar(serial);data21=data33*data34;PORTA.4=1;}; //set timer
    if(data21>0){
    if(data21==(data33*data34)-1){serial='D';putchar(serial);PORTA.5=1; PORTA.6=1;};
    if(data21==(data33*data34)-2){serial='E';putchar(serial);PORTA.7=1; PORTB.0=1;};
    if(data21==2){serial='c';putchar(serial);PORTA.4=0;};
    if(data21==1){serial='d';putchar(serial);PORTA.5=0; PORTA.6=0;};

    }
    else{serial='e';putchar(serial);PORTB.0=0; PORTA.7=0;};
    };

    //LCD DISPLAY
    if(data31==1){
    lcd_gotoxy(0,0);lcd_putsf("SYSTEM:RUNING");
    lcd_gotoxy(0,1);lcd_putsf("TA:");
    lcd_gotoxy(5,1);lcd_putsf("TA:");
    lcd_gotoxy(10,1);lcd_putsf("LL:");
    if(data14>=0){itoa(data14,temp);
    }
    lcd_gotoxy(3,1);lcd_puts(temp);

    if(data13>=0){itoa(data13,ta);
    }
    lcd_gotoxy(8,1);lcd_puts(ta);
    itoa(data21,wc);lcd_gotoxy(13,1);lcd_puts(wc);


    if(data14==9){lcd_gotoxy(4,1);lcd_putsf(" ");};
    if(data13==9){lcd_gotoxy(9,1);lcd_putsf(" ");};
    if(data21==9){lcd_gotoxy(14,1);lcd_putsf(" ");};};
    if(data31==2){
    lcd_gotoxy(0,0);lcd_putsf("SYSTEM:SET-TA1");
    lcd_gotoxy(0,1);lcd_putsf("Timer:");
    itoa(data32,temp);lcd_puts(temp);
    if(data32==9){lcd_putsf(" ");};
    };
    if(data31==3){
    lcd_gotoxy(0,0);lcd_putsf("SYSTEM:SET-TA2");
    lcd_gotoxy(0,1);lcd_putsf("Timer:");
    itoa(data33,temp);lcd_puts(temp);
    if(data33==9){lcd_putsf(" ");};
    };
    if(data31==4){
    lcd_gotoxy(0,0);lcd_putsf("SYSTEM:SET-LL");
    lcd_gotoxy(0,1);lcd_putsf("Timer:");
    itoa(data33,temp);lcd_puts(temp);
    if(data33==9){lcd_putsf(" ");};
    };
    }
    nah disini tadinya saya buat while (2) yg kodingan singkat sebelumnya
    tapi sama aja
    }


    BalasHapus
  24. Saya ada tugas komunikasi serial antara 2 mikro kontroler
    Bagaiamana ya listing programnya jika mikro 1 mengirim data agar mikro 2 menerima data dan menghidupkam 4 buah LED karena saya mash bingung konsepnya
    Terima kasih

    BalasHapus
  25. saya mau tanya, untuk mengirim data float melalui uart bagaimana ya? thx

    BalasHapus
  26. assalamuallaikum mas saya mau tnya cara membuat biar keluarannya 7 segmen bagai mana ya dari program ini

    #include
    #include
    #asm
    .equ_lcd_port=0x15 ; // POTRC
    #endasm
    #include
    unsigned char wadah [16];
    unsigned char kar;
    void terima_data(void);

    void main (void)
    {
    lcd_init (16);
    lcd_clear ();
    UCSRA = 0X00;
    UCSRB = 0X10; // RXEN
    UCSRC = 0X86; //
    UBRRH = 0X00;
    UBRRL = 0X51;
    lcd_gotoxy(0,0);
    lcd_putsf("ketikan huruf");
    lcd_gotoxy(0,1);
    lcd_putsf("huruf anda");
    while (1)
    {
    terima_data();
    sprintf(wadah, "%c", kar);
    lcd_gotoxy(12,1);
    lcd_puts (wadah);
    }
    }
    void terima_data (void)
    {
    while ( ! (UCSRA&0X80));
    {
    };
    kar = UDR;
    }


    trima kasih

    BalasHapus
    Balasan
    1. Masnya harus singkronkan dg program dlu utk ke 7segmen

      Hapus
  27. mas mau tanya, kalau simulasi di proteus komponen nya apa aja ya yg buat komunikasi serial...?

    BalasHapus
  28. Bang mau tanya seandainya di dalam program ada lcd,segmen utk menampilkan voltmeter
    nah usart saya aktifkan kok tidak bisa trbca di komputer dg aplikasi cvavr ya.
    Apa yang harus saya lakukan ?
    apa perlu tambahan aplikasi proteus atau pakai rx 232 dg converter jga.terimakasih tlong bantuannya bang

    BalasHapus
  29. hello gan, bisa berikan contoh interrupt usart ??? misalkan secara berulang saya kirim ke mikro karakter 'M' trus saya interrupkan untuk mengirim karakter 'K'tanpa menghentikan pengiriman karakter 'M'ke mikrokontroller

    BalasHapus
  30. gan mohon pencerahan nya...

    maslahnya ginigan
    ini program suka stuck kang. inputnya tu harus di kirim 3 sampe 4 kali baru ter exse kusi

    misal ini gan
    if(getchar()=='W')
    {
    PORTB.4=1;
    };
    nah ngirim hurup W nya tu harus sampe 4 kali baru keluar prt b nya tu 1

    // Place your code here


    if(getchar()=='W')
    {
    PORTB.4=1;
    };
    if(getchar()=='A')
    {
    PORTB.4=0;
    };

    if(getchar()=='M')
    {
    PORTB.5=1;
    };
    if(getchar()=='S')
    {
    PORTB.5=0;
    };

    if(getchar()=='E')
    {
    PORTB.6=1;
    };
    if(getchar()=='D')
    {
    PORTB.6=0;
    };
    if(getchar()=='R')
    {
    PORTB.7=1;
    };
    if(getchar()=='F')
    {
    PORTB.7=0;
    };
    if(getchar()=='P')
    {

    arus=read_adc(0);
    volt=read_adc(1);
    sprintf(buf,"I= %d'A", arus);
    lcd_gotoxy(0,1);
    lcd_puts(buf);
    sprintf(buf,"V= %d'V", volt);
    lcd_gotoxy(8,1);
    lcd_puts(buf);
    printf("%d",arus);
    printf("A";
    printf("%d",volt);
    printf("B#";



    };


    };
    }

    BalasHapus
    Balasan
    1. coba gini

      unsigned char bufchar;

      bufchar=getchar();

      if(bufchar=='W')
      {
      PORTB.4=1;
      }
      else if(bufchar=='A')
      {
      PORTB.4=0;
      }

      else if(bufchar=='M')
      {
      PORTB.5=1;
      }
      else if(bufchar=='S')
      {
      PORTB.5=0;
      }

      else if(bufchar=='E')
      {
      PORTB.6=1;
      }
      else if(bufchar=='D')
      {
      PORTB.6=0;
      }
      else if(bufchar=='R')
      {
      PORTB.7=1;
      }
      else if(bufchar=='F')
      {
      PORTB.7=0;
      }
      else if(bufchar=='P')
      { ...

      Hapus
  31. gan kenapa ga mau jalan programnya ? saya pake putchar doang, putchar('A'); , yang keluar itu malah kaya huruf CCCCCCCCC, kenapa ya ?

    BalasHapus
  32. Gan mau tanya ini kalo konversi dari string ke char bisa pake apa ya?? Soalnya ini aku pake bluethooth data bisa rerkirim tapi ga bisa kebaca apa yg dikirimnya itu (tamoilan di lcd huruf lambang ngaco2)

    BalasHapus
  33. Gan mau tanya ini kalo konversi dari string ke char bisa pake apa ya?? Soalnya ini aku pake bluethooth data bisa rerkirim tapi ga bisa kebaca apa yg dikirimnya itu (tamoilan di lcd huruf lambang ngaco2)

    BalasHapus
    Balasan
    1. kalau pake getchar, data string dari bluetooth di simpan dulu ke variable array bertipe char atau unsigned char, setelah itu ditampilkan ke lcd. pastikan juga baudrate nya dan parity nya sama

      Hapus
  34. gan, saya ngirim data berupa sejumlah kata kan dari labview ke AVR , menggunakan fungsi scanf, kenapa ya karakter "spasi " dan enter ga ke baca ?

    BalasHapus
  35. gan saya mau nanya kalo coding usart untuk mpu6050 bagaimana ya?

    BalasHapus
  36. Om cara mengirimkan variabel ke usart gimana ya?
    Contoh int a;
    a=100;
    gimana cara mengirim data a ke usart?

    BalasHapus
  37. saya pake microcontroller8535 real gak pake simulasi terus untuk receivernya pake software hyperterminal,,
    adakah tutorialnya mas atau ada buku pdf yang bisa saya gunakan?

    terima kasih

    BalasHapus
    Balasan
    1. saya belum buat tutorialnya untuk itu, kalau mau dipraktekan langsung, harus menggunakan converter usb to ttl, rx tx konverter di hubungkan dengan tx rx atmega

      Hapus
  38. Mas kalau saya coba berhasil tapi kalau saya coba pakai 3 mikro kok tdk bisa ya? 1 sbg penrima 2 pengirim

    BalasHapus
  39. Mas kalau saya coba berhasil tapi kalau saya coba pakai 3 mikro kok tdk bisa ya? 1 sbg penrima 2 pengirim

    BalasHapus
  40. umm mas maaf nih klo boleh tanya, klo mau munculin nilai ADC ke serial monitor apa aja yah perintah yang di kasih ?

    BalasHapus
    Balasan
    1. putchar(nilai_adc); nila_adc adalah char atau integer

      kalau coding di arduino print(nilai_adc)

      Hapus
  41. mas, saya sudah coba mengubah data integer ke data string sebelum dikirim (fungsi putchar), dan pada virtual terminal sudah mengirim karakter string yang merupakan hasil dari konversi data integer tadi ke string. Namun, bagaimana cara menerima data dengan fungsi getchar. saya sudah coba pake getchar dengan memanggil karakter string yang dikirim tadi, namun hasilnya tidak ada nilai alias kosong, mohon pencerahannya mas.


    Terima Kasih

    BalasHapus
  42. min mau nanya min, saya mau buat program komunikasi serial untuk menampilkan suhu dari sensor LM35 ke computer
    pada software HyperTerminal/Terminal. itu gimana ya min? sy bingung untuk memasukkan perintah di CVAVRnya. apakah untuk menampilkan hasil dari sensornya ke hyperterminal menggunakkan perintah scanf() atau getchar() ?

    BalasHapus
    Balasan
    1. kalau pakai cvavr bisa menggunakan program di atas, pakai putchar(),tipe data di fungsi putchar 8 bit atau 1 byte dari 0-255(integer), bisa juga menggunakan putsf(), tipe data nya string

      Hapus