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 microcontroller. Tampilkan semua postingan
Tampilkan postingan dengan label microcontroller. Tampilkan semua postingan

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:

Rabu, 18 September 2013

[TUTORIAL] AVR - BLUETOOTH - ANDROID ...... it's easy



Sebelum lanjut ke topik pembahasan, saya pingin ngeluh, bangga atau sedih dengan kenyataan mengenai komponen elektronika pabrikan dari china. Teringat ketika disuatu terminal bis 10 tahun yg lalu pada pedagang asongan yang menjual radio FM mini dengan harga 10 ribu rupiah. Secara saya pernah merakit sendiri radio FM serasa ga masuk akal deh harga segitu. Sekarang di tahun 2013 apa sih komponen yg tidak dibikin murah sama pabrikan china ? Dan kenapa bisa murah ? Yang saya tahu bahwa komponen elektronika di china sudah menjadi industri rumah tangga dan mereka didukung pemerintah komunis untuk memproduksi komponen diskrit kelas rendah seperti resistor, kapasitor , transistor dsb. Hasilnya ya dapat dilihat dari murahnya hasil output barang-barang rakitan atau seperti modul Bluetooth seri HC-XX yang saya beli ini dengan harga tidak masuk akal ! Ohh Indonesiaku kapan bisa seperti itu....


MODUL BLUETOOTH


Kembali ke LAAPPTOPP (gaya tukul arwana) .... Kita akan mulai dengan membuka komponen yg baru dibeli yaitu modul bluetooth HC-05. Kenapa saya pilih HC-05 ? Ya karena beberapa tulisan di internet menyatakan bahwa lebih worthed untuk membeli versi ini karena dapat berfungsi sebagai Master atau Slave. Mode ini menunjukkan bahwa si modul dapat menginisialisasi (ala vicky saskia ghotik) koneksi dan juga standar sebagai penerima koneksi dari perangkat lain. 

Dan yang bikin lumayan pusing adalah modul yg dibeli belum di breakout (yg jual ke saya ternyata bohong), terpaksa deh saya break out pada kaki-kaki yang akan digunakan. Trick nya adalah dengan memanfaatkan kawat atau sisa kaki komponen yang tipis kemudian di solderkan pada lekukan pin modul. Lakukan dengan hati-hati karena cukup kecil ukurannya. Juga yang menjadi perhatian adalah space antar lekukan yang tidak standar seperti space pin komponen umum, sehingga perlu di kreasikan agar pas seperti contoh yang saya buat di gambar berikut.





Seperti halnya komponen jaman sekarang yg biasa digunakan pada perangkat bertenaga baterai maka HC-05 (harus diingat dalam-dalam)  level tegangan yang dipakai adalah 3.3V. Akibatnya semua logic dan supply tenaga yang diberikan memiliki range yang berbeda dengan level TTL yang 5V. Komunikasi yang akan kita pakai adalah UART serial sederhana tapi memiliki level 3.3 volt. Jadi sebelum berkomunikasi dengan microcontroller ataupun menuju ke PC via RS232 (kali ini memakai MAX232) maka cukup diberikan level shifter yang dapat dibuat dengan komponen sederhana seperti berikut ini.


Untuk menghasilkan tegangan 3.3v saya gunakan regulator tegangan AIC 1722-33 yg sangat simple dengan bentuk seperti transistor (TO-92). Apabila mengalami kesusahan mencari komponen ini maka dapat digunakan regulator variabel LM317 yang mudah didapatkan atau bisa juga memakai 7805 dengan modifikasi sebagai berikut.


Atur resistansi R2 sampai output mencapai 3.3V

SKEMATIK

Oke ilmu awal sudah cukup, dan sebaiknya langsung aja dirakit biar ga pusing (biasanya kalo dibiarkan ide atau keinginan menyolder mengendap di otak akan menimbulkan kegalauan tingkat tinggi) . Skematiknya seperti berikut, harap di klik biar jelas.



IC AVR yg digunakan ATMega16, bisa juga menggunakan ATMega 8535/32I


Jika rangkaian sudah dirakit kita lanjut dengan membahas rangkaian diatas. Microcontroller avr merupakan otak dari semua system. HC05 melalui level shifter akan berkomunikasi dengan micro menggunakan mode serial UART. Selain itu harus diingat ketika HC05 keluar pabrik memiliki baudrate 38400 bps dengan nama bluetooth "HC05" passkey : "1234". Untuk merubah nama dan setting lainnya diperlukan koneksi ke UART PC melalui Max232. Seperti alat komunikasi standar maka AT command merupakan metode perintah yang akan digunakan walaupun agak berbeda sedikit dengan AT command untuk perangkat telepon yang pernah dibahas disini.

Untuk menuju ke mode AT command, maka hubungkan jumper serial port ke arah MAX232 dan pasang jumper Key sehingga pin key mendapat logika 1 (high). Jika ini dilakukan sebelum diberikan tegangan maka mode UART menjadi 38400 (otomatis), sedangkan jika jumper dipasang setelah power dinyalakan maka baudrate mengikuti baudrate yg telah diset sebelumnya (semisal 9600). Gunakan software terminal seperti Putty untuk memasukkan command, dan  yang umum adalah :

AT+NAME? , AT+NAME=[masukkan nama] , AT+PSWD? , AT+PSWD=[pasword baru], AT+UART?  

Selengkapnya dapat di download commandnya disini . Ketika mode AT dijalankan maka LED pin 31 akan menyala pelan dan akan menyala terus atau mati terus saat memberi respon ke kita. Ingat command yang dikirim tidak diketik ulang (echo) oleh modul dan reply akan keluar terus menerus sampai ada penekanan tombol keyboard. Jadi agak sedikit berbeda dengan AT command pada modem wavecom.

Setelah tersetting seperti keinginan (kali ini baudrate kita set 9600), maka kita menuju ke pemrograman pada AVR dan ini tidak jauh berbeda dengan pembahasan sebelumnya mengenai kontrol via serial . Jika pembahasan terdahulu komunikasi serial melalui kabel USB to serial dan kontrol dilakukan di PC maka sesuai judul kita akan menggunakan smartphone ANDROID dengan software terminal "SENA Bterm".


SCRIPT

#define F_CPU 4000000UL //sesuaikan dengan xtal yg dipakai
#include <avr/io.h>
#include <util/delay.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <avr/pgmspace.h> 


#define USART_BAUDRATE 9600  //sesuaikan dengan baudrate Bluetooth
#define BAUD_PRESCALE (((F_CPU / (USART_BAUDRATE * 16UL))) - 1) 

//teks reply, sesuaikan dengan keinginan
const char menu[] PROGMEM = " \ntest BLUETOOTH by ahocool\n\r" ;
const char satu[] PROGMEM = " \ntombol 1 \n\r";
const char dua[] PROGMEM = " \ntombol 2 \n\r";
const char tiga[] PROGMEM = " \ntombol 3 \n\r";



void USART_Tx(unsigned char data)
{   
    
   while (!(UCSRA & (1<<UDRE)));{} // wait till transmit Data register is empty
    UDR = data; // Send data to the computer

}

void kirim_text(const char *data)
{
   while (pgm_read_byte(data) != 0x00)
     USART_Tx(pgm_read_byte(data++));
} 




void init_usart(void)
{

cli();

   UCSRB |= (1 << RXEN) | (1 << TXEN);   
   UCSRC |= (1 << UCSZ0) | (1 << UCSZ1); 
   UBRRL = BAUD_PRESCALE; 
   UBRRH = (BAUD_PRESCALE >> 8);
   UCSRB |= (1 << RXCIE);  //interupt serial usart
sei();
  }




ISR(USART_RX_vect)
{ 
 char databyte;
 
  
  databyte = UDR;   

  
     switch (databyte)        
 
  {
 //sesuaikan dengan tombol keyboard yg digunakan
     
     case 0xD : {
             kirim_text(menu) ;
    break; }
     case '1' : {
             kirim_text(satu) ;
    break; }
     case '2' : {
             kirim_text(dua) ;
    break; }
     case '3' : {
             kirim_text(tiga) ;
    break; }      
  
  }  
}  





int main(void)
{
 


 init_usart();


 while(1)
  {
    

  }

return 0;
}



MENJALANKAN DI ANDROID

Jika kamu tidak mempunyai android maka bisa memanfaatkan komputer yg memiliki bluetooth atau membeli dongle/usb bluetooth yg harganya murah saja sekitar 30ribuan. Selanjutnya bisa menggunakan koneksi serial via bluetooth dan software terminal untuk mengakses com port yg dihasilkan oleh dongle. Untuk HP ANDROID maka meluncur saja ke GOOGLE PLAY dan di search "SENA BTerm" dan kemudian di install. Software terminal ini mendukung komunikasi serial ke bluetooth.


Hidupkan modul dan AVR yg sudah terprogram, jumper serial /UART terhubung ke micro AVR, Jumper Key dicabut dan kemudian ditandai dengan led pin 31 yg menyala cepat (2hz) yang berarti "ready for pairing". Jalankan SENA BTerm pada hp android dan kemudian pencet tombol menu dan pilih "bluetooth management" kemudian "connect to" ==> " Device Select ". Kemudian lanjutkan dengan scanning perangkat bluetooth dan pilih sesuai nama bluetooth modul HC05 yang telah diseting sebelumnya. Masukkan juga password pairing yang sesuai.



Untuk melakukan koneksi mode serial maka pencet tombol "Connect (ATDxxxx)" sampai ada muncul tulisan connected data.


Berdasarkan script diatas maka ketika tombol enter, 1, 2 dan 3 ditekan maka akan muncul reply seperti berikut :



Selanjutnya kreativitas tak terbatas dapat dibuat dengan komunikasi wireless ini. Tapi ingat bahwa bluetooth hanya berjarak udara cukup pendek kira-kira 10 meter tanpa halangan dan harap ini menjadi perhatian tersendiri jika ingin medesain suatu system remote jarak jauh.


SELAMAT MENCOBA

Share:

Minggu, 18 Agustus 2013

Instalasi DT HiQ AVR-51 (AVRISP MK2) - AVRSTUDIO - Jungo untuk WIN 64 bit




Bagi kamu yang kebingungan setelah membeli downloader DT-Hiq AVR51 (versi AVRISP MK2) sedangkan komputer yang digunakan WIN 64 bit, berikut saya bagi langkah-langkah yang sebenarnya sudah banyak di share di internet. Tapi buat para pembaca setia yang belum bisa ga ada salahnya kita bahas lagi disini.

Berikan power ke programmer AVR ISP MK2 melalui baterai atau adaptor yg tidak melebihi 5v sehingga led power menyala. Bisa juga menyambung langsung ke rangkaian target sehingga bisa langsung melanjutkan ke proses pemrograman.


Jika tidak menggunakan rangkaian, maka cukup memberi tegangan (+) ke pin header no 2 dan tegangan (-) / Ground ke header pin no 4. Setelah Led hijau menyala maka port usb dapat dicolokkan ke PC/Laptop.



Jika menggunakan win32 biasanya saat instalasi avr studio maka otomatis diberi pilihan untuk menginstal jungo, sedangkan jika menggunakan win64 maka avrstudio versi lawas tidak menyediakan drivernya dan bisa di download disini lalu diextract ke hardisk. Jika menggunakan Atmel Studio 6 sebenernya driver jungo ada di instalasi hanya saja hardwarenya tidak akan kedetect sehingga perlu di "ADD LEGACY HARDWARE" seperti pada gambar di device manager berikut:




Lanjut klik next dan select "Install the hardware, that I manually select from a List (Advanced)" , lalu select "Show All Devices" dan click on "Have disc" dan arahkan ke  "C:\Program Files (x86)\Atmel\AVR Tools\usb64\windrvr6.inf" atau folder tempat extract hasil download sebelumnya.


Pilih "WIN DRIVER" dan kemudian tinggal melanjutkan klik next-next saja. Jika Instalasi benar akan muncul seperti gamabr dibawah serta LED merah (status) pada programmer akan menyala


Selanjutnya AVRSTUDIO dan programmer DT-HiQ yang kamu beli dapat digunakan seperti biasanya.

Untuk yang lebih suka menggunakan AVRDUDE untuk melakukan programming maka perlu menginstal libusb 64 bit yang bisa didownload disini. Selanjutnya tutorial menggunakan AVRDUDE bisa dibaca disini.


SELAMAT MENCOBA ...
Share:

Selasa, 06 Agustus 2013

Kreasi Pembaca: VU Meter Untuk Sound Level dengan ATMega8535 (Versi Digital)



Kreasi pembaca lanjutan dari tulisan sebelumnya merupakan penggabungan dari beberapa pembahasan mengenai penulisan ke lcd dan topik yang membahas tentang ADC (Analog To Digital Converter). Sinyal yang diterima oleh mic condenser kemudian dikuatkan dua kali oleh op-amp LM358 kemudian output yang berupa tegangan ini akan memberikan inputan menuju ADC port pada minimum system 8535. Sebelumnya alangkah baiknya kita ketahui dulu bagaimana response tegangan dengan suara yang tidaklah linear akan tetapi logaritmik.




Microcontroller 8 bit akan mengalami kesulitan jika dipaksakan berhitung di skala logarithmic (entah micronya yg bakal error atau kepala yg bikin script akan pusing hebat). Nah untuk itu kita akan mengambil sampling data sound level dari sebuah bunyi (tone generator) , kemudian kita ukur pada dbMeter yang difungsikan sebagai kalibrator. Pada saat yang bersamaan kita catat pula level pembacaan ADC yang keluar pada layar LCD minimum system. 

Karena sudah memakai minimum system maka rangkaian yg kita tampilkan hanya berupa penguat dari mic condenser.



Klik gambar untuk memperjelas gambar
*) VCC 5v tidak sebagai input, melainkan input dari supply 9-12v


Jika pembaca sudah terbiasa dengan pembahasan ADC ungkin akan sangat mudah tetapi tetap saja saya tempel scriptnya demi kemudahan bagi pembaca setia.


//Insisialisasi awal

#define F_CPU 4000000UL //frek minsys 8535 versi innovative
#include <string.h>
#include <avr/io.h>
#include <util/delay.h>
#include "lcd.h"

// silahkan baca pembahasan menulis di lcd
//fungsi untuk menulis angka ke ASCII LCD
void reverse(char s[]) 
{ 
   int c, i, j; 
    
   for (i = 0, j = strlen(s)-1; i < j; i++, j--){ 
      c = s[i]; 
      s[i] = s[j]; 
      s[j] = c; 
   } 
} 
void itoa(int n, char s[]) 
{ 
   int i, sign; 
    
   if ((sign = n) < 0) // record sign 
      n = -n;         // make n positive 
   i = 0; 
   do {   // generate digits in reverse order 
      s[i++] = n % 10 + '0'; // get next digit 
   } while ((n /= 10) > 0); // delete it 
   if (sign < 0) 
      s[i++] = '-'; 
   s[i] = '\0'; // add null terminator for string 
   reverse(s); 
}  


//insisialisasi ADC

void initADC()
{
ADMUX=(1<<REFS0);// Aref=AVcc;
ADCSRA=(1<<ADEN)|(1<<ADIE)|(7<<ADPS0);
MCUCR |= _BV(SE);  // Sleep Enable, jadi abis ini processor diturunkan loadnya
MCUCR |=_BV(SM0);  // mode ADC NOISE REDUTION
}


//Baca ADC, pilih pin portA yg diinginkan

uint16_t ReadADC(uint8_t ch)
{

   //Select ADC Channel ch must be 0-7
   ch=ch&0b00000111;
   ADMUX|=ch;

   //Start Single conversion

   ADCSRA|=(1<<ADSC);

   //Wait for conversion to complete
   while(!(ADCSRA & (1<<ADIF)));

   //Clear ADIF by writing one to it
   ADCSRA|=(1<<ADIF);

   return(ADC);

}


int main(void)
{


uint16_t baca,decimal,pecahan;
uint8_t a;

//inisialisasi port I/O 

//PORTC menuju LCD & BUzzer
//PC0=buzzer, dapat tidak digunakan
DDRC  |= (1<<PC0)|(1<<PC1)|(1<<PC2)|(1<<PC3)|(1<<PC4)|(1<<PC5)|(1<<PC6)|(1<<PC7);
//PC1=Rs PC2=R/W PC3= E PC4-PC7 = data lcd 4 bit
//inisialisasi LCD
lcd_init(LCD_DISP_ON);
lcd_clrscr();


initADC();
char dum; //dum = variabel sementara penyimpan angka


   while(1)
   {

      baca=ReadADC(1); //baca tegangan output op-amp
      lcd_clrscr();
      lcd_gotoxy(0,0);

    // baca merupakan binner 10 bit, range 0-5V
    // jadi binnernya 0-1023  
    
  // berikut ini untuk buat animasi level VU
 for(a=0; a< (baca/64); a++) 
    {

     if(a<16) lcd_putc(0xFF); //tulis kotak ke LCD sesuai level

 }

// yang ini penentuan level buzzer, gunakan sesuai keinginan 
    if(a>13) PORTC|=(1<< PC0);
 else PORTC &= ~(1<< PC0);

//buzzer dapat tidak digunakan

      
   decimal= (baca * 5)/1000 ;

   pecahan= ( ((baca * 5) - (decimal * 1000) ) /10);

// tampilan tegangan ke LCD
      lcd_gotoxy(0,1);
      lcd_puts("teg =");

      itoa(decimal,&dum);
   lcd_puts(&dum);
   lcd_putc(',');
      
       if(pecahan <10) lcd_putc('0');

      itoa(pecahan,&dum);
   lcd_puts(&dum);

   lcd_puts(" V    ");
  

      _delay_ms(100);  //delay pembacaan, ubah2 sesuai keinginan, makin cepet susah dibaca tapi makin realtime

   }


return 0;

}




Selanjutnya jika menginginkan perhitungan dB (desibel) dari level suara, maka kita buat tabel seperti contoh berikut :


dB P1 P2 P3 AVG BINER
45 2.09 2.22 2.12 2.14 429
50 2.12 2.25 2.19 2.19 437
47 2.15 2.27 2.21 2.21 442
48 2.18 2.31 2.22 2.24 447
49 2.25 2.32 2.23 2.27 453
51 2.28 2.34 2.24 2.29 457
52 2.32 2.35 2.26 2.31 462
53 2.36 2.37 2.27 2.33 467
55 2.41 2.39 2.29 2.36 473
56 2.47 2.42 2.31 2.40 480
58 2.53 2.44 2.33 2.43 487
59 2.56 2.46 2.34 2.45 491
61 2.57 2.48 2.35 2.47 493
62 2.59 2.49 2.37 2.48 497
65 2.60 2.53 2.41 2.51 503
67 2.62 2.54 2.43 2.53 506
68 2.63 2.56 2.44 2.54 509
70 2.66 2.58 2.47 2.57 514 



Dengan perolehan data seperti diatas maka dapat dilakukan pengambilan sample level db vs voltage(rata-rata) kemudian secara mudah dapat dilakukan menggunakan lookup array ataupun paling primitif menggunakan "IF ELSE" saja seperti contoh berikut:




  if( baca <= 429) lcd_puts("<45 dB");
  else if( baca > 429 && baca <= 437 ) lcd_puts(" 45 dB");
  else if( baca > 437 && baca <= 442 ) lcd_puts(" 50 dB");
  else if( baca > 442 && baca <= 447 ) lcd_puts(" 47 dB");
  else if( baca > 447 && baca <= 453 ) lcd_puts(" 48 dB");
  else if( baca > 453 && baca <= 457 ) lcd_puts(" 49 dB");
  else if( baca > 457 && baca <= 462 ) lcd_puts(" 51 dB");
  else if( baca > 462 && baca <= 467 ) lcd_puts(" 52 dB");
  else if( baca > 467 && baca <= 473 ) lcd_puts(" 53 dB");
  else if( baca > 473 && baca <= 480 ) lcd_puts(" 55 dB");
  else if( baca > 480 && baca <= 487 ) lcd_puts(" 56 dB");
  else if( baca > 487 && baca <= 491 ) lcd_puts(" 58 dB");
  else if( baca > 491 && baca <= 493 ) lcd_puts(" 59 dB");
  else if( baca > 493 && baca <= 497 ) lcd_puts(" 61 dB");
  else if( baca > 497 && baca <= 503 ) lcd_puts(" 62 dB");
  else if( baca > 503 && baca <= 506 ) lcd_puts(" 65 dB");
  else if( baca > 506 && baca <= 509 ) lcd_puts(" 67 dB");
  else if( baca > 509 && baca <= 514 ) lcd_puts(" 68 dB");
  else if( baca > 514 ) lcd_puts(">70 dB");



Hasilnya pada video berikut ...jangan terkejut alau kualitas video jelek dan ada suara latar yang sangat "menggetarkan hati..."





Dan seperti biasa kabar gembira muncul dari hasil bimbinganku ini, tugas akhir yang dibuat mahasiswi dari aceh ini mendapatkan nilai "A"  . Duh ...senangnya.....


SELAMAT MENCOBA
Share:

Senin, 29 Juli 2013

Tutorial: Jam 6 Digit + Kalender Dengan Attiny 2313




Siapkan bahan-bahan  seperti berikut:

Attiny 2313 + downloader isp
Bagian power supply

  •     Trafo AC atau Adaptor yang dapat diatur tegangannya
  •     Jika menggunakan Trafo AC, maka ubah-ubah terminal sekunder trafo untuk V Segmen
  •     7805 untuk menurunkan tegangan ke 5V
  •     Baterai backup 3v - 4.5 v

Dioda 1N4002 (4 + 1 )atau Dioda Bridge sebagai penyearah jika memakai Trafo AC
Capasitor 1000uF/25v , 100nF, 22pF (2buah) atau Varco 0-50pF
Resistor 10K (3 buah), 1K 2Buah
Led 4 buah sebagai pembatas digit
ULN 2003
OptoIsolator PC817 atau 4N25 atau yang sejenis (6 buah)
Xtal 4MHz atau sesuai keinginan
Push Buton tactile (2 buah)
7 segment common Anoda ukuran terserah (6 buah)


SKEMATIK




klik untuk memperjelas

Keterangan:


  1. Gunakan power supply berbeda (yang dapat diubah-ubah) untuk V SEGMEN sehingga dapat mengatur kecerahan dari 7 segmen
  2. Untuk mengkompensasi ketidak akuratan xtal, maka salah satu load cap dari xtal dibuat variabel
  3. Nilai Xtal yang digunakan disesuaikan dengan xtal yg tersedia dipasaran, jika berbeda maka silahkan baca pembahasan mengenai counter/timer disini.
  4. Baterai backup akan mencatu attiny jika listrik mati (tanpa display) sehingga time keeping tetap jalan.


SCRIPT


#define F_CPU 4000000UL //sesuaikan xtal yg dipakai
#include <avr/io.h>
#include <util/delay.h>
#include <avr/eeprom.h>
#include <inttypes.h>
#include <avr/interrupt.h>
#include <string.h>

uint8_t jam,menit,detik,bulan,tanggal,tahun,clock,menu,mode,blink; 
uint8_t a = 0;
char bul_max[12]={31,28,31,30,31,30,31,31,30,31,30,31} ;





//tampilan 7 digit 7 segmen dan animasi

void segmen(uint8_t digit)

{
    switch (digit)        
          {

  case 0 :  
     {

   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3)  & ~_BV(PB4) 
            & ~_BV(PB5)  & ~_BV(PB6);

            PORTB |= _BV(PB7);
   
   break;
           }
  case 1 :
     {
      
   PORTB &= ~_BV(PB2) & ~_BV(PB3);

            PORTB |= _BV(PB1)|  _BV(PB4)|  _BV(PB5)|  _BV(PB6)|  _BV(PB7);
   
   break;
           }
  case 2 : 
     {
   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB7) & ~_BV(PB5) & ~_BV(PB4);

            PORTB |= _BV(PB3)|  _BV(PB6) ;
   
      break;
           }  
  case 3 : 
      {

   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB4) & ~_BV(PB7);

            PORTB |= _BV(PB5)|  _BV(PB6) ;
        
   break;
           }
  case 4 :
     {
      
   PORTB &= ~_BV(PB6) & ~_BV(PB2) & ~_BV(PB3) & ~_BV(PB7) ;

            PORTB |= _BV(PB4)|  _BV(PB5) |  _BV(PB1);
   
   break;
           }
  case 5 : 
     {

   PORTB &= ~_BV(PB1) & ~_BV(PB3)  & ~_BV(PB4) & ~_BV(PB7)  & ~_BV(PB6);

            PORTB |= _BV(PB2) |  _BV(PB5);
   
   break;
           }
  case 6 : 
     {

   PORTB &= ~_BV(PB1) & ~_BV(PB3)  & ~_BV(PB4) & ~_BV(PB7)  & ~_BV(PB6) & ~_BV(PB5);

            PORTB |= _BV(PB2) ;
   
      break;
           }
  case 7 : 
     {

   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3);

            PORTB |=  _BV(PB4)|  _BV(PB5)|  _BV(PB6)|  _BV(PB7);
   
      break;
           }  
  case 8 : 
     {
   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3)  & ~_BV(PB4) 
            & ~_BV(PB5)  & ~_BV(PB6)  & ~_BV(PB7);

      break;
           }
  case 9 : 
     {

   PORTB &= ~_BV(PB1) & ~_BV(PB2) & ~_BV(PB3)  & ~_BV(PB4) 
             & ~_BV(PB6)  & ~_BV(PB7);

   PORTB |= _BV(PB5); 

      break;
           }
  case 10 :
     {
         PORTB |= _BV(PB1) |  _BV(PB2) |  _BV(PB3) |  _BV(PB4)|
                _BV(PB5) | _BV(PB6) |  _BV(PB7) ;

      break;
           }
  case 11 :
     {
         PORTB &= ~_BV(PB1);

      PORTB |=  _BV(PB2) |  _BV(PB3) |  _BV(PB4)|
                _BV(PB5) | _BV(PB6) |  _BV(PB7) ;
                

      break;
           }
  case 12 :
     {
         PORTB &= ~_BV(PB4);

      PORTB |=  _BV(PB2) |  _BV(PB3) |  _BV(PB1)|
                _BV(PB5) | _BV(PB6) |  _BV(PB7) ;
                

      break;
           }

  case 13 :
     {
         PORTB &= ~_BV(PB2);

      PORTB |=  _BV(PB4) |  _BV(PB3) |  _BV(PB1)|
                _BV(PB5) | _BV(PB6) |  _BV(PB7) ;
                

      break;
           }

  case 14 :
     {
         PORTB &= ~_BV(PB3);

      PORTB |=  _BV(PB2) |  _BV(PB4) |  _BV(PB1)|
                _BV(PB5) | _BV(PB6) |  _BV(PB7) ;
                

      break;
           }
  case 15 :
     {
         PORTB &= ~_BV(PB5);

      PORTB |=  _BV(PB2) |  _BV(PB3) |  _BV(PB1)|
                _BV(PB4) | _BV(PB6) |  _BV(PB7) ;
                

      break;
           }
  case 16 :
     {
         PORTB &= ~_BV(PB6);

      PORTB |=  _BV(PB2) |  _BV(PB3) |  _BV(PB1)|
                _BV(PB5) | _BV(PB4) |  _BV(PB7) ;
                

      break;
           }

      }

         PORTB =  _BV(PB0) | ~PORTB; //khusus memakai uln2003


}


//posisi scan digit

void posisi(uint8_t pos)

{
    switch (pos)   
    {
    case 0 :  
     {

            PORTD &=  ~_BV(PD0) & ~_BV(PD1) & ~_BV(PD4) & ~_BV(PD5)  & ~_BV(PD6) ;
   
   PORTB &= ~_BV(PB0);
               
   break;
           }

    case 1 :  
     {

            PORTD |= _BV(PD0);

            PORTD &= ~_BV(PD1) & ~_BV(PD4) & ~_BV(PD5)  & ~_BV(PD6) ;
   
   PORTB &= ~_BV(PB0);
               
   break;
           }

    case 2 :  
     {

            PORTD |= _BV(PD1);

            PORTD &= ~_BV(PD0) & ~_BV(PD6) & ~_BV(PD4)  & ~_BV(PD5) ;
   
   PORTB &= ~_BV(PB0);
               
   break;
           }

    case 3 :  
     {

            PORTD |= _BV(PD4);

            PORTD &= ~_BV(PD1) & ~_BV(PD0) & ~_BV(PD5)  & ~_BV(PD6) ;
   
   PORTB &= ~_BV(PB0);
               
   break;
           }


    case 4 :  
     {

            PORTD |= _BV(PD5);

            PORTD &= ~_BV(PD0) & ~_BV(PD1) & ~_BV(PD4)  & ~_BV(PD6) ;
   
   PORTB &= ~_BV(PB0);
               
   break;
           }

    case 5 :  
     {

            PORTD |= _BV(PD6);

            PORTD &= ~_BV(PD0) & ~_BV(PD1) & ~_BV(PD4)  & ~_BV(PD5) ;
   
   PORTB &= ~_BV(PB0);
               
   break;
           }


    case 6 :  
     {

            PORTB |= _BV(PB0);

            PORTD &= ~_BV(PD0) & ~_BV(PD1) & ~_BV(PD4) & ~_BV(PD5)  & ~_BV(PD6) ;
   
               
   break;
           }
         }

}


void animasi(void) //animasi pindah jam-kalender

{
     posisi(1);
     segmen(11);
  _delay_ms(50);
     posisi(2);
     segmen(11);
  _delay_ms(50);
     posisi(3);
     segmen(11);
  _delay_ms(50);
     posisi(4);
     segmen(11);
  _delay_ms(50);
     posisi(5);
     segmen(11);
  _delay_ms(50);

     posisi(6);
     segmen(11);
  _delay_ms(50);
     segmen(13);
  _delay_ms(50);
     segmen(14);
  _delay_ms(50);

     posisi(5);
     segmen(12);
  _delay_ms(50);
     posisi(4);
     segmen(12);
  _delay_ms(50);
     posisi(3);
     segmen(12);
  _delay_ms(50);
     posisi(2);
     segmen(12);
  _delay_ms(50);

     posisi(1);
     segmen(15);
  _delay_ms(50);
     segmen(16);
  _delay_ms(50);

}


void tulis(void) //tulis ke 7 segmen

{

     posisi(1);
 
 if(menu == 1 && TCNT1 < 20000) segmen(10); //edit jam
 else    segmen((jam/10));
  _delay_ms(1);
     segmen(10);


     posisi(2);
 if(menu == 1 && TCNT1 < 20000) segmen(10); //edit jam
 else  segmen((jam%10));
  _delay_ms(1);
     segmen(10);

 
 
     posisi(3);
 if(menu == 2 && TCNT1 < 20000) segmen(10); //edit menit
 else    segmen((menit/10));
  _delay_ms(1);
     segmen(10);


     posisi(4);
 if(menu == 2 && TCNT1 < 20000) segmen(10); //edit menit
 else    segmen((menit%10));
     _delay_ms(1);
     segmen(10);

     
  posisi(5);
 if(menu == 3 && TCNT1 < 20000) segmen(10); //edit detik
 else     segmen((detik/10));
  _delay_ms(1);
     segmen(10);

    
  posisi(6);
 if(menu == 3 && TCNT1 < 20000) segmen(10); //edit detik
 else    segmen((detik%10));
  _delay_ms(1);
     segmen(10);


}

void tanggalan(void)

{

     posisi(1);
  if(menu == 4 && TCNT1 < 20000) segmen(10); //edit tgl
 else   segmen((tanggal/10));
  _delay_ms(1);
     segmen(10);


     posisi(2);
  if(menu == 4 && TCNT1 < 20000) segmen(10); //edit tgl
 else    segmen((tanggal%10));
  _delay_ms(1);
     segmen(10);

     posisi(3);
  if(menu == 5 && TCNT1 < 20000) segmen(10); //edit bulan
 else    segmen((bulan/10));
  _delay_ms(1);
     segmen(10);


     posisi(4);
  if(menu == 5 && TCNT1 < 20000) segmen(10); //edit bulan
 else    segmen((bulan%10));
     _delay_ms(1);
     segmen(10);

     
  posisi(5);
  if(menu == 6 && TCNT1 < 20000) segmen(10); //edit tahun
 else    segmen((tahun/10));
  _delay_ms(1);
     segmen(10);

    
  posisi(6);
 if(menu == 6 && TCNT1 < 20000) segmen(10); //edit tahun
 else     segmen((tahun%10));
  _delay_ms(1);
     segmen(10);


}


//INTERUPT 1 DETIK

ISR(TIMER1_COMPA_vect) 

{ 


detik++;
clock++;


if(detik == 60)

{  
   detik=0;
   menit++;

if(menit == 60)

     { menit=0; 
       jam++;
     }

if (jam == 24) 

{ tanggal++; jam = 0 ; }

       
    if(tahun%4 == 0) bul_max[1]=29;
       else bul_max[1]=28; 

if (tanggal > bul_max[bulan-1]) {bulan++; tanggal =1 ;}

if (bulan > 12) {tahun++;  bulan=1; }



}




}


void tombol(void)
{

if(bit_is_clear(PIND, PIND2)) 
   { 

if(menu == 0) menu =1;

else if (menu == 1) menu=2;

else if (menu == 2) menu=3; 

else if (menu == 3) menu=4; 

else if (menu == 4) menu=5; 

else if (menu == 5) menu=6; 

else if (menu == 6) menu=0; 

 
_delay_ms(200);

 }




else if(bit_is_clear(PIND, PIND3)) 
   { 

if(mode==0 && menu == 0)
{ animasi();  
  mode=1; 
  clock=0; }

else if(mode ==1 && menu ==0)
{mode=0;
clock=0;
}


if(menu == 1) 
{ jam ++;
  if (jam == 24) jam =0;
}

else if(menu == 2) 
{ menit ++;
  if (menit == 60) menit =0;
}

else if(menu == 3) detik = 0;

else if(menu == 4) 
{ tanggal++;
  if (tanggal == 32) tanggal =1;
}

else if(menu == 5) 
{ bulan++;
  if (bulan == 13) bulan =1;
}

else if(menu == 6) 
{ tahun++;
  if (tahun == 100) tahun=0;
}


_delay_ms(200);

}


}

int main(void)
{



 
 DDRD |= _BV(PD0) | _BV(PD1) | _BV(PD4) | _BV(PD5) | _BV(PD6) ; //scan digit
 DDRB |= _BV(PB0) | _BV(PB1) | _BV(PB2) | _BV(PB3) | _BV(PB4) | _BV(PB5) | _BV(PB6) | _BV(PB7) ; //segment
 DDRD &= ~_BV(PD2) & ~_BV(PD3); //tombol
  

// ------------ini untuk xtal 4Mhz----------------------
   TCCR1B |= (1 << WGM12); 
   TIMSK |= (1 << OCIE1A); 
   OCR1A  = 62499;
   TCCR1B |= (1 << CS11)|(1 << CS10); 
//------------------------------------------------------

 

jam = 0;
menit= 0;
detik=0;
tanggal=1;
bulan=1;
tahun=11;
clock=0; //perpindahan animasi jam dan kalender
mode=0;
menu=0;

sei();



 while(1)
 {
     
     if(clock == 40 && mode == 1 && menu == 0)
    { animasi();}

  else if(clock > 40 && clock <50 && mode == 1 && menu == 0) 
       {
        
        tanggalan();
    }
     else if(clock == 50 && mode == 1 && menu == 0)

   { animasi(); clock =0; }
  
  else if(menu == 0)
  { tulis(); }

  else if(menu > 3)
  { tanggalan(); }

  else 
  { tulis(); }

         
tombol();   

    }
return 0;
}




ALTERNATIF UNTUK 7 SEGMEN LEBIH BESAR

Optoisolator PC817 mempunyai kekurangan yaitu dayanya kecil sehingga arus yg dapat dialirkan kecil saja. Hal ini akan menyebabkan 7 segmen besar menjadi redup sehingga perlu ditambahkan transistor yg memiliki daya lebih dan dengan rangkaian common Emiter menggunakan transistor PNP seperti BD140  dan PC817 sebagai control base nya (bisa juga transistor NPN 2N3906/2222)  dengan contoh rangkaian pengganti sebagai berikut:





HASIL




SELAMAT MENCOBA
Share:

Kamis, 27 Juni 2013

Tutorial : Membuat RTC internal pada AVR


Real Time Clock mempunyai fungsi sebagai pewaktu stand-alone yang akan hidup walaupun rangkaian utama mati. Jadi pada intinya informasi waktu akan tersedia kapanpun diinginkan. Sadarkah kamu kalau RTC yg umum dipasaran seperti DS1307 (serial) atau 12C887 (parallel) memiliki note ini pada datasheet ?



Nah...untuk itu kita kembali review ke posting yang membahas mengenai timer/counter disini . Semua fungsi timer dapat dihasilkan oleh sebuah IC AVR. Tingkat akurasi? asal programmingnya tidak menggunakan delay manual dan proses interupt dijaga sesimple mungkin maka sesuai pengalaman penulis sangatlah akurat, apalagi menggunakan clock input yang berasal dari xtal dengan kualitas yang bagus.

Kalau power diputus bagaimana cara pewaktu tetap jalan ? Tenang saja, cukup menggunakan baterai 4.5v(3 x AA) seperti rangkaiana berikut :





Prinsip rangkaian diatas adalah sebagai berikut:


  1. Regulator 5v menghasilkan tegangan VCC 5v dan akan mencatu rangkaian selama terdapat tegangan Vin (input regulator).
  2. Baterai 4.5v dan dioda akan menghasilkan tegangan 4.5v dikurangi 0.7v  = 3.8 volt yang sesuai dengan hukum khircof maka tegangan yang muncul di ujung dioda (ketika ada input di regulator) adalah 5 volt. Baterai akan aman dari tegangan balik karena ada dioda.
  3. Ketika tegangan input (Vin) hilang alias mati lampu, maka otomatis baterai akan mencatu rangkaian walaupun hanya menggunakan 3.8 volt. Microcontroller sekelas AVR menggunakan tegangan dengan range yang lebar (2.7 - 5.5  volt) terutama pada seri yang ada embel2nya "L" atau "LV", dengan catatan tidak ada proses yang sensitif terhadap penurunan catu daya seperti ADC. Ini dapat diakali dengan berbagai cara salah satunya melakukan pengukuran Vref atau menghentikan perhitungan ADC dan sebagainya.


Kita akan lanjut pada contoh pemakaiannya dengan memperhatikan script menulis tanggal dan jam di LCD dibawah ini, siapkan rangkaian seperti pada penjelasan menulis lcd disini :



Untuk lebih akurat, kaki 4 & 5 dihubungkan ke xtal (sesuai script 4Mhz) 
dan tiap kaki xtal dihubungkan dengan capasitor 22pF ke ground
Untuk Baterai backup dan tegangan 5v digunakan seperti contoh sebelumnya



/*=============================
JAM AKURAT dengan RTC INTERNAL
ATTINY 2313 , 4Mhz Xtal Clock
by: ahocool@gmail.com    
www.aisi555.com
=============================*/
#define F_CPU 4000000UL //sesuaikan dengan clock yang dipakai
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
#include "lcd.h" //silahkan baca pembahasan menulis di LCD
#include <string.h>

uint8_t jam,menit,detik,bulan,tanggal,tahun; 
char bul_max[13]={0,31,28,31,30,31,30,31,31,30,31,30,31} ;
const char bul_name[13][4] PROGMEM={"xxx","Jan","Feb","Mar","Apr","Mei","Jun","Jul","Ags","Sep","Okt","Nov","Des"} ;
void reverse(char s[]) 
{ 
   int c, i, j; 
    
   for (i = 0, j = strlen(s)-1; i < j; i++, j--){ 
      c = s[i]; 
      s[i] = s[j]; 
      s[j] = c; 
   } 
} 
void itoa(int n, char s[]) 
{ 
   int i, sign; 
    
   if ((sign = n) < 0) // record sign 
      n = -n;         // make n positive 
   i = 0; 
   do {   // generate digits in reverse order 
      s[i++] = n % 10 + '0'; // get next digit 
   } while ((n /= 10) > 0); // delete it 
   if (sign < 0) 
      s[i++] = '-'; 
   s[i] = '\0'; // add null terminator for string 
   reverse(s); 
}
void init_jam(void)
{
   TCCR1B |= (1 << WGM12); // Configure timer 1 for CTC mode
   TIMSK |= (1 << OCIE1A); // Enable CTC interrupt 
   OCR1A  = 62499; //compare the CTC A 
   TCCR1B |= (1 << CS11)|(1 << CS10); // Start timer at Fcpu/64
   TCNT1 = 0;
   sei();
} 



void tulis_lcd(void)
{
char dum;

lcd_clrscr();


lcd_gotoxy(3,0);
itoa(tanggal,&dum);
lcd_puts(&dum);
lcd_putc('-');
lcd_puts_p(bul_name[bulan]);
lcd_puts("-20");
itoa(tahun,&dum);
lcd_puts(&dum);

lcd_gotoxy(5,1);
itoa(jam,&dum);
lcd_puts(&dum);
lcd_putc(':')
if(menit<10) lcd_putc('0');
itoa(menit,&dum);
lcd_puts(&dum);
lcd_putc(':');
if(detik<10) lcd_putc('0');
itoa(detik,&dum);
lcd_puts(&dum);
}


ISR(TIMER1_COMPA_vect) //Interupt timer
{

detik++;
if(detik == 60)

{  detik=0;
   menit++;
}

if(menit == 60)
     {    jam++;
   menit=0;      
     }
if (jam == 24) 
     { tanggal++; 
       jam = 0 ; 
      }
if(tahun%4 == 0) bul_max[2]=29;  //kabisat
else bul_max[2]=28; 

if (tanggal > bul_max[bulan]) {bulan++; tanggal =1 ;}

if (bulan > 12) {tahun++;  bulan=1; }

tulis_lcd();

}


int main(void)
{

/*ini inisialisasi awal jam, untuk merubah jam saat program jalan dapat menggunakan tombol , cek di pembahasan lain untuk cara pembacaan tombol */ 
jam = 20;
menit=20;
detik=14;
tanggal=16;
bulan=6;
tahun=13;


init_jam();
lcd_init(LCD_DISP_ON);
lcd_clrscr();


while(1){ }

}
 

Mudah bukan? Selamat Mencoba ...
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 (24) 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