"Kembali Ke Dasar Elektronika Digital ... "

  • 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

  • Animasi LED Dengan IC 4017

    IC 4017 adalah IC 16-pin CMOS dekade counter dari seri IC CMOS 4000. Sangat berguna jika ingin membuat animasi lampu atau LED secara sederhana seperti led berjalan, tulisan berjalan , counter/timer dan masih banyak kegunaan lainnya

  • 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

  • BIKIN PCB SEDERHANA TAPI GA MURAHAN

    Bikin PCB itu ga susah kok..dengan software EAGLE CAD dan teknik sterika kamu dapat membuat PCB untuk berbagai project elektronika mu ...

Selasa, 21 Januari 2014

[TUTORIAL] Jam Digital 6 Digit Dengan IC CMOS





----=== UPDATE KREASI PEMBACA ===---


*) Dari Pembaca blog SMKN2 Yogyakarta




" Jam tanpa micro ...." itulah request dari seorang pembaca dari Bali. Mustahil ? Tidak lahh... Ketika jamannya microcontroller masih di meja desain para engineer, para pelajar dan penghoby elektronika jaman jadul menggunakan IC yang umum dipasaran kala itu, IC TTL atau IC CMOS. Bahkan salah satu buku yg pernah saya baca mengenai dedengkot APPLE "IWOZ" Steve Wozniak menceritakan bagaimana tahun 60-70an sang pioner ini berlomba membuat alat elektronika digital dengan jumlah komponen IC yang paling sedikit. Bayangkan game "BREAKOUT" merupakan cikal bakal masuknya Wozniak dan sebagai "penari latarnya" si Steve Jobs ke dunia gaming dan industri besar ( waktu itu mereka menjualnya ke ATARI ) dengan membuat console game yang seluruhnya disusun dengan IC TTL. Atari mendesain game breakout dengan 150 buah IC dan bos nya yg bernama Nolan Bushnell merasa ini terlalu besar dan menjanjikan hadiah U$700 jika ada yg berhasil membuat game ini dibawah 50 IC . Dan Steve Wozniak berhasil membuatnya dengan hanya 44 IC! 




Steve Wozniak dan Game Komponen Diskrit "Breakout"

Teringat kembali dengan percobaan dadu digital menggunakan ic cmos 4026 yg sangat simple karena berfungsi sebagai counter dan driver 7 segmen, ditambah dengan pembangkit clock 1 hz menggunakan xtal 32,768 khz dengan ic 4060 + 4013. Lalu masalah muncul ketika sadar kalau jam itu bermodulo 12/24 sedangkan menit/detik bermodulo 60. Dan Google menjadi penyelamatku dengan memberikan arahan ke sebuah forum belanda yg menggunakan dioda sebagai deteksi dari angka-angka maksimum pada dial jam. Ayo kita mulai saja dengan pembahasan lebih mendalam.

1 Hz Clock Generator

Ic yang kita gunakan adalah CMOS 4060 (14 bit binary counter) yg sangat compact karena memiliki input langsung dari xtal. Kali ini yg kita gunakan adalah xtal yang umum dijumpai pada mesin jam baik jam dinding ataupun jam tangan. Frekuensi yg dimiliki oleh xtal ini adalah 32,768 khz.


Kenapa dipilih angka 32,768 khz ? perhatikan rumus dari ic counter 14 bit yg ditunjukkan dari gambar berikut:



Sehingga pada output Q14 ( pin 3 )akan membagi clock input (32,768 kHz) menjadi 2Hz. Masih kurang karena yg kita inginkan adalah pulsa 1Hz maka kita perlukan pembagi 2 bisa menggunakan D flip-flop (4013) atau IC yang umum dibahas di blog ini menggunakan pembagi 10 atau decade counter 4017, dengan melakukan reset ketika mencapai stage ke 3. Sebagai project awal untuk mendapatkan clock 1 Hz ikuti skematik berikut:


*) ralat ..ada yg salah dengan penempatan kaki no 6,7 dan 8 ...ingat 4013 hanya 14 kaki bukan 16
jadi kaki paling pojok kanan bawah adalah kaki 7, bukan 8 !


Alternatifnya menggunakan 4017 seperti gambar skematik dibawah ini :



Sesuai dengan karakteristik  dari xtal memerlukan load capacitor sebesar 18-30 pF. Dikarenakan keakuratan yg cukup kritikal maka dapat diberikan kapasitor variabel pada salah satu kaki xtal dan kemudian diputar-putar untuk mendapatkan keakuratan yg diinginginkan. Bagaimana mengetestnya? Jika ada frequency counter atau oscilloscop atau AVO meter yg agak mahal dengan fasilitas freq. counter , hubungkan dengan kaki 7 (Q4) dari 4060 dan pembacaan diharapkan berkisar 2048 Hz.

Hasilnya seperti pada video berikut ini:





Pencacah Modulo 60 dan 24 

IC Cmos 4026 yang dicascade akan menghasilkan susunan counter bermodulo pangkat 10 sehingga tidak cocok untuk jam yang bermodulo 60 (pada detik dan menit) serta bermodulo 12/24 pada Jam. Bagaimana mendeteksi kondisi ketika 7 segment mencapai 60 dan kembali reset ke 0 ? Perhatikan tabel 7 segment (puluhan saja , satuan diabaikan karena modulo 10)  berikut ini.


Secara kebetulan ( atau tidak ) kita diuntungkan dengan deteksi digit angka 6 yg memiliki kondisi segment yang berbeda dengan digit lainnya yaitu pada segment E-F-G. Jadi dengan memanfaatkan dioda saja sudah dapat memberikan reset pada IC 4026. Rangkaiannya seperti berikut:








Bagaimana dengan Modulo 24 ? kita akan mendeteksi di 2 tempat yaitu puluhan dan satuan. Kembali kita perhatikan tabel segmennya.





Bingung  ? jangan lahh.... lihat saja dibagian yang saya kasikan warna merah dan perubahan menjadi "NYALA" pada kedua segmen (puluhan di segmen G dan satuan di segmen F-G) akan mereset tepat saat angka 24. PIN reset dari 4026 akan aktif ketika mendapat LOGIKA 1 , saat sebelum digit 24 kondisi dari ketiga diode ini akan selalu memberikan tegangan 0 sehingga juga memberikan logika 0  terhadap pin RESET. Ketika semua dioda mendapatkan "NYALA" maka dioda akan menjadi "REVERSE BIAS" , sehingga tidak ada aliran arus ke dioda dan PIN RESET akan ter "pull up" oleh resistor 10k ke VCC dan menerima  logika "1". 



JAM 6 DIGIT FULL CMOS


Mari kita menuju ke perangkaian jam 6 DIGIT FULL CMOS. Karena kita menggunakan CMOS maka range tegangan supply yg digunakan cukup lebar berkisar 3-15 volt. Komponen yg digunakan cukup sedikit seperti gambar diatas akan tetapi diperlukan kabel jumper ke PCB atau Breadboard yg lumayan banyak. Skematik yg digunakan dan daftar komponennya seperti berikut ini . Klik pada gambar jika dirasa kurang jelas. 


****PERHATIAN**** 
Schematik ini tidak menunjukkan kaki Vcc dan Ground Untuk IC CMOS
Jadi Jangan Lupa !! Pada umumnya kaki Vcc ada di kanan atas, Ground di kiri bawah


***) update .... by request dari pembaca-pembaca yg baru newbie di dunia elektro

DAFTAR KOMPONEN :

IC :   
         - CMOS 4060  (1 buah)
         - CMOS 4013 atau 4017 (1 buah)
         - CMOS 4026  (6 buah)

Resistor : 

         - 10 Kilo ohm  ( 5 buah )
         - 470 Kilo ohm  ( 1 buah )
         - 1M ohm  - keatas , disesuaikan dengan yg ada ditoko ( 1 buah )

Capasitor :

         - 22 pico farad  (2 buah) , bisa menggunakan antara 22/33 pf
         -  Jika ingin akurasi , bisa mengganti 1 buah C 22pF dengan 
            Capasitor Variabel 30pF

Dioda  :
         - 1N4148 atau dioda umum 1N 4001 / 1N4002 ( 12 buah )

7 Segmen Kecil :  

  COMMON KATODA / -   (6 buah) ! INGAT JANGAN SAMPAI SALAH BELI !

Tombol :

         - Tactile switch  ( 2 buah )

XTAL :   32.768 kHz  (1 buah)


Bahan Pendukung :
         
          - Baterai 6 Volt / adaptor
          - Bread Board / Project Board / PCB lubang
          - Kabel Jumper
          - Solder dan timah (jika dirangkai diatas PCB lubang)




Hasilnya seperti pada video berikut ini :

TESTING





JAM BENERAN






Simple bukan ? Bagaimana jika menggunakan 7 segment yg besar? Pada umumnya 7 segment besar menggunakan mode common anoda dengan susunan kaki yg berbeda. 4026 memiliki output aktif high sedangkan 7 segmen common anoda membutuhkan aktif low sehingga untuk membalik logika bisa menggunakan transistor NPN atau lebih simplenya menggunakan IC ULN2003 seperti pada skematik berikut ini.



SELAMAT MENCOBA ...
Share:

Kamis, 02 Januari 2014

Trick Pada Mikrokontroler Saat Catuan Menghilang




Selamat Tahun Baru 2014 kepada pembaca setia aisi555 dot com. Semoga ditahun yang baru ini berbagi ilmunya semakin bermanfaat bagi kita semua. Doakan saya juga agar sehat dan terus berkreasi serta membagi ilmu kepada kalian semua. 

Tahun baru ini dimulai dengan berbagi trick mengatasi masalah hilangnya catuan pada microcontroller. Kita tidak akan membahas fasilitas sleep mode dan low power mode lainnya karena ada alasan yg menyebabkan hal ini tidak diperlukan pada level mikrokontroler sederhana. Yang kita akan bahas adalah jawaban dari pertanyaan yang beberapa hari yang lalu disampaikan oleh pembaca.

  1. Bagaimana membuat jam digital tetap jalan saat lampu mati sehingga saat nyala kembali jam tidak kacau ?
  2. Bagaimana melanjutkan hasil counter di alat saya pada saat catuan menyala lagi ?

Pembahasan kali ini menggunakan metode battery backup dan yang lainnya menggunakan memory EEPROM yg sudah dimiliki mikrokontroler untuk menyimpan data sebelum catuan hilang. Untuk itu sebelum melanjutkan agar terlebih dahulu membaca pembahasan mengenai eeprom disini.


Bagaimanakah logika dari rangkaian diatas ? Prinsip yang digunakan adalah prinsip arus searah dari dioda.


VCC atau sumber tegangan dari microcontroller yang masih ditoleransi adalah minimal 2.5 volt (kecuali pengukuran ADC). Saat supply utama masih memberikan tegangan maka gambar dibawah ini mewakili kondisinya.


Jika tegangan baterai yang diberikan bernilai kurang dari VCC + 0.5 volt (forward voltage)  dari tegangan dikiri katode maka arus tidak akan mengalir ke arah VCC. Dalam contoh digunakan 3 buah baterai 1.5 volt yg ekivalen kurang dari 4.5 volt. Apa yang terjadi ketika sumber utama tidak ada ? Berikut ini gambarannya.


Dengan tidak adanya sumber di kiri katoda maka VCC akan benilai  tegangan baterai dikurangi 0.5 volt yang merupakan forward voltage dari dioda. Trick yg mungkin menghemat penggunaan baterai saat catuan utama mati adalah dengan mematikan fungsi yg memakan energi besar. Ini menjawab pertanyaan no 1 yang intinya adalah untuk menjaga fungsi waktu tidak kacau sehingga tidak diperlukan tampilan ke display 7 segmen. Caranya adalah dengan menggunakan supply yg terpisah ke catuan display 7 segmen dan catuan ini bersumber ke adaptor/trafo yg akan mati ketika PLN mati. Cara lainnya adalah dengan menggunakan deteksi tegangan menggunakan transistor.



Script deteksinya mudah saja


if(bit_is_clear(PIND, PIND2) ) // jika catuan normal
{

 yang_boros_nyala(); 

}

else  // jika catuan mati dan baterai aktif

{

 yang_boros_mati(); 

}


Trick seperti gambar diatas dapat juga digunakan untuk menjawab pertanyaan kedua. Ini alasannya mengapa deteksinya dipasang di PIN D2 yang juga merupakan pin untuk INT 0. Marilah kita ingat pembahasan interrupt disini. Jadi saat power supply mati maka deteksi dari low ke high akan kita gunakan untuk proses penyimpanan data counter sebelum sumber benar-benar hilang. Bagaimana ceritanya menjalankan mikrokontroller padahan tegangan sumber tidak ada  ? Jawabannya cukup simpel dengan menggunakan kapasitor pada VCC untuk menyimpan tegangan 5 volt beberapa saat.



Bagaimana dengan scriptnya ? Kita inisialisasi dulu Interuptnya , kali ini menggunakan ATMega 8535


#define F_CPU 4000000UL
#include <avr/io.h>
#include <avr/interrupt.h>  // INI JANGAN LUPA !!
#include <avr/eeprom.h>
#include <util/delay.h>


uint8_t EEMEM eecounter;

uint8_t counter;


void init_interupt(void)
{
  
// interrupt aktif ketika perubahan Low ke High (0--> 1)
MCUCR |= (1<<ISC01)|(1<<ISC00) ; 
  
// aktifkan INT 0
GICR |= (1<<INT0);

   sei();

}




Dan ketika saat power PLN mati dan kemudian basis transistor tidak mendapatkan tegangan maka transistor akan ada pada kondidi cut off sehingga pada pin INT 0 terjadi perubahan dari LOW (0) ke HIGH (5volt) dan berdasarkan inisialisasi telah ditentukan trigger interrupt pada kondisi "rising edge" . Pada kondisi ini hasil dari counter disimpan ke EEPROM.


ISR(SIG_INTERRUPT0) 

eeprom_write_byte(&eecounter,counter);

}



Dan ketika listrik menyala kembali yang pertama dilakukan adalah membaca isi eeprom dari counter



int main(void)
{


counter= eeprom_read_byte(&eecounter); //baca eeprom

init_interupt(); //inisialisasi interrupt


while(1)
{

// contoh program penambahan counter
// sesuaikan dengan keperluan

counter++;  

_delay_ms(2000);


}

return(0);

}




SELAMAT MENCOBA
Share:

Jumat, 20 Desember 2013

[TUTORIAL] Keypad + LCD + Password



Tutorial berikut ini merupakan kelanjutan dari pembahasan sebelumnya mengenai keypad dan lcd dengan menitikberatkan pada proses input dan pengecekan password. Prinsipnya mudah saja hanya dengan memindahkan penekanan tombol ke array memory dan kemudian membandingkannya dengan password yg diinginkan. Untuk itu agar diperhatikan juga pembahasan mengenai ARRAY.



uint8_t pas[6];  // ARRAY untuk menyimpan inputan tombol
uint8_t pase[6]={ 1,2,3,4,5,6 } ; //ARRAY password yg akan dibandingkan




Langkah pertama mendeklarasikan ARRAY yg akan menyimpan inputan tombol. Kita batasi jumlah password yg diinput 6 angka sehingga array ini memiliki panjang 6. Setiap tombol ditekan maka array pas[ ] akan dimasukkan nilai dari variabel keypad.



Untuk menampilkan karakter diatas scriptnya adalah :


lcd_init(LCD_DISP_ON_CURSOR);  //inisialisasi LCD
lcd_puts(" Input Password:");
lcd_gotoxy(4,1);              //pindah baris



Sedangkan untuk memindahkan inputan keypad seperti berikut:


//jika tombol ditekan (bukan * dan # )
if(keypad!= 100 && keypad !=21 && keypad !=20 ) 
 {  
  

   if( posisi < 6 ) {    //ada 6 buah password
   lcd_putc('*') ; // tampilkan asterix untuk password
   pas[posisi]=keypad; //pindahkan nilai keypad ke array
      posisi++; //tambahkan nilai posisi
 
      }

 

 _delay_ms(150);   
   

   }






 Jika ingin mengoreksi password yg telah dimasukkan , maka cancel diwakili oleh tombol '*' dan scriptnya seperti berikut :


if(keypad == 21 )  // penekanan * berarti hapus 1 kebelakang
 {  
  

 
 if(posisi != 0)  posisi--;  //posisi kursor dikurangi



  

  lcd_gotoxy((posisi +4),1); //mundur 1 posisi 
  lcd_putc(' '); //bersihkan kursor
  lcd_gotoxy((posisi +4),1); //balik lagi


 
 _delay_ms(150);   
   

   }






Berikut ini adalah script untuk membandingkan password :


 if(keypad == 20 )  // penekanan # berarti password bisa dicek
 { 


  if(posisi == 5) { //jika sudah semua password dimasukkan
//berikut ini pembanding
   if( pas[0] == pase[0] && pas[1] == pase[1] && pas[2] == pase[2] && pas[3] == pase[3] && pas[4] == pase[4] && pas[5] == pase[5]  )

    {

     lcd_gotoxy(1,0);
  lcd_puts(" Password Benar "); //jika benar

 }
   else
   {
   
     lcd_gotoxy(1,0);
  lcd_puts(" Password Salah "); //jika salah
   }   
  
  
  }




 _delay_ms(150); 

 }





Hasilnya seperti berikut :





Script selengkapnya dapat didownload disini.



SELAMAT MENCOBA


Share:

Kamis, 19 Desember 2013

[TUTORIAL] KEYPAD to 16 x 2 LCD MATRIX



Sebelum melanjutkan ke tutorial berikut ada baiknya membaca pembahasan terdahulu mengenai keypad dan menulis ke lcd


Episode berikut dari pembahasan mengenai keypad akan membahas mengenai pemindahan data dari keypad menuju LCD Matrix 16x2 . Display LCD yang umum didapatkan di toko hoby elektronika ini berharga dikisaran 40-60 ribu. Sedangkan modul keypad dijual dengan harga 30 ribu (keypad keras) dan 20 ribu untuk keypad pita/tipis. 


Pembahasan mengenai penulisan LCD pernah ditulis dalam blog ini, dimana akan digunakan library langsung pakai yang sangat simple yaitu pfleury. Ada 2 file yang harus dicopykan yaitu lcd.h dan lcd.c yang kemudian akan ditambahkan pada script. Untuk lcd.h perlu dilakukan penyesuaian terhadap penempatan kaki-kaki pin dari lcd terhadap microcontroller yang digunakan. Perhatikan skematik yg digunakan dalam tutorial ini.


klik pada gambar untuk memperjelas



Rangkaian diatas menggunakan AVR ATMEGA8535 , dengan PortA sebagai kontrol LCD dan mode data yg digunakan 4 bit. Jadi pada file lcd.h diubah sebagai berikut :





#define XTAL 1000000 //default clock adalah 1Mhz

#define LCD_LINES 2      // jumlah line LCD
#define LCD_DISP_LENGTH 16 // jumlah karakter per line


#define LCD_IO_MODE 1    // mode 0=8bit, 1=4 bit

// selanjutnya adalah definisi pin yang dipakai, berikut ini hasil edit yang sesuai skematik diatas

#define LCD_PORT PORTA
#define LCD_DATA0_PORT LCD_PORT
#define LCD_DATA1_PORT LCD_PORT
#define LCD_DATA2_PORT LCD_PORT
#define LCD_DATA3_PORT LCD_PORT
#define LCD_DATA0_PIN 3
#define LCD_DATA1_PIN 2
#define LCD_DATA2_PIN 1
#define LCD_DATA3_PIN 0
#define LCD_RS_PORT 
LCD_PORT
#define LCD_RS_PIN 6
#define LCD_RW_PORT 
LCD_PORT
#define LCD_RW_PIN 5
#define LCD_E_PORT 
LCD_PORT

#define LCD_E_PIN 4 

Jangan lupa juga dengan cara menambahkan library lcd.c seperti gambar berikut (AVR STUDIO 4)



Karena penulisan LCD matrix sangat simple , maka script pun menjadi semakin simple. Hanya dengan menggunakan logika sederhana untuk menentukan baris yang akan ditulis maka didapatkan script utama seperti berikut :




int main(void)

{

uint8_t keypad,posisi;
 
DDRA |= _BV(PA0) | _BV(PA1) | _BV(PA2) | _BV(PA3) | _BV(PA4) | _BV(PA5) | _BV(PA6)  ; //LCD PORT yg digunakan
  
    
   //keypad     
    DDRD &= ~_BV(PD0) & ~_BV(PD1) & ~_BV(PD2); //col 
    DDRD |= _BV(PD3) | _BV(PD4) | _BV(PD5) | _BV(PD6); //row


posisi=0; //variabel penanda posisi kursor


lcd_init(LCD_DISP_ON_CURSOR); //inisialisasi LCD

 while(1)

 {
   
keypad=tombol(); //fungsi keypad, silahkan baca pembahasan sebelumnya

if(keypad!= 100 && keypad !=21 && keypad !=20 ) //jika tombol ditekan
 {  
  

   if( posisi < 32 ) {    //ada 32 buah ruang untuk menulis  (16 x 2 )
      lcd_putc( keypad + 48 ) ; //48 adalah ascii dari angka 0
      posisi++; //tambahkan nilai posisi
 
      }

 
 if(posisi == 16){ //jika melewati 16 karakter di baris 1
 
 lcd_gotoxy(0,1); //pindah ke baris kedua

 } 


 _delay_ms(150);   
   

   }
   



if(keypad == 21 )  // penekanan * berarti hapus 1 kebelakang
 {  
  

 
 if(posisi != 0)  posisi--;  //posisi kursor dikurangi



 if(posisi < 16 ){ //baris 1

  lcd_gotoxy(posisi,0); //mundur 1 posisi di baris 1
  lcd_putc(' '); //bersihkan kursos
  lcd_gotoxy(posisi,0); //balik lagi


 } 

 else { //baris 2

  lcd_gotoxy((posisi - 16),1); //mundur 1 posisi di baris 2
  lcd_putc(' '); //bersihkan angka
  lcd_gotoxy((posisi - 16),1); //balik lagi

 }
 
 _delay_ms(150);   
   

   }


else if(keypad == 20 )  // penekanan # berarti bersihkan layar lcd
 { 

posisi = 0;

lcd_clrscr();


 _delay_ms(150); 

 }



}

return 0;

}



Yang menarik dari script diatas adalah karena yg ditampilkan berupa angka saja sedangkan LCD menerima input karakter ASCII, maka untuk merubah dari integer ke ascii cukup dengan menambahkan angka 48. Kenapa ? Karena ascii dari angka 0-9 berurutan dari 48-57 jadi simple saja menggunakan script  lcd_putc( keypad + 48)  Script selengkapnya dapat didownload di sini.


SELAMAT MENCOBA
Share:

Rabu, 18 Desember 2013

[TUTORIAL] Keypad Matrix ke 7 segmen



Catatan : Untuk mempelajari tutorial ini agar memulai dengan praktek dasar input/output dan jam 7segmen


Tombol atau keypad merupakan alat input yg umum digunakan. Sebagai dasarnya adalah tactile switch seperti gambar berikut ini :


Gambar dikiri adalah contoh tactile switch (switch yg sensitif dan sekali sentuh) dan gambar dikanan adalah koneksi umum menggunakan pull up resistor 10k ohm , yang nantinya akan memberikan input dari logika HIGH (vcc) menuju logika LOW (gnd). Fungsi dari resistor adalah sebagai pembatas arus saat tombol ditekan sehingga tidak terjadi short antara vcc dan ground. Pada penekanan tombol yang akan kita cek adalah kondisi turun atau naik (menggunakan interupt) atau kondisi High / Low dengan teknik scanning. Kali ini akan dibahas metode scanning dengan script dasar pembacaan tombol sebagai berikut :


if (bit_is_clear(PIND, PIND5)) //tombol ada di pin D5
{
// kondisi yg diinginkan ditulis disini

_delay_ms(200); // delay untuk mengatasi de-bounching efek

}


Juga agar diperhatikan untuk mengeset pin D5 sebagai pin input pada inisialisasi port. Jika ingin menambahkan tombol lainnya cukup hanya dengan menambahkan rangkaian yg sama dan pencabangan di script if..else if. Jika memerlukan banyak tombol maka banyak pula pin microcontroller yang digunakan. Ada suatu teknik yg umum digunakan yaitu teknik scanning matrix dari tombol dengan mengubah pembacaan input dan output seperti yg biasanya kita dapatkan pada keypad matrix dibawah ini :



Gambar diatas menjelaskan bagaimana kombinasi dari 2 buah pin yang terhubung dan kemudian mewakili penekanan keypad. Keuntungan dari penggunaan matrix ini adalah berkurangnya penggunaan pin micro, yg seharusnya 12 pin menjadi hanya 7 pin Input Output saja. Mekanisme untuk pembacaan adalah dengan melakukan scanning dari kolom atau baris (pilih salah satu , digunakan sebagai OUTPUT) dan kemudian melakukan pembacaan pada pin yg dibuat sebagai INPUT.

Contoh penjabarannya adalah seperti berikut:


  • Row / Baris digunakan sebagai OUTPUT dan Micro akan membaca 3 pin Kolom
  • Micro akan melakukan output scanning "LOW" pada 4 pin baris (0111, 1011, 1101, 1110) secara bergantian
  • Micro kemudian akan membaca adakah input yg juga bernilai "LOW" , semisal saat scanning 0111 (paling kiri row 3), maka jika kolom 0 (sesuaikan pin microcontroller) bernilai "LOW" berarti yg ditekan adalah tombol " * " bintang begitu pula jika kolom 1 bernilai "LOW" maka yang ditekan adalah tombol " 0 ".
  • Pemilihan scanning aktif "LOW" atau "High" tergantung dari perlakuan pull up atau pull down dari pin input dalam hal ini pin kolom.


Secara scipt akan menjadi seperti ini :


uint8_t tombol(void)
{

uint8_t key=100; // nilai awal jika tidak ada penekanan


PORTD &= ~_BV(PD3);

PORTD |= _BV(PD4)|_BV(PD5)|_BV(PD6);  // scanning 0111
_delay_ms(1);


// berikut ini pembacaan tombol kolom sebagai input

if(bit_is_clear(PIND, PIND0))
{
key= 1;    
}
else if(bit_is_clear(PIND, PIND1))
{
key= 2;    
}

else if(bit_is_clear(PIND, PIND2))

{
key= 3;    
}


PORTD &= ~_BV(PD4);

PORTD |= _BV(PD3)|_BV(PD5)|_BV(PD6);  // scanning 1011
_delay_ms(1);

// berikut ini pembacaan tombol kolom sebagai input

if(bit_is_clear(PIND, PIND0)  )
{key= 4;    
}
else if(bit_is_clear(PIND, PIND1) )
{
key= 5;    
}

else if(bit_is_clear(PIND, PIND2) )

{
key= 6;    
}



PORTD &= ~_BV(PD5);

PORTD |= _BV(PD4)|_BV(PD3)|_BV(PD6); // scanning 1101
_delay_ms(1);

// berikut ini pembacaan tombol kolom sebagai input

if(bit_is_clear(PIND, PIND0) )
{key= 7;    
}
else if(bit_is_clear(PIND, PIND1) )
{
key= 8;    
}

else if(bit_is_clear(PIND, PIND2) )

{
key= 9;    
}



PORTD &= ~_BV(PD6);

PORTD |= _BV(PD4)|_BV(PD5)|_BV(PD3); // scanning 1110
_delay_ms(1);

// berikut ini pembacaan tombol kolom sebagai input

if(bit_is_clear(PIND, PIND1) )
{
key= 0;    
}

else if(bit_is_clear(PIND, PIND2))

{
key= 21; //mewakili *   
}
else if(bit_is_clear(PIND, PIND0) )
{key= 20;    //mewakili #
}


return key; // nilai integer dari variable key dikembalikan ke pemanggil




}



Dengan mengasumsikan bahwa pembaca sudah melakukan praktek microcontroller "jam sederhana" maka kita dapat melanjutkan menuju ke praktek sesungguhnya. Skematik dapat dilihat pada gambar berikut, menggunakan micro AVR ATMEGA8535 , micro lain tinggal menyesuaikan.




(klik pada gambar untuk memperjelas)



Sedangkan script lengkap pada percobaan ini sebagai berikut :


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

uint8_t pencet, angka[4];

void segmen(int digit) // konversi angka ke segmen

{
    switch (digit)        
          {

  case 0 :  
     {

    PORTC &= ~_BV(PC0) & ~_BV(PC1) & ~_BV(PC2)  & ~_BV(PC3) 
            & ~_BV(PC4)  & ~_BV(PC5);

            PORTC |= _BV(PC6);
   
   break;
           }
  case 1 :
     {
      
   PORTC &= ~_BV(PC1) & ~_BV(PC2);

            PORTC |= _BV(PC0)|  _BV(PC3)|  _BV(PC4)|  _BV(PC5)|  _BV(PC6);
   
   break;
           }
  case 2 : 
     {
   PORTC &= ~_BV(PC0) & ~_BV(PC1) & ~_BV(PC6) & ~_BV(PC4) & ~_BV(PC3);

            PORTC |= _BV(PC2)|  _BV(PC5) ;
   
      break;
           }  
  case 3 : 
      {

   PORTC &= ~_BV(PC0) & ~_BV(PC1) & ~_BV(PC2) & ~_BV(PC3) & ~_BV(PC6);

            PORTC |= _BV(PC4)|  _BV(PC5) ;
        
   break;
           }
  case 4 :
     {
      
   PORTC &= ~_BV(PC5) & ~_BV(PC1) & ~_BV(PC2) & ~_BV(PC6) ;

            PORTC |= _BV(PC3)|  _BV(PC4) |  _BV(PC0);
   
   break;
           }
  case 5 : 
     {

   PORTC &= ~_BV(PC0) & ~_BV(PC2)  & ~_BV(PC3) & ~_BV(PC6)  & ~_BV(PC5);

            PORTC |= _BV(PC1) |  _BV(PC4);
   
   break;
           }
  case 6 : 
     {

   PORTC &= ~_BV(PC0) & ~_BV(PC2)  & ~_BV(PC3) & ~_BV(PC6)  & ~_BV(PC5) & ~_BV(PC4);

            PORTC |= _BV(PC1) ;
   
      break;
           }
  case 7 : 
     {

   PORTC &= ~_BV(PC0) & ~_BV(PC1) & ~_BV(PC2);

            PORTC |=  _BV(PC3)|  _BV(PC4)|  _BV(PC5)|  _BV(PC6);
   
      break;
           }  
  case 8 : 
     {
   PORTC &= ~_BV(PC0) & ~_BV(PC1) & ~_BV(PC2)  & ~_BV(PC3) 
            & ~_BV(PC4)  & ~_BV(PC5)  & ~_BV(PC6);

      break;
           }
  case 9 : 
     {

   PORTC &= ~_BV(PC0) & ~_BV(PC1) & ~_BV(PC2)  & ~_BV(PC3) 
             & ~_BV(PC5)  & ~_BV(PC6);

   PORTC |= _BV(PC4); 

      break;
           }
  case 10 :
     {
         PORTC |= _BV(PC0) |  _BV(PC1) |  _BV(PC2) |  _BV(PC3)|
                _BV(PC4) | _BV(PC5) |  _BV(PC6) ;

      break;
           }



  }
}



void posisi(uint8_t pos) //posisi scanning 7 segmen

{
    switch (pos)   
    {
    case 0 :  
     {

           PORTA &= ~_BV(PA4) &  ~_BV(PA5)& ~_BV(PA6) & ~_BV(PA7) ;
               
   break;
           }

    case 1 :  
     {

            PORTA |= _BV(PA4);

            PORTA &= ~_BV(PA5) & ~_BV(PA6) & ~_BV(PA7) ;
   

               
   break;
           }

    case 2 :  
     {

            PORTA |= _BV(PA5);

            PORTA &= ~_BV(PA4) & ~_BV(PA6) & ~_BV(PA7) ;
           
   break;
           }

    case 3 :  
     {

            PORTA |= _BV(PA6);

            PORTA &= ~_BV(PA4) & ~_BV(PA5) & ~_BV(PA7)  ;
   
                 
   break;
           }


    case 4 :  
     {

            PORTA |= _BV(PA7);

            PORTA &= ~_BV(PA4) & ~_BV(PA5) & ~_BV(PA6)  ;

   break;
           }

         }

}


void tulis(void) //menulis angka ke 7 segmen

{  

    posisi(1);
    
    if( pencet <1) segmen(10); 
    else segmen(angka[0]);
 } 
 
    _delay_us(300);
    segmen(10);
     

    posisi(2);
    
    if( pencet <2) segmen(10);
    else segmen(angka[1]);
 } 
 
    _delay_us(300);
    segmen(10);

    posisi(3);
    
    if( pencet <3) segmen(10);
    else segmen(angka[2]);
 } 
 
    _delay_us(300);
    segmen(10);

    posisi(4);
    
    if( pencet <4) segmen(10);
    else segmen(angka[3]);
 } 
 
    _delay_us(300);
    segmen(10);
 

 


}




uint8_t tombol(void) //penerjemahan penekanan tombol
{

uint8_t key=100;

PORTD &= ~_BV(PD3);
PORTD |= _BV(PD4)|_BV(PD5)|_BV(PD6);
_delay_ms(1);


if(bit_is_clear(PIND, PIND0) )
{key= 1;    

}
else if(bit_is_clear(PIND, PIND1) )
{
key= 2;    

}

else if(bit_is_clear(PIND, PIND2))
{
key= 3;    

}


PORTD &= ~_BV(PD4);
PORTD |= _BV(PD3)|_BV(PD5)|_BV(PD6);

_delay_ms(1);

if(bit_is_clear(PIND, PIND0)  )
{key= 4;    

}
else if(bit_is_clear(PIND, PIND1) )
{
key= 5;    

}

else if(bit_is_clear(PIND, PIND2) )
{
key= 6;    

}



PORTD &= ~_BV(PD5);
PORTD |= _BV(PD4)|_BV(PD3)|_BV(PD6);

_delay_ms(1);

if(bit_is_clear(PIND, PIND0)  )
{key= 7;    

}
else if(bit_is_clear(PIND, PIND1) )
{
key= 8;    

}

else if(bit_is_clear(PIND, PIND2) )
{
key= 9;    

}



PORTD &= ~_BV(PD6);
PORTD |= _BV(PD4)|_BV(PD5)|_BV(PD3);
_delay_ms(1);


if(bit_is_clear(PIND, PIND1) )
{
key= 0;    

}

else if(bit_is_clear(PIND, PIND2) )
{
key= 21;  // mewakili *

}
else if(bit_is_clear(PIND, PIND0) )
{key= 20;  // mewakili #

}


return key;


}




int main(void)

{

uint8_t keypad;
 
   DDRA |= _BV(PA5) | _BV(PA6) | _BV(PA7) | _BV(PA4) ; //scanning 7 segmen 
   DDRC |= _BV(PC0) | _BV(PC1) | _BV(PC2) | _BV(PC3) | _BV(PC4) | _BV(PC5) | _BV(PC6) ; //segmen
    
   //keypad     
    DDRD &= ~_BV(PD0) & ~_BV(PD1) & ~_BV(PD2); //col 
    DDRD |= _BV(PD3) | _BV(PD4) | _BV(PD5) | _BV(PD6); //row


pencet=0;

angka[0]=1;
angka[1]=2;
angka[2]=3;
angka[3]=4;

 while(1)

 {
   
keypad=tombol();

if(keypad!= 100 && pencet == 0)
 {  
  
  angka[0]=keypad;
  pencet = 1;

 _delay_ms(150);   
   

   }
   

else if(keypad!= 100 && pencet == 1)
 {  
  
  angka[1]=keypad;
  pencet = 2;

 _delay_ms(150);   
   

   }
   
else if(keypad!= 100 && pencet == 2)
 {  
  
  angka[2]=keypad;
  pencet = 3;

 _delay_ms(150);   
   

   }

else if(keypad!= 100 && pencet == 3)
 {  
  
  angka[3]=keypad;
  pencet = 4;

 _delay_ms(150);   
   

   }



if(keypad == 21 || keypad == 20)  // penekanan * atau # membersihkan 7 segmen
 {  
  
  pencet = 0;

 _delay_ms(150);   
   

   }


}

return 0;

}






SELAMAT MENCOBA 
Share:

Rabu, 27 November 2013

[Script Breakdown] Bikin Jam Di Televisi

Untuk melanjutkan ke project berikut ini disarankan agar menuju ke pembahasan awal mengenai Microcontroller VS Televisi di sini : Part#1 Part#2 Part#3 dan Pakman 







Siapkan Bahan-bahan berikut ini:


  1. Micro-AVR ATTiny 2313
  2. Breadboard
  3. Power suply 5v , atau adaptor 12v dan diregulasi 7805
  4. Resistor 10K, 470
  5. Tombol push button 2 buah
  6.  Xtal 20Mhz + capasitor 22pF
  7. Programer AVR + header isp (2 x 10)
  8. Pesawat TV yg nganggur (pastikan tidak bentrok dengan jadwal mama nonton tv)

Kemudian skematik yg digunakan seperti gambar berikut :


Klik pada gambar buat memperjelas gambar
*) Rangkaian sama persis dengan project pakman hanya tombol yg digunakan  berada pada INT0 dan INT1


Kita akan breakdown scriptnya secara satu persatu agar pembaca semakin mengerti (atau tambah mumet .....mungkin looo). SIlahkan Baca Penjelasan disela-sela script.

>>> Header <<

#define F_CPU 20000000UL  //Frekuensi xtal yg digunakan, ubah fusebit untuk mengaktifkan
#include <avr/io.h>
#include <util/delay.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h>


#define FONTHEIGHT 12 //Tinggi font yg diwakili lebar array font

#define HSYNC PORTB=0; //PORTB=0 sebagai bit sinkronisasi horizontal atau penghasil 0 volt
#define BLACK PORTB=1;//PORTB=0 sebagai warna putih
//Berikut ini rumus untuk menampilkan warna dot putih di televisi berdasarkan array
#define COL(r) textnya=word[r][fontzoom];

static uint8_t fontline = 0; //variabel fontline
static uint8_t fontzoom = 0; //variabel zoom font untuk besar karakter yg ditampilkan

//BERIKUT INI ARRAY DOT YG MEWAKILI ANGKA 0 - 9 :
const unsigned char font[12][FONTHEIGHT] PROGMEM = { 
   {    //0
 0b00000000,
 0b01111100,
 0b11000110,
 0b11001110,
 0b11011110,
 0b11010110,
 0b11110110,
 0b11100110,
 0b11000110,
 0b01111100,
 0b00000000,
 0b00000000,
 },
 {//1
 0b00000000,
 0b00010000,
 0b00110000,
 0b11110000,
 0b00110000,
 0b00110000,
 0b00110000,
 0b00110000,
 0b00110000,
 0b11111100,
 0b00000000,
 0b00000000,
 },
 {//2
 0b00000000,
 0b01111000,
 0b11001100,
 0b11001100,
 0b00001100,
 0b00011000,
 0b00110000,
 0b01100000,
 0b11001100,
 0b11111100,
 0b00000000,
 0b00000000,
 },
 {//3
 0b00000000,
 0b01111000,
 0b11001100,
 0b00001100,
 0b00001100,
 0b00111000,
 0b00001100,
 0b00001100,
 0b11001100,
 0b01111000,
 0b00000000,
 0b00000000,
 },
 {//4
 0b00000000,
 0b00001100,
 0b00011100,
 0b00111100,
 0b01101100,
 0b11001100,
 0b11111110,
 0b00001100,
 0b00001100,
 0b00011110,
 0b00000000,
 0b00000000,
 },
 {//5
 0b00000000,
 0b11111100,
 0b11000000,
 0b11000000,
 0b11000000,
 0b11111000,
 0b00001100,
 0b00001100,
 0b11001100,
 0b01111000,
 0b00000000,
 0b00000000,
 },
 {//6
 0b00000000,
 0b00111000,
 0b01100000,
 0b11000000,
 0b11000000,
 0b11111000,
 0b11001100,
 0b11001100,
 0b11001100,
 0b01111000,
 0b00000000,
 0b00000000,
 },
 {//7
 0b00000000,
 0b11111110,
 0b11000110,
 0b11000110,
 0b00000110,
 0b00001100,
 0b00011000,
 0b00110000,
 0b00110000,
 0b00110000,
 0b00000000,
 0b00000000,
 },
 {//8
 0b00000000,
 0b01111000,
 0b11001100,
 0b11001100,
 0b11101100,
 0b01111000,
 0b11011100,
 0b11001100,
 0b11001100,
 0b01111000,
 0b00000000,
 0b00000000,
 },
 {//9
 0b00000000,
 0b01111000,
 0b11001100,
 0b11001100,
 0b11001100,
 0b01111100,
 0b00011000,
 0b00011000,
 0b00110000,
 0b01110000,
 0b00000000,
 0b00000000,
 },
 {//:
 0b00000000,
 0b00000000,
 0b00000000,
 0b00110000,
 0b00110000,
 0b00000000,
 0b00000000,
 0b00110000,
 0b00110000,
 0b00000000,
 0b00000000,
 0b00000000,
 },
 {//blank
 0b00000000,
 0b00000000,
 0b00000000,
 0b00000000,
 0b00000000,
 0b00000000,
 0b00000000,
 0b00000000,
 0b00000000,
 0b00000000,
 0b00000000,
 0b00000000,
 }};



uint8_t word[7][12]; //array dari dot

int tick; //variabel untuk mendapatkan pulse tiap sync

uint8_t jam,menit,detik,textnya;//variabel jam dan text





>>> TIMER <<

void timer_init(void){ //timer untuk menentukan pewaktu Hsync 64us

 TCCR1B |= (1<<WGM12);
 TIMSK |= (1<<OCIE1A);
 OCR1A = 1280; //64 (us)* 20(Mhz) sesuaikan dengan xtal yg dipakai
 TCCR1B |= (1<<CS10);
}





>>>GESER PER PIXEL <<

void geser(void)
{ uint8_t a;

//loop untuk menggeser Array angka yg ditampilkan dalam 64 us
for(a=0;a<8;a++){ 
PORTB = (textnya & 0x81) + 1;
textnya <<=1;
 asm("nop");
 asm("nop");
 asm("nop");
//sesuaikan banyak asm("nop"); dengan lebar karakter yg diinginkan
}






>>>TIMER INTERRUPT dan RASTER <<

/* Timer interrupt */

ISR (TIMER1_COMPA_vect) { //64 us
 static uint16_t rasterline=0;
 

 HSYNC; //mulai h sync
        //tulis jika diantara line 100 dan 160  
 if( rasterline > 100 && rasterline <= 160 ) {
  _delay_us(4);
  BLACK;
  _delay_us(8);
        asm("nop");
        asm("nop");
        asm("nop");

       //tampilkan dot putih(1) atau hitam(0)sesuai array gambar angka
    COL(0); //tampilkan puluhan jam
    geser();
    COL(1); //tampilkan satuan jam
    geser();
    COL(2); //tampilkan :
    geser();
    COL(3);//tampilkan puluhan menit
    geser();
    COL(4);//tampilkan satuan menit
    geser();
    COL(2);//tampilkan :
    geser();
    COL(5);//tampilkan puluhan detik
    geser();
    COL(6);//tampilkan satuan detik
    geser();
  
  fontline++; //tambahkan line / pindah raster selanjutnya
  if(fontline % 6 ==0)fontzoom++; 
// ubah angka 6 untuk mengatur tinggi karakter yg tampil di tv , fontzoom menyatakan berapa jumlah line raster yg akan ditampilkan (sama) sebelum menuju ke array baris karakter selanjutnya. semakin lama ditampilkan maka karakter akan semakin memanjang. sesuaikan nilai if di atas (  if( rasterline > 100 && rasterline <= 160 )  )


 } 

 //yang ini bagian Vertical sync, hanya menggunakan raster genap saja,  karena efek kelembaban mata tidak perlu menampilkan karakter saat raster ganjil (menghemat memory)
 else if( rasterline >= 0 && rasterline < 5 ) {
  _delay_us(27);
  BLACK;
  _delay_us(5);
  HSYNC;
  _delay_us(27);
  BLACK;
 } else if( (rasterline >= 5 && rasterline <= 10) ) {
  _delay_us(2);
  BLACK;
  _delay_us(28);
  HSYNC;
  _delay_us(2);
  BLACK;
 } else if( rasterline >311-6 ) {
  _delay_us(2);
  BLACK;
  _delay_us(28);
  HSYNC;
  _delay_us(2);
  BLACK;
 } else { //yang ini mereset nilai array karakter
  _delay_us(3);
  BLACK;
   fontline = -1;
  fontzoom=0;
   }

 rasterline++;
 //bagian dibawah ketika layar ga tampil maka pindahkan nilai waktu
 if( rasterline > 311 )
   { rasterline = 0;
   

   memcpy_P(&word[0],&font[jam/10],12);
   memcpy_P(&word[1],&font[jam%10],12);
   memcpy_P(&word[2],&font[10],12);
   memcpy_P(&word[3],&font[menit/10],12);
   memcpy_P(&word[4],&font[menit%10],12);
   memcpy_P(&word[5],&font[detik/10],12);
   memcpy_P(&word[6],&font[detik%10],12);
 
      }


//yang ini mengakali nilai 1 detik , karena resource timer  termakan oleh proses sinkronisasi
  tick++;

    if(tick == 15625){ //ubah nilai tick sehingga pas 1 detik
    tick=0;
       detik++;
    if(detik==60){
      menit++;
   detik=0;}

       if(menit==60){
    menit=0;
    jam++;}
    if (jam==24) jam=0;
    }
}





>>>TOMBOL <<

SIGNAL (SIG_INT0)  //Tombol Tambah Jam
{
jam++;

if(jam == 24) jam=0;

detik=0;
}

SIGNAL (SIG_INT1)// Tombol Tambah Menit
{
menit++;  

if(menit == 60) menit =0;


detik=0;
}







>>>MAIN PROGRAM <<

int main() {
tick=0;
jam=00;
menit=00;
detik=00;

 
 
 
 MCUCR |= (1<<ISC01)  |(1<<ISC11) ; // interupt tombol fall edge

 GIMSK |= (1<<INT0) |(1<<INT1); //aktifkan interrupt 0 dan 1

 DDRB = (1<<PB7)|(1<<PB0); //PB0=1K, PB7=470 ohm

 timer_init(); //hidupkan timer
 sei(); // aktifkan interrupt

 for( ;; ); //muter terussssss
}





>>>HASILNYA <<





SELAMAT MENCOBA
Share:

Jumat, 15 November 2013

REVISI : 3 Led Matrix - Overlimit RAM usage !



Setelah beberapa pembaca mengeluh karena gagal pada project 3 led matrix ...dan saya juga bingung dibuatnya, akhirnya terdeteksi bahwa saya menggunakan script dengan ARRAY yang melebihi RAM seperti gambar berikut ini :



JADI MOHON DIMAAFKAN !!

Share:

Kontak Penulis



12179018.png (60×60)
+628155737755

HP: 081331339072
Mail : ahocool@gmail.com

Site View

Categories

555 (6) 7 segmen (3) adc (4) amplifier (2) analog (10) android (11) antares (3) arduino (14) attiny (1) attiny2313 (17) blog (1) bluetooth (1) cmos (2) crypto (2) dasar (35) display (3) esp8266 (3) gcc (1) iklan (1) infrared (2) Input Output (3) iot (16) jam (6) jualan (12) kereta api (1) keyboard (1) keypad (3) kios pulsa (2) kit (6) komponen (12) komputer (3) komunikasi (1) kontrol (4) lain-lain (8) lcd (2) led (9) led matrix (6) line tracer (1) lm35 (1) memory (1) metal detector (4) microcontroller (55) mikrokontroller (7) mikrotik (5) ninmedia (2) ntp (1) paket belajar (19) palang pintu otomatis (1) parabola (38) pcb (2) praktek (2) project (33) proyek (1) python (1) radio (3) raspberry pi (4) remote (1) revisi (1) rfid (1) robot (1) rpm (2) rs232 (1) script break down (3) sdcard (3) sensor (1) sharing (3) signage (1) sinyal (1) sms (6) software (18) tachometer (2) telepon (7) televisi (72) television (5) transistor (1) troubleshoot (3) tulisan (59) tutorial (78) tvri (2) vu meter (2) vumeter (2) wav player (3) wayang (1) wifi (3)

Arsip Blog

Diskusi


kaskus
Forum Hobby Elektronika