Anda di halaman 1dari 8

Komunikasi serial port AVR

Posted: June 25, 2009 by ADIHOLIX in AVR Project

8 salah satu cara komunikasi avr adalah dengan cara komunikasi serial UARTpada 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); }; }

Mengakses ADC pada AVR ATMega16


Posted: June 13, 2009 by ADIHOLIX in AVR Project

6 ADC digunakan untuk mengubah input analog(tegangan kontinyu) menjadi data digital(ex: 10110011) atau binary. pada uC ATMega16 sudah terintegrasi ADC 8 input dengan resolusi sebesar 10 bit didalamnya sehingga kita bisa memanfaatkannya tanpa menggunakan IC ADC tambahan + menghemat pengeluaran. ADC pada uC ATMega16 berada di PORTA. pada project ini input menggunakan potensiometer sebagai simulasi tegangan dari sensor atau bisa juga misalkan anda menggunakan sensor suhu LM35 sebagai input. Vinput dimasukkan pada PORTA.0 ATMega16. Aref dan AVcc dihubungkan ke Vcc 5 volt. Tampilan pada project ADC ini menggunakan LCD 162 yang dihubungkan ke PORTC. dibawah ini adalah sourcecode untuk mengakses ADC ATMega16 yang ditulis dalam bahasa C dengan compiler CodeVisionAVR :
/***************************************************** 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 : 1/16/2009 Author : Greenblack Company : LakoV Comments: Chip type : ATmega16 Program type : Application Clock frequency : 11.059200 MHz Memory model : Small External SRAM size : 0 Data Stack size : 256 *****************************************************/ #include <mega16.h> #include <stdio.h> #include <delay.h> // Alphanumeric LCD Module functions #asm .equ __lcd_port=0x15 ;PORTC #endasm #include <lcd.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 for ADC stabilization 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 char lcd_buffer[33]; float vinput; unsigned int dataadc; // 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; // Analog Comparator initialization // Analog Comparator: Off // Analog Comparator Input Capture by Timer/Counter 1: Off ACSR=0x80; SFIOR=0x00; // ADC initialization // ADC Clock frequency: 691.200 kHz // ADC Voltage Reference: AREF pin // ADC High Speed Mode: Off // ADC Auto Trigger Source: None ADMUX=ADC_VREF_TYPE &amp; 0xff; ADCSRA=0x84; SFIOR&amp;=0x10; // LCD module initialization lcd_init(16); while (1) // looping forever { // Place your code here dataadc=read_adc(0); vinput=((float)dataadc*0.0048828125);

lcd_gotoxy(0,0); sprintf(lcd_buffer,"Volt :%0.0002f V",vinput); lcd_puts(lcd_buffer); printf("%0.0002f",vinput); delay_ms(300); }; }

Anda mungkin juga menyukai