Mengakses AVR EEPROM di AVR GCC + AVR Studio 4

Berikut adalah contoh akses EEPROM dengan EEMEM attribute.

#include <avr/io.h>
#include <avr/eeprom.h>
#define BLKSIZE 16
#define DATA 0x10
uint8_t EEMEM eechar;
uint16_t EEMEM eeword=0x1234;
uint8_t EEMEM eestring[] = "Write to EEPROM";
int main(void)
{
uint16_t sramword;
//where block has to be read
uint8_t readblock[BLKSIZE];
//write byte to location eechar
eeprom_write_byte(&eechar, DATA);
sramword=eeprom_read_word(&eeword);
//read block from EEPROM
eeprom_read_block ((void *)readblock, (const void *)eestring, BLKSIZE);
while(1)
{
    //do nothing
}
}

Dengan cara di atas alokasi address EEPROM akan diatur secara otomatis oleh software. Setiap variable EEPROM akan disimpan dalam file .eep. Maka dari itu .eep tersebut harus kita upload juga ke mikrokontroler.

Pada bagian flash masukan .hex sedangkan bagian EEPROM masukan .eep.

________________________________________________

DAFTAR PUSTAKA

Accessing AVR EEPROM memory in AVRGCC

Membuat Robot Line Follower Sederhana

Membuat Robot Line Follower Sederhana

A.    Mekanika

   
   

Bagian utama badan robot terbuat dari plat alumunium. Untuk gearbox dan motor menggunakan bagian dari mainan tamiya. Dan bagian badan lainnya adalah PCB dan bahan acrilic.

Pada bagian roda menggunakan gearbox dari tamiya. Gearbox ini berguna untuk menaikan torsi dari motor yang mempunyai torsi lemah.

 B.     Elektronika

1.      Sensor

Untuk rangkaian elektronika sensor menggunakan 8 sensor proximity dengan output tegangan analog yang kemudian akan dijadikan input oleh mikrokontroler sebagai input untuk PORT ADC. Rangkaian proximity sendiri sederhananya terdiri dari bagian transmitter (dalam hal ini LED) dan receiver (dalam hal ini phototransistor). Cara kerjanya, ketika LED menyala, maka akan memantul di permukaan arena yang berwarna putih dan garis hitam. Respon terhadap warna putih, pantulan cahaya akan sempurna. Sedangkan terhadap warna hitam pantulan intensitas cahaya berkurang. Hal itu akan mempengaruhi aktivasi dari phototransistor yang mempunyai prinsip kerja sebagai saklar sederhana, jika ada cahaya maka tersambung, jika tidak ada cahaya maka tidak tersambung.

Dari rangkaian di atas, jika mengenai warna putih maka output tegangan akan lebih kecil daripada output tegangan sensor-mengenai warna hitam yang memberikan pantulan dengan intensitas cahaya rendah.

      Rangkaian lainnya yang mempunyai prinsip sebagai sensor adalah rangkaian push button yang kelak berguna untuk melakukan setting pada robot.

 

      Terdapat empat buah push button yang masing-masing berguna sebagai tombol enter, cancel, arah_plus, dan arah_minus. Cara kerjanya adalah pada keadaan awalnya titik pb1..4 diberi tegangan high atau 5V oleh mikrokontroller dan keadaan tersebut dibaca juga oleh mikrokontroler. Sehingga data pada keadaan tersebut terbaca logic 1 oleh mikrokontroller. Jika tombol ditekan, maka otomatis jalur pb1..4 akan terhubung dengan ground. Sehingga otomatis tegangan di jalur tersebut menjadi 0V dan oleh mikrokontroller akan terbaca sebagai logic 0. Begitulah mikrokontroler membedakan kondisi tombol tidak ditekan dan ditekan.

2.      Prosesor

Rangkaian prosesor disini menggunakan sistem minimum dari ATMega32. Berikut schematicnya.

Dalam mikrokontroller inilah algoritma program akan dimasukan. Mengolah data dari input sensor sehingga menghasilkan output ke aktuator.

3.      Aktuator

Aktuator disini adalah motor DC. Untuk menggerakan motor DC diperlukan sebuah rangkaian motor driver yang biasa disebut H-bridge. Rangkaian ini berguna untuk mengontrol motor yang mempunyai tegangan operasi yang lebih besar.

 
   

Dalam rangkaian ini kita gunakan H-bridge dalam kemasan IC yaitu L298. Berikut rangkaian untuk L298.

Disini yang termasuk aktuator juga adalah speaker yang berguna sebagai indikator dari push button.

4.      Regulator Voltase

Rangkaian ini berguna untuk menurunkan tegangan batere yang dibutuhkan untuk mikrokontroler dan rangkaian sensor. Dikarenakan tegangan batere lebih dari 5V, sedangkan tegangan yang dibutuhkan mikrokontroler dan sensor 5V. Dalam hal ini digunakan regulator LM2576 yang mempunyai kapasitas arus 3A.

Berikut keseluruhan dari rangkaian elektronika.

 C.    Algoritma & Pemrograman

Terdapat 2 bagian, bagian setting dan run. bagaian setting berguna untuk mengatur beberapa konstanta tuning dan bagian run adalah bagian fungsi utama robot yaitu mengikuti garis.  Pada program yang dibuat setiap tombol diberi indikator nada dengan menggunakan library wangready_tone_lib untuk avr gcc.

Algoritma kontrol yang digunakan yaitu PID. Sensor yang dibaca dikonversi kedalam angka-angka yang akan menjadi input PID. Di PID data diolah sehingga mempunyai output berupa PWM (pulse width modulation) yang akan mengatur kecepatan motor sebagai responnya terhadap garis. Berikut persamaan PID dalam bentuk matematis.

Kp: Proportional gain, a tuning parameter

Ki: Integral gain, a tuning parameter

Kd: Derivative gain, a tuning parameter

e: Error = SPPV

t: Time or instantaneous time (the present)

Berikut pseudo code dari persamaan di atas.

previous_error = setpoint - process_feedback
integral = 0
start:
  wait(dt)
  error = setpoint - process_feedback
  integral = integral + (error*dt)
  derivative = (error - previous_error)/dt
  output = (Kp*error) + (Ki*integral) + (Kd*derivative)
  previous_error = error
  goto start

Berikut block diagram sistem kontrol yang saya gunakan dengan mengadopsi dari persamaan di atas dengan menghilangkan nilai feedback sehingga nilai error ditiadakan.

Berikut kode utama yang saya buat dengan menggunakan WinAVR+AVR Studio 4 dengan bahasa C.

#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "lcd_lib.h"
#include <stdio.h>	//untuk sprintf
#include <stdlib.h> //untuk rand
#include <avr/eeprom.h>
#include "wangready_tone_lib.h"

#define ADC_VREF_TYPE 0x40

// Read the AD conversion result
unsigned int 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 ADCW;
}

#define RPWM OCR1A
#define LPWM OCR1B

uint8_t buff[33];

void nada_enter()
{
	nada_c1(32);
	nada_f1(32);
	nada_a1(8);
}

void nada_cancel()
{
	nada_a1(32);
	nada_f1(32);
	nada_c1(8);
}

void nada_plus()
{
	nada_c1(8);
}

void nada_minus()
{
	nada_g1(8);
}

void music()
{
//8d1 8- 8d1 8- 16g1 16- 16g1 16- 16#f1 16- 8d1 8- 8d1 8- 8d1 8d1
	nada_d1(8);
	jeda(8);
	nada_d1(8);
	jeda(8);
	nada_g1(16);
	jeda(16);
	nada_g1(16);
	jeda(16);
	nada_f1_kres(16);
	jeda(16);
	nada_d1(8);
	jeda(8);
	nada_d1(8);
	jeda(8);
	nada_d1(8);
	nada_d1(8);
}

unsigned char get_button(unsigned char select)
{
	switch(select)
	{
		case 1:	if((PINB&0b00001000)==0)
				{					
					nada_enter();
					return(1); 	//OK
				}
				else return(0);
				break;
		case 2:	if((PINB&0b00000100)==0)
				{					
					nada_plus();
					return(1);	// +
				}
				else return(0);
				break;
		case 3:	if((PINB&0b00000010)==0)
				{
					nada_minus();
					return(1);	// -
				}
				else return(0);
				break;
		case 4:	if((PINB&0b00000001)==0)
				{
					nada_cancel();
					return(1);	//cancel
				}
				else return(0);
				break;
	}
}

// additional custom LCD characters
const uint8_t panah_kanan[8] PROGMEM=
{
0b00000000,//back slash
0b00011000,
0b00011110,
0b00011111,
0b00011110,
0b00011000,
0b00000000,
0b00000000
};

const uint8_t panah_kiri[8] PROGMEM=
{
0b00000000,//back slash
0b00000011,
0b00001111,
0b00011111,
0b00001111,
0b00000011,
0b00000000,
0b00000000
};

const uint8_t blank[8] PROGMEM=
{
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000,
0b00000000
};

float EEMEM var_Kp;
float EEMEM var_Ki;
float EEMEM var_Kd;
unsigned int EEMEM var_Ts ;
unsigned char EEMEM var_max_speed;

float Kp;
float Ki;
float Kd;
unsigned int Ts;
unsigned char max_speed;

#define pnh_kiri_char 1
#define pnh_kanan_char 2

void init_char()
{
	LCDdefinechar(blank,0);
	LCDdefinechar(panah_kiri,1);
	LCDdefinechar(panah_kanan,2);		
}

void disp_max_speed()
{	
	LCDclr();//clears LCD

   	LCDGotoXY(0,0);	
	LCDsendChar(pnh_kiri_char);
   	LCDGotoXY(15,0);
	LCDsendChar(pnh_kanan_char);

	LCDGotoXY(0,1);	
	LCDsendChar('-');
   	LCDGotoXY(15,1);
	LCDsendChar('+');

	LCDGotoXY(2,0);
	sprintf(buff,"Set Maxspeed");
   	LCDstring(buff,12);

	_delay_ms(300);
	
	if(get_button(1) == 1)//jika OK
	{
		while(get_button(4)==0)
		{
			if(get_button(2)==1)max_speed += 5; 	//+
			if(get_button(3)==1)max_speed -= 5;	//-		

			LCDclr();//clears LCD
			LCDGotoXY(1,1);
			sprintf(buff,"Max Speed=%d", max_speed);
    		LCDstring(buff,13);
				
			_delay_ms(1);
		}
		eeprom_write_byte(&var_max_speed,max_speed);
	}
}

void disp_Kp()
{	
	LCDclr();//clears LCD

	LCDGotoXY(15,0);
	LCDsendChar(pnh_kanan_char);

	LCDGotoXY(0,1);	
	LCDsendChar('-');
   	LCDGotoXY(15,1);
	LCDsendChar('+');

	LCDGotoXY(4,0);
	sprintf(buff,"Set Kp");
   	LCDstring(buff,6);

	_delay_ms(300);
	
	if(get_button(1) == 1)//jika OK
	{
		while(get_button(4)==0)
		{
			if(get_button(2)==1)Kp += 1; 	//+
			if(get_button(3)==1)Kp -= 1;	//-		

			LCDclr();//clears LCD
			LCDGotoXY(4,1);
			sprintf(buff,"Kp=%2.2f", Kp);
    		LCDstring(buff,8);
			
			_delay_ms(1);
		}
		eeprom_write_float(&var_Kp,Kp);
	}
}

void disp_Ki()
{
	LCDclr();//clears LCD
 
   	LCDGotoXY(0,0);	
	LCDsendChar(pnh_kiri_char);
   	LCDGotoXY(15,0);
	LCDsendChar(pnh_kanan_char);

	LCDGotoXY(0,1);	
	LCDsendChar('-');
   	LCDGotoXY(15,1);
	LCDsendChar('+');

	LCDGotoXY(4,0);
	sprintf(buff,"Set Ki");
   	LCDstring(buff,6);
	
	_delay_ms(300);
	
	if(get_button(1) == 1)//jika OK
	{
		while(get_button(4)==0)
		{
			if(get_button(2)==1)Ki += 0.1; 	//+
			if(get_button(3)==1)Ki -= 0.1;	//-	
		
			LCDclr();//clears LCD
			LCDGotoXY(4,1);
			sprintf(buff,"Ki=%2.2f", Ki);
   			LCDstring(buff,8);

			_delay_ms(1);
		}
		eeprom_write_float(&var_Ki,Ki);
	}
}

void disp_Kd()
{
	LCDclr();//clears LCD

   	LCDGotoXY(0,0);	
	LCDsendChar(pnh_kiri_char);
   	LCDGotoXY(15,0);
	LCDsendChar(pnh_kanan_char);

	LCDGotoXY(0,1);	
	LCDsendChar('-');
   	LCDGotoXY(15,1);
	LCDsendChar('+');

	LCDGotoXY(4,0);
	sprintf(buff,"Set Kd");
   	LCDstring(buff,6);
	
	_delay_ms(300);
	
	if(get_button(1) == 1)//jika OK
	{
		while(get_button(4)==0)
		{
			if(get_button(2)==1)Kd += 0.1; 	//+
			if(get_button(3)==1)Kd -= 0.1;	//-	
	
			LCDclr();//clears LCD
			LCDGotoXY(4,1);
			sprintf(buff,"Kd=%2.2f", Kd);
   			LCDstring(buff,8);

			_delay_ms(1);
		}
		eeprom_write_float(&var_Kd,Kd);
	}
}

void disp_Ts()
{	
	LCDclr();//clears LCD

   	LCDGotoXY(0,0);	
	LCDsendChar(pnh_kiri_char);
   	LCDGotoXY(15,0);
	LCDsendChar(pnh_kanan_char);

	LCDGotoXY(0,1);	
	LCDsendChar('-');
   	LCDGotoXY(15,1);
	LCDsendChar('+');

	LCDGotoXY(4,0);
	sprintf(buff,"Set Ts");
   	LCDstring(buff,6);

	_delay_ms(300);
	
	if(get_button(1) == 1)//jika OK
	{
		while(get_button(4)==0)
		{
			if(get_button(2)==1)Ts++; 	//+
			if(get_button(3)==1)Ts--;	//-			

			LCDclr();//clears LCD
			LCDGotoXY(4,1);
			sprintf(buff,"Ts=%ums", Ts);
   			LCDstring(buff,8);
			
			_delay_ms(1);
		}
		eeprom_write_word((void *)&var_Ts,Ts);
	}
}

unsigned int sens[8];
unsigned int treshold = 200;
unsigned char warna_garis;

unsigned int EEMEM var_sens[8];
unsigned char EEMEM var_warna_garis;

unsigned int compare_var_uint_high(unsigned int A, unsigned int B)
{
	if(A>=B)return(A);
	else if(B>A)return(B); 
}

unsigned int compare_var_uint_low(unsigned int A, unsigned int B)
{
	if(A<=B)return(A);
	else if(B<A)return(B); 
}

void auto_calibrate()
{	
unsigned char i;
	LCDclr();//clears LCD

   	LCDGotoXY(0,0);	
	LCDsendChar(pnh_kiri_char);
   	LCDGotoXY(15,0);
	LCDsendChar(pnh_kanan_char);

	LCDGotoXY(0,1);	
	LCDsendChar('-');
   	LCDGotoXY(15,1);
	LCDsendChar('+');

	LCDGotoXY(1,0);
	sprintf(buff,"Autocalibrate");
   	LCDstring(buff,13);

	_delay_ms(300);
	
	if(get_button(1) == 1)//jika OK
	{
		LCDclr();
		LCDGotoXY(0,0);
		sprintf(buff,"Tekan 'Cancel'");
    	LCDstring(buff,33);
		LCDGotoXY(0,1);
		sprintf(buff,"untuk mengakhiri");
    	LCDstring(buff,33);

		for(i=0;i<8;i++)
		{
					sens[i] = 500;
		}

		if(warna_garis == 1)//garis putih adc kecil
		{
			while(get_button(4)==0)
			{
				for(i=0;i<8;i++)
				{
					sens[i] = compare_var_uint_low(sens[i],read_adc(i));
					eeprom_write_word(&var_sens[i],sens[i]);	
				}
			}		
			for(i=0;i<8;i++)
			{
				sens[i] += treshold;
				eeprom_write_word(&var_sens[i],sens[i]);	
			}
		}
		else if(warna_garis == 0)//garis hitam adc besar
		{
			while(get_button(4)==0)
			{
				for(i=0;i<8;i++)
				{
					sens[i] = compare_var_uint_high(sens[i],read_adc(i));					
					eeprom_write_word(&var_sens[i],sens[i]);	
				}
			}		
			for(i=0;i<8;i++)
			{
				sens[i] -= treshold;
				eeprom_write_word(&var_sens[i],sens[i]);
			}
		}
	}
}

void tipe_garis()
{
	LCDclr();//clears LCD

	LCDGotoXY(0,0);	
	LCDsendChar(pnh_kiri_char);
   	LCDGotoXY(15,0);
	LCDsendChar(pnh_kanan_char);

	LCDGotoXY(0,1);	
	LCDsendChar('-');
   	LCDGotoXY(15,1);
	LCDsendChar('+');

	LCDGotoXY(2,0);
	sprintf(buff,"Tipe Garis");
   	LCDstring(buff,10);	

	_delay_ms(300);
	
	if(get_button(1) == 1)//jika OK
	{
		while(get_button(4)==0)
		{
			if(get_button(2)==1)warna_garis = 1; 	//+
			if(get_button(3)==1)warna_garis	= 0;	//-	

			LCDclr();//clears LCD	

			if(warna_garis == 0)		//hitam
			{
				LCDGotoXY(4,1);
				sprintf(buff,"Hitam");
    			LCDstring(buff,5);
			}
			else if(warna_garis == 1)	//putih
			{
				LCDGotoXY(4,1);
				sprintf(buff,"Putih");
    			LCDstring(buff,5);
			}	

			_delay_ms(300);
		}
		eeprom_write_byte(&var_warna_garis,warna_garis);
	}
}

unsigned char sensor(unsigned char urut)
{
	if(warna_garis == 0) //hitam adc besar
	{
		if(read_adc(urut) > sens[urut])return(1);
		else return(0);
	}
	else if(warna_garis == 1)//putih adc kecil
	{
		if(read_adc(urut) < sens[urut])return(1);
		else return(0);
	}
}

void cek_sensor()
{
unsigned char i,buff_sens;

	LCDclr();//clears LCD

	LCDGotoXY(0,0);	
	LCDsendChar(pnh_kiri_char);
   	LCDGotoXY(15,0);
	LCDsendChar(pnh_kanan_char);

	LCDGotoXY(0,1);	
	LCDsendChar('-');
   	LCDGotoXY(15,1);
	LCDsendChar('+');

	LCDGotoXY(2,0);
	sprintf(buff,"Cek Sensor");
   	LCDstring(buff,10);	
	
	_delay_ms(300);
	
	if(get_button(1) == 1)//jika OK
	{
		while(get_button(4)==0)
		{	
			LCDclr();
			for(i=0;i<8;i++)
			{
				LCDGotoXY((7-i), 1);
				if(sensor(i))
				{
					LCDsendChar('1');
				}else
				{
					LCDsendChar('0');
				}	

			}		
		
			_delay_ms(300);	
		}	
	}
}	

void menu()
{
unsigned char count_menu=0,i;
	
akhir:
	
	LCDclr();//clears LCD

	LCDGotoXY(5,0);
	sprintf(buff,"Z-Jet");
   	LCDstring(buff,6);

	LCDGotoXY(3,1);
	sprintf(buff,"System-On");
   	LCDstring(buff,9);
		
	music();

	LCDclr();//clears LCD

	LCDGotoXY(5,0);
	sprintf(buff,"Run!!!");
   	LCDstring(buff,6);
	
	for(i=0;i<8;i++)
	{
		LCDGotoXY(i,1);	
		LCDsendChar(pnh_kiri_char);	
	}

	for(i=8;i<16;i++)
	{
		LCDGotoXY(i,1);	
		LCDsendChar(pnh_kanan_char);	
	}

	if(get_button(1) == 1)//jika OK
	{	
		while(1)
		{
			if((get_button(2) == 1) && (count_menu < 8))count_menu++;
			if((get_button(3) == 1) && (count_menu > 0))count_menu--;
				
			switch(count_menu)
			{
				case 0:	disp_Kp();
					break;
				case 1:	disp_Ki();
					break;
				case 2:	disp_Kd();
					break;
				case 3:	disp_Ts();
					break;
				case 4:	disp_max_speed();
					break;
				case 5:	auto_calibrate();
					break;
				case 6:	tipe_garis();
					break;
				case 7:	cek_sensor();
					break;
				case 8: LCDclr();//clears LCD

						LCDGotoXY(0,0);	
						LCDsendChar(pnh_kiri_char);\

						LCDGotoXY(0,1);	
						LCDsendChar('-');
   						LCDGotoXY(15,1);
						LCDsendChar('+');

						LCDGotoXY(4,0);
						sprintf(buff,"Start");
   						LCDstring(buff,5);	
					
						if(get_button(1) == 1)goto akhir;

						_delay_ms(300);
					
					break;
			}
		}
}
}

void init_var()
{
unsigned char i;
	
	max_speed 	= eeprom_read_byte(&var_max_speed);
	Kp 			= eeprom_read_float(&var_Kp);
	Ki 			= eeprom_read_float(&var_Ki);
	Kd 			= eeprom_read_float(&var_Kd);
	Ts 			= eeprom_read_word(&var_Ts);
	for(i=0;i<8;i++)sens[i] = eeprom_read_word(&var_sens[i]);
	warna_garis = eeprom_read_byte(&var_warna_garis);
}

int last_sens;
int _SP() 
{
	//sensor dari kanan ke kiri
	//1 0 0 0 0 = -4
	//1 1 0 0 0 = -3
	//0 1 0 0 0 = -2
	//0 1 1 0 0 = -1
	//0 0 1 0 0 = 0
	//0 0 1 1 0 = 1
	//0 0 0 1 0 = 2
	//0 0 0 1 1 = 3
	//0 0 0 0 1 = 4
			if((sensor(0)==1)&&(sensor(1)==0)&&(sensor(2)==0)&&(sensor(3)==0)&&(sensor(4)==0)){last_sens = -4; return(-4);}
	else 	if((sensor(0)==1)&&(sensor(1)==1)&&(sensor(2)==0)&&(sensor(3)==0)&&(sensor(4)==0))return(-3);
	else 	if((sensor(0)==0)&&(sensor(1)==1)&&(sensor(2)==0)&&(sensor(3)==0)&&(sensor(4)==0))return(-2);
	else 	if((sensor(0)==0)&&(sensor(1)==1)&&(sensor(2)==1)&&(sensor(3)==0)&&(sensor(4)==0))return(-1);
	else 	if((sensor(0)==0)&&(sensor(1)==0)&&(sensor(2)==1)&&(sensor(3)==0)&&(sensor(4)==0))return(0);
	else 	if((sensor(0)==0)&&(sensor(1)==0)&&(sensor(2)==1)&&(sensor(3)==1)&&(sensor(4)==0))return(1);
	else 	if((sensor(0)==0)&&(sensor(1)==0)&&(sensor(2)==0)&&(sensor(3)==1)&&(sensor(4)==0))return(2);
	else 	if((sensor(0)==0)&&(sensor(1)==0)&&(sensor(2)==0)&&(sensor(3)==1)&&(sensor(4)==1))return(3);
	else 	if((sensor(0)==0)&&(sensor(1)==0)&&(sensor(2)==0)&&(sensor(3)==0)&&(sensor(4)==1)){last_sens = 4; return(4);}
	else 	return(last_sens);

}

int last_SP;
float P,I,D;
void PID()
{
float PID;
int speed_kanan, speed_kiri;

	while(get_button(4)==0)//cancel
	{
		P = _SP();
		I += _SP();
		D = _SP() - last_SP;
		PID = (Kp * (float)P) + (Ki * (float)I) + (Kd * (float)D); 
		last_SP = _SP();

		_delay_ms((double)Ts);

		speed_kanan = (int)max_speed + (int)PID;
		speed_kiri	= (int)max_speed - (int)PID;

		if		(speed_kanan > max_speed)speed_kanan = max_speed;
		else if	(speed_kanan < (-(max_speed)))speed_kanan = (-(max_speed));

		if		(speed_kiri > max_speed)speed_kiri = max_speed;
		else if	(speed_kiri < (-(max_speed)))(-(max_speed));			
			
		if(speed_kanan>=0)
		{
			PORTD = 0b00110000;
			RPWM = (unsigned char)speed_kanan;
		}
		else
		{
			PORTD = 0b00111000;
			RPWM = 255 + (unsigned char)speed_kanan;
		}

		if(speed_kiri>=0)
		{
			PORTD += 0b00110000;
			LPWM = (unsigned char)speed_kiri;
		}
		else
		{
			PORTD += 0b00110100;
			LPWM = 255 + (unsigned char)speed_kiri;
		}

		//LCDGotoXY(0,0);
		//sprintf(buff,"%d=%d",(unsigned char)speed_kiri,(unsigned char)speed_kanan);
   		//LCDstring(buff,16);
	}
	
	PORTD = 0b00110000;
	RPWM = 0;
	LPWM = 0;
}

int main(void)
{

PORTB 	= 0xFF;
DDRD 	= 0xFF;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 15.625 kHz
// Mode: Ph. correct 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=0x05;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=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: 1000.000 kHz
// ADC Voltage Reference: AVCC pin
ADMUX=ADC_VREF_TYPE & 0xff;
ADCSRA=0x84;

tone_wr_init();
LCDinit();//init LCD bit, dual line, cursor right
LCDcursorOFF();
init_char();
init_var();

	while(1)
	{
		menu();
		PID();
	}
return 0;
}

Daftar Pustaka

http://en.wikipedia.org/wiki/PID_controller

H-Bridge Driver : Kontrol Arah Motor

http://www.societyofrobots.com/mechanics_gears.shtml

Line Tracker Robot using AVR Microcontroller Created by Hendawan Soebhakti on Desember 2007

https://wangready.wordpress.com

_____________________________

File Download

Aplikasi LCD 2×16 Sederhana Pada Mikrokontroler AVR Dengan Compiler WinAVR + AVR Studio 4

Berikut adalah contoh aplikasi sederhana penggunaan LCD 2×16 pada mikrokontroler ATmega8 4Mhz dengan menggunakan header file lcd_lib.h dari http://winavr.scienceprog.com/download/AVR_LCD_Lib_Demo.zip. Dari file tersebut saya tambahkan kode untuk menampilkan bilangan float atau bilangan berkoma. Berikut kode yang saya gunakan.

//*****************************************************************************
//
// File Name    : 'main.c'
// Title        : LCD demo
// Author        : Scienceprog.com - Copyright (C) 2007
// Created        : 2007-03-29
// Revised        : 2007-08-28
// Version        : 1.0
// Target MCU    : Atmel AVR series
//
// This code is distributed under the GNU Public License
//        which can be found at http://www.gnu.org/licenses/gpl.txt
//
//*****************************************************************************

#include <avr/io.h>
#include <avr/pgmspace.h>
#include <util/delay.h>
#include "lcd_lib.h"
#include <stdio.h>    //untuk sprintf
#include <stdlib.h> //untuk rand

//Strings stored in AVR Flash memory
const uint8_t LCDwelcomeln1[] PROGMEM="AVR LCD DEMO";
const uint8_t LCDprogress[] PROGMEM="Loading...";
const uint8_t LCDanimation[] PROGMEM=" LCD animation ";

// additional custom LCD characters
const uint8_t backslash[8] PROGMEM=
{
0b00000000,//back slash
0b00010000,
0b00001000,
0b00000100,
0b00000010,
0b00000001,
0b00000000,
0b00000000
};
//delay 1s
void delay1s(void)
{
    uint8_t i;
    for(i=0;i<100;i++)
    {
        _delay_ms(10);
    }
}
//demonstration of progress bar
void progress(void)
{
    LCDclr();
    CopyStringtoLCD(LCDwelcomeln1, 3, 0);    
    delay1s();
    LCDclr();
    CopyStringtoLCD(LCDprogress, 3, 0);
    for(uint8_t i=0;i<255;i++)
        {
            _delay_ms(10);
            LCDGotoXY(0, 1);
            LCDprogressBar(i, 255, 16);
        }
}
//demonstration of animation
void demoanimation(void)
{
    LCDclr();
    LCDdefinechar(backslash,0);
    CopyStringtoLCD(LCDanimation, 0, 0);
    for(uint8_t i=0;i<3;i++)
        {
            LCDGotoXY(8, 1);
            LCDsendChar(0);
            delay1s();
            LCDGotoXY(8, 1);
            LCDsendChar('-');
            delay1s();
            LCDGotoXY(8, 1);
            LCDsendChar('/');
            delay1s();
            LCDGotoXY(8, 1);
            LCDsendChar('|');
            delay1s();
            LCDGotoXY(8, 1);
            LCDsendChar(8);//backslash
            delay1s();
            LCDGotoXY(8, 1);
            LCDsendChar('-');
            delay1s();
            LCDGotoXY(8, 1);
            LCDsendChar('/');
            delay1s();
            LCDGotoXY(8, 1);
            LCDsendChar('|');
            delay1s();
        }    
}

int main(void)
{
uint8_t buff[33];
double a, b, c;

    LCDinit();//init LCD bit, dual line, cursor right
    while(1)//loop demos
    {
        LCDclr();//clears LCD
        LCDGotoXY(0,0);//arahkan kursor ke koordinat 0,0 LCD
        a = (double)(rand() % 10 + 1)/2; //membangkitkan bilangan acak (0s.d.10)/2
        b = (double)(rand() % 10 + 1)/3; //membangkitkan bilangan acak (0s.d.10)/3
        c = a*b;
        sprintf(buff,"%.2f*%.2f=%.5f",a,b,c);//menampilkan bilangan float
        LCDstring(buff,33);//menampilkan bilangan float
        delay1s();
        delay1s();

        progress();//demonstration of progress bar
        delay1s();
        demoanimation();//demonstration of animation
    }
    return 0;
}

Pada program tersebut pada LCD akan tampil perkalian 2 buah bilangan acak berkoma (c = a*b). Lalu demonstrasi sebuah progress bar dan demoanimation yang diulang dalam while(1).

Untuk menampilkan angka berkoma pada LCD menggunakan sprintf() maka ditambahkan #include <stdio.h>. Lalu tambahkan -Wl,-u,vfprintf -lprintf_flt pada linker options (Merujuk pada situs http://winavr.scienceprog.com/comment/28). Pada menu bar klik Project -> Configuration Options -> Custom Options.

Untuk mengatur port mana yang akan digunakan untuk interface ke LCD,  diatur pada lcd_lib.h.

#define LDP PORTD    //define MCU port connected to LCD data pins
#define LCP PORTD    //define MCU port connected to LCD control pins
#define LDDR DDRD    //define MCU direction register for port connected to LCD data pins
#define LCDR DDRD    //define MCU direction register for port connected to LCD control pins

Berikut link file yang bisa di-download dari project di atas.

http://www.mediafire.com/file/dbwri8ndlwaavlt/tes_lcd_2.rar

_________________________________

Daftar Pustaka

http://winavr.scienceprog.com/download/AVR_LCD_Lib_Demo.zip

http://winavr.scienceprog.com/example-avr-projects/simplified-avr-lcd-routines.html

http://winavr.scienceprog.com/example-avr-projects/avr-gcc-4-bit-and-8-bit-lcd-library.html

http://www.cplusplus.com/reference/clibrary/cstdlib/rand/

http://winavr.scienceprog.com/comment/28

Audio Player Sederhana Untuk PCM 8 bit Menggunakan Mikrokontroler AVR

Pemrograman berikut menggunakan compiler WinAVR untuk mikrokontroler ATMega32 dengan nilai crystal 8 MHz. Pin output adalah PD5/OC1A yang dihubungkan dengan speaker. Untuk mendapatkan suara yang jelas maka output disambungkan dengan sebuah amplifier sederhana terlebih dahulu. Berikut konfigurasi dari sebuah jack audio.Sambungkan PD5/OC1A dengan Tx pada jack audio dan GND dengan GND pada mikrokontroler.

  1. Siapkan sebuah file audio. Jika berminat, berikut adalah link untuk membuat wav file yang dikonversi dari teks ke suara. http://www2.research.att.com/%7Ettsweb/tts/demo.php.
  2. Download software berikut untuk mengkonversi file audio ke format PCM Uncompressed 8000 Hz, 8 bits, mono  http://www.nch.com.au/switch/index.html. Setelah terinstall, buka software tersebut, klik Add File(s) lalu pilih file audio yang sudah disiapkan tadi. Pilih .wav pada Output Format. Kemudian klik Encoder options. Lalu akan muncul window Wave Encoder Options. Atur Format menjadi PCM Uncompressed dan Attributes menjadi 8000 Hz, 8 bits, Mono lalu klik OK. Setelah itu Convert.
  3. Konversi file .wav hasil konversi tadi ke dalam sebuah file .c dengan menggunakan software berikut. http://darkfader.net/ngpc/files/wav2c.zip. Pertama extract file .zip tersebut maka di dalamnya sudah terdapat file wav2c.exe. Cara mengkonversinya adalah dengan cara men-drag file .wav tadi lalu drop di file wav2c.exe tadi maka akan muncul file output berekstensi “.c”. Kemudian buka dengan notepad file tersebut maka akan muncul kumpulan angka-angka yang akan kita gunakan untuk sample PCM yang akan dimasukan pada mikrokontroler AVR.
  4. Copy angka-angka tadi ke header file pcm_sample.h dan save.
  5. Compile dengan menggunakan WinAVR. Berikut source code-nya.

main program:

/*
 ATmega32 @ 8MHz
 Plays an 8bit/8000 sample PCM audio on OC1A output
 */
 #include <stdint.h>
 #include <avr/io.h>
 #include <avr/pgmspace.h>
 #include "pcm_sample.h"
 #include <avr/interrupt.h>
 #define SAMPLE_RATE 8000;
 volatile uint16_t sample;
 int sample_count;
 /* initialise the PWM */
 void pwm_init(void)
 {
 /* use OC1A pin as output */
 DDRD = _BV(PD5);
 /*
 * clear OC1A on compare match
 * set OC1A at BOTTOM, non-inverting mode
 * Fast PWM, 8bit
 */
 TCCR1A = _BV(COM1A1) | _BV(WGM10);
 /*
 * Fast PWM, 8bit
 * Prescaler: clk/1 = 8MHz
 * PWM frequency = 8MHz / (255 + 1) = 31.25kHz
 */
 TCCR1B = _BV(WGM12) | _BV(CS10);
 /* set initial duty cycle to zero */
 OCR1A = 0;
 /* Setup Timer0 */
 TCCR0|=(1<<CS00);
 TCNT0=0;
 TIMSK|=(1<<TOIE0);
 sample_count = 4;
 sei(); //Enable interrupts
 }
 ISR(TIMER0_OVF_vect)
 {
 sample_count--;
 if (sample_count == 0)
 {
 sample_count = 4;
 OCR1A = pgm_read_byte(&pcm_samples[sample++]);
 if(sample>pcm_length)sample=0;
 }
 }
 int main(void)
 {
 pwm_init();
 while(1);//do nothing
 }

________________________________

Berikut contoh header file pcm_sample.h yang memutar suara “its working”.

// pcm samples created by wav2c
//It plays "its working"
const long pcm_length=6800;
const unsigned char pcm_samples[] PROGMEM ={
 116,97,144,26,0,0,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,127,128,128,127,128,127,127,128,127,127,128,127,128,128,127,128,127,127,127,127,127,127,127,127,127,127,127,127,127,128,127,127,128,127,128,127,127,128,127,128,128,128,128,128,128,130,129,128,132,129,127,133,127,128,131,127,128,131,129,127,132,130,128,132,129,130,131,137,138,130,140,135,128,137,130,126,130,124,125,126,121,124,122,119,
 121,120,117,118,121,118,120,123,126,131,134,141,144,146,149,148,148,146,142,139,136,131,127,123,115,102,89,74,62,56,94,96,84,149,146,137,183,172,153,166,145,123,127,108,101,108,107,115,121,135,150,154,167,173,166,169,158,142,135,123,116,112,115,120,123,135,142,144,150,148,141,136,125,113,104,92,87,82,80,89,94,104,120,126,138,154,159,157,161,160,145,143,139,129,128,130,128,133,141,140,
 147,151,148,142,137,115,84,86,50,33,66,69,68,106,142,138,171,191,177,181,173,150,140,135,116,112,119,115,118,133,141,147,161,168,166,164,163,152,137,133,123,112,110,106,92,86,92,74,67,82,93,107,111,137,151,142,159,160,151,151,143,136,136,127,126,131,127,134,139,141,152,157,163,168,165,161,152,140,123,107,85,73,68,42,40,57,74,93,110,147,159,166,182,180,171,164,150,134,130,116,
 112,118,118,125,135,146,159,170,178,181,177,170,155,137,118,99,78,68,62,43,37,45,61,91,107,129,162,167,173,186,176,166,158,141,131,120,112,112,114,121,131,140,156,169,178,188,184,180,170,150,133,113,91,75,69,56,40,39,45,62,94,108,127,164,165,171,187,174,167,157,140,132,118,111,115,115,124,136,146,162,177,186,190,188,180,166,145,125,104,81,72,61,40,34,33,42,73,90,107,143,
 156,165,182,182,178,170,156,146,132,119,117,115,119,126,134,149,162,174,183,185,184,175,161,144,123,103,84,74,62,44,37,41,54,77,88,113,147,141,159,181,169,173,171,160,153,136,131,131,121,125,132,133,143,152,163,168,166,171,165,149,139,125,108,93,90,87,76,73,74,82,90,91,102,114,117,121,133,140,144,149,152,153,148,144,144,142,140,139,142,144,143,146,147,144,141,140,135,130,127,125,
 123,120,121,123,121,118,116,115,115,114,112,112,111,110,111,112,114,117,120,124,128,130,133,135,136,137,139,141,143,144,143,143,142,140,139,138,136,135,134,133,132,132,131,131,130,129,128,127,126,125,123,122,120,117,115,114,112,111,111,112,114,115,117,120,122,124,126,129,131,133,135,136,138,139,139,139,139,138,138,137,136,135,134,133,132,132,131,130,129,128,128,127,127,126,125,125,124,123,123,122,
 122,122,122,122,122,122,123,124,124,125,126,127,128,128,129,130,130,130,131,131,131,131,131,130,130,130,130,129,129,129,129,129,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,129,129,129,129,129,129,129,129,128,128,128,128,128,128,128,128,128,128,128,128,128,127,127,127,127,127,127,127,127,127,127,127,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,129,129,129,129,129,129,129,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,129,128,127,129,
 130,128,127,128,128,127,127,128,128,127,128,128,128,128,128,128,128,128,128,128,128,128,127,128,128,128,128,128,127,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,127,128,128,128,128,128,128,128,128,128,128,129,128,128,128,128,128,128,129,129,127,128,128,127,128,128,128,128,128,128,128,128,128,128,128,128,128,127,128,128,128,128,128,129,128,127,128,128,
 127,129,128,129,129,128,128,127,129,127,128,127,127,128,128,129,128,129,128,128,128,128,128,127,128,128,128,128,128,130,128,129,127,128,128,127,127,128,129,127,129,128,129,128,127,128,128,126,130,129,127,127,128,128,128,126,129,129,128,128,129,129,128,127,128,129,128,126,128,128,129,127,130,128,129,125,129,127,127,129,126,131,125,131,128,130,126,130,126,127,128,129,129,129,126,128,130,125,129,127,
 129,126,128,124,129,129,130,131,125,126,128,129,126,130,127,130,129,126,130,127,125,125,130,128,127,129,127,131,125,127,129,128,128,127,128,127,130,126,126,125,127,129,129,130,128,130,126,130,128,131,130,128,128,125,129,126,130,127,130,130,127,128,128,130,127,130,126,130,130,125,128,128,130,129,128,125,127,130,125,129,127,129,132,128,127,126,130,126,128,129,127,130,127,128,127,128,126,127,131,126,
 129,126,124,131,128,127,128,129,127,130,127,123,133,127,129,132,127,129,128,128,124,129,126,127,131,123,129,131,130,130,128,129,129,129,121,128,130,126,130,126,127,132,130,125,129,130,125,129,123,124,132,128,125,129,129,128,131,129,124,129,129,127,130,127,128,132,129,125,128,130,127,126,128,129,127,126,127,128,129,126,127,130,130,129,126,129,130,127,128,127,128,129,128,128,130,130,127,128,128,128,
 129,127,126,128,130,127,128,129,129,129,127,128,128,127,127,127,129,128,129,129,129,128,126,128,127,126,129,129,128,129,129,128,128,128,127,128,127,128,128,127,127,128,129,128,128,127,128,129,128,128,127,127,128,129,128,128,128,128,129,128,128,128,129,129,128,128,128,127,127,128,128,128,129,128,127,128,129,128,128,127,127,129,129,128,127,127,128,129,129,128,128,129,129,128,128,129,127,128,128,128,
 128,128,128,128,128,128,128,127,127,127,128,128,127,128,128,128,127,126,128,128,129,128,128,128,129,128,129,129,128,129,129,128,128,128,129,129,128,128,128,129,128,128,127,128,128,129,128,127,127,127,127,128,128,128,128,128,127,128,128,128,128,128,127,127,128,129,128,128,128,128,128,128,129,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 127,127,128,128,128,128,128,128,128,129,128,128,128,128,129,128,128,128,128,128,128,128,129,128,128,128,128,128,127,127,127,128,128,128,128,128,127,127,128,129,129,128,128,128,128,129,129,129,128,128,129,129,129,129,128,128,128,128,128,128,128,128,128,127,128,128,127,127,127,127,127,127,127,128,128,128,128,128,128,128,128,128,128,128,128,129,129,129,129,129,129,129,129,129,129,129,128,128,128,129,
 129,128,128,128,127,127,128,128,127,127,127,127,127,127,127,127,127,127,127,127,127,128,128,128,129,129,129,129,129,128,129,129,129,130,129,128,128,129,129,129,129,129,128,128,128,128,128,128,127,127,127,127,127,127,127,127,127,127,127,126,126,127,127,127,127,128,128,128,128,129,130,130,130,130,130,130,130,130,130,130,130,129,129,129,129,129,129,128,127,125,125,125,125,124,124,124,124,125,125,125,
 125,125,126,127,128,129,129,130,130,131,132,132,132,132,132,133,133,133,133,132,131,131,131,131,130,129,128,126,124,124,124,123,122,121,119,118,119,121,121,121,122,124,126,129,132,133,134,134,135,135,137,138,139,139,138,137,138,139,139,139,137,133,130,129,128,127,123,117,111,107,104,101,98,93,89,92,105,123,138,145,146,143,140,141,146,150,146,137,129,125,127,136,147,154,155,152,149,147,145,144,
 141,133,123,115,110,107,105,102,95,84,75,75,88,111,132,146,153,152,145,140,142,144,141,136,131,123,117,121,133,143,151,155,154,148,144,144,145,144,139,131,120,112,111,115,119,119,113,99,85,76,72,83,109,135,148,152,149,145,143,148,152,147,135,123,115,115,126,141,150,150,147,145,145,149,154,153,142,129,120,115,117,122,124,120,112,104,94,88,84,80,85,105,129,144,151,152,149,145,145,146,
 140,129,119,115,117,127,140,148,148,145,145,147,149,150,146,136,125,120,121,123,125,126,123,118,114,110,103,94,84,74,81,108,138,153,154,149,146,146,151,154,143,124,111,111,121,135,147,149,142,138,144,153,156,152,141,127,118,119,126,129,124,119,117,119,122,121,111,94,82,72,75,98,130,147,144,139,142,151,156,156,143,122,107,110,125,136,140,139,138,139,148,159,160,148,135,128,126,128,130,128,
 122,118,123,131,133,128,118,107,97,91,82,77,90,119,142,147,146,147,152,153,152,144,126,111,109,120,130,135,136,138,141,148,155,156,146,135,129,129,129,128,124,120,118,124,132,134,129,121,114,107,100,90,76,73,97,132,150,147,141,145,154,158,152,137,117,106,113,128,136,134,133,139,148,156,159,151,138,130,131,134,129,121,117,118,124,132,136,133,125,120,118,114,102,89,75,67,84,120,150,149,
 137,138,155,164,156,137,116,106,109,124,133,131,128,137,152,161,158,149,141,135,134,135,130,120,115,121,131,135,134,132,132,131,130,124,112,98,87,83,77,82,106,139,152,146,143,153,162,154,137,120,110,109,116,127,131,131,137,150,159,157,149,142,137,133,128,125,121,118,121,128,134,134,133,133,134,130,123,115,106,98,91,85,77,80,106,142,158,149,140,148,161,157,137,117,108,110,119,130,134,133,
 138,153,164,160,145,136,136,136,130,123,120,121,126,133,137,136,132,132,134,132,123,113,106,102,99,94,86,78,86,118,152,159,142,134,146,160,150,125,108,107,115,124,131,134,136,144,156,162,153,138,132,135,135,128,120,120,126,133,137,137,136,134,136,136,131,121,112,110,109,106,99,93,87,87,107,139,158,148,133,137,153,156,133,111,108,118,125,126,130,136,143,150,155,152,140,131,132,135,131,121,
 118,126,134,136,133,133,136,136,133,128,122,116,112,112,109,105,100,97,92,90,109,140,159,147,132,136,154,156,133,112,111,122,129,130,131,136,144,151,154,148,137,131,134,136,130,121,122,131,137,134,131,132,136,135,130,124,120,117,114,111,106,104,101,98,89,88,111,146,159,141,127,139,159,155,126,108,113,127,131,127,128,138,147,153,152,145,136,134,138,137,128,119,124,134,139,134,132,135,139,137,
 129,123,120,118,116,112,107,102,100,98,91,90,113,146,156,138,127,141,159,151,123,108,116,128,128,125,127,136,146,151,149,141,133,134,139,135,125,120,128,136,136,130,130,136,138,134,128,124,121,118,114,110,106,103,100,95,87,94,123,151,151,133,131,151,162,144,119,113,124,131,127,124,129,139,148,150,146,139,137,141,140,131,123,125,132,133,129,128,133,137,136,132,129,125,121,117,112,107,103,100,
 96,87,84,104,136,151,138,129,143,163,156,130,117,123,131,128,121,122,131,142,149,147,140,139,146,147,138,126,126,132,134,129,126,129,134,137,135,131,126,125,123,118,109,104,103,100,91,83,93,122,144,139,128,137,157,160,141,125,124,131,130,123,118,122,134,143,143,138,138,146,149,142,131,129,133,133,128,125,126,131,134,133,130,127,127,127,123,115,109,108,105,98,89,90,109,131,134,127,130,147,
 158,149,135,131,135,136,130,122,120,128,137,138,134,134,142,147,144,137,134,135,134,131,127,125,126,129,131,129,126,127,129,126,120,116,115,113,108,103,99,103,115,125,125,123,130,142,146,140,136,137,140,137,130,126,127,130,132,131,129,132,137,139,137,134,135,135,134,130,128,127,127,128,128,126,126,127,128,126,124,124,124,123,121,120,120,120,120,121,122,124,125,126,126,128,129,129,129,129,130,130,
 129,129,129,129,129,129,129,129,130,130,130,130,130,130,130,130,130,130,130,130,129,129,128,128,128,127,127,127,127,127,127,127,127,127,127,127,127,128,128,128,128,128,128,128,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,129,128,128,128,128,128,128,128,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,127,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,131,132,129,126,126,127,127,127,127,127,128,128,129,129,129,128,129,129,129,140,124,114,133,131,119,128,133,124,123,127,143,130,117,143,133,116,132,134,
 118,124,131,127,130,127,125,130,131,126,128,131,125,126,130,126,125,129,128,125,129,128,126,128,128,127,127,129,129,129,127,127,128,130,132,127,127,129,126,127,130,127,126,129,128,127,129,129,127,129,128,131,135,128,128,130,127,126,127,126,125,127,127,127,128,128,128,129,129,127,128,128,127,127,126,127,127,127,128,127,128,128,129,129,129,129,129,129,129,130,129,130,130,129,129,129,129,129,129,129,
 129,128,128,128,127,127,127,126,126,126,125,126,125,124,125,123,123,125,123,124,126,124,127,128,128,130,130,131,133,132,133,134,133,134,134,133,134,134,133,134,133,133,133,131,131,131,128,129,127,125,125,122,121,120,117,117,115,112,113,112,111,114,113,116,121,121,127,132,134,140,142,143,147,146,146,146,144,143,142,139,140,139,138,139,139,138,139,136,135,133,129,125,120,114,108,102,95,91,85,84,
 87,88,98,105,112,127,133,142,153,152,157,157,151,151,144,139,137,132,131,133,134,139,145,147,152,154,153,153,148,143,138,131,125,119,115,111,108,108,106,104,103,97,94,93,93,94,99,105,109,120,127,135,147,150,154,158,153,152,149,141,139,134,129,131,131,132,138,140,144,148,148,148,148,143,139,137,129,127,124,119,119,116,114,115,113,111,108,102,97,94,92,91,96,101,108,118,126,136,146,150,
 156,156,154,152,146,141,136,131,129,128,130,133,137,142,146,149,152,150,150,146,141,138,131,127,124,118,118,115,113,115,113,111,109,103,98,95,91,91,94,97,106,113,123,133,141,149,153,155,155,151,149,143,139,136,132,132,133,135,140,143,147,150,151,151,149,146,141,136,131,126,122,118,115,113,112,111,110,109,106,102,96,93,91,91,96,100,107,117,124,135,143,149,154,155,153,151,147,143,139,135,
 134,134,135,138,141,144,148,150,150,150,147,143,140,134,129,127,122,120,119,115,116,115,111,113,109,104,102,95,93,93,93,99,105,112,121,129,138,143,148,151,149,150,146,141,141,135,134,135,133,138,140,142,147,148,148,149,147,145,142,138,133,130,127,123,123,121,119,120,116,115,116,109,107,104,94,95,91,90,98,100,110,119,125,136,141,145,150,148,147,146,141,139,136,134,135,134,137,141,143,147,
 149,150,151,148,146,143,138,135,131,127,126,123,122,122,121,120,118,116,114,110,106,101,96,94,91,94,98,102,112,119,127,136,140,144,147,146,146,144,140,139,136,135,136,136,138,141,143,147,149,150,150,148,146,143,138,135,131,127,126,124,123,123,121,121,120,117,115,111,107,102,97,94,91,91,95,101,107,117,124,131,139,142,145,147,144,144,142,138,138,135,135,137,138,141,145,146,149,151,150,150,
 147,143,140,136,132,129,126,125,123,122,123,121,121,121,118,115,112,106,101,97,92,92,92,96,104,109,119,127,132,141,143,145,147,143,142,140,136,136,135,134,137,138,141,145,147,150,151,150,149,146,143,140,135,132,129,126,125,124,123,124,123,122,121,120,116,113,108,102,100,95,94,95,96,103,108,115,123,128,135,139,141,144,142,142,140,138,137,135,136,137,137,141,142,145,148,148,149,148,145,144,
 140,137,135,130,129,127,125,127,125,124,124,122,121,120,116,114,110,105,103,99,98,98,99,103,108,113,120,126,130,136,138,139,141,139,139,138,135,136,136,135,139,139,141,145,145,148,148,147,147,144,142,140,136,134,131,129,128,127,126,125,124,123,122,121,119,117,114,110,106,102,99,98,98,100,104,108,114,120,125,130,134,137,139,140,139,139,138,137,137,136,137,138,140,142,144,146,147,147,147,146,
 144,142,139,136,133,131,129,128,127,127,126,125,124,123,122,120,118,115,111,108,105,101,100,100,100,104,107,112,118,122,128,132,134,137,138,138,139,137,137,137,136,137,138,139,142,143,144,146,146,147,146,144,143,140,137,135,132,130,129,128,127,126,126,125,123,122,121,119,117,114,110,107,104,102,100,100,102,106,109,114,119,123,128,131,134,137,137,138,137,137,137,136,137,138,138,141,141,143,145,145,
 146,145,144,144,141,139,137,135,133,131,130,129,128,128,127,125,124,123,121,120,117,115,112,108,106,103,102,102,103,105,108,112,116,120,125,128,132,134,136,137,138,138,138,138,138,139,139,140,141,142,143,144,144,144,144,143,142,140,138,136,134,132,131,130,129,128,127,126,125,123,122,120,118,116,114,111,108,105,104,103,103,104,107,110,114,118,122,126,130,133,135,137,138,138,138,138,138,139,139,140,
 140,141,143,143,144,144,144,143,142,141,139,137,135,133,131,130,129,128,128,127,126,124,123,122,120,118,115,112,109,107,104,103,102,103,106,109,112,116,121,125,129,132,134,136,137,137,137,137,137,138,138,139,140,141,142,143,143,144,144,143,142,141,139,137,135,134,132,130,129,129,128,128,127,126,125,123,122,119,117,115,111,109,107,104,103,103,104,107,110,114,118,122,126,130,132,134,136,136,137,137,
 137,137,137,138,139,140,141,142,143,143,144,144,143,142,140,138,137,135,133,131,130,129,129,128,128,127,126,125,123,121,119,117,114,112,109,107,106,106,105,106,108,112,115,118,122,125,128,131,133,134,135,136,136,137,137,137,138,139,140,140,141,142,142,143,142,142,141,139,138,136,135,133,132,131,130,129,128,128,127,126,125,123,122,120,118,116,114,112,110,108,107,106,107,108,110,113,117,120,124,128,
 131,133,134,135,136,137,137,137,137,137,138,139,139,140,141,142,142,142,142,141,140,138,137,135,134,132,131,130,129,129,128,128,127,126,124,123,121,120,117,115,113,111,109,108,107,107,108,110,112,115,119,122,125,128,131,133,134,135,136,136,136,137,137,137,138,139,140,141,142,142,142,142,141,141,139,138,136,135,133,132,130,129,129,128,127,126,125,124,123,121,119,117,115,113,111,109,108,108,108,109,
 110,113,116,119,123,126,129,131,133,134,135,136,136,136,136,137,137,138,139,140,141,142,142,142,142,141,140,139,137,136,134,132,131,129,128,128,127,126,125,124,123,122,121,119,117,114,113,111,110,109,109,109,110,111,114,118,121,124,127,130,132,134,135,135,136,137,137,137,137,138,138,139,140,141,142,142,142,141,140,139,137,136,134,132,131,129,128,127,127,126,125,124,123,122,121,120,118,116,115,113,
 112,112,111,111,112,113,114,116,119,122,125,128,130,132,134,135,136,137,138,138,138,139,139,140,140,141,141,141,141,140,140,139,137,136,134,132,130,129,127,126,125,124,123,122,121,120,119,118,116,115,114,113,113,112,113,113,114,116,118,120,123,125,128,130,132,134,135,136,137,138,138,139,139,139,139,140,140,140,140,140,139,139,137,136,135,133,131,129,128,127,126,125,124,123,123,123,122,121,119,118,
 117,116,114,114,114,114,114,115,116,117,120,122,124,126,128,130,132,133,135,135,136,137,138,138,139,139,140,140,140,140,140,140,139,138,137,135,133,132,130,129,127,126,125,124,123,122,121,120,120,119,118,117,116,116,115,115,115,115,116,117,119,121,123,126,128,130,132,133,134,135,136,136,137,137,137,137,137,138,138,138,138,138,138,137,136,135,134,132,131,129,128,127,126,125,124,124,123,123,122,121,
 121,120,119,119,118,118,118,118,118,119,119,120,122,123,125,126,128,129,130,131,132,133,134,134,135,135,136,136,136,137,137,137,137,136,136,136,135,134,133,132,131,130,129,128,127,126,125,124,123,123,123,122,121,121,120,120,119,119,119,119,120,120,120,120,122,123,124,126,127,129,130,131,132,132,133,134,134,134,135,135,135,136,136,136,136,136,135,135,134,133,133,131,130,129,128,127,127,126,125,125,
 125,124,124,124,124,124,124,123,122,122,121,121,121,121,121,122,122,123,125,126,127,128,129,130,130,130,131,131,131,131,132,132,132,133,133,133,133,134,133,133,133,132,131,131,130,130,129,128,128,128,127,127,127,127,126,126,126,126,126,125,125,124,124,123,123,123,123,123,123,124,124,125,126,127,128,128,128,128,129,129,129,129,130,130,130,131,131,132,132,133,133,133,133,132,132,131,130,130,129,129,
 128,128,128,128,128,128,128,128,128,127,127,126,126,125,125,125,125,125,125,125,125,125,126,126,127,127,128,128,128,128,128,128,128,128,128,128,128,129,129,129,129,129,130,130,130,130,130,130,129,129,129,129,128,128,129,129,129,129,129,129,129,128,128,128,128,128,128,127,127,126,126,126,126,126,127,127,127,127,127,127,127,127,127,128,128,128,128,128,128,128,128,129,129,129,129,129,129,129,129,129,
 128,128,128,128,128,128,128,128,128,129,129,129,128,128,128,128,128,127,128,128,128,128,128,128,128,128,127,127,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
 128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,128,
};

Berikut contoh program dengan compiler AVR Studio 4.

http://www.mediafire.com/file/hi5rz16mhp3fre5/avr_wav.rar

SELAMAT MENCOBA!!

___________________________

Sumber :

http://avrpcm.blogspot.com/2010/11/playing-8-bit-pcm-using-any-avr.html

Library Bahasa C Untuk Aplikasi Nada Monophonic Pada Mikrokontroler AVR Dengan Compiler WinAVR

wangready_tone_lib.h

Kelengkapan software compiler:  AVR Studio 4 (versi terbaru AVR Studio 5) dan WinAVR. Setelah kelengkapan software terinstall semua, mulailah sebuah project baru pada software AVR Studio 4. Klik Project pada menu bar kemudian pilih project wizard maka akan muncul tampilan seperti berikut.

Setelah itu, pilih New Project. Kemudian pilihlah AVR GCC dan jangan lupa beri nama project pada kolom yang ada lalu Next.

Setelah itu, pilih AVR Simulator dan pilih juga jenis mikrokontroler yang digunakan. Misal ATMega8 lalu Finish. Maka akan muncul tampilan kosong yang belum terprogram. Lalu coba masukan kode di bawah ini untuk musik berikut. Misal musik berformat nokia komposer:

4e1 8g1 4c1 8- 4a1 8c2 4f1 8- 8b1 8g1 8a1 8b1 8d2 8c2

Maka jika ditulis dalam program sederhana menjadi:

#include “wangready_tone_lib.h”

int main(void)

{

jeda(1);

tone_wr_init();

nada_e1(4);

nada_g1(8);

nada_c1(4);

jeda(8);

nada_a1(4);

nada_c2(8);

nada_f1(4);

jeda(8);

nada_b1(8);

nada_g1(8);

nada_a1(8);

nada_b1(8);

nada_d2(8);

nada_c2(8);

return(0);

}

Sekarang coba copy source wangready_tone_lib.c dan wangready_tone_lib.h ke folder project dimana source file berekstensi .c utama project berada. Setelah itu, pada jendela project sebelah kiri klik kanan pada Source Files lalu pilih Add Existing Source File(s)  dan tambahkan file wangready_tone_lib.c.

Setelah itu klik Edit Current Configuration Options lalu masukan nilai Frequency dan pilih nilai Optimization –Os.

Sekarang pada bagian kiri pilih Libraries lalu tambahkan libm.a ke bagian kanan setelah itu OK.

Setelah itu, cobalah build.

Untuk melakukan pengaturan output nada untuk speaker maka bukalah file wangready_tone_lib.h dengan cara expand pada panel project bagian External Dependencies lalu double klik pada nama wangready_tone_lib.h. Setelah itu bisa diatur pin mana yang akan digunakan untuk output speaker. Setingan awal disana menunjukan bahwa pin output yang digunakan untuk speaker adalah PORTB.0 dan PORTC.1.

//***SETTING PORT OUTPUT SPEAKER***

#define SPEAKER_OUT_0              0 //ubah angka disamping kiri dengan pilihan antara 0-7 sesuai penomoran PIN mikrokontroler

#define SPEAKER_OUT_1              1 //ubah angka disamping kiri dengan pilihan antara 0-7 sesuai penomoran PIN mikrokontroler

#define DIR_OUT_0 DDRB             //pengaturan PORT yang digunakan

#define DIR_OUT_1 DDRC             //pengaturan PORT yang digunakan

#define PORT_OUT_0 PORTB //pengaturan PORT yang digunakan

#define PORT_OUT_1 PORTC //pengaturan PORT yang digunakan

//==================================

Berikut contoh schematic yang bisa digunakan.

Jika proses build berhasil maka program sudah bisa di upload ke mikrokontroler. Bisa juga disimulasikan dahulu dengan software proteus.

Berikut link untuk contoh source code + library. http://www.mediafire.com/file/fii4bluau17m1vb/wangready_avr_tone.0.01.rar

Berikut link untuk disain PCB contoh rangkaian dalam Eagle PCB Designer Format. http://www.mediafire.com/file/875e66xfuhnn5fp/eagle_wangready_tone_lib.rar

lihat juga https://wangready.wordpress.com/2011/02/21/mpp-set/

____________________________________________________________________

Daftar Pustaka

http://www.sengpielaudio.com/calculator-notenames.htm

AVR Studio 4 — Build Error : Coba.elf section .text will not fit in region text ATAU region text overflowed

c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe: Coba.elf section .text will not fit in region text

c:/winavr-20100110/bin/../lib/gcc/avr/4.3.3/../../../../avr/bin/ld.exe: region text overflowed by 1068 bytes

make: *** [Coba.elf] Error 1

Build failed with 2 errors and 0 warnings…

Text di atas adalah pesan error saat saya mengkompile program untuk mikrokontroler avr menggunakan AVR Studio 4. Sempat bingung dengan kondisi tersebut saya coba googling. Solusinya tambahkan libm.a pada libraries pada configuration options. Pada menu bar klik Project. Lalu Configuration options. Setelah itu masuk pada menu Libraries. Klik libm.a lalu Add Library lalu OK.

Berikut pemahaman saya yang didapat forum

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=33001

libm.a adalah library matematika. Mengoptimasikan program yang memakai fungsi matematika.

With libm:
.data 78
.text 13478

Without libm:
.data 86
.text 16038

Diedit dari komentar “/Lars”

http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&p=191776

libm.a harus di link-kan untuk nilai binary/code <= 14kByte. Tampaknya ini adalah library fungsi matematika bawaan dari gcc (jika tidak menggunakan libm.a hasil compile program akan besar). libm.a menyediakan fungsi yang sama jika tanpa library ini, tapi dengan menambahkan maka akan menghasilkan code/binary yang lebih kecil.

Diedit dari komentar “Martin Thomas”

AVR Studio 4 + WinAVR = a nice combination (post ke-2)

MORE FUN WITH FREE SOFTWARE! ^_^

Membuat aplikasi led berjalan

Pertama, instal dulu avr studio 4 lalu winavr. Software bisa didownload pada post sebelumnya. Setelah terinstal pada PC, buka aplikasi avr studio 4, maka akan tampak tampilan seperti berikut ini.


Pilih new project. Lalu akan ada piliha untuk memilih apakah akan menggunakan atmel AVR assembler atau AVR GCC. Coba pilih AVR GCC untuk melakukan pemrograman dengan menggunkan bahasa C.

Ketikan nama program pada project name, misal led_berjalan. Centang create folder agar file project tersimpan rapi pada satu folder. Bisa ditentukan juga lokasi menyimpan file project yang dibuat dengan mengedit Location. Jika sudah, maka klik next.

Setelah itu akan muncul tampilan seperti dibawah ini.

Pilih pada debug platform AVR Simulator dan device ATmega8535. Lalu klik Finish. Setelah itu akan muncul form led_berjalan.c yang mana pada form tersebut kita melakukan pemrograman.  Sebelum melakukan pemrograman setting Configuration Options pada menu bar project. Pilih General dan setting Frequency dengan nilai frekuensi osilator yang akan digunakan pada mikrokontroler. Misal frekuensi yang digunakan adalah 4MHz.  Pilih juga Optimization dengan memilih -0s. Optimization Level digunakan untuk memilih level optimal file output program. Optimalisasi 0-3. 0 = tidak dioptimalisasi. s = optimalisasi ukuran. Level 3 bukan berarti level yang menghasilkan kode hex paling kecil. Lalu klik OK.

Setelah itu, coba ketikan program di bawah ini.

#include <avr/io.h>

#include <util/delay.h>

int main(void)

{

int i;

DDRA=0xFF;

PORTA=0x01;

_delay_ms(500);

while(1)

{

for(i=0;i<=5;i++)

{

PORTA=(PORTA<<1);

_delay_ms(500);

}

for(i=0;i<=5;i++)

{

PORTA=(PORTA>>1);

_delay_ms(500);

}

};

return(0);

}

Setelah itu, klik tombol build pada menu bar. Lalu klik tombol debug dan start debugging. Jika ada pilihan select folder, abaikan saja dulu dan klik select. Lalu pada menu bar debug pilih auto step agar melakukan debug secara otomatis. Lalu lihat pada jendela I/O view dan buka PORTA, maka akan terlihat PORTA akan menyala lalu bergeser ke arah kiri lalu kembali ke kanan dst. Mungkin akan terlihat lambat perpindahan led menyala padahal nilai delay 500 milisecond. Tapi itu tidaklah masalah. Untuk melakukan simulasi mungkin bisa menggunakan software Proteus.

Setelah program selesai dan tidak terdapat error, program bisa langsung didownload ke dalam mikrokontroler. Untuk mendownload bisa digunakan AVR ISPMkII atau banyak jenis lainnya.

Bisa dicoba sitem minimum di bawah ini.

AVR Studio 4 + WinAVR = a nice combination (post ke-1)

MORE FUN WITH FREE SOFTWARE! ^_^

AVR Studio 4Software AVR Studio versi 4 adalah software gratis yang berfungsi sebagai text editor dalam penulisan baris-baris perintah dan juga melakukan proses assembly yang mengubah program sumber assembly menjadi program objek maupun bahasa hexa. Software ini juga dapat melakukan simulasi secara lengkap.

AVR Studio 4 adalah Integrated Development Environment (IDE) untuk mengembangkan aplikasi pada AVR 8-bit pada lingkungan Windows NT/2000/XP/Vista/7.

AVR Studio 4 menyediakan satu set lengkap fitur termasuk debugger yang mendukung run control including source dan instruction-level stepping and breakpoints; register, tampilan memori dan I / O; dan target configuration and management serta dukungan penuh untuk programmer pemrograman mandiri.

AVR Studio 4 fitur

* Integrated Assembler
* Integrated Simulator
* Terintegrasi dengan kompiler GCC plug-in
* Dukungan untuk semua alat Atmel yang mendukung arsitektur AVR 8-bit, termasuk AVR ONE!, JTAGICE mkI, JTAGICE mkII, AVR Dragon, AVRISP, AVR ISPmkII, AVR Butterfly, STK500 and STK600
* AVR RTOS plug-in support
* support for AT90PWM1 and ATtiny40
* Command Line Interface tools updated with TPI support
* Online help

Software AVR Studio 4 sendiri bisa didownload di situs http://www.atmel.com/dyn/resources/prod_documents/AVRStudio4.18SP3.exe atau kunjungi situs http://www.atmel.com/ jika memungkinkan untuk software seri terbaru. Bisa juga kunjungi situs forum http://www.avrfreaks.net/index.php?func=viewItem&item_id=258&module=Freaks%20Tools

daftar pustaka :

Wardhana, Lingga. Belajar Sendiri Mikrokontroler AVR Seri ATMega8535. Penerbit ANDI: Yogyakarta.

http://www.atmel.com/dyn/products/tools_card.asp?tool_id=2725

WinAVR

WinAVRTM adalah sebuah paket executable, open source software development tools untuk seri AVR Atmel mikroprosesor RISC host pada platform Windows. Ini mencakup kompilator GNU GCC untuk C dan C + +.

WinAVRTM berisi semua tools untuk pengembangan di AVR. Ini termasuk avr-gcc (compiler), avrdude (programmer), avr-gdb (debugger), dan banyak lagi! WinAVR digunakan di seluruh dunia dari para hobis yang duduk di ruang bawah tanah basah mereka, untuk sekolah, untuk proyek-proyek komersial.

WinAVR adalah paket AVR-GCC untuk distribusi Microsoft Window. Sedangkan AVR-GCC adalah sekumpulan tool/alat/software yang digunakan untuk mengubah kode bahasa c ke bahasa yang dimengerti oleh mikrokontroler AVR yaitu (*.HEX) intel.

Compiler C hanya menghasilkan file asm (.S) dari tiap file input (.C) lalu assembler mengubahnya ke dalam file objek, di mana banyaknya kode objek sama dengan kode file asm. Kemudian linker menyatukan file-file objek dan fungsi-fungsi yang bersilangan diantara file objek dan mengambil/menghubungkan modul library c yang digunakan ke dalam satu file objek yaitu file (.ELF). Oleh avr-objcopy file (.ELF) diubah menjadi file (.HEX).

Keempat proses tersebut (compiler, assembler, linker, avr-objcopy) dalam winavr dijadikan dalam satu file yang disebut “makefile”, semua proses kompilasi dalam “makefile” ditangani oleh make.exe. Untuk membuat “makefile” disediakan MFile yaitu generator/pembuat “makefile”.

Kesimpulannya untuk membuat suatu program, sedikitnya diperlukan:

– file (nama_file.c) yang berisi tulisan program aplikasi avr dalam bahasa c.

– file (makefile) yang berisi aturan proses kompilasi program.

Software winavr sendiri bisa didownload di situs http://sourceforge.net/projects/winavr/files/WinAVR/ atau kunjungi situs http://winavr.sourceforge.net/ . Bisa juga kunjungi situs forum http://www.avrfreaks.net/index.php?func=viewItem&item_id=376&module=Freaks%20Tools

daftar pustaka :

Winoto, Ardi. Mikrokontroler AVR ATmega8/16/32/8535 dan Pemrogramannya dengan Bahasa C pada WinAVR. Penerbit INFORMATIKA: Bandung.

http://winavr.sourceforge.net/

continued on page AVR Studio 4 + WinAVR = a nice combination (post ke-2)