Articles by "Pemograman C"
Tampilkan postingan dengan label Pemograman C. Tampilkan semua postingan


Antarmuka Seven Segment menggunakan Metode Scanning - Seven segmen (7 segmen) adalah komponen elektronika yang merepresentasikan angka numerik. 7 segmen sebenarnya  adalah led yang disusun sedemikian rupa membentuk angka dasar 8, yang bisa diatur segmennya sehingga dapat menampilkan digit 0 sampai 9. Seven segment terdapat 2 jenis, yaitu common anoda dan common katoda. Saat ini orang banyak menggunakan program 7segmen menggunakan metode scanning karena dapat menghemat penggunaan port dan sumber daya pada mikrokontroller. Sehingga mikrokontroller tidak dibebani dengan arus berlebih.  

skematik ekuivalent seven segment


Skematik Program

Skematik rangkaian yang terhubung dengan Mikrokontroller


Pada skematik proteus diatas 7 segment yang digunakan adalah 7 segment common catoda (cc) dan sebuah transistor NPN sebagai driver. artinya untuk menyalakan setiap segmen maka basis transistor yang terhubung ke PORTB.0, PORTB.1, dan PORTB.2 harus diberi logika high. Setelah itu tinggal mengatur segmen mana yang akan dinyalakan sehingga dapat merepresentasikan angka. Setiap digit Seven Segment terhubung pada PORTC. Baca juga : Pemograman LED menggunakan AVR ATmega 

Tabel kebenaran

tabel kebenaran common catode


Tabel dibawah adalah tabel untuk common chatode, bagi yang menggunakan common anode atau common catode dengan konfigurasi yang berbeda silahkan disesuaikan pada listing program dengan mengubah nilainya.


Listing program



Mikroontroller yang digunakan adalah Atmel AVR ATmega 16 dan Software yang digunakan adalah AVR studio 5. bisa juga menggunakan Codevision AVR.  Listing programnya adalah sebagai berikut :


Program Scanning biasa

#include           // Header Standard AVR
#define F_CPU 12000000UL    //  Set clock 12Mhz
#include h   //   Fungsi delay

void main (void)    // Program Utama
{
DDRB=0xff;       // Set PORTB sebagai OUTPUT
DDRC=0xff;      // Set PORTC sebagai OUTPUT
      
       while (1)// Prgram berulangan terus menerus
       {
              PORTB=0x01; // Set PINB.0 = 1, Mengaktifkan Segmen Satuan
              PORTC=0X4F; // Set PORTC = 0x4f, Menampilkan angka 3
              _delay_ms(1); // Tunda 1 Milidetik
              PORTB=0x00; // Mematikan semua segmen
             
              PORTB=0x02; // Set PINB.1 = 1, Mengaktifkan Segmen Puluhan
              PORTC=0X5b; // Set PORTC = 0x5b, Menampilkan angka 2
              _delay_ms(1); // Tunda 1 Milidetik
              PORTB=0x00; // Mematikan semua segmen
             
              PORTB=0x04; // Set PINB.1 = 1, Mengaktifkan Segmen Ratusan
              PORTC=0X508; // Set PORTC = 0x508, Menampilkan angka 1
              _delay_ms(1); // Tunda 1 Milidetik
              PORTB=0x00; // Mematikan semua segmen
       }
      
}


Pada listing Program diatas Kita akan memprogram 3 digit seven segment sehingga dapat menampilkan angka 123. Logika program ini sederhana, hanya dengan menyalakan Segmen satu persatu namun dengan input digit yang berbeda yaitu angka 1,2 dan 3. Proses menyalakan segmen  satu persatu berlangsing sangat cepat (hanya 1 Milidetik). Mata manusia tidak dapat menagkap perubahan seven segmen yang begitu cepat.

Program Scanning Dengan formula

#include           // Header Standard AVR
#define F_CPU 12000000UL    //  Set clock 12Mhz
#include h   //   Fungsi delay

unsigned char angka[0x3f,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f] // Variabel array untuk                                                    //                                                                   angka 0 sampai 9

void main (void)    // Program Utama
{
DDRB=0xff;       // Set PORTB sebagai OUTPUT
DDRC=0xff;      // Set PORTC sebagai OUTPUT
char a;        // membuat Variabel a dengan tipe data Char
int nilai;    // membuat Variabel nilai dengan tipe data integer

nilai=123;   
while (1)// Program berulangan terus menerus
{

       for (a=0; a<6 span="" style="color: maroon;"> a++)  // Perulangan 6 kali
              {
              PORTC=angka[nilai%10];  // Formula Ambil data Satuan  (menampilkan Satuan)
              PORTB=0x01;            //  Mengaktifkan digit satuan
              delay_ms(1);         //   Tunda 1 Milidetik
              PORTB=0x00;          //    matikan Segmen
                    
              PORTC=angka[nilai%10]; // Formula Ambil data Puluhan  (menampilkan Puluhan)
              PORTB=0x02;            //  Mengaktifkan digit puluhan
              delay_ms(1);         //   Tunda 1 Milidetik
              PORTB=0x00;          //    matikan Segmen
                    
              PORTC=angka[nilai%10];  // Formula Ambil data Ratusan (menampilkan Ratusan)
              PORTB=0x04;            //  Mengaktifkan digit ratusan
              delay_ms(1);         //   Tunda 1 Milidetik
              PORTB=0x00;          //    matikan Segmen
                    
              }
       }
      
}

Program diatas lebih mudah dari program pertama karena untuk mengubah tampilan  segment hanya dengan mengubah variabel �Nilai�. Pada Program diatas Nilai di set pada angka 123, sehingga segmen akan menampilkan angka 123. Namun jika nilai diganti angka 400 misalkan, maka digit seven segment akan langsung menyesuaikan.

Penutup

Untuk dapat memprogram sebuah mikrokontroller diperlukan pengetahuan dasar tentang karakteristik komponen elektronika dan dasar pemograman. 2 hal ini adalah �item Wajib� bagi seorang programmer untuk merancang sebuah sistem mikrokontroller.  Selain itu latihan terus menerus juga sangat penting untuk meningkatkan logika program kita. Ingat ! Pemograman itu gampang, Logikanya yang susah !. Dengan banyak latihan maka skill logika program kita akan semakin terasah. Semoga bermanfaat !



Pemograman tombol (switch) ATmega 16 menggunakan bahasa C  - Pada aplikasi mikrokontroller, Tombol sering digunakan sebagi input untuk menjalankan fungsi program lain. Misal tombol a ditekan untuk menyalakan buzzer atau memutar motor DC. Tombol memiliki banyak jenis, namun yang paling sering digunakan pada aplikasi mikrokontroller ATmega 16 adalah push button switch. Partnya pun banyak ditemui dipasaran daengan harga yang sangat murah


Skematik Program

Skematik Switch 

Pada skematik program diatas tombol yang digunakan dihubungkan langsung ke ground, tanpa resistor pull up. Mengapa ? kerena pada dasarnya setiap pinout dari IC ATmega 16 sudah dilengkapi internal Pull up resistor didalamnya. Maka, tinggal diatur dalam program untuk mengaktifkan pull upnya. Saklar push button terhubung pada PORTD, nantinya akan digunakan untung menyalakan LED pada PORTB.

Program tombol terdapat beberapa cara, semua akan dibahas dibawah. Software yang digunakan adalah AVR studio 5. Bisa juga menggunakan Codevision AVR dengan menggunakan sedikit modifikasi pada �penulisan� program, namun logikanya tetap sama.
Tombol yang digunakan adalah push button (push button switch). Prinsipnya sederhana yaitu jika saklar ditekan maka saklar akan terhubung dan jika dilepas maka akan terputus kembali.

Listing program adalah seperti berikut :

Cara 1

#include <avr/io.h>         // header standard AVR
#define F_CPU 12000000UL   //  set clock 12mhz
#include <util/delay.h>   //   delay

void led (void)
{
       while (1)
       {
              PORTB=0x00;          //led nyala
              _delay_ms(1000);    // delay 1S
              PORTB=0xff;        //  LED mati
              _delay_ms(1000);
       }
}
void main (void)
{      DDRB=0xf0;; // set portd.0 - portt.3 = input
       PORTD=0xff; // mengaktifkan Pull up resistor internal
       DDRB=0xff;// set portb = output
       char kondisi;
      
       while (1)
       {
     if (PORTD==0b11111110) kondisi=1; //jika portd.0=0 (sw1 ditekan)                                             // maka kondisi =1
     if ((PORTD==0b11111111) &&(kondisi==1))kondisi=0; led(); 
      // jika saklar dilepas dan kondisi=1,kondisi=0 dan jalankan led()
                    
       }
      
}

CARA 2 (menggunakan lock)

#include <avr/io.h>         // header standard AVR
#define F_CPU 12000000UL   //  set clock 12mhz
#include <util/delay.h>   //   delay

void lock() // sub program LOck
{
       while(PIND==0b11111110){ } // sw 1 ditekan
       while(PIND==0b11111101){ } // sw 2 ditekan
       while(PIND==0b11111011){ } // sw 3 ditekan
       while(PIND==0b11110111){ } // sw 4 ditekan
};

void main (void)
{      DDRD=0xf0;; // set portd.0 - portt.3 = input
       PORTD=0xff; // mengaktifkan Pull up resistor internal
       DDRB=0xff;// set portb = output
       char kondisi;
      
       while (1)
           {
           if(PIND==0b11111110){lock();kondisi=1;}; //jika sw 1 ditekan,                                                  
                          
               while (kondisi==1)
                    
                    {
                     PORTB=0x00;          //led nyala
                     _delay_ms(1000);    // delay 1s
                     PORTB=0xff;        //  LED mati
                     _delay_ms(1000);
                     }
      
}

Cara 3 (bit_is_clear)

#include <avr/io.h>         // header standard AVR
#define F_CPU 12000000UL   //  set clock 12mhz
#include <util/delay.h>   //   delay

void led (void)
{
       while (1)
       {
              PORTB=0x00;          //led nyala
              _delay_ms(1000);    // delay 1S
              PORTB=0xff;        //  LED mati
              _delay_ms(1000);
       }
}


void main (void)
{      DDRD=0xf0;; // set portd.0 - portt.3 = input
       PORTD=0xff; // mengaktifkan Pull up resistor internal
       DDRB=0xff;// set portb = output
       char kondisi;
       while (1)
       {
    if (bit_is_clear(PIND,0)){while (bit_is_clear(PIND,0)) kondisi=0;              led(); } 
       }

}

Ketiga program diatas hanya menggunakan 1 switch sedangkan pada skema ada 4 switch. Tugas anda adalah menjalankan 3 switch lainnya secara bervariasi. Tujuannya adalah mengembangkan logika program sehingga otak semakin terasah dan terbiasa untuk �pusing�. Tetap semangat dan berusaha jangan menyerah.




Pemograman LED ATmega 16 menggunakan  bahasa C � pada artikel kali ini membahas tentang  cara pemograman LED menggunakan ATmega mulai dari LED berkedip, Running LED dan Animasi LED variatif. Skefo, LED (Light emitting dioda) adalah piranti elektronika yang prinsipnya memancarkan cahaya.  

LED banyak digunakan karena efisiensinya yang tinggi alias Intensitas cahayanya yang tinggi namun konsumsi arus yang rendah dibandingkan dengan lampu pijar maupun lampu CFL (compact Flourescent lamp) . 

LED memiliki 2 elekroda yaitu anoda dan katoda. Prinsipnya sederhana, ketika LED diberi bias maju (anoda terhubung dengan VCC dan katoa terhubung ke Ground)  maka LED akan menyala. Pada aplikasi mikrokontroller yang berbasis ATmega 16 LED digunakan sebagai media edukasi dengan visualisasi maupun penerapan pada alat uji.

AVR studio

Untuk aplikasi compiler digunakan aplikasi AVR studio. AVR studio dipilih karena lebih mudah dalam menulis listing program dan menyimpan project, didukung tools yang lengkap,Walaupun ukuran (size) dari avr studio lebih besar dari Codevision AVR. 

Dalam penulisannya AVR studio terdapat sedikit perbedaan, misal pada AVR studio untuk menggunakan delay maka penulisannya adalah �_delay_ms()� sedangkan Codevision AVR dituliskan �delay_ms()� saja. Namun perbedaan ini dapat dengan mudah disesuikan dengan cara penulisan Codevision avr




Skematik LED

Pada skema diatas menggunakan konfigurasi common anoda (anoda yang saling terhubung). Sehingga untuk menyalakan led harus diberi logika 0 atau negatif. Istilah lainnya LED tersebut adalah Aktif Low (aktif ketika diberi logika low). LED terhubung dengan PORTB atmega 16 namun dapat disesuikan pada project masing-masing

Skematik LED


Program Led Berkedip

Listing programnya adalah seperti berikut :

#include <avr/io.h>         // header standard AVR
#define F_CPU 12000000UL   //  set clock 12mhz
#include <util/delay.h>   //   delay

void main (void)
{
      
       DDRB=0xff;// set portb = output
       while (1)  //perulangan terus menerus

       {
        PORTB=0x00;      // LED nyala
        _delay_ms(1000); // delay 1000ms (1 detik)
        PORTB=0xff;
        _delay_ms(1000); // LED mati
       }
      
} // end program

FYI : tanda �//� adalah komentar program, artinya bukan bagian dari tubuh program hanya sebagai keterangan saja. Tdk ditulis maka tidak masalah

Program running led manual

Listing programnya adalah seperti ini :

#include <avr/io.h>         // header standard AVR
#define F_CPU 12000000UL   //  set clock 12mhz
#include <util/delay.h>   //   delay

void main (void)
{
      
       DDRB=0xff;// set portb = output
       while (1)
       {
        PORTB=0xfe;
        _delay_ms(1000);
        PORTB=0xfd;
        _delay_ms(1000);
        PORTB=0xfb;
        _delay_ms(1000);
        PORTB=0xf7;
        _delay_ms(1000);
        PORTB=0xef;
        _delay_ms(1000);
        PORTB=0xdf;
        _delay_ms(1000);
        PORTB=0xbf;
        _delay_ms(1000);
        PORTB=0x7f;
        _delay_ms(1000);
       }
      
}// end program

Pada Program diatas LED dinyalakan satu persatu mulai dari LED 1 sampai LED 8 dan akan berulang terus menerus (while). Program diatas langsung mengisi semua port (PORTB). Namun bisa juga diisi pe PORT misal PORTB.0=0; untuk menyalakan LED 1, dan PORTB.1=0;  untuk menyalakan LED 2 dan seterusnya. Cara seperti ini biasanya digunakan pada Codevision AVR.

Pemograman Running LED dengan variabel Array

Variabel Array adalah Variabel dengan satu nama namun memiliki banyak nilai di dalamnya. Fungsinya adalah menghemat dan memudahkan penulisan program. Misalnya :

Unsigned Char array[8]={a,b,c,d,e,f,g,h};

Pada contoh diatas terdapat variabel bernama array yang bertipe data unsigned char. Array tersebut berisi 8 nilai �[8]�  yaitu a,b,c,d,e,f,g,h yang disimpan mulai dari array[0] sampai array[7]. Misalkan kita menggunakan array[0], maka nilainya adalah �a� dan seterusnya.

Listing programnya adalah seperti ini :

#include <avr/io.h>         // header standard AVR
#define F_CPU 12000000UL   //  set clock 12mhz
#include <util/delay.h>   //   delay

unsigned char LED[8]={0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f}; // variabel array LED

void main (void)
{     
       DDRB=0xff;// set portb = output
       char a=0; // membuat variabel a bernilai awal 0
      
              while (1)
              {
                     PORTB=LED[a];     // portb diisi nilai sesuai nilai variabel "a"
                     _delay_ms(1000); // delai 1 detik
                     a++;            // variabel a bertambah 1 (a=a+1) alias increment
                     if a(>7)a=0 ;  //  jika nilai a lebih dari 7 maka a=0        
              }
      
}// end program

Program animasi LED

Setelah menguasai 3 program sebelumnya sekarang adalah tugas anda membuat program LED animasi sendiri, tujuannya adalah untuk mengembangkan dan mengasah logika program. Banyak mastah berkata, pemograman itu gampang, LOGIKANYA yang susah. Kalau bukan kita sendiri yang berlatih program, maka akibatnya  akan terus menerus bergantung pada internet. Tetap semangat dalam mempelajari program, terima kasih.