simple servo control

Bentuk motor servo:


servo standar



servo mini




 konfigurasi pin pada tiap merk servo




berikut merupakan gambar pemberian pulse pada data sheet servo Hitec-HS 311:

Arti dari gambar tersebut adalah jka servo di beri logic 1 (high) selama 600microsecon kemudian diberi logika 0 (low) selama beberapa miili secon maka servo akan bergerak ke posisi -90 derajat (berputar kekiri) , jika logik 1 nya diberikan selama 2400microsecon maka servo akan bergerak ke +90 derajat. untuk menggerakan servo ke tengah 0 derajat maka pulse yang diberikan adalah selama 1500micro secon,
pertanyaan yang muncul:
bagai mana menggerakan servo ke posisi 81 derajat?,33 derajat, 10 derajat?.

kita ganti saja logika berfikirnya, misal saya ubah menjadi :
  • -90 derajat (90 derajat kekiri) = 0 derajat
  • 0 derajat (tengah-tengah) = 90 derajat
  • +90 derajat (90 derajat kekanan) = 180 derajat
artinya :
  • lebar high pulse 600us  = 0 derajat
  • lebar high pulse 1500us= 90 derajat
  • lebar high pulse 2400us= 180 derajat
ini bukan merubah servo tetapi merubah pola berfikir untuk mempermudah pemrograman.
selisih lebar pulse high tiap derajat adalah (2400us - 600us) /180 = 10us.
maka untuk menggerakan servo sebesar 1 derajat maka lebar pulsa logic 1 adalah 600us + 1 x 10us. 


kesimpulan :
  • lebar pulse high (logic 1) = 600us + derajat yng diinginkan  x 10us 
  • lebar pulse low nya (logic 0) saya gunakan 10 milisecon

contoh program dalam bahasa C:
#include <mega16.h> // microcontroller ATmega 16
#include <delay.h>
#define servo PORTC.0 // servo connected with PORTC.0
typedef unsigned char unchar; // unsigned char = unchar
void set_servo(unchar derajat) // function to control servo 1
{
unchar n;
servo=1; // berikan output logic 1
delay_us(600); // selama 600us
 for(n=0; n < derajat; n++){ // ditambah 10us X derajat yg diinginkan
delay_us(10);
};
servo=0; // keluarkan output logic 0
delay_ms(10); // tunda selama 10 ms 
};
void main(void){
DDRC = 0x01;
PORTC= 0x00;
while(1){
set_servo(100); //menggerakan servo ke sudut 100 derajat
delay_ms(1000);
set_servo(30); // menggerakan servo ke sudut 30 derajat
delay_ms(1000); 
}
 }

Salah satu logika cara untuk mengatur speed servo:
jika servo kita perintahkan untuk bergerak menuju ke sudut tertentu maka servo akan bergerak ke sudut tersebut dengan kecepatan penuh , jika kita gerakan servo tiap step maka servo akan bergerak lambat.
misal :
dari posisi awal servo 0 derajat kemudian kita perintah untuk bergerak ke 30 derajat maka servo akan langsung bergerak dengan kecepatan penuh ke sudut 30 derajat. utuk memperlambat kita gerakan tiap 1 derajat.  maka servo akan bergerak dari 0 ke 1 derajat dulu, 2 derajat, 3 ,4.... dst sampai ke 30 derajat (tujuan), jika step kita perbesar maka gerakan akan semakin cepat , misal menggunakan 5 step, maka servo akan bergerak dari 0 derajat , 5 derajat , 10 derajat.. dst sampai 30 derajat (tujuan).
jangan lupa untuk menunda beberapa mili secon tiap step.


lihat video 24 serial servo controller buatan saya:



komunikasi menggunakan USART 
yang paling kiri adalah servo hitec HS-322
yang lainya servo towerpro MG945R 

source code dan simulasi proteus download disini !!  
setingan crystal yang saya gunakan external crystal 16MHZ (sesuaikan dengan milik anda), jika crystal tidak sama dengan program maka servo tidak akan bergerak sesuai keinginan,

password to open zip file : microku.blogspot.com

74 comments:

Unknown said...

ada contoh programnya buat stepny gak gan????

sh mukti said...

mas epong: logika nya kira2 seperti ini,

sudut=100
speed=10
for (i=0;i<=sudut;i+=speed){
set_servo(i);
delay_ms(100/speed);
}

Unknown said...

ok thanks mas,
nanti q coba

bang Gent said...

Ijin ya mas..untuk meng-unduh
Mudah PCB

Unknown said...

#include // microcontroller ATmega 16
#include
#define servo PORTC.0 // servo connected with PORTC.0
typedef unsigned char unchar; // unsigned char = unchar
void set_servo(unchar derajat) // function to control servo 1

{

unchar n;
servo=1; // berikan output logic 1
delay_us(600); // selama 600us

for(n=0; n < derajat; n++){ // ditambah 10us X derajat yg diinginkan
delay_us(10);

};

servo=0; // keluarkan output logic 0
delay_ms(10); // tunda selama 10 ms

};

void main(void){
DDRC = 0x01;
PORTC= 0x00;
while(1){

set_servo(100); //menggerakan servo ke sudut 100 derajat
delay_ms(1000);
set_servo(30); // menggerakan servo ke sudut 30 derajat
delay_ms(1000);

}

}



mas program ini sudah saya coba tapi kok gak bisa ya mas,pa ada yg salah????
kl diprogram utama cuma satu sudut aja bisa tp kl uda di kasih 2 sudut yg berbeda kok gak bisa.bingung saya mas

sh mukti said...

bang gent: silahkan bang gent..

mas epong :
di coba di hardware langsung atau di simulasi?
kalo menggunakan simulasi silahkan gunakan yang ada.

misal akan membuat 2 gerakan atau lebih harus di delay setelah perintah. jika tidak maka yang di eksekusi adlah perintah yang terakhir.

contoh:
set_servo(0);
delay_ms(500);
set_servo(40);
delay_ms(500);
set_servo(100);
delay_ms(500);
set_servo(30);
delay_ms(500);

jika tanpa delay seperti ini:

set_servo(30);
set_servo(100);

maka servo cuma akan bergerak ke 100 derajat saja..

Unknown said...

uda mas bisa gerak tapi perubahan sudutnya kecil banget tdk sesuai dgn sebenarnya

sh mukti said...

periksa lagi settingan clock / crystalnya nya. harus sesuai antara di codevision dan di mikronya (fuse bit)

Unknown said...

sudah mas tp q pake 12Mhz, apa itu berpengaruh ya mas????

sh mukti said...

servo controller yng saya buat juga menggunakan 12Mhz. seharusnya tidak begitu berpengaruh.

Unknown said...

void set_servo(unchar sudut)
{
unchar n;
servo=1;
//delay_us(600); // selama 600us
for(n=0; n < sudut; n+=5){
delay_us(10);
};
servo=0;
delay_ms(10);
}

void set_speed(unsigned char sudut , unsigned char speed)
{
unchar i;
set_servo(sudut);
for (i=1;i<=sudut;i+=speed){
set_servo(i);
delay_ms(100/speed);
}
}
void main(void){
DDRC = 0x01;
PORTC= 0x00;

while(1){


set_speed(0,2);
delay_ms(1000);
set_speed(90,2);
delay_ms(1000);
set_speed(180,2);
delay_ms(1000);
set_speed(90,2);
delay_ms(1000);



}
}
dr program diatas bisa gerak secara halus mas tapi kok pergerakannya servo kembali ke 0drjt dl baru ke sudut selanjutnya
misal 0 ke 90,trs ke 180 servo ke 90 stlh itu ke o dl baru ke 180, tolong dikoreksi mas>>>>>>>>>>>

sh mukti said...

servonya type berapa ya?

itu di prosedur set_servo

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

berarti penambahan i nya kelipatan 5

jika servo di set < 5 derajat.

berarti delay logic satunya cuma 10us.

kalo di set 90 derajat delay logic satunya 1800us.

kalo di set 180 derajat delay logic nya 3600us

Unknown said...

q pake proteus mas,trs program yg bener biar bs atur kecepatannya gmn mas? q mau bikin robot tangan tp gak bs gerakin servo secara pelan mas
mohon bantuannya mas

sh mukti said...

silahkan dicoba dulu di servonya langsung...
besok kalo sempat tak update lg blognya..

Unknown said...

ok mas.thx

Anonymous said...

Pak, punya fixer CodeVisionAVR 2.05.6?
Terima kasih.

Ahlan Wa Sahlan said...

Cara akses servo yang MG945R gmana?
Apakah rumusnya sama dengan yang di atas, mengingat MG945R adalah servo digital.

sh mukti said...

sama saja,, semua servo controlnya sama. yang membedakan analog dan digital adalah sistem yang di gunakan di dalam servo tersebut. saya dah mencoba di servo towerpro, hitec hs-311 hs-322 hs-5625 termasuk MG945R dan servo mini.

Ahlan Wa Sahlan said...

Berarti cara akses analog dan digital sama y mas, rumus di atas sudah saya coba terapkan pada servo Futaba S3003 dan memang berhasil, tapi sya coba terapkan ke servo digital JR ES539 tapi gerakannya aneh, saya jga pernah baca sebuah artikel untuk mengakses servo digital digunakan data berbentuk heksadesimal.

sh mukti said...

wah, saya belum mencoba kedua servo itu, yg saya tahu servo Futuba 53003 dan JR ES 539 adalah analog servo (servocity.com).
Hs-5625 dan Towerpro MG945R adalah servo digital (www.hitecrcd.com) sedangkan servo Hs-311 dan Hs-322 adalah servo analog (www.hitecrcd.com) saya sudah mencobanya dan dapat bekerja dengan sangat baik. ada baiknya anda mengecek power supply yang di gunakan. sy menggunakan UBEC 3A. ketika saya coba dengan regulator 7805 saja, servo tidak dapat bekerja dengan baik. thx

Eko Cahyono said...

kalau pakai codevison AVR gimana gan logikanya ?

sh mukti said...

saya memakai codevision avr mas..

Agung P. said...

salam kenal mas, kalo mau ngontrol lebih dari satu servo dari mikro langsung (g pake servo controler) contoh programnya gemana mas?
mohon pencerahnnya...

sh mukti said...

#define servo0 PORTC.0
#define servo1 PORTC.1
void set_servo(unchar derajat0,unchar derajat1)
{
unchar n;

servo0=1;
servo1=0;
delay_us(600);
for(n=0; n < derajat0; n++){
delay_us(10);
};

servo0=0;
servo1=1;
delay_us(600);
for(n=0; n < derajat1; n++){
delay_us(10);
};

servo0=0;
servo1=0;
delay_ms(10);
};

Anonymous said...

siang mas dan salam kenal,saya ada kendala untuk mendownload program cv avr 2.05.03 ke micon atmega328 ,ntu gman ya caranya ? (saya masih pemula dalam micon atmega)
kemudian tentang kabel peripheral untuk mendownloadnya apa ada gambar skema nya ?
kalo boleh,saya minta dikirim via email mas,ini email saya budax_leuweung15@yahoo.com

terima kasih sebelumnya

Anonymous said...

salam kenal.
Bagaimana cara menggerakkan posisi servo dg komunikasi serial USART menggunakan bhs C cvAVR, saya menggunakan atmega328.
Mohon contoh dan penjelasannya.
trimakasih.

sh mukti said...

coba dengan membuat program usart dulu, kalo sudah bisa kirim-terima data, tinggal data yang di terima dipakai untuk menggerakan servo..

Anonymous said...

mas contoh program untk menggrakn servo 90 derajat pd saat servo memutar perlahan itu gmn mas??

fred_siga@ymail.com

tlong jwaban'na mas, terima kasih..

Anonymous said...

coba pake HItec HS-311 lancar
pake MG945R jadi gedek2,
pake DF15SR continues jd muter terus,

perbedaannya dimana gan antara ketiga servo ane bingung -_-

sh mukti said...

@fred_siga : bisa dilihat pos ane yang baru mas (pengatur posisi kamera).. mungkin bisa jadi reverensi..

@kang uyut : servo continous pulse 1500us = stop , < 1500us = cw , > 1500us = ccw , biasanya ada potensio buat tuning biar stop di 1500us..
biasanya kalo servo metal gear pulse nya 1ms-2ms jadi gak 0-180 derajat dan butuh arus yang besar.. Kalo hs311 standar servo bukan metal gear torsi kecil makan arusnya kecil..

Wahyu Pratama said...

mas
sya mencoba servo futaba s3003, kenapa ya kok gada program yg cocok buat servonya..
mohon bantuannya mas untuk list program codevisionnya..

sh mukti said...

gak cocoknya kenapa ya mas.. maaf saya belum pernah mencoba servo merk tersebut. coba liat datasheet dan bandingkan dengan yng lain..

Wahyu Pratama said...

kalau yang ini maksudnya apa ya mas::
for(n=0; n < derajat; n++){ // ditambah 10us X derajat yg diinginkan
delay_us(10);
apakah derajatnya sesuai yg qt inginkan??

Wahyu Pratama said...

Saya dapat di data sheetnya untuk futaba s3003 begini mas = 1520-1900us..
nahh list programnnya seperti apaaa yaa??
mohon bimbingannyaa..
Terimakasih banyak sebelumnya...

sh mukti said...

itu rumus pengali input perintah sudutnya.. jadi delay 10us akan diulang sebanyak derajat yang diinginkan (for(n=0....).

Unknown said...

Bang, ini saya lg pake program codevision AVR.

Saya butuh coding memperhalus kecepatan motor servo dari sudut menuju sudut yang diinginkan.
Ada contohnya ngak ?

sh mukti said...

silahkan ke sini bang,,,
source code,skema,ada disono,,

http://microku.blogspot.com/2013/04/pengatur-posisi-kamera.html

Unknown said...

Bang, klu langsung tambahin coding yang saya punya, gimana ?

Ini codingnya:
#include

// Standard Input/Output functions
#include
#include ;

//deklarasi servo
int servo_num;
int servo_poz[7]={0,0,0,0,0,0,0};


// Declare your global variables here
// Timer 0 overflow interrupt service routine
#define Servo1 PORTD.2
#define Servo2 PORTD.3
#define Servo3 PORTD.5
#define Servo4 PORTD.6
#define Servo5 PORTD.7


unsigned int i = 0;
unsigned char dataServo1, dataServo2=0;
interrupt [TIM0_OVF] void timer0_ovf_isr(void)
{
if (i>937)
i=0;
else
i++;

if (i


void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// 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=0xFF;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=Out Func6=Out Func5=Out Func4=Out Func3=Out Func2=Out Func1=Out Func0=Out
// State7=0 State6=0 State5=0 State4=0 State3=0 State2=0 State1=0 State0=0
PORTD=0xFF;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x01;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x01;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;

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

#asm("sei")

while (1)
{
// Place your code here

printf ("\n Ready");
delay_ms(200);


while (getchar()== 255)
{

/* printf("\n ServoNum?"); */
servo_num = getchar();

/* printf("\nServoNo: %d",servo_num); */

if(servo_num > 7) {
putsf("\nNoServoFound"); }
else {
servo_poz[servo_num] = getchar();
/* printf("Pos %d",servo_poz[servo_num]); */
};
};

};

}

di tandai ya bang tambahannya...
tq...

Unknown said...

Bang, gimana?
Coding abang bisa dikombinasi dgn coding saya ngak ?

Saya coba ngak bisa tuh

sh mukti said...

gak bisa gimana bang.. ane kagak dong program abang ini arahnya kemana..
di analisis aja bang error notification nya.. kan dah jelas ditunjukan errornya kalo bikin code pake cvavr..

Wahyu Pratama said...

jadi sya pake 600us untuk yg 0derajat sama 1500us untuk yg 90

sh mukti said...

dicoba saja mas.. saya belum punya servonya jadi gak bisa komen banyak.. trial and error saja.

Anonymous said...

mohon pencerahannya..
kira" programnya gimana ya kalau servo akan bergerak dari sumbu x ke y jika tombol ditekan trus dan servo berhenti ketika tombol di lepas.. newbie abis...

sh mukti said...

void main(){
i=0;
while(1)
if (tombol==0){
i++;
if(i>180) i=0;
delay_ms(200);
}
set_servo(i);
}
}

andhie said...

mohon pencerahannya mas...

klo untuk ngatur speed servo kan main perstep pergerakan biar gk langsung ke sudut yg diinginkan...

nah klo untuk mengatur bebebrapa servo sekaligus dimana besarnya sudut dan speed yang berbeda tapi geraknya bersamaan itu gimana yh??

soalnya sy nyoba yg ada di comment di atas itu malah ketika servo yg satu gerak, yang lainnya jadi lemes...

mohon pencerahannya mas...

Unknown said...
This comment has been removed by the author.
Unknown said...

Mas ini tolong dikoreksi yang salah yang mana, kok gk bisa pace coding ini ..

variable i itu int mas ..

void full_cw()
{
for(i=0;i<65;i++)
{
servo=1;
delay_us(600);
servo=0;
delay_us(2400);
}

terima kasih mas ..

sh mukti said...

servonya apa, kalo buat servo logika 1 nya kisaran 600us - 2400us. logika 0 nya sekitar 10ms -20ms mas
kalo mau gerak kanan kiri kanan kiri.

void full_cw()
{
for(i=0;i<65;i++)
{
servo=1;
delay_us(600);
servo=0;
delay_ms(20);
}
for(i=0;i<65;i++)
{
servo=1;
delay_us(2400);
servo=0;
delay_ms(20);
}
}

Unknown said...
This comment has been removed by the author.
Unknown said...
This comment has been removed by the author.
Unknown said...

Sudah saya coba mas, kok tetep gk bisa ya??

#define servo PINC.0
int i;

oh iya mas, sekalian nanya kalau mrogram sensor PIR it gmn ya?? soalnya sudah saya coba tetep gk mau..


Untuk mengetahui servo logika 0 atau 1 gmna ya mas??
soalnya ini saya pake servo yang kecil itu, servo mini.. buat uji coba
Rencana mungkin pake servo yang standart.. (Untuk Tugas Akhir mas)

Mohon bantuannya, terima kasih ...

Unknown said...

wah sudah bisa, ternyata cuma PINC.0 saya ganti jadi PORTC.0..

nanya mrogram Sensor PIRnya aja mas.. heheee

terima kasih

sh mukti said...

sensor pir outputnya = 1 jika mendeteksi, 0 jika tidak mendeteksi

PIN untuk membaca input
PORT untuk output

Unknown said...

gk bisa mas program sensor pirnya ..

if (PINA.0==1)
{
PORTC=0b11111111;
}

apa ada langkah awalan khusus saat new project di avrnya mas??

sh mukti said...

kamu harus ngeset PINA.0 jadi input

#include <...........

void main(){

DDRA.0=0;
PORTA.0=0;

DDRC=0b11111111;
PORTC=0b00000000;

while(1){
if (PINA.0==1)
{
PORTC=0b11111111;
}
}
}

sh mukti said...

kamu harus ngeset PINA.0 jadi input

#include <...........

void main(){

DDRA.0=0;
PORTA.0=0;

DDRC=0b11111111;
PORTC=0b00000000;

while(1){
if (PINA.0==1)
{
PORTC=0b11111111;
}
}
}

Unknown said...

bisa mas ..

setelah mendeteksi, perubahan tegangan vout dari 4v ke 0v agk lama, dari situ saya bingung kok nyala LED lama tidak mati2 ..
saya setting di vrnya, dan skrng uda bisa langsung 0v saat tidak mendeteksi adanya manusia .. thanks mas

Eka -Abugroza- Ramdhan Hidayat said...

Mas maaf saya coba kode yg pake set_speed tapi ga saya ubah penambahannya kok 0derajat servonya ga ditengah ga dipinggir ya? clock yg saya pake 12Mhz mega8535 servonya s0361 hobbyking

sh mukti said...

gimana ya,, emm anu,, coba cek fusebit dsb dll..

Unknown said...

mas mw nanya nh program untuk mengendalikan putaran motor servo dengan sensor jarak tu gmna ya mas, dengan putaran servo 360 derajat. saya menggunakan sensor ultrasonik srf04 untuk menggerakan motor servo sehingga pintu dapat terbuka dan tertutup.

sh mukti said...

ya di buat saja..

baca sensor jaraknya..
misal jarak kurang dari 5 meter
set servo sekian derajat untuk kondisi buka pintu..

Unknown said...

gmna program di codevision Avr unruk membaca sensor ultrasonik nya. saya dah nyoba tapi gx mau tampil di LCD.

sh mukti said...

di posting saja code mu,

Unknown said...

#include
#include
#include

// Alphanumeric LCD functions
#asm
.equ __lcd_port=0x15; PORTC
#endasm
#include
#define TRIGGER PORTB.4
#define ECHO PINB.5

unsigned char s_1[16],s_2[16];
long timer=0,xTimer=0;
float pulsa,jarak;

// Timer1 overflow interrupt service routine
interrupt [TIM1_OVF] void timer1_ovf_isr(void)
{
// Place your code here
xTimer++;

}
void bacajarak() {
TRIGGER=1;
delay_us(10);
TRIGGER=0;
while(ECHO==0);
TCNT1=0;
xTimer=0;
while(ECHO==1);
timer=TCNT1;
pulsa = (float)xTimer * 65535 * 0.5 + (float)timer * 0.5;
jarak=pulsa/30.034;
lcd_clear();
sprintf(s_1,"pulsa=%5.2f",pulsa);
sprintf(s_2,"jarak=%fcm",jarak);
lcd_gotoxy(0,0);
lcd_puts(s_1);
lcd_gotoxy(0,1);
lcd_puts(s_2);
delay_us(500);
}

// Declare your global variables here

void main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port A initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTA=0x00;
DDRA=0x00;

// Port B initialization
// Func7=In Func6=In Func5=In Func4=Out Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=P State4=0 State3=T State2=T State1=T State0=T
PORTB=0x20;
DDRB=0x10;

// Port C initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
// Mode: Normal top=0xFF
// OC0 output: Disconnected
TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: 11059.200 kHz
// Mode: Normal top=0xFFFF
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer1 Overflow Interrupt: On
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x01;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
// INT2: Off
MCUCR=0x00;
MCUCSR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x04;

// USART initialization
// USART disabled
UCSRB=0x00;

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

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// 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: 8
lcd_init(8);

// Global enable interrupts
#asm("sei")

while (1)
{
// Place your code here
bacajarak();
delay_ms(100);


}
}

sh mukti said...

klik "project " di menu bar, pilih "configure", muncul menu box pilih "c compiler" , di bagian "(s)printf feature" pilih "float,width,precission".. klik ok

build project dan coba lagi

Unknown said...

bang, dah saya setting seperti perintah.kok pas di build all project files muncul tulisan (tanda silang) Evaluation version code limit exceeded ! tu kenapa ya bang.

sh mukti said...

CodeVisionAVR that you use is a limited version!

Unknown said...

jd solusi nya gmna bang

sh mukti said...

http://microku.blogspot.com/2011/10/codevisionavr-v2053.html

Unknown said...

mas file cvavr2.exe yg di crack gx bisa di copy di folder Bin kyak nya file nya kena virus.. bisa tlong dikirim crack nya gx mas, trims

Ritwan_awan said...

Mas sh mukti: Izin nyimak , ilmunya pas banget ma tugas kuliah saya saat ini , TERIMA KASIH SEBELUMNYA

Unknown said...

kk, boleh minta tolong ajarin tentang motor servo..
saya pake 2 pus button, saat push button 1 di tekan, servonya jalan, terus saat push button ke dua ditekan push servonya berhenti,
itu kodingannya gimana ya kk. terima kasih

sh mukti said...

tutorial dan sebagainya akan saya pindahkan ke web yang baru di : www.team-ichibot.com , artikel akan selalu kita update,

Unknown said...

itu gimana cara nya kk, ??
buat servo bergerak saat push button 1 ditekan, dan berhenti saat push button 2 di tekan.