Tampilkan postingan dengan label Mikrokntroler. Tampilkan semua postingan
Tampilkan postingan dengan label Mikrokntroler. Tampilkan semua postingan

Jumat, 24 Oktober 2014

Interface Joystick PS 2 berbasis Mikrokontroller AVR dan compiler Codevision AVR

Bissmilahirrohmanirrohim..,

Hhmm.., dah lama gak posting jadi rada kaku..., hohohooo..,

     Sekarang saya akan mencoba untuk share kepada teman-teman cara interface joystick PS2 dengan mikrokontroler AVR dan program yang digunakan bahasa C compiler Codevision AVR yang di aplikasikan pada robot beroda. Joystick PS2 ada 2 tipe yang Wire / kabel dan Wireless tanpa kabel, pada ajang KRAI penggunaan joystick ini sangat familiar karena mudah penggunaan'y dan simple. Interface Joystick PS dengan Mikrokontroler AVR ini menggunakan komunikasi SPI (Serial Peripheral Interface) atau yg dikenal dengan 3 kabel, tapi disini saya tidak akan bahas detail tentang SPI (ask google), 

Ok langsung aja, 
1. Kita lihat Pin Konfigurasi dari Joystick PS 2

Gambar 1. Pin konfigurasi Joystick PS2

     Dari gambar diatas bisa kita lihat joystick PS memiliki 9 pin dengan warna yang berbeda. akan tetapi ada beberapa joystick(tipe kabel/wire) di pasaran yang hanya memiliki 8 pin. Dari 9 atau 8 pin tersebut yang hanya digunakan hanya 6 pin / warna dengan mengabaikan tegangan motor(Getar) pada joystick. 6 warna kabel tersebut yaitu (Brown = data), (Orange = Command), (Black = Ground), (Red = Power), (Yellow = Attention), dan (Blue = Clock). Hati-hati terhadap warna Orange dan Kuning karena hampir sama jika terbalik maka joystick tidak akan bisa digunakan.

2. Rangkaian Joystick PS2 dengan Mikrokontroler.


Gambar 2. Rangkaian joystick PS2 dengan Mikrokontroler

    Dari rangkaian diatas joystick PS2 dengan mikrokontroler cukup sederhana hanya 4 pin yaitu Mosi, Miso, SCK, dan Pin bebas. Untuk pin SCK, MOSI, PB4(bebas) diberi resistor 220 ohm sebagai pengaman, sedangkan resistor 4k7 ohm pada MISO sebagai Pull-up. Pin SCK dihubungkan ke kabel joystick warna biru, PB4 (pin bebas) dihubungkan ke kabel joystick warna kuning, Pin MOSI dihubungkan ke kabel joystick warna orange, dan Mosi dihubungkan ke kabel joysick warna Coklat dan diberi pull-up.Sedangkan untuk power joystick diberi tegangan 5 V (merah) dan ground (hitam).

3. Pertukaran data joystick dengan mikrokontroler


     Pertukaran data joystick dengan uC terlihat pada tabel 1 dan 2. Untuk mengawali komunikasi dengan joystick, mikrokontroler mengirim Byte pertama berupa perintah 0x0, kemudian Byte kedua dengan perintah 0x42 (baca data) sekaligus menerima tipe joystick (0x41 [65] untuk digital, dan 0x73 [115] untuk analog) dari kontroler joystick. Byte ketiga dan seterusnya uC menerima data dari kontroler joystick berturut-turut 0x5A (ready), data digital 1, dan data digital 2. Data digital ini bersifat Aktif LOW (0). jadi jika tidak ada tombol di tekan akan diterima data 0xFF (0b11111111). 
misal jika kita menekan / mengaktifkan tombol R2 maka potongan coding'y :

 if (byte5==0b11111101).    // Tombol R2 di baris byte 5 dengan kolom bit 1 aktifkan low. (liat tabel 1)
{       
         lcd_clear();
         lcd_gotoxy(0,1);         
         lcd_puts("R2");
         delay_ms(100);       
 } 

    Jika joystick dalam kondisi analog maka komunikasi dilanjutkan dengan data analog 1, data analog 2, data analog 3, data analog 4. dimana saat kondisi netral berupa data 0x7F (127) dengan nilai minimal 0 dan nilai maksimal 0xFF(255). saat operasi digital, byte 6 - 9 selalu memberikan data 0xFF. 
misal jika kita ingin mengaktifkan analog kanan - sumbu x. maka potongan coding'y :

 if ( (ID == 115) && (byte6 == 0b00000000) || (byte6 == 0b11111111) ) // mode analog diaktifkan(115)  {        
      itoa(byte6, analog6);           // byte 6 == 0b11111111  analog kanan - sumbu x di aktifkan, dsb.
      lcd_clear();
      lcd_gotoxy(0,1);
      lcd_puts(analog 6);
      lcd_gotoxy(0,5);                      
      lcd_puts(" analog ON");          
      delay_ms(100);
}

dari tabel diatas berikut prosedur untuk membaca data dari joystick :
void baca_data()
{        
        PORTB.4 = 0;       
        spi(0x01);    
        ID = spi(0x42);
        SS = spi(0);
        byte4 = spi(0);
        byte5 = spi(0);
        byte6 = spi(0);
        byte7 = spi(0);
        byte8 = spi(0);
        byte9 = spi(0);
        PORTB.4 = 1;
}

    Portb.4 sebagai psxattn pada kodisi iddle / awal berlogika high (1), untuk mengaktifkan maka diberi logika low (0), kemudian terjadi pertukaran data seperti yg di jelaskan diatas. komunikasi di akhiri dengan memberi Portb.4 logika high (1) kembali.

     Sebenernya saya punya banyak contoh coding'y yang di dapat dr om google, ataupun program yang saya buat sendiri. 
berikut salah satu full program interface joystick menggunakan mikrokontroler avr atmega8.


Chip type                                : ATmega8
Program type                           : Application
AVR Core Clock frequency   : 8.000000 MHz
Memory model                       : Small
External RAM size                 : 0
Data Stack size                       : 256
*****************************************************/


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

// SPI functions
#include <spi.h>
#include <delay.h>
// Declare your global variables here
unsigned char spi(unsigned char data);

void main(void)
{
// Declare your local variables here
unsigned char byte4, byte5, byte6, byte7, byte8, byte9;
unsigned char ID, SS;
unsigned char *analog;
unsigned char *analog6;
unsigned char *analog7;
unsigned char *analog8;
unsigned char *analog9; 

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=Out Func4=In Func3=Out Func2=Out Func1=In Func0=In
// State7=T State6=T State5=0 State4=T State3=0 State2=0 State1=T State0=T
PORTB=0x04;
DDRB=0x2C;
// SPI initialization
// SPI Type: Master
// SPI Clock Rate: 62.500 kHz
// SPI Clock Phase: Cycle Half
// SPI Clock Polarity: High
// SPI Data Order: LSB First
SPCR=0x7F;
SPSR=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 3
// D5 - PORTC Bit 4
// D6 - PORTC Bit 5
// D7 - PORTB Bit 0
// Characters/line: 8
lcd_init(16);

while (1)
{
      // Place your code here
        lcd_clear();
        PORTB.2 = 0;
        spi(0x01);    
        ID = spi(0x42);
        SS = spi(0);
        byte4 = spi(0);
        byte5 = spi(0);
        byte6 = spi(0);
        byte7 = spi(0);
        byte8 = spi(0);
        byte9 = spi(0);
        PORTB.2 = 1;
     
      lcd_clear();
      itoa(ID, analog);
      lcd_gotoxy(0,0);
      lcd_puts(analog);
     
      if (ID == 65)
      {
       lcd_gotoxy(5,0);
       lcd_puts("analog off");
       delay_ms(500);
      }
     
      else if (ID == 115)
      {
       lcd_gotoxy(5,0);
       lcd_puts("analog on");
       delay_ms(500);
      }

       lcd_clear();     
       if (byte4 == 0b01111111)
        {
         lcd_clear();
         lcd_gotoxy(0,1);
        lcd_puts("left");
        delay_ms(700);
        }     
       
       else if (byte4 == 0b10111111)
        {
        lcd_clear();
         lcd_gotoxy(0,1);
        lcd_puts("down");
         delay_ms(700);
        }
       
       else if (byte4 == 0b11011111)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("right");
         delay_ms(700);
        }
       
       else if (byte4 == 0b11101111)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
        lcd_puts("up");
         delay_ms(700);
        }               
      
       else if (byte4 == 0b11110111)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("start");
         delay_ms(700);
        }                 
                 
       else if (byte4 == 0b11111110)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("select");
         delay_ms(700);
       }
       
       else if (byte5 == 0b01111111)
       {
        lcd_clear();
        lcd_gotoxy(0,1);
        lcd_puts("kotak");
        delay_ms(700);
       }

       else if (byte5 == 0b10111111)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("X");
         delay_ms(700);
       }
        
       else if (byte5 == 0b11011111)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("bulat");
         delay_ms(700);
       }
       
       else if (byte5 == 0b11101111)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("segitiga");
         delay_ms(700);
       }               
      
       else if (byte5 == 0b11110111)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("R1");
         delay_ms(700);
       } 
       
       else if (byte5 == 0b11111011)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("L1");
         delay_ms(700);
       }
      
       else if (byte5 == 0b11111101)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("R2");
         delay_ms(700);
       } 
      
       else if (byte5 == 0b11111110)
       {
         lcd_clear();
         lcd_gotoxy(0,1);
         lcd_puts("L2");
         delay_ms(700);       
       }
                      
      else if ( (ID == 115) && (byte6 == 0b00000000) || (byte6 == 0b11111111) )
      {itoa(byte6, analog6);
      lcd_clear();
      lcd_gotoxy(0,1);
      lcd_puts(analog6);
      lcd_gotoxy(0,5);
      lcd_puts(" analog ON");          
      delay_ms(700);}
     
      else if ( (ID == 115) && (byte7 == 0b00000000) || (byte7 == 0b11111111) )  
      {itoa(byte7, analog7);
      lcd_clear();
      lcd_gotoxy(0,1);
      lcd_puts(analog7);
      lcd_gotoxy(0,5);
      lcd_puts(" analog ON");
      delay_ms(700);}
      
      else if ((ID == 115) && (byte8 == 0b00000000) || (byte8 == 0b11111111) )
      {itoa(byte8, analog8);
      lcd_clear();
      lcd_gotoxy(0,1);
      lcd_puts(analog8);
      lcd_gotoxy(0,5);
      lcd_puts(" analog ON");
      delay_ms(700);}
     
      else if ((ID == 115) && (byte9 == 0b00000000) || (byte9 == 0b11111111) )
      {itoa(byte9, analog9);
      lcd_clear();
      lcd_gotoxy(0,1);
      lcd_puts(analog9);
      lcd_gotoxy(0,5);
      lcd_puts(" analog ON");
      delay_ms(700);}
     
      lcd_clear();            
}
}

    Jika teman-teman perlu refrensi coding joystick PS dengan mikrokontroler menggunakan bahasa C codevision avr bisa download disini, atau program robot saya yang menggunakan joystick silahkan download disana.

Refrensi:

Berikut adalah video interface Joystick PS dengan mikrokontoler AVR yang diaplikasikan untuk menggerakan Robot beroda. 


Kamis, 07 Maret 2013

Komunikasi serial antar 2 Mikrokontroler (Master-Slave)

Assalamualaikum., wr. wb.

Postingan kali ini saya akan mencoba untuk membahas tentang komunikasi serial antar 2 mikrokontroller. hal ini dikarenakan rasa penasaran saya untuk menghubungkan 2 mikrokontroler, yang satu sebagai Master dan yg satu lagi sebagai Slave. dulu kasus ini pernah saya temui ketika membuat suatu robot, yang mana robot ini harus menggunakan lebih dari 1 mikrokontroler. kemudian untuk menghubungkan antar mikrokontroler tersebut saya menggunakan teknik port-pin (teknik yg paling simple & lucu) hehehe...,
Ok., langsung aja kita liat foto rangkaian komunikasi serial antar 2 mikrokontroler di bawah ini:

Gambar 2. Rangkaian mikrokontroler master-slave
Disini saya menggunakan 2 mikrokontroler AVR ATmega 32. dengan kristal 8 Mhz,  seharus'y yg bagus utk komunikasi serial menggunakan kristal 11.059200 Mhz, supaya baudrate error'y 0.0%. Sensor ultrasonik yang saya gunakan HC-SR04 (sensor cina coy!), servo yang saya pakai micro gws, dan baterai yang saya gunakan adalah baterai lipo 2S 500mAh. Mikrokontroler yg dijadikan master (minsys yg warna hijau) berfungsi mengirimkan data (transmitter) dan Mikrokontroler yg di jadikan Slave(minsys yg warna biru) akan menerima data (Receiver) dari mikrokontroler (Master). supaya lebih gampang mungkin bisa melihat diagram blok di bawah ini:

Gambar 2. Diagram Blok.

Prinsip kerja dari diagram blok diatas yaitu mikrokntroler master akan mengaktifkan sensor ultrasonik pada PortB dan menampilkan data jarak pada LCD di PortC. Jika jarak yg di deteksi sensor ultrasonik  kurang dari sama dengan (<=100 mm) maka mikrokontroler master akan mengirimkan karakter ke mikrokontroler slave, yang kemudian mikrokontroler slave akan menggerakan motor servo. Pengiriman karakter ini menggunakan komunikasi serial yang mana pada Mikro Master terhubung pada PortD.1 (Tx) dan Mikro Slave terhubung pada PortD.0 (Rx). dan satu lagi ground antar ke-2 mikrokontroler ini harus di satukan. Baudrate yg digunakan yaitu 9600. Untuk lebih jelas'y mungkin bisa dilihat video'y di akhir postingan ini.

Next..!! lanjut ke codevision AVR.

Pengaturan mikrokontroler, kristal, dan port B (sensor Us) menggunakan codewizard pada sisi Transmitter.

Gamar 3. Pengaturan Mikro,kristal,dan port sensor Us

Pengaturan USART dan LCD menggunakan codewizard pada sisi Transmitter.

Gambar 4. Pengaturan Usart dan LCD
Pengaturan mikrokontroler, kristal, dan usart  menggunakan codewizard pada sisi Receiver.

Gambar 5. Pengaturan mikrokonroler, kristal, dan USART.
======================================================================
Berikut Listing Program pada sisi Transmiter:

/*****************************************************

Project : Komunikasi serial antar 2 mikro

Author  : Mr.Jho_robin

Company : URC
Comments: Program untuk Transmitter <master>
Chip type           : ATmega32
Program type        : Application
Clock frequency     : 8.000000 MHz
Memory model        : Small
External RAM size   : 0
Data Stack size     : 512
*****************************************************/
#include <mega32.h>
#include <delay.h>
#include <stdio.h>
#include <math.h>
#define triger PORTB.0
#define echo PINB.1
// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

unsigned char buf[33];
unsigned int counter,jarak;

void hysr04()
        triger=1;
        delay_us(10);
        triger=0;
        while (echo==0)
        {counter=0;
         jarak=0;
        }
        while (echo==1) 
        counter++;
        jarak=counter/3.4;                     // supaya hasil''mm' maka dibagi 3.4 
        sprintf(buf,"jarak=%4d mm ",jarak);        
        lcd_gotoxy(0,1);
        lcd_puts(buf);
        lcd_gotoxy(0,0);
        lcd_putsf("sensor cina Coy!");
        delay_ms(200);
}      

void main(void)
{

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

// 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;

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

// 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);
lcd_gotoxy(0,0);
lcd_putsf("Joko Kegantengan");
delay_ms(1000);
lcd_clear();

while (1)
      {
       hysr04();
       if(jarak<=100)
       { printf("k");}
       else
       { printf("s");}
      };
}

========================================================================
Berikut Listing Program pada sisi Receiver :

/*****************************************************

Project : Komunikasi serial antar 2 mikro

Author  : Mr.Jho_robin

Company : URC
Comments: Program untuk Receiver <slave>
Chip type           : ATmega32
Program type        : Application
Clock frequency     : 8.000000 MHz
Memory model        : Small
External RAM size   : 0
Data Stack size     : 512
*****************************************************/

#include <mega32.h>

#include <delay.h>
#include <stdio.h>
#define servo PORTC.0
unsigned int j;
unsigned char servok;
unsigned char receive;

interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
// Place your code here
    j++;
         if(j==625)
            j=0;
        else
    {
        if(j<=servok) servo=1;
        else servo=0;
  }
 }
void posisi()
{
 servok=28;
 delay_ms(800);
 servok=75;
 delay_ms(800);
}

void diam()
{
 servok=49;
}

void main(void)
{

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

// 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=0x01;
TCNT0=0x00;
OCR0=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=0x10;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x33;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;
// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;
// Global enable interrupts
#asm("sei")

while (1)
      {
         receive=getchar();
         if(receive=='k')
           {posisi();}
         else if (receive=='s')
           {diam();}   
      };
}

=======================================================================
 Berikut video dari komunikasi serial antar 2 mikrokontroler.


Sebenernya saya ingin melanjutkan komunikasi serial antar 3 mikro dengan 1 master dan 2 slave. Program sudah siap, akan tetapi mikrokontroler'y yg terakhir ternyata rusak. T.T. mungkin jika sudah ada mikrokontroler'y saya akan coba posting lanjutan dari komunikasi serial antar 2 mikrokontroler. 
jika ada yg ingin di tanyakan silahkan komen aja. Ok..!!!

Reff:
http://www.musbikhin.com/komunikasi-dua-mikrokontroler-menggunakan-serial-usart
http://too-payz.blogspot.com/2010/03/kauc-komunikasi-antar-mikrokontroller_10.html

Rabu, 04 Januari 2012

Rangkaian Minimum System AVR


Assalamualaikum..,

Saat’y posting mengenai mikrokontroler, disini ane mau coba share rangkaian mikrokontroler jenis AVR. Mungkin bagi sebagian orang yang sudah terjun di dunia robotika hal ini adalah biasa, tapi bagi orang yang ingin mau belajar tentang mikrokontroler  semoga bisa bermanfaat. Aaammiiiiinn…!! 

Bagi pemula / newbie, Rangkaian minimum system ane mungkin agak sedikit kompleks coz rangkaian ini merupakan main controller untuk line follower robot yang pernah ane bikin. So, kalo ada yang bigung pada rangkaian ini silahkan aja koment, Ok..!!
Langsung ja ini gambar Rangkaian Minimum System AVR :
Gambar Rangkaian Minimum System AVR
 
 Dari gambar diatas berikut spesifikasi’y :
1.       1.Mikrokontroler 40 Pin (ATMega8535 / ATMega 16 / ATMega 32.
2.       2.Kristal 8 Mhz
3.       3.IC Regulator LM7805
4.       4.Port LCD
5.       5.Tombol push-button
6.       6.Buah kapasitor keramik 22 pf
7    7.PORT ISP untuk Download
8.       8. Tombol reset
9.       9. Dll.

Dalam menggambar / desian rangkaian skematik minimum system AVR saya menggunakan Protel DXP. Jadi kalo mau file’y skematiknya (.schdoc) silahkan saja comment dan kasih email’y nanti saya akan kasih GRRAATTIISSS..!!!

Ohya satu lagi, ane akan memberikan sedikit tambahan tentang Mikrokontroler AVR. Mikrokontroler yang ane bahas ini yaitu ATMega 16

1. Memory.








  

Dari tulisan diatas dapat dilihat ukuran Flas memori = 16K flash, EEPROM = 512 Bytes, Sram = 1K Byte.  Nah dari ketiga memori tsb ane akan coba jelaskan sedikit apa beda’y :

#     Flash Memori  merupakan lokasi penyimpanan program yang kita buat, File’y bertipe (.hex) file ini merupakan hasil compile pada program yang kita buat dan nantinya program tersebut akan dimasukkan ke mikrokontroller melalui alat yang disebut downloader. Pada mikrokontroler ATMega16 terdapat Flash memori yang mampu menampung data sebanyak 16KB, sedangkan untuk ATMega8535 sebanyak 8 KB, dan ATMega 32 sebanyak 32 KB.

#    EEPROM merupakan suatu penyimpanan data yang tidak hilang walaupun system dimatikan. Pada mikrokontroler ATMega16 dan ATMega 8535 terdapat EEPROM yang mampu menampung data sebanyak 512 Bytes, sedangkan untuk ATMega32 sebanyak 1024 Bytes.

#    SRAM merupakan memori aktual dari mikrokontroler AVR. Di sinilah tempat menyimpan variabel-variabel selama mikrokontroler beroperasi. Pada mikrokontroler ATMega16 terdapat SRAM yang mampu menampung data sebanyak 1 KB, sedangkan untuk ATMega8535 sebanyak 512 KB, dan ATMega 32 sebanyak 2 KB.

2. Tegangan Kerja dan Kristal

 
 
Dari tulisan diatas terdapat tulisan tentang tegangan operasi pada mikrokontrel ATmega 16L dan ATMega16, untuk ATMega16L tegangan operasi Low voltage yaitu mampu bekerja pada tegangan antara 2.7 sampai 5.5 V. Sedangkan untuk ATMega16 hanya mampu bekerja pada tegangan antara 4.5 sampai 5.5 V. 
Kemudian untuk Frekuensi, pada tulisan diatas frekuensi maksimal yang boleh digunakan pada ATMega16L hanya 8MHz, berbeda dengan ATMega16 yang memiliki frekuensi maksimal 16MHz.
Dari 2 jenis mikrokontroler ATMega16 dan ATMega16L terdapat kelemahan dan kekurangan’y akan tetapi sekarang ini ada penyempurnaan dari kedua jenis mikrokontroler tersebut yaitu seri ATMega16A.


Nah dari keterangan diatas dapat dilihat tegangan kerja dari mikrokontroler ATMega16A yaitu 2.7 sampai 5.5 V. sedangkan untuk frekuensi Kristal yaitu : 0 sampai 16 MHz.
   
         3. Kapasitor XTAL.
Nah., untuk kasus yang ini ane pernah di tanya sama dosen pembimbing ketika mendesain main controller di robot, dia menanyakan “kenapa kok di Kristal kamu pasang kapasitor dengan nilai 22pf” yaudah ane jawab “berdasarkan datasheet Pak. (Alasan yg Aman dan Masuk akal) hehe...!!, Dan berikut keterangan datasheet tentang kapasitor di XTAL:

Ok. Menurut ane udah cukup tentang rangkaian minimum system AVR, Smoga bermanfaat., klo da yang kurang jelas komen ja, OK…!!!