USART Pada Mikrokontroler ATMEGA16

USART (Universal Syncronous Asyncronous Receiver/Transmiter) pada mikrokontroler ATMEGA16 memiliki beberapa keuntungan diantaranya ialah operasi full duplex (memiliki register receive dan transmiter yang terpisah), mendukung komunikasi multiprosesor dan kecepatan transmisi berorde Mbps.
Dalam Uji coba kali ini mikrokontroler ATMEGA16 akan berkomunikasi secara USART dengan komputer melalui port serial. berikut rangkaian uji coba lengkapnya :
USART_1
Mikrokontroler akan menerjemahkan data yang dikirimkan PC dan menyalakan / mematikan LED berdasarkan data yang diterima dari PC.
RS232
Chip Max 232 dalam uji coba ini berfungsi untuk mengkonversi level tegangan mikrokontroler ke level tegangan komunikasi serial PC dan sebaliknya.
Berikut merupakan aplikasi yang digunakan untuk menguji coba komunikasi serial antara mikrokontroler dan PC :
MICU
Aplikasi ini dapat di download disini
Aplikasi ini berfungsi untuk mengirimkan data ke mikrokontroler dan menerima data dari mikrokontroler. dalam uji coba ini LED akan menyala ketika dikirimkan data ‘1’ dan padam ketika dikirimkan data ‘0’. Ketika LED menyala mikrokontroler akan mengirimkan string “LED ON” kepada PC dan dalam aplikasi akan menampilkan string yang dikirimkan mikrokontroler.
Program lengkap dan penjelasan uji coba ini dapat dilihat berikut ini :
#include <mega16.h>
#include <delay.h>

// Standard Input/Output functions
#include <stdio.h>
unsigned char data;

void main(void)
{
PORTC=0xff;  //Pull Up internal diaktifkan
DDRC=0xff;
//PORTA sebagai Output
//// 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=0x4D;

while (1)
      { 
       data=getchar();delay_ms(1000); //Baca data yang dikirimkan PC simpan dalam var data
      if(data=='1'){PORTC=0x00;printf ("\n LED ON");}  //Jika data=1 LED on, kirimkan LED ON 
      if(data=='0'){PORTC=0xff;printf ("\n LED OFF");}  //Jika data=1 LED on, kirimkan LED ON
      }
}

ADC pada Mikrokontroler ATMEGA16

 

Dalam Mikrokontroler ATMEGA16 terdapat 8 buah ADC yang berada pada PORTA (ADC0-ADC7), ADC (Analog to Digital Converter) merupakan proses perubahan tegangan DC kedalam data bilangan digital, bisa berupa biner, heksa, ataupun desimal tergantung pemrograman yang dilakukan.

Dalam percobaan kali ini akan dilakukan uji coba pembacaan nilai ADC pada PORTA.0(ADC 0) dan PORTA.1(ADC 1) pembacaan data dalam bentuk digital 8bit dan dirubah kedalam bentuk desimal dan ditampilkan dalam LCD 16x2. berikut merupakan skema rangkaian uji cobanya :

ADC_LCDADC pada mikrokontroler ATMEGA16 dapat diberi referensi tegangan eksternal, yang dalam uji coba ini referensi tegangan eksternal di inputkan pada PIN 30 (AVCC).POT_ADC  Dua buah potensio meter di inputkan pada port ADC yang dipergunakan sebagai simulasi perubahan tegangan yang terjadi ketika potensio ini diputar, dalam kenyataan perubahan nilai tegangan ini dapat di aplikasikan berupa pembacaan sensor, misalkan sensor suhu LM35, sensor jarak GP2D12, dll tergantung aplikasi yang akan digunakan.

Berikut merupakan program percobaan beserta penjelasannya yang saya tulis dalam CodeVision AVR :

#include <mega16.h>

#include <delay.h>

// Alphanumeric LCD functions
#include <alcd.h>
#include <stdlib.h>

#define ADC_VREF_TYPE 0x60  //Tegangan referensi yang digunakan pin AVCC

// Nilai konversi adc 8bit
unsigned char read_adc(unsigned char adc_input)
{
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 ADCH;
}

int adc0,adc1; 
char buf0[8];
char buf1[8];

void main(void)
{
PORTA=0xFF;  //Pull up interal port A diaktifkan
DDRA=0x00; 
//Seluruh PIN Port A sebagai Input

// ADC initialization
// ADC Clock frequency: 750.000 kHz
// ADC Voltage Reference: AVCC pin
// ADC Auto Trigger Source: ADC Stopped
// Only the 8 most significant bits of
// the AD conversion result are used
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;

// Alphanumeric LCD initialization
// Connections are specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16

lcd_init(16);

while (1)
      {
       lcd_gotoxy(0,0);lcd_putsf("ADC 0 =");
      lcd_gotoxy(0,1);lcd_putsf("ADC 1 =");
      adc0=read_adc(0); // Baca nilai ADC0 dan simpan dalam variabel adc0
      itoa(adc0,buf0);
// Konversi nilai integer adc0 ke dalam bentuk karakter

      lcd_gotoxy(8,0);lcd_puts(buf0); // Tampilkan nilai adc0
      adc1=read_adc(1);  // Baca nilai ADC1 dan simpan dalam variabel adc1
      itoa(adc1,buf1);
//Konversi nilai integer adc1 ke dalam bentuk karakter

      lcd_gotoxy(8,1);lcd_puts(buf1); //tampilkan nilai adc1
      }
}

Hasil Pembacaan ADC akan ditampilkan dalam bentuk desimal 0-255 berdasarkan hasil pembacaan.LCD_adcSemoga membantu, Terima Kasih.

Pengaturan Kecepatan Motor DC dengan ATMEGA16 dan L293D

Pada posting kali ini dilakukan uji coba pengaturan kecepatan putaran motor DC, menggunakan mikrokontroler ATMEGA16 sebagai prosesor, dan driver menggunakan ICL293D yang dapat di inputkan tegangan maksimum 32V, LCD karakter 16x2 sebagai user interface, berikut skema rangkaian tersebut :


Motor DC yang di kontrol berjumlah 2 buah, dengan pengaturan dengan 4buah push button, yang berfungsi menaikan dan menurunkan kecepatan.

Driver motor menggunakan IC L293D yang sudah biasa digunakan, dengan fungsi sebagai berikut :
- IN1 & IN2 = arah putaran motor 1 misal (IN1=High & IN2=Low) maka motor forward dan sebaliknya
- IN3 & IN4 = arah putaran motor 2 misal (IN3=High & IN4=Low) maka motor forward dan sebaliknya
- EN1 = Pengatur kecepatan motor 1 dengan metode PWM (Pulse Width Modulation)
- EN1 = Pengatur kecepatan motor 2 dengan metode PWM (Pulse Width Modulation)

Dengan memanfaatkan fitur Fast PWM yang terdapat dalam mikrokontroler ATMEGA16, pemrograman diawali dengan mengaktifasi Fast PWM mode OCR1A untuk motor 1, dan OCR1B untuk motor 2, kemudian nilai OCR1A dan OCR1B ditampilkan melalui LCD sebagai parameter. Berikut merupakan program lengkapnya yang saya tulis dengan bahasa C pada CodeVision AVR :
#include

// Alphanumeric LCD Module functions
#include
#include
//Deklarasi variabel
int SA,SB;
char MA[8];
char MB[8];
void main(void)
{
PORTA=0xFF;
DDRA=0x00;
PORTD=0x00;
DDRD=0xFF;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 12000.000 kHz
// Mode: Fast PWM top=0x00FF
// OC1A output: Non-Inv.
// OC1B output: Non-Inv.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0xA1;
TCCR1B=0x09;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

/ Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 8
lcd_init(8);

while (1)
      {   
      lcd_gotoxy(0,0);lcd_putsf("M1=");lcd_gotoxy(0,1);lcd_putsf("M2=");  
      PORTD.0=1;   //Motor 1 Forward
      PORTD.1=0; 
      PORTD.3=1;   //Motor 2 Reverse
      PORTD.4=0; 
      if(PINA.0==0){SA++;}  //Jika pushbutton A0 ditekan naikan kecepatan motor 1
      if(PINA.1==0){SA--;}   //Jika pushbutton A1 ditekan turunkan kecepatan motor 1
      if(PINA.2==0){SB++;}   //Jika pushbutton A2 ditekan naikan kecepatan motor 2
      if(PINA.3==0){SB--;}    //Jika pushbutton A3 ditekan turunkan kecepatan motor 2
      lcd_gotoxy(5,0);itoa(SA,MA);lcd_puts(MA); //Tampilkan nilai kecepatan Motor 1
      lcd_gotoxy(5,1);itoa(SB,MB);lcd_puts(MB);  //Tampilkan nilai kecepatan Motor 2
      OCR1A=SA; 
      OCR1B=SB;
      // Place your code here

      }
}

Terima Kasih, semoga membantu.

Monitoring SUHU dan Detector Smoke menggunakan ATmega16 Dengan Bahasa Basic (Bascom AVR)

Pada project kali ini adalah sedikit eksperimen menggunakan sensor suhu LM35 dan smoke detektor, rangkaian akan mendeteksi tingkat ketebalan asap dan nilai parameternya akan ditampilkan melalui LCD, dan akan menentukan tingkat bahaya dan adanya api jika terjadi peningkatan suhu. Monitoring SUHU dan Detector Smoke menggunakan ATmega16 Dengan Bahasa Basic )Bascom AVR) Berikut daftar Komponen Library nya... :-) ATMega 16 Led Button LCD 20*4 Sensor LM35 Detector Smoke Berikut Listing Program Basic nya 'Konfigurasi ATmega 16 '================================== $regfile = "m16def.dat" $crystal = 1200000 'Konfigurasi LCD '================================== Config Lcdpin = Pin , Db4 = Portd.4 , Db5 = Portd.5 , Db6 = Portd.6 , Db7 = Portd.7 , E = Portd.2 , Rs = Portd.0 Config Lcd = 20 * 4 Cursor Off 'Konfigurasi Input & Out put '================================== Config Portd = Output Config Porta = Input 'Bagian ADC '================================== Dim Y As Integer Deflcdchar 0 , 14 , 10 , 14 , 32 , 32 , 32 , 32 , 32 Config Adc = Single , Prescaler = Auto , Reference = Internal Dim A As Word , Volt As Word , Volt_d As Byte Dim Z As Word , I As Word , I_d As Byte Start Adc 'analisasi Port '================================== C Alias Portd.3 'Star Awal Program '================================== Cls Locate 1 , 4 Lcd "ALARM KEBAKARAN" Locate 3 , 1 Lcd " Suhu & Sensor Asap" Locate 4 , 1 Lcd " AVR ATmega16" Wait 1 Cls Waitms 500 'Mulai Program '=================================== Do 'Baca Sensor Suhu '=================================== Locate 1 , 1 Lcd "MONITORING SUHU" A = Getadc(0) Volt = A * 5 Volt_d = Volt Mod 10 Volt = Volt / 20 Locate 2 , 1 Lcd Volt ; "," ; Volt_d Locate 2 , 6 Lcd Chr(0) ; "C" 'Baca Sensor Asap '================================== Locate 3 , 1 Lcd "MONITORING ASAP" Z = Getadc(1) I = Z * 10 I_d = I Mod 10 I = I / 20 Locate 4 , 1 Lcd I ; "," ; I_d Locate 4 , 6 Lcd Chr(1) ; "ppm" 'Bagian Suhu Normal '================================== Normal: If Volt < 31 Then If Volt > 19 Then Locate 2 , 9 Lcd "SUHU NORMAL " C = 1 End If End If 'Bagian Suhu Dingin '=================================== Dingin: If Volt < 19 Then Locate 2 , 8 Lcd " SUHU DINGIN " C = 1 End If 'Bagian Suhu Siaga '=================================== Siaga: If Volt > 30 Then If Volt < 41 Then Locate 2 , 9 Lcd "SUHU SIAGA1" C = 1 End If End If If Volt > 40 Then If Volt < 51 Then Locate 2 , 9 Lcd "SUHU SIAGA2" C = 1 End If End If If Volt > 50 Then If Volt < 61 Then Locate 2 , 9 Lcd "SUHU SIAGA3" C = 1 End If End If 'Bagian Suhu Bahaya '=================================== Bahaya: If Volt > 60 Then Locate 2 , 9 Lcd "KEBAKARAN " C = 0 End If Loop Skema Rangkaian Menggunakan Proteus 7.7 SP2 Untuk pertanyaan dan kelengkapannya Klick Disini Inbox ajah

AVR Studio 5 Full version Download

Software dapat didownload langsung disini
Ukuran File 606MB