Komunikasi serial port AVR

Posted on Updated on

salah satu cara komunikasi avr adalah dengan cara komunikasi serial UART…pada posting ini akan dijelaskan cara berkomuniaksi secara serial menggunakan uC avr dengan contoh atmega8535..PORTD.0 berfungsi sebagai Rx (penerima data) sedangkan PORTD.1 berfungsi sebagai Tx (pengirim data)..sebagai contoh, saya ingin membaca data dari adc lalu ditampilkan di komputer melalui hyperterminal windows..masukan adc adalah sensor misalkan sensor suhu LM35..dengan range masukan 0-5volt(sudah dikuatkan) atau juga untuk coba2 digunakan potensiometer agar lebih gampang..sebagai masukan data yang akan ditampilkan bisa sesuai dengan kebutuhan, tidak hanya data dari adc, data dari sensor DS1621 atau PING))) juga bisa asalkan pake printf() semua bisa ditampilkan, untuk hal itu silakan anda berkreasi sendiri..baudrate yang digunakan sebesar 9600 bps dan memakai kristal 11.059200 MHz. untuk komunikasi data serial, nilai kristal sangat berpengaruh dalam error yang terjadi selama pengiriman data..nilai kristal yang sangat baik untuk digunakan adalah 11.059200 MHz, karena error pengiriman datanya secara teoritis 0 % dibandingkan nilai kristal lain yang mempunyai tingkat error data jauh lebih besar..

dibawah ini adalah contoh sourcecode dari komunikasi serial avr :

/*****************************************************
This program was produced by the
CodeWizardAVR V1.25.3 Professional
Automatic Program Generator
© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 2/25/2009
Author  : GreenBlack
Company : WEIP
Comments:

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

#include <mega8535.h>
#include <delay.h>

// Standard Input/Output functions
#include <stdio.h>

#define ADC_VREF_TYPE 0x00

// Read the AD conversion result
unsigned int read_adc(unsigned char adc_input)
{
ADMUX=adc_input | (ADC_VREF_TYPE &amp; 0xff);
//delay untuk kestabilan adc(optional)
delay_us(10);
// Start the AD conversion
ADCSRA|=0x40;
// Wait for the AD conversion to complete
while ((ADCSRA &amp; 0x10)==0);
ADCSRA|=0x10;
return ADCW;
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here
unsigned int dataadc;
float vin;

// 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=0x00;

// 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: 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: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud rate: 9600
UCSRA=0x00;
UCSRB=0x18;
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;

// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AREF pin
// ADC Auto Trigger Source: None
ADMUX=ADC_VREF_TYPE &amp; 0xff;
ADCSRA=0x84;

while (1)
{
// Place your code here
dataadc = read_adc(0); // input pada pin ADC.0 atau PORTA.0
vin = ((float)dataadc*5/1024); // --> 5/1024 adalah Aref/2^10 --> 10 adalah jumlah bit adc
printf("%0.2f",vin);
delay_ms(500);
};
}

Link untuk download Full Sourcecode :

11 thoughts on “Komunikasi serial port AVR

    CjDw said:
    September 8, 2009 at 9:42 pm

    mantab pol mas..

    komunikasi UART tu kan berarti pake mode asinkron,, kelebihan ama yg make mode singkron apa mas? atau emang ada spesifikasi fungsinya? kan klo g salah pake mode singkron berarti hrs memberi sinyal clock setiap kali pengiriman data,, sedangkan yg asinkron cuman butuh protokol komunikasi data (baudrate)..
    trus bwt disply data d monitornya pake software apa y?

    thanks

      ADIHOLIX responded:
      September 9, 2009 at 3:29 am

      mosok mantab troh??? preketek troh omonganmu…hehehe…

      ya dua-duanya punya kelebihan masing2….gak bisa dibandingkan…klo yg asinkron dy punya start bit buat menunjukkan ada data yg masuk dan stop bit untuk memberitahu bahwa pengiriman data telah complete…UART lebih mudah karena udah ada start bit dan stop bit,jadi lebih mudah untuk digunakan..

      kalo yang sinkron tidak ada start bit maupun stop bit, karena pada penerimanya udah ada clock yg fungsinya buat membaca data yg masuk(bit pertama dan terakhir)..jadi disini datanya seperti data digital serial yang tanpa pemisah antara setiap bytenya(continue)…jadi USART lebih sulit diaplikasikan tetapi baudratenya bisa lebih tinggi dari UART….baudrate = kecepatan transfer data,,bukan protokol komunikasi data kayak yg km bilang diatas…hehehe…

      klo buat belajar atau interface, pake UART aja soalnya gampang…qeqeqeqe….

      softwarenya pake delphi…

      suwun wes mampir….

    m fadholi said:
    October 22, 2009 at 5:49 am

    mas mw tanya gmn caranya bwt program dg bahasac,saya mw membuat dispro rancang bangun alat pemilah sampah basah dan kering?thanks yang banyak mas

      ADIHOLIX responded:
      October 25, 2009 at 1:50 am

      wah,,maaf mas fadholi…pertanyaannya agak di persempit lagi aja ya…saya juga bingung jawabnya…hehe mksudnya yang ditanyakan itu sensornya,rangkaiannya gimana,kodingnya atau semuanya??? hehe..

      trims sudah berkunjung….^^

    dhany said:
    November 2, 2009 at 6:20 am

    salam kenal mas…kalo komunikasi 2 micro gimana mas. misal ambil data di PORT A,B,C,D micro 1 terus dikirim ke PORT A,B,C,D micro 2….makasih ya mas….ditunggu penjelasannya..hehe..
    dhanyirvandy@yahoo.com

    akbar said:
    January 2, 2010 at 5:01 am

    mas mw tanya tentang komunikasi serial…
    komunikasi serial delphi ke avr..
    cntohnya gini kita buat program d delphi perintahkan ke avr untuk mendapat logik 1..
    itu gmn programnya..
    makasih…

    Bayu said:
    January 24, 2011 at 9:51 am

    Mas mau tanya, jika saya pake 2 sensor LM 35 dikirimkan lewat RF modem, sourcecodenya gmn y?apa yang hrus ditmbh pada source di atas?
    mhon bantuannya mas . . .

    Bayu said:
    January 24, 2011 at 10:26 am

    buku rekomendasi untuk belajar AVR mas?
    juga site2 yang bagus?

    nice post, very usefull.thx mas
    waslmkum

    mikro said:
    December 7, 2011 at 8:43 pm

    kalo lewat USB gimana mas bisa ndak? atao terbatas pada port serial rs232 saja?

    NS said:
    July 22, 2012 at 9:08 am

    Mas contoh program menampilkan grafik suhu/tegangan pada VB ada?

    afanpunyablog said:
    August 7, 2012 at 12:08 am

    mas mau tanya
    rumus vin = ((float)dataadc*5/1024);, ini tetapan apa gimana maz?

Leave a comment