Semua Tentang Belajar Teknologi Digital Dalam Kehidupan Sehari - Hari

  • IC Timer 555 yang Multifungsi

    IC timer 555 adalah sirkuit terpadu (chip) yang digunakan dalam berbagai pembangkit timer, pulsa dan aplikasi osilator. Komponen ini digunakan secara luas, berkat kemudahan dalam penggunaan, harga rendah dan stabilitas yang baik

  • Ayo Migrasi TV Digital

    Kami bantu anda untuk memahami lebih jelas mengenai migrasi tv digital, apa sebabnya dan bagaimana efek terhadap kehidupan. Jasa teknisi juga tersedia dan siap membantu instalasi - setting perangkat - pengaturan antena dan distribusi televisi digital ke kamar kos / hotel

  • Bermain DOT Matrix - LOVEHURT

    Project Sederhana dengan Dot Matrix dan Attiny2313. Bisa menjadi hadiah buat teman atau pacarmu yang ulang tahun dengan tulisan dan animasi yang dapat dibuat sendiri.

  • JAM DIGITAL 6 DIGIT TANPA MICRO FULL CMOS

    Jika anda pencinta IC TTL datau CMOS maka project jam digital ini akan menunjukkan bahwa tidak ada salahnya balik kembali ke dasar elektronika digital , sebab semuanya BISA dibuat dengan teknologi jadul

  • Node Red - Kontrol Industri 4.0

    Teknologi kontrol sudah melampaui ekspektasi semua orang dan dengan kemajuan dunia elektronika, kini semakin leluasa berkreasi melalui Node Red

Tampilkan postingan dengan label dasar. Tampilkan semua postingan
Tampilkan postingan dengan label dasar. Tampilkan semua postingan

Kamis, 03 Januari 2013

Interrupt - solusi eksekusi perintah real time

interrupt.jpg (537×694)


Secara harfiah interrupt dapat diartikan sebagai "pemecah" atau "penyelaan" dari suatu keadaan yang sedang berlangsung. Ya begitulah interrupt dapat diartikan seperti halnya interupsi pada sidang-sidang dewan di senayan. Jika di tarik kedalam proses suatu microcontroller maka interrupt merupakan suatu keadaan "menyela" dari program utama untuk masuk kedalam proses yg dikendalikan oleh interrupt itu sendiri. Ingat bahwa proses kerja dari microprosessor atau microcontroller adalah melakukan perintah sesuai script yang diberikan dari atas ke bawah. Jadi perhatikan proses membaca tombol berikut ini seperti yang dibahas pada project dasar input - output :


int main(void)

{

DDRB |= (1<<PB5)|(1<<PB0) ; //inisialisasi port B#5 & B#0 sebagai output
DDRB &= ~(1<<PB1) & ~(1<<PB2) ; //inisialisasi port B#1 & B#2 sebagai input

PORTB |= (1<<PB5) | (1<<PB0); //kita SET LED NYALA semuanya

while(1)
{

// membaca jika port input B#1 di set atau HIGH 
//  atau 1 ( posisi awal di ground /LOW )

if (bit_is_set(PINB, PINB1)) 
{
PORTB ^=(1<<PB5) ; //TOGGLE LED di PORT B#1
_delay_ms(500);

}

// membaca jika port input B#2 di set atau HIGH 
// atau 1 ( posisi awal di ground/LOW )

if (bit_is_set(PINB, PINB2)) 
{
PORTB ^=(1<<PB0) ; //TOGGLE LED di PORT B#2
_delay_ms(500);
 
}
}

return 0;
}

Script diatas merupakan perintah pembacaan tombol yang terdapat pada PORT B1 dan B2 yang akan mengendalikan nyala dari 2 buah LED pada PORT B0 dan B5. Perintah pembacaan tombol ini merupakan cara 'pooling' dimana terpadat proses IF yang menunggu sampi BIT dari tombol berubah dari 0 ke 1. Bagaimana jika scipt nya panjang semisal ada proses perhitungan yang panjang ? Yang akan terjadi adalah proses pembacaan tombol harus menunggu beberapa waktu sampai posisi akumulator dari processor berada tepat pada proses IF.

Solusi dari permasalahan pooling adalah dengan menciptakan suatu table interupt yang memiliki prioritas tertentu dan tentunya prioritasnya lebih dari proses pooling biasa. Interupt ada beberapa jenis tergantung fasilitas yang disediakan oleh microprocessor atau microcontroller. Interupt dapat di kendalikan oleh proses luar (input external) maupun internal. External interupt umumnya merupakan proses perubahan logika(logic) dari pin input (biasanya pin ditentukan sebagai pin INT). Jenis perubahan logika ini terdiri dari :

-  AKTIF HIGH  : interupt akan dieksekusi ketika pin input mendapat logika "1"
-  AKTIF LOW   : interupt akan dieksekusi ketika pin input mendapat logika "0"
-  RISING EDGE  : interupt akan dieksekusi ketika pin input berubah dari logika "0" ke logika "1"
-  FALLING EDGE  : interupt akan dieksekusi ketika pin input berubah dari logika "1" menuju logika "0"

Ada 2 buah istilah baru yaitu rising dan falling edge yang lebih menekankan ke perubahan logika dari input interupt. Hal ini lebih bermafaat dikarenakan umumnya proses interupt dieksekusi sekali saja. Semisal kita akan menunggu interupt dari suatu pulsa untuk menambah atau mengurangi suatu nilai variabel ,  sehingga hanya perubahan yang dikehendaki saja akan menambah nilai tersebut dan hebatnya akan ditambah hanya sekali saja dalam proses interuptnya.

Interrupt secara internal pada umumnya di trigger oleh suatu kondisi dari hasil eksekusi program dan contoh yang paling sering kita temui adalah interupt yang di trigger oleh proses timer.

Untuk ATTINY 2313 proses interrupt external dikendalikan oleh 2 buah INT0 dan INT1 serta interupt lainnya berupa Pin Change Interupt yang dapat dipasang diantara PINB 0-7. Register atau memory yang merupakan memory kontrol dari interupt attiny seperti berikut :
















Contoh script dari  inisialisasi interupt external pada attiny2313 adalah sebagai berikut :


int main(void)
{

   // aktifkan interrupt 0 dan 1
   GIMSK |= (1<<INT0) |(1<<INT1);
   
   // interrupt rising EDGE ( perubahan 0 ke 1) 
   MCUCR |= (1<<ISC01) | (1<<ISC00) |(1<<ISC11) | (1<<ISC10); 

   
sei();   // perintah bahwa interupt aktif / enable

while(1)

{

//looping tak berhingga

}

return 0;

}


Sedangkan perintah (susunan script) ketika interupt mendapat trigger dan berada pada posisi aktif ditempatkan dengan posisi seperti berikut :




SIGNAL (SIG_INT0)
{

// masukkan perintah eksekusi interupt di pin INT0  
    
}

SIGNAL (SIG_INT1)
{

// masukkan perintah eksekusi interupt di pin INT1  
    
}



Berikut akan ditampilkan contoh interupt internal yang ditrigger oleh timer. Proses timer dengan interrupt sangatlah akurat sehingga cocok dipakai untuk timer atau jam digital.




void init_jam(void)
{
   TCCR1B |= (1 << WGM12); // konfihurasi timer 1 mode CTC 
   TIMSK |= (1 << OCIE1A); // Enable CTC interrupt 
   OCR1A  = 31249; //nilai timer 1 detik dari CTC A 
   TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer Fcpu/64
   TCNT1 = 0;
   
   sei();
}


ISR(TIMER1_COMPA_vect) // interupt internal dari timer akurat 1 detik

{ 

detik++;

if(detik >= 60)

{  
   detik=0;
   menit++;



}

if(menit >= 60)

     { menit=0; 
       jam++;
     }

if (jam >= 24) jam = 0 ;




}






SELAMAT MENCOBA
Share:

Selasa, 01 Januari 2013

Script Break Down - Episode Love Hurt






SELAMAT TAHUN BARU 2013 kepada para pembaca setia blog tercinta. Dengan semangat baru di tahun yang baru ini kita mulai dengan pembahasan script-script yang terdapat di blog ini karena ada beberapa teman yang merasa "terintimidasi" dengan bahasa pemrograman yang dianggap terlalu susah. 

Kali ini kita akan membahas script dari percobaan led matriks  "love hurt" yang ditulis agustus 2011. Project love hurt ini juga terdapat dalam paket belajar dasar microcontroller  yang dapat anda pesan dengan harga yang cukup terjangkau oleh  kantong anak SMA sekalipun.

Seperti pada posting led matrix love hurt rangkaian yang digunakan seperti skematik berikut ini :



Rangkaian nya sangat simple, sesimple scriptnya juga dan marilah kita break down scriptnya


HEADER


#define F_CPU 1000000UL
#include < avr/io.h >
#include < util/delay.h >
#include < avr/pgmspace.h >
#include < string.h >
#include < avr/eeprom.h >

Pada penjelasan terdahulu mengenai dasar-dasar bahasa GCC maka dapat dilihat pada header terdapat inisialisai dari beberapa parameter. Yang pertama adalah #define F_CPU yang menjelaskan clock microcontroller yang digunakan. Berdasarkan skematik rangkaian dapat dilihat jika microcontroller attiny2313 yang dipakai tanpa menggunakan xtal sehingga dapat dikatakan memakai internal clock (Calibrated RC Oscillator). Secara default ketika ic attiny2313 keluar dari pabrik memiliki clock internal 8MHz dengan pembagian CLKDIV8=ON yang berarti clock dibagi 8 sehingga menghasilkan angka 1MHz. Untuk melihat clock yang dipakai dapat dilihat pada pembacaan fusebit, dapat dilakukan melalui menu programming pada AVRSTUDIO.

  
Image Hosted by PicturePush - Photo Sharing


Selanjutnya didalam header dituliskan beberapa include yang berguna dalam script love hurt seperti definisi kaki micro (io.h) ,delay.h sebagai pengatur delay waktu, pgmspace.h sebagai trick memanfaatkan flash memory sebagai static ram, string.h sebagai pengolah data berupa string dan eeprom.h yang memudahkan penulisan script untuk akses eeprom (memory non-volatile / tidak hilang saat micro tanpa power) .


DEFINISI VARIABEL , RAM & EEPROM


//Progmem simpannya di FLASH memory

const char love1[] PROGMEM =
{
0b0011110,
0b0100001,
0b1000010,
0b0100001,
0b0011110

};

const char love2[] PROGMEM =
{
0b0001100,
0b0010010,
0b0100100,
0b0010010,
0b0001100

};

const char L[] PROGMEM ={0x7f, 0x7f, 0x40, 0x40, 0x20};
const char O[] PROGMEM ={0x3e, 0x7f, 0x41, 0x41, 0x3e};
const char V[] PROGMEM ={0x3f, 0x7e, 0x40, 0x20, 0x1f};
const char E[] PROGMEM ={0x7f, 0x7f, 0x49, 0x49, 0x41};
const char H[] PROGMEM ={0x7f, 0x7f, 0x08, 0x08, 0x7f};
const char U[] PROGMEM ={0x3f, 0x7f, 0x40, 0x40, 0x3f};
const char R[] PROGMEM ={0x7f, 0x7f, 0x11, 0x29, 0x46};
const char T[] PROGMEM ={0x03, 0x03, 0x7f, 0x03, 0x02};

const char creature[]={0x4e, 0x31, 0x35, 0x31, 0x4e}; //simpan di memory/RAM aja

uint8_t EEMEM tengkorak[5]= {0x1e, 0x75, 0x61, 0x75, 0x1e}; //simpan di EEPROM

uint8_t EEMEM pacman[5]= {0x26, 0x67, 0x67, 0x7f, 0x3e}; //simpan di EEPROM


char dotnya[5],scrolnya[7];



Untuk mengetahui angka hexa yang terdapat dalam array ada lebih baiknya terlebih dahulu membuka software generator dot matrix yang dapat dilihat disini.

Pada penulisan array diatas ada 3 type yang dipergunakan yaitu RAM, PROGMEM dan EEMEM. Kenapa mesti seperti ini ya karena dikarenakan attiny2313 yang memiliki kapasitas RAM yang super irit yaitu 128byte saja, sehingga untuk menambah memory maka kita manfaatkan memory flash (program) yang cukup lumayan 2048byte atau 2Kbyte (ini aja masih kecil banget). Untuk memanfaatkan flash diperlukan inisialisasi tambahan berupa PROGMEM dan tidak bisa dipakai langsung seperti halnya jika ditempatkan pada RAM umum, harus ada proses memindahkan flash PROGMEM menuju memory RAM. Tentunya tidak semuanya tapi yang akan diolah saja yang dipindahkan. Pada inisialisasi variabel array diatas terdapat 2 buah array RAM yaitu dotnya[5] dan scrolnya[7] yang akan ditimpa dengan isi PROGMEM jika dibutuhkan.

Pada project lovehurt diperlihatkan juga cara mengakses memory EEPROM dengan inisialisai berupa EEMEM. Tujuan menggunakan memory EEPROM adalah sifatnya yang tidak terhapus jika baterai atau power dimatikan (non-volatile memory)


BAGIAN MENULIS KE LED MATRIX

void tulis(uint8_t lama)
{
  uint8_t a,b;

for(a=0 ; a<lama ; a++)
   {
   for(b=0 ; b<5 ; b++)     
  {
         PORTB = ~(1<<b) ;
         PORTD = dotnya[b];
                _delay_ms(2);
  }

   }
}


void geser(uint8_t lama)
{
  uint8_t a,b;
   for(a=0 ; a<11 ; a++)     
    {
    if( a<6) 
      { 
                for(b=0 ; b<(5-a) ; b++)  dotnya[b]=0x80;
                for(b=(5-a); b<5 ;b++) dotnya[b]=scrolnya[b-5+a];
     
                tulis(10);
        }
    else if (a==6) tulis(lama);

    else 
       {        for(b=0 ; b<11-a ; b++) dotnya[b]=scrolnya[a-5+b];
                for(b=(11-a); b<11 ;b++) dotnya[b]=0x80;  
      
                tulis(10);
       }     
     }  
}

void naik (uint8_t lama)

{ uint8_t q,step=0;
  
  
  while(step!=16)
   {
 if( step <8)
    {   
                for(q=0 ; q < 5 ; q++) dotnya[q] = scrolnya[q] << (7 - step) ; 

                tulis(10);
           } 
   
        else if (step == 8)
           {    
             tulis(lama); 
    
           }      
 else 
    {   
              for(q=0 ; q < 5 ; q++)  dotnya[q] = scrolnya[q] >> (step - 7) ;  
          
              tulis(10);
     } 
        step++; 
   }    
}

}

Nah inilah bagian utama dari penggerak tulisan geser kiri atau naik. Perhatikan pertama bagian function tulis dimana terdapat isian variabel lama yang berarti lama looping dieksekusi yang akan menentukan lama tulisan ditampilkan. Begitu pula jika ingin menggeser maka variabel lama perlu dimasukkan untuk menentukan lama nya teks diam setelah digeser.

Bagaimana sih cara menghidupkan dotmatrix ? sebaiknya baca penjelasannya disini . Jadi pada intinya nilai hexa yang diinisialisaikan pada array diawal berjumlah 5 buah array. Sedangkan bit yang digunakan adalah 7 bit karena memang dot matrix yang dgunakan bertype 5x7 (5 kolom  x 7 baris) . Perhatikan loop berikut :


 for(b=0 ; b<5 ; b++)
{
PORTB = ~(1<<b) ;
PORTD = dotnya[b];
                 _delay_ms(2);
}


Skematik menunjukkan bahwa kolom di kontrol oleh port B0 - B4 dan baris dikontrol oleh port D0 - D6. Loop diatas menunjukkan proses geser kolom (scanning) dengan perintah PORTB = ~(1<<b)  yang artinya angka 1(biner) digeser ke sebelah kiri  sebanyak dari nilai b kemudian dinegasi .  Variabel b mengontrol pergeseran berdasarkan loop. Jika kolom dot matrix '0' akan menyebabkan LED pada baris yang mendapat bit '1' menyala. Hal ini dapat dikatakan kolom aktif LOW dan baris aktif HIGH. Urutan loop dari scanning pada PORTB seperti berikut (11110) , (11101) ,(11011) ,(10111) ,(01111).

Ingat penjelasan terdahulu bahwa array yang ada pada flash (PROGMEM) atau EEPROM harus dipindahkan kedalam array memori RAM  dotnya[b]. Sekali lagi variabel b berperan dalam menentukan array baris yang sesuai dengan kolom yang sedang aktif atau mendapat scanning "LOW" (0).

Untuk proses geser ke kiri dan geser keatas ada sebuah variabel yaitu step yang berfungsi sebagai penanda posisi pergeseran yang sedang tampil sehingga text yang tampil pada dot matrix memiliki efek bergeser. Selebihnya yang diperlukan hanya proses kreatif mengeser-geser bit dari baris berdasarkan loop yang sedang berjalan dan dipindahkan ke array scrolnya[ ].


MAIN PROGRAM



int main(void)
{
 DDRD = 0b1111111; // untuk baris
 DDRB = 0b11111;  // untuk kolom

 PORTD =0; // Set all pins low
 PORTB =0b11111; //matikan layar
    
    
 
 
 while(1)
 {
    // yang ini nulis langsung 
  
     strncpy_P(dotnya,love2,5);
     tulis(20);
     strncpy_P(dotnya,love1,5);
     tulis(40);
     strncpy_P(dotnya,love2,5);
     tulis(20);
     strncpy_P(dotnya,love1,5);
     tulis(40);
     strncpy_P(dotnya,love2,5);
     tulis(20);
     strncpy_P(dotnya,love1,5);
     tulis(40);     

//yang ini pake function geser 

     strncpy_P(scrolnya,L,5);
     geser(50);
     strncpy_P(scrolnya,O,5);
     geser(50);
     strncpy_P(scrolnya,V,5);
     geser(50);
     strncpy_P(scrolnya,E,5);
     geser(50);
     strncpy_P(scrolnya,H,5);
     geser(50);
     strncpy_P(scrolnya,U,5);
     geser(50);
     strncpy_P(scrolnya,R,5);
     geser(50); 
     strncpy_P(scrolnya,T,5);
     geser(50); 

//geser ambil dari RAM
 
     strncpy(scrolnya,creature,5);  //tanpa _P karena ambil di RAM
     naik(50); 
 
//ambil dari eeprom ..mengirit..

     eeprom_read_block((void*)&scrolnya,(const void*)&tengkorak, 5); 
     naik(50);

     eeprom_read_block((void*)&scrolnya,(const void*)&pacman, 5); 
     geser(50);

   }
 
 return 0;
}



Pada bagian awal dari function main( ) terdapat inisialisai port dari attiny yang digunakan yaitu PORTB dan PORTD yang kesemuanya diberi bit 1 yang artinya port tersebut dipakai sebagai port output.

Script yang digunakan untuk memindahkan memory flash (PROGMEM) menuju RAM adalah  operasi string strncpy_P, ingat array dari char (8byte) dapat dianggap sebagai string,   seperti contoh  strncpy_P(dotnya,love2,5)  yang artinya isi dari array dotnya[ ] diisi dengan array dari array PROGMEM love2. Jika diambil dari RAM langsung maka operasi copy ini menggunakan strncpy( ) tanpa _P.

Untuk pemindahan isi dari EEPROM menuju RAM menggunakan syntax eeprom_read_block ( *pointer_ram_tujuan, *posisi_memori_eeprom, jumlah blok ), seperti contoh  eeprom_read_block((void*)&scrolnya,(const void*)&tengkorak, 5). Jangan dipusingkan dengan void dan * (pointer) karena itu hanya atribut yang menyatakan type data diabaikan.


MUDAH BUKAN ? jika ada pertanyaan atau request script break down yang lain akan saya bahas dengan senang hati.


SELAMAT TAHUN BARU 2013 KAWAN



Share:

Senin, 31 Desember 2012

[Part 3] Belajar dasar bahasa GCC - Kondisi Percabangan dan Pengulangan


Setiap bahasa pemrograman memiliki suatu proses yang dinamakan "conditonal statement". Yang dimaksud sebagai contional statement adalah percabangan dimana terdapat beberapa pilihan jalannya program sesuai dengan kondisi yang terjadi.
















Sementara itu pengulangan atau looping adalah proses pengulangan dari suatu perintah dimana bisa diberikan sebuah atau lebih kondisi yang menyebabkan pengulangan atau looping akan berhenti. Secara flowchart dapat digambarkan seperti berikut:

for.gif (383×402)


Kondisi Percabangan


Dalam bahasa C terdapat beberapa kondisi percabangan yang sering kita temui. Kita akan bahas satu persatu dengan contoh-contoh yang sering dipakai pada project di blog ini.

IF



if(kondisi == 1)
{
  //script 1

}

else if(kondisi == 3 || kondisi == 4)
{
  //script 2

}
 else if(kondisi <= 10 && kondisi >5)
{
   //script 3

}

else
 {   

 //script kondisi terakhir

}



Ada yang perlu diperhatikan pada percabangan yaitu selalu ada kondisi pembanding. Kondisi pembanding yang terdapat pada bahasa C adalah:


Pembanding sederhana:

==         Sama dengan

!=         Tidak sama dengan

<           Kurang dari

>           Lebih besar dari

<=         Kurang dari atau sama dengan

>=         Lebih besar dari atau sama dengan


Pembanding logika :

Hal ini dapat menggabungkan pembanding untuk mendapatkan logika yang lebih kompleks

&&         Dan (and)

||             Atau (or)



secara umum proses pencabangan IF .. ELSE  atau   IF .... ELSE IF ....ELSE membandingkan satu kondisi dengan kondisi yang lain , dan dapat juga menggabungkannya dengan tambahan pembanding logika. Untuk pencabangan IF .... ELSE IF ...dst .. yang terdiri dari banyak kondisi ELSE IF maka pencabangan akan menjalankan perintah pada kondisi yang benar kemudian mengabaikan yang lainnya. Perlu diingat jika eksekusi dari pencabangan mengikuti urutan atas ke bawah sehingga penempatan dari statement kondisi sangat penting.


SWITCH

Pola pencabangan yang lain adalah metode switch case seperti pada contoh berikut :


ISR(USART_RX_vect)

{ 

 char databyte;

 databyte = UDR; 



     switch (databyte)       

  {
     

    case 0xD : {  

             kirim_text(menu) ;

              break; }

    case '1' : {  

                     PORTB ^=(1<<0);

                     break; }

    case '2' : {

            
             PORTB ^=(1<<1);


                break; }

    default :{   
              PORTB |=(1<<1);
              break;}
  }  

}

Ketika mendefinisikan ekspresi kondisi yang hasilnya akan mengarah pada pelaksanaan program yang spesifik dan umumnya berjumlah banyak maka dapat menggunakan "switch".  Hasil yang berbeda tercantum dalam tiap tubuh "case" dari pernyataan switch dan setiap case memiliki eksekusi sendiri. Tubuh pernyataan switch dibatasi dari pembukaan ke penutupan kurung  kurawal: "{"   "}" dan jika memerlukan eksekusi tunggal maka diberikan perintah terminasi "break".  Sintaks dari kondisi switch seperti berikut :


switch(Expression)
{
    case Choice1:
        Statement1;
    case Choice2:
        Statement2;
    case Choice-n:
        Statement-n;
}






PENGULANGAN / LOOPING 


Pengulangan membantu program untuk menghemat penulisan pada urutan syntaxnya dengan memberikan kondisi keluar tertentu. Loop yang paling dasar adalah for(;;), yang memiliki 3 buah isian didalamnya berupa "kondisi awal" ; "kondisi keluar" ; "proses update" ; . Jika for tanpa isian seperti contoh for ( ; ; ) maka akan menciptakan looping tidak berhingga yang tak akan pernah selesai.


void proses (void) 

{
int a;


for(a=0; a < 10 ; a++) 
   {
      PORTB = a;
      PORTC = (10 - a) ;
   }

}


script diatas memiliki penjelasan bahwa nilia a berawal pada angka 0, akan diulang terus bila nilai a lebih kecil dari 10  sedangkan kondisi update nilai a ditambah 1 tiap pengulangan. Jadi nilai a bermula dari 0 diteruskan menuju 1,2,3,4,5,6,7,8,9  kemudian pada saat nilai a mencapai nilai 10 maka loop akan  selesai.


Jenis looping yang lain memiliki pola yang sama yaitu while(condition) {  }  dan do { } while(condition). Kondisi keluar dari loop ditentukan pada awal atau akhir namun memiliki pola yang sama yaitu kondisi awal dan akhir harus dirubah berdasarkan pengulangan atau kondisi luar ,seperti contoh berikut :




int a;
a=0;
while(a < 10)
{
  PORTB=a;
  PORTC=(10-a);

   a++;
}
a=0;


do
{
PORTB=a;
a++;
}
while(a <10)


while(bit_is_set(PIND, PIND3) )
{

PORTB|=_BV(PB3);
 
}


Ingat jika kondisi dari variabel harus di inisialisasikan terlebih dahulu sehingga tidak menimbulkan kesalahan dan warning saat dicompile. Contoh yang terakhir menunjukkan bahwa kondisi looping akan berhenti jika ada perubahan nilai dari luar , dalam hal ini nilai logika biner dari port microcontroller PIND3 .


SELAMAT BELAJAR


Share:

Minggu, 30 Desember 2012

[Part 2] Belajar dasar bahasa GCC - Function & Array

png00002.png (1329×937)
Bagian kedua dari tutorial akan membahas susunan scipt GCC yang digunakan sebagai bahasa pemrogramman microcontroller. Setelah sebelumnya kita membahas bagia header, maka sekarang kita bahas mengenai "function". Dalam bahasa C  semua kode dieksekusi berada dalam suatu function. Function adalah sebuah blok yang mempunyai nama  yang melakukan tugas dan kemudian akan mengembalikan kontrol ke pemanggil. Perhatikan bahwa bahasa pemrograman lain mungkin membedakan antara "function", "subroutine", "subprogram", "procedure", atau "metode" -  sedangkan dalam C hal ini semuanya sama dan bernama function.  Array dalam Bahasa C  dapat didefinisikan sebagai jumlah lokasi memori, yang masing-masing dapat menyimpan tipe data yang sama dan yang bisa menjadi referensi melalui nama variabel yang sama.


FUNCTION

Sebuah function sering dieksekusi (dipanggil) beberapa kali, dari beberapa tempat yang berbeda, selama eksekusi dari sebuah program. Setelah menyelesaikan subrutin, program ini akan bercabang dan kembali ke titik setelah dimana function ini dipanggil. Function adalah alat pemrograman yang kuat yang merupakan salah satu kelebihan bahasa C.


Secara umum pada pemrograman microcontroller berbasis GCC - Winavr, pola function paling utama adalah seperti berikut:


int main(void)

{  
  uint8_t a;
  DDRA  |= (1<<PA6)|(1<<PA7); //port yg digunakan PA6 & PA7  
  a=100;
  while(1)

   {    
    
  a=200;
    }
   
   return 0;

  }


function yang bernama main() merupakan function utama dimana awal dari program microcontroller dimulai. Function ini sebaiknya diberikan tipe data yang akan di kembalikan (return) karena beberapa compiler menanggap semua function itu sama. Jika tidak diberi type maka di depan main diberikan tanda void. Trus kenapa di dalam kurung terdapat void juga ? perhatikan jenis function berikut ini.




void coba_fungsi_1(void)

{  DDRA  |= (1<<PA6)|(1<<PA7);
//isi fungsi bebas ................
}


 int coba_fungsi_2(int var_a,  int var_b  ) 
 {
int var_c;
 
var_c = var_a + var_b ;
   
return (var_c);
   
  }
  
function yang berisikan kata-kata void berarti bahwa type dan variabel dari function tidak digunakan. Bandingkan dengan contoh function yang ke dua yang bertype integer dengan 2 buah variabel didalam kurung, yang jika dipanggil menggunakan perintah seperti berikut :


int main(void)

{  

int output;

 //panggil function1

    coba_fungsi_1();

  //panggil function2

   output = coba_fungsi_2(5, 3);


 // nilai dari variabel output =  8


  }



ARRAY

Array adalah penamaan kolektif yang diberikan kepada sekelompok data pada memory dalam jumlah yang sama. Jumlah yang sama ini contohnya bisa berupa nilai dari 100 siswa, jumlah kursi di rumah, atau gaji dari 300 karyawan atau usia dari 25 orang siswa. Jadi array adalah kumpulan elemen yang sama. Biasanya array dari banyak karakter disebut sebagai "string" array. Semua elemen dari setiap array yang diberikan harus dari jenis yang sama semisal kita tidak bisa memiliki sebuah array dari 10 buah nomor , yang 5 bertipe integer dan 5 sisanya bertipe uint8_t.

Contoh array yang sering dipakai dalam project-project di blog ini adalah array untuk data teks pada project led matrix "love hurt".



const char love[5]  =

{

0b0011110,

0b0100001,

0b1000010,

0b0100001,

0b0011110



};


const char L[5]  ={0x7f, 0x7f, 0x40, 0x40, 0x20}; 

const char O[5] ={0x3e, 0x7f, 0x41, 0x41, 0x3e};


char isinya[5],hasilnya[10];


const char creature[]={0x4e, 0x31, 0x35, 0x31, 0x4e}; 

uint8_t EEMEM tengkorak[5]= {0x1e, 0x75, 0x61, 0x75, 0x1e}; 




Dapat dilihat bahwa array memiliki nilai yang dapat di inisialkan terlebih dahulu atau nilainya kosong. Besar dari data yang dipesan untuk array sebaiknya di tentukan namun jika datanya seragam dapat juga dikosongkan. Array ini dapat kemudian dipindahkan ke dalam variabel lain ataupun di ubah nilainya.




int main(void)

{


  
//memindahkan data dari data yang sudah ada ke memory lain
 isinya[0]=creature[0]
 isinya[1]=creature[1];   
 isinya[2]=creature[2];
 isinya[3]=creature[3];   
 isinya[4]=creature[4];


//merubah data dari array secara sengaja

love[4]=0b0001100;

 
}





Jadi perlu diperhatikan ukuran dan jenis dari array yang akan dipindah-pindah haruslah sesuai.


nantikan pembahasan part#3  yang lebih seru pada lain waktu


Share:

Sabtu, 29 Desember 2012

[Part 1] Belajar dasar bahasa GCC - bahasa untuk programming Microcontroller

meditate.jpg (1280×1112)

Gnu Compiler Collection merupakan sebuah project compiler berbasis open source untuk beberapa bahasa pemrograman. Karena sifatnya yang "terbuka" inilah membuat pengembang bahasa pemrograman untuk microcontroller memilih bahasa C yang digabungkan dalam environment GCC, sebagai bahasa pemrogramman pada beberapa compiler seperti WINAVR atau TOOLCHAIN.

Kali ini akan kita bahas GCC yang digunakan paling umum untuk menyusun script dari pemrogramman AVR yang digunakan umum pada AVR STUDIO yatu WINAVR. Atmel sebagai produsen microcontroller AVR memiliki beberapa kerjasama dengan bahasa pemrograman lain seperti IAR akan tetapi banyak juga yang memilih versi gratisnya dengan menginstall plugin WINAVR. Pola pemrograman dari winavr umumnya seperti berikut :


HEADER


#define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/interrupt.h>
#include "coba.h"

uint8_t jam,menit,detik,show;

#define hidup PORTB|=_BV(PB3)



Pada  bagian header ini dinyatakan beberapa syntax yang berhubungan dengan pre-processor (#define),  variabel global serta  "include" yang merupakan rujukan compiler untuk menyertakan file-file eksternal. mari kita bahas satu persatu.


#define nama kondisi

Setelah #define terdapat  dua buah kalimat yang dipisahkan dengan spasi. Kalimat sebelah kiri merupakan rujukan sedangkan sebelah kanan merupakan proses yang dilakukan. Seperti contoh diatas maka dapat diartikan bahwa setiap syntax yang ditulis sebagai "nama" akan berubah menjadi "kondisi", contoh lain #define F_CPU 4000000UL berarti setiap syntax pada script yang berisikan "F_CPU" maka akan digantikan dengan "4000000UL" .

Jika ditulis seperti ini #define hidup PORTB|=_BV(PB3) maka setiap kita menulis  " hidup; " pada syntax maka akan terjadi kejadian pada port B3 akan menjadi "high" atau kalau dikasi LED akan menyala. Kenapa? karena syntax hidup telah diartikan sebagai syntax PORTB|=_BV(PB3) yang merupakan syntax untuk menghidupkan port B3.

Berguna banget apabila kita menggunakan perulangan "kondisi" yang banyak sehingga menyingkat dalam penulisan dan mempermudah proses tracing atau debuging error(kesalahan) syntax serta jalannya dari program yang diinginkan.


#include "nama.file"

Bagian ini untuk melakukan penyertaan compiling kepada file-file external. Contoh yang paling gampang adalah #include <avr/io.h> dimana compiler akan menyertakan directory pada instalasi WINAVR pada folder "include/avr" . File io.h merupakan file yang berisikan definisi port input output yang disesuaikan dengan jenis IC microcontroller yang digunakan. Include yang lain juga sangat berguna dan disesuaikan dengan kebutuhan, contohnya delay.h yang berhubungan dengan delay, interrupt.h yang berhubungan dengan interupt, string.h yang berhubungan dengan operasi string dan lain sebagainya. Untuk itu dapat dibaca pada website WINAVR di : http://winavr.sourceforge.net.

Untuk file include yang menggunakan tanda petik merupakan penyertaan file lokal yang diletakkan di folder atau direktori yang sama dengan direktori project


int variabel;

Untuk menyimpan suatu nilai pada memory maka diperlukan pemesanan lokasi variabel terlebih dahulu. GCC memiliki cara dinamis untuk menempatkan memory sehingga memudahkan dalam penyusunan. Variabel ini tentunya harus diberitahukan jenisnya sehingga dapat dipesankan sesuai kebutuhan. Contoh dari type variabel yang sering digunakan adalah seperti berikut :

- unsigned : menyatakan kalau type variabel berupa 8 bit sehingga nilainya antara 0-255, sama seperti char
- int : integer, merupakan memory 16 bit memiliki nilai antara -32768 sampai + 32767

ada beberapa type integer yang dapat diambil dengan menggunakan #include <inttypes.h>

- uint8_t  : 8 bit
- uint16_t: 16 bit
- uint32_t: 32 bit

sebagai contoh kita akan menyompan data karakter huruf, cukup dengan menggunakan unsigned char atau char saja karena karakter ascii merupakan data dengan lebar 8 bit. Sedangkan untuk perhitungan timer 16 bit maka sebaiknya menggunakan uint16_t yang memiliki lebar data 16 bit dan selalu bernilai positif.



bersambung di part#2
Share:

Senin, 26 November 2012

JOULE THIEF : Menghidupkan LED dengan 1 Baterai 1,5V



Ga mungkin ahh ? kan LED biasanya hidup dengan 2 baterai 1,5v  ..


Jangan bingung...rangkai saja seperti gambar skematik berikut



Bahan- bahan mudah didapat, kumparan di peroleh dari bekas lampu hemat energi atau bekas power supply komputer. Kumparan sebelah kanan jumlah lilitannya banyak, sedangkan kumparan sebelah kiri lilitannya kecil. Jadi cara simple nya adalah melilitkan kawat enamel atau kabel tipis diantara lilitan bekas kanibal. Ingat lilitan sebaiknya memiliki inti ferit/ toroida didalamnya. Komponen lainnya cukup mudah didapat, transistor yang digunakan merupakan transistor NPN yang umum dan (BC 327 , 2N2222 dsb)


SELAMAT MENCOBA
Share:

Minggu, 10 Juni 2012

Operasi geser Byte pada Win-AVR GCC untuk AVR microcontroller

Byte, bit, mega byte, giga byte ...itu hanya susunan 101010101010 loooo..
ah..cuma 2 angka ...eitt..jangan sepelekan...ini adalah penemuan paling brilian abad ke 20 yg memungkinkan kita bermain game , PC, internet blaa..blaaa....tanpa berlama-lama langsung kita goyang teory & operasi byte pada microcontroller dan bahasa C (win Avr)


"ingat , Micro AVR itu 8 bit ! , jadi semua data berpola 00000000-11111111" 


Kita akan mengambil contoh AVR yg paling sering digunakan pada blog ini yaitu ATTINY 2313
attiny2313dip.jpg (877×525)

ukuran memory FLASH (program) adalah 2kbyte (2048 byte), RAM 128 Byte dan EEPROM 128 byte juga.
Port input/output berjumlah 18 (Max) dengan register I/O A, B  dan D (paling umum digunakan register I/O B & D)IO port B berjumlah 8 (PB0-PB7) dan D berjumlah 7(PD0-PB6)  sedangkan portA jarang digunakan karena berhubungan dengan xtal dan reset.

attiny2313isp.jpg (530×291)


Operasi byte berguna saat melakukan perubahan register, memory dan juga input output. Semisal kita ingin melakukan setting PORT D menjadi output semua, maka kita tuliskan di listing seperti ini :

DDRD=0b1111111;
atau
DDRD=0x7F;
atau
DDRD=127;


begimana kalo ingin membuat port D0 input, port D2 output port D6 output ...gampang ...kita bikin aja seperti ini :

DDRD=0b1000010;

tapi tiba-tiba ditengah tengah program, ada pin yg ingin kita ubah menjadi fungsi yg berbeda tanpa menghiraukan bit yg lainnya? sebenernya bisa aja kita pake cara yg tadi...tapi percaya deh, cara ini lebih gampang dan akan berguna suatu saat nanti

semisal....kita ingin hanya memperhatikan port D3 sebagai output , yg laen gua ga peduli ...begini caranya: 

GESER YUKKK....

kita memanfaatkan angka 1 dimana 1 secara biner juga dipanggil 0b0000001. Jika kita ingin merubah port D3 sebagai output maka kita perlu menuliskan :

DDRD=0b0001000; 

hubungan antara 0b0000001 dan 0b0001000  adalah bergesernya bit 1 dari paling kanan ke 3 posisi disebelah kiri. Secara aritmetika binner dan bahasa C , operasi ini dapat dipanggil dengan :

 (1<<3)

artinya angka 1 digeser 3 kali ke kiri...dapet deh.. trus gimana jika kita ingin mengubah jadi input..ya sama aja kita geser aja nilai 0 ke kiri 3 kali (0 <<3) , tapi cara ini tidak elegan menurut para programmer. 

nah ... operasi diatas hanya bisa dilakukan jika nilai yg laennya 0 dan dilakukan di awal inisialisasi program, jika dilakukan ditengah2, kita perlu melakukan operasi laen yaitu operasi exclusive or (XOR) dan negasi AND. Cara ini efektif jika kita ingin merubah suatu register di posisi selaen awal program (semisal berubah ditengah2)

semisal kita pengen ngidupin led di port 4 dan 6  aja, tanpa menghiraukan port laen, kita tulis seperti ini :       

PORTD |=(1<<4) | (1<<6); 


sedangkan jika kita ingin mematikan LED di port 2 & port 5 maka yg kita tulis seperti ini (cara ini yg disarakan):

PORTD &=~(1<<2) & ~(1<<3); 


nah...hal ini berfungsi banget jika inisialisai register2 yg rumit didalam AVR, seperti contoh inisialisai timer berikut :


   TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
   TIMSK |= (1 << OCIE1A); // Enable CTC interrupt 
   OCR1A  = 62499; //compare the CTC A 1 sec
   TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64


jadi kita tidak pusing-pusing lagi menyusun bit satu persatu, hanya perlu mencari nama register yg perlu di on / off ( 1/ 0)   kan ...beress dahhh...simple bukan ?


SELAMAT MENCOBA

Share:

Minggu, 25 September 2011

Langkah Awal Instalasi DT-HIQ USB AVR ke PC

"Gimana nehh....kok ga detect apa-apa pas dicolokin ? "

SMS seperti ini sering meluncur dari pembeli paket belajar microcontroller dasar sesaat setelah paketnya datang. Kesalah-pahaman seperti ini muncul karena alat tidak mengambil power supply dari port USB melainkan mengambil tegangan dari rangkaian target atau bisa juga hanya menancapkan baterai/tegangan 3 - 5 v ke header pin 2 (+) dan pin 4 (-).




Jika USB-ISP mendapatkan tegangan dari rangkaian atau dari baterai, maka PC akan mendetect hardware baru



Pilih “Locate and Instal driver software” dan arahkan instalasi driver ke DVD installer yg didapat di paketan programmer USB-ISP





Ikuti langkah-langkah sampai USB-ISP terdeteksi oleh PC dan mendapatkan COM PORT tertentu
Dikarenakan software AVR STUDIO hanya mendeteksi port COM terbatas (sampai COM9) maka perlu dilakukan perubahan COM PORT secara manual pada control panel è device manager seperti gambar berikut:


(klik untuk memperbesar)

Klik kanan pada USB ISP Device, kemudian pilih properties, Port setting, Advance dan kemudian pilih com port antara 4-9 ( 1-3 biasanya digunakan oleh PC/Laptop). Jika terdapat keterangan (IN-USE) tidak menjadi masalah asal perangkat yg memiliki com port yg sama sedang tidak terpasang.
Share:

Senin, 08 Agustus 2011

PEMANCAR RADIO FM 1 TRANSISTOR

Kali ini kita selingkuh ke Analog dulu yuk , kita bikin Pemancar radio FM paling sederhana. Di inspirasi dari pertanyaan seorang anak SMA yg gagal meniru skematik pemancar FM di sebuah blog, kemudian dia meminta bantuanku untuk memperbaiki. Hasil googling dapet video youtube yg menuntunku menuju website jepang http://anarchy.translocal.jp/radio/micro/

Di salah satu bagian web jadulnya ada petunjuk membuat radio FM sederhana.
Gambar skematik seperti ini :



klik disini untuk gambar skematik lebih jelas

nah..ternyata ketika ku cek di kotak komponen punyaku ada beberapa yg cocok dan yang lainnya aku bikin dengan pendekatan nilai komponen dengan menggabungkan komponen2 berbeda



dari skematik di web asli, aku lakukan beberapa penyesuaian :

- R 27 Kohm aku buat dari gabungan R 10K + R 12 K , jadi nilainya mendekati
- Kapasitor 10pF aku buat dari seri 2 kasitor 22pF, jadi nilai sekitar 11pF
- Transistor yg kupakai transistor NPN umum 2N3904, ga bagus sebenernya respon frekuensi tinggi, tapi ga masalah
- Lilitan / Kumparan dibuat dari kabel jumper atau wrap kabel yang biasanya di gunakan untuk menyambung rangkaian di PCB lubang. Lilitan dibuat dengan melilitkan kabel 4-5 loop di obeng kecil, kemudian ujung2nya diluruskan biar gampang disolder. Kumparan ini bisa dibuat dengan kabel email, kabel dinamo tamiya ato kabel balast lampu neon. Ingat ujung kabel dikupas saat menyolder karena ada lapisannya
- Kapasitor trimmer/Varco aku pake yg ukuran 20 - 50 PF , bisa juga tidak dipergunakan tapi akan kesusahan ketika tuning lilitan
- PCB yang aku gunakan PCB lobang, sedangkan aslinya menggunakan PCB polos, sehingga Ground plane yg lebar akan memperkecil interfrensi. Jadi PCB lobang aku kasi groundplane pake timah yg disolder memanjang
- Batere yg dipake 3 buah AA, jadi tegangannya 4.5 V


Setelah berkutat beberapa lama dan ga suskses, akhirnya aku pikir lebih baik menunggu sape lewat tengah malem, biar siaran radio publik pada off, dan akhirnya berhasil mancar di range 90-102 MHZ. Aku gunakan mp3 player sebagai inputan audio

Trick tuning frekuensi sebagai berikut :

- Lilitan diusahakan lebar / kerenggangan seragam, semakin lebar/renggang maka frek semakin tinggi dan sebaliknya, jika versi tanpa varco / trimmer maka penentuan frekuensi menggunakan pengaturan jarak kerenggangan lilitan. Susah bangett...
- Putar2 varco dengan obeng trimmer, jika pake obeng biasa maka akan terpengaruh tangan yg nge-ground, pilih frek yg kosong di radio penerima, putar varco pelan2 sampe suara muncul. biasanya akan terjadi offset ketika obeng dilepas, kira2 frek turun 0.6 - 1 MHz. Contoh, misal frek yg diingini 94MHZ, maka radio dipanteng frek 95Mhz ketika muter2 varco sampe suara muncul
- Antena pemancar dapat dibuat dari kabel tunggal


dari hasil pemantauan siaran dapat diterima sampe jarak 15 meter (LOS / tanpa halangan)


Kalo agan beruntung , bisa ngerjain orang serumah lho ! TV nya bisa masuk suara dari pemancar nya...seru kan ?

SELAMAT MENCOBA!


Share:

Rabu, 03 Agustus 2011

DOT MATRIX


Pada dasarnya DOT matrix adalah Display LED yg disusun sedemikian rupa sehingga untuk menghidupkan led ke (x,x) dibutuhkan kombinasi tegangan antara Pin baris & kolom








Penanda kaki nomer satu adalah tulisan marking, paling kiri no 1....paling kanan no 7
Menyebrang ke kanan atas no 8 sampai ke kiri atas itu nomer 14

Beberapa kaki memang tidak dipakai jadi dibarkan tidak terhubung



Kemudian untuk mempermudah kontrol dan menghemat pin maka diperlukan proses scanning ( biasanya kolom...) sedangkan pada baris diberikan bit sesuai huruf/karakter yang akan ditampilkan yang bersesuaian dengan posisi scanning.

Scanning untuk kolom dimaksud memberikan "1" high ( untuk common katoda) atau"0" untuk common anoda , untuk kolom lainnya diberi nilai negasi dari kolom yg diberi nilai 1 tadi .....begitu selanjutnya untuk kolom berikutnya sampai kolom terakhir dari rangkaian led matrix..dan berulang dari depan lagi. Proses ini dilakukan sangat cepat sehingga mata kita melihatnya tetap sebagai suatu karakter yg diam.

misalnya ingin menampilkan huruf A , secara umum digambarkan sebagai berikut:


0000000
0000000
0000000
0000000
0000000
0000000
0000000


dari gambar diatas logikanya seperti ini :

- saat kolom pertama ( scan kolom 1 = 1 / high/2.4 v) maka bit yg diberi pada baris berupa "1110000", sehingga jika ketemu 1 vs 1 ga ada arus mengalir, jadi LED mati, jika 1 ketemu 0 maka arus mengalir, led menyala

- begitu juga untuk kolom kedua, ketika kolom kedua diberi tegangan maka pada baris bit yg diberikan adalah "1101011"

- Dan seterusnya, ketika kolom nya mencapai ujung maka akan diulang ke kolom 1 lagi

- Untuk melakukan scanning biasanya dilakukan dengan memanfaatkan shift register, atau paling sederhana dengan menggunakan IC 4017 yang di cascade menjadi led berjalan yang panjang. (buka di sini )




Share:

Senin, 01 Agustus 2011

BASIC OUTPUT & INPUT dengan ATTINY 2313

Siapkan bahan2 sesuai skematik berikut ini :



dan jangan lupa programmer AVR nya ...

PROJECT 1 LED BLINK

#define F_CPU 1000000UL // frekuensi clock internal
#include <avr/io.h> // definisi standar io port
#include <util/delay.h> // definisi include untuk delay


int main(void)

{



DDRB=0b1 ; // Inisialisasi bahwa port B0 adalah output , jika pake port B5 ya inisialisai jadi DDRB=0b100000;



while(1)

{

PORTB=0b1; //port B0 = 1 atau nyala

_delay_ms(1000); //delay

PORTB=0b0; //port B0 = 0 atau mati

_delay_ms(1000); //delay

}

return 0;




PROJECT 2 LED BLINK

Gunakan 2 LED di port B#0 dan B#5
Kita akan memperkenalkan operasi bit untuk inisialisasi rangkap

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>


int main(void)

{



DDRB |= (1<<PB5)|(1<<PB0) ; // inisialisai menggunakan operasi bit

PORTB |= (1<<PB5) ; // operasi bit PORT B#5 = 1
PORTB &= ~(1<<PB0) ; //operasi bit PORT B#0 =0

while(1)

{

PORTB ^=(1<<PB5) ; // operasi bit toggle atau NEGASI/KEBALIKAN dari posisi bit sebelumnya
PORTB ^=(1<<PB0) ;

_delay_ms(1000);



}

return 0;

}




PROJECT - MEMBACA TOMBOL

kali ini kita akan membaca tombol dan kita gunakan untuk mengatur nyala matinya LED
kita memanfaatkan syntax " if (bit_is_set(PIN#, PIN##)) "

#define F_CPU 1000000UL
#include <avr/io.h>
#include <util/delay.h>

int main(void)

{



DDRB |= (1<<PB5)|(1<<PB0) ; //inisialisasi port B#5 & B#0 sebagai output
DDRB &= ~(1<<PB1) & ~(1<<PB2) ; //inisialisasi port B#1 & B#2 sebagai input

PORTB |= (1<<PB5) | (1<<PB0); //kita SET LED NYALA semuanya

while(1)

{


if (bit_is_set(PINB, PINB1)) // membaca jika port input B#1 di set atau HIGH / 1 ( posisi awal di ground /LOW )
{
PORTB ^=(1<<PB5) ; //TOGGLE LED di PORT B#1
_delay_ms(500);

}

if (bit_is_set(PINB, PINB2)) // membaca jika port input B#2 di set atau HIGH / 1 ( posisi awal di ground /LOW )
{
PORTB ^=(1<<PB0) ; //TOGGLE LED di PORT B#2
_delay_ms(500);

}
}

return 0;

}



Share:

Minggu, 31 Juli 2011

BERKENALAN DENGAN AVR MICROCONTROLLER

avr-chip.jpg (230×191)
Lupakan MC 89S51 karena sudah outdate, walau masih tersedia di pasar
kenapa ??

1. 89c51 memang dasar sekali, tapi untuk fungsi2 yang memerlukan RAM, EEPROM, COUNTER, ADC,PWM dsb dibutuhkan komunikasi ke IC tersendiri

2. AVR merupakan teknologi MC yang langsung memiliki beberapa fungsi sekaligus dalam 1 chip (Harvard architecture) RAM, EEPROM, ADC, PWM COUNTER, UART, SPI, I2C dsb. gabung dalam 1 IC tinggal pilih IC MC yang sesuai dengan kebutuhan

3. Pemrograman secara SPI, bisa mencoba produk 200 rb-an di http://www.innovativeelectronics.com/

4. AVR yang cocok buat belajar :
- ATtiny 2313(15rb) ==> umum, kecil, simple, realible
- ATMega 8515(35rb) ==> jika butuh kapasitas agak besar
- ATMega 8535 (40rb) ==> tambah ADC 8 ch
- ATMEGA128(70rb) ==> jika butuh I/O yang banyak & memori gede

5. Bikin Progam "Hello world" , dengan menyalakan LED berjalan bolak-balik dengan MC AtTiny 2313, menggunakan AVR studio(gratis) & WInAVR(krack) sehingga pemrograman full dalam bahasa C (GCC)

6. Hubungkan PORTD dari attiny2313 dengan LED 8 buah ( tambahkan Resistor 470 ohm tiap led untuk pembatas arus)


#include <avr/io.h>
#include <avr/delay.h>


int main (void)
{
// set PORTD sebagai output
DDRD = 0xFF;
int i ;


while(1) {
for(i = 1; i <= 128; i = i*2)
{
PORTD = i;
_delay_ms(1000);
}
for( i = 128; i > 1; i -= i/2)
{
PORTD = i;
_delay_ms(1000);
}

}
}



Download file "hex" menuju AVR melalui SPI port , alat yg digunakan bisa beragam...googling aja banyak kok yg gampang + murah bahan2nya

Hasilnya :



Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

Mail : ahocool@gmail.com

Site View

Categories

555 (8) 7 segmen (3) adc (4) amplifier (2) analog (19) android (12) antares (8) arduino (26) artikel (11) attiny (3) attiny2313 (19) audio (5) baterai (5) blog (1) bluetooth (1) chatgpt (2) cmos (2) crypto (2) dasar (46) digital (11) dimmer (5) display (3) esp8266 (25) euro2020 (13) gcc (1) iklan (1) infrared (2) Input Output (3) iot (58) jam (7) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (17) komputer (3) komunikasi (1) kontrol (8) lain-lain (8) lcd (2) led (14) led matrix (6) line tracer (1) lm35 (1) lora (7) MATV (1) memory (1) metal detector (4) microcontroller (70) micropython (6) mikrokontroler (1) mikrokontroller (14) mikrotik (5) modbus (9) mqtt (3) ninmedia (5) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (88) pcb (2) power (1) praktek (2) project (33) proyek (1) python (7) radio (26) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (2) sharing (3) signage (1) sinyal (1) sms (6) software (18) solar (1) solusi (1) tachometer (2) technology (1) teknologi (2) telegram (2) telepon (9) televisi (167) television (28) transistor (2) troubleshoot (3) tulisan (93) tutorial (108) tv digital (6) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika