Komunikasi serial port AVR

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 :


001/*****************************************************
002This program was produced by the
003CodeWizardAVR V1.25.3 Professional
004Automatic Program Generator
005© Copyright 1998-2007 Pavel Haiduc, HP InfoTech s.r.l.
006 
008 
009Project :
010Version :
011Date    : 2/25/2009
012Author  : GreenBlack
013Company : WEIP
014Comments:
015 
016Chip type           : ATmega8535
017Program type        : Application
018Clock frequency     : 11.059200 MHz
019Memory model        : Small
020External SRAM size  : 0
021Data Stack size     : 256
022*****************************************************/
023 
024#include <mega8535.h>
025#include <delay.h>
026 
027// Standard Input/Output functions
028#include <stdio.h>
029 
030#define ADC_VREF_TYPE 0x00
031 
032// Read the AD conversion result
033unsigned int read_adc(unsigned char adc_input)
034{
035ADMUX=adc_input | (ADC_VREF_TYPE &amp; 0xff);
036//delay untuk kestabilan adc(optional)
037delay_us(10);
038// Start the AD conversion
039ADCSRA|=0x40;
040// Wait for the AD conversion to complete
041while ((ADCSRA &amp; 0x10)==0);
042ADCSRA|=0x10;
043return ADCW;
044}
045 
046// Declare your global variables here
047 
048void main(void)
049{
050// Declare your local variables here
051unsigned int dataadc;
052float vin;
053 
054// Input/Output Ports initialization
055// Port A initialization
056// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
057// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
058PORTA=0x00;
059DDRA=0x00;
060 
061// Port B initialization
062// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
063// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
064PORTB=0x00;
065DDRB=0x00;
066 
067// Port C initialization
068// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
069// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
070PORTC=0x00;
071DDRC=0x00;
072 
073// Port D initialization
074// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
075// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
076PORTD=0x00;
077DDRD=0x00;
078 
079// Timer/Counter 0 initialization
080// Clock source: System Clock
081// Clock value: Timer 0 Stopped
082// Mode: Normal top=FFh
083// OC0 output: Disconnected
084TCCR0=0x00;
085TCNT0=0x00;
086OCR0=0x00;
087 
088// Timer/Counter 1 initialization
089// Clock source: System Clock
090// Clock value: Timer 1 Stopped
091// Mode: Normal top=FFFFh
092// OC1A output: Discon.
093// OC1B output: Discon.
094// Noise Canceler: Off
095// Input Capture on Falling Edge
096// Timer 1 Overflow Interrupt: Off
097// Input Capture Interrupt: Off
098// Compare A Match Interrupt: Off
099// Compare B Match Interrupt: Off
100TCCR1A=0x00;
101TCCR1B=0x00;
102TCNT1H=0x00;
103TCNT1L=0x00;
104ICR1H=0x00;
105ICR1L=0x00;
106OCR1AH=0x00;
107OCR1AL=0x00;
108OCR1BH=0x00;
109OCR1BL=0x00;
110 
111// Timer/Counter 2 initialization
112// Clock source: System Clock
113// Clock value: Timer 2 Stopped
114// Mode: Normal top=FFh
115// OC2 output: Disconnected
116ASSR=0x00;
117TCCR2=0x00;
118TCNT2=0x00;
119OCR2=0x00;
120 
121// External Interrupt(s) initialization
122// INT0: Off
123// INT1: Off
124// INT2: Off
125MCUCR=0x00;
126MCUCSR=0x00;
127 
128// Timer(s)/Counter(s) Interrupt(s) initialization
129TIMSK=0x00;
130 
131// USART initialization
132// Communication Parameters: 8 Data, 1 Stop, No Parity
133// USART Receiver: On
134// USART Transmitter: On
135// USART Mode: Asynchronous
136// USART Baud rate: 9600
137UCSRA=0x00;
138UCSRB=0x18;
139UCSRC=0x86;
140UBRRH=0x00;
141UBRRL=0x47;
142 
143// Analog Comparator initialization
144// Analog Comparator: Off
145// Analog Comparator Input Capture by Timer/Counter 1: Off
146ACSR=0x80;
147SFIOR=0x00;
148 
149// ADC initialization
150// ADC Clock frequency: 750.000 kHz
151// ADC Voltage Reference: AREF pin
152// ADC Auto Trigger Source: None
153ADMUX=ADC_VREF_TYPE &amp; 0xff;
154ADCSRA=0x84;
155 
156while (1)
157{
158// Place your code here
159dataadc = read_adc(0); // input pada pin ADC.0 atau PORTA.0
160vin = ((float)dataadc*5/1024); // --> 5/1024 adalah Aref/2^10 --> 10 adalah jumlah bit adc
161printf("%0.2f",vin);
162delay_ms(500);
163};
164}
Link untuk download Full Sourcecode : disini

Artikel yang berkaitan :



0 comments:

Posting Komentar