April 30, 2012

Kunci Otomatis menggunakan AVR ATMEGA16

Ini postingan pertama saya dalam hal mikrokontroller seri ATMEGA16. Saya anggap yang sedang membaca artikel saya ini telah mengerti tentang mikrokontroler khususnya ATMEGA. Disini saya menggunakan compiler CVAVR Codevison dengan simulasi proteus. Program ini saya ambil dari elektro-kontrol.blogspot.com tapi dengan menggunakan keypad 3x4...(kalo di web aslinya pakai keypad 4x4). Jadi saya cuma modif sedikit saja.


berikut penjelasan dari elektro-kontrol.blogspot.com

Mungkin teman-teman semua sudah tahu tentang aplikasi yang bernama pengunci pintu (door lock) berpassword, pada aplikasi ini sudah saya realisasikan pada hardware yang sesungguhnya dan berhasil.

Kesulitan utama dari aplikasi ini adalah ketika seorang user memasukkan password dengan menggunakan keypad, kita harus dapat menyimpan input yang berasal dari keypad kedalam satu variabel. Misalnya user menekan 6, lalu 2, lalu 0 dan 4 berarti passwornya adalah 6204 (misalkan). Nilai tersebut harus dijadikan dalam 1 variabel yang kemudian akan dibandingkan dengan password yang sebenarnya. Jika user memasukkan password dengan benar maka akan membuka kunci, jika salah maka kunci tidak akan terbuka.

Untuk mengatasi masalah tersebut saya menggunakan array untuk mendeteksi berapa kali penekanan keypad dan angka berapa yang akan ditekan. Baiklah disini saya akan menjelaskan algoritma yang saya buat. Jika user menekan 6, lalu 2 lalu 0 dan 4 maka seperti ini logikanya:

Awalnya saya deklarasikan array sebagai berikut:
array[10], i=0;

saat terjadi penekanan angka 6 maka;
i++ (saya increamentkan) jadi i=1
kemudian angka 6 saya simpan pada variabel array[i] jadi array[1]=6

kemudian saat terjadi penekanan angka 2, maka:
i++ (saya increamentkan lagi) jadi i=2
kemudian angka 2 saya simpan pada variabel array[i] jadi array[2]=2

kemudian saat terjadi penekanan angka 0, maka:
i++ (saya increamentkan lagi) jadi i=3
kemudian angka 0 saya simpan pada variabel array[i] jadi array[3]=0

kemudian saat terjadi penekanan angka 4, maka:
i++ (saya increamentkan lagi) jadi i=4
kemudian angka 4 saya simpan pada variabel array[i] jadi array[4]=4
maka didapat array[1]=6, array[2]=2, array[3]=0, array[4]=4

kalo sudah didapat seperti diatas maka kita tinggal kumpulkan dalam satu variabel (nama variabelnya misalkan nilai) caranya:

saat i bernilai 1, i=1 kita hitung dengan rumus:
nilai=array[1]  //jadi nilai=6

saat i bernilai 2, i=2 kita hitung dengan rumus:
nilai=(array[1]*10)+array[2]  //jadi nilai=62

saat i bernilai 3, i=3 kita hitung dengan rumus:
nilai=(array[1]*100)+(array[2]*10)+array[3]  //jadi nilai=620

saat i bernilai 4, i=4 kita hitung dengan rumus:
nilai=(array[1]*1000)+(array[2]*100)+(array[3]*10)+array[4]  //jadi nilai=6204
Sudah mengerti bukan, dari rumus-rumus diatas masih dapat disederhanakan, menjadi:

jika i=1
nilai=array[i]

jika i bernilai (i>=2 dan i<=8)
nilai=(nilai*10)+array[i]
Banyaknya penekanan tombol saya batasi sampai 8 kali. Sebenarnya saya ingin membuatnya sampai 10 kali tetapi saat saya coba tidak berjalan dengan lancar saat penekanan ke 9 kali. Saya tidak tahu kenapa? Jika teman-teman bisa memecahkannya tolong beri tahu saya!

Baiklah kembali lagi ke aplikasi yang akan kita buat. Langsung saja ke cara kerjanya, gambar rangkaiannya bisa anda lihat dibawah ini. Saat pertama kali alat ini saya nyalakan maka dalam keadaan tidak terkunci (unlock), untuk menguncinya (lock) anda harus menekan tombol = (lihat gambar keypad dibawah). Setelah terkunci, jika anda ingin membukanya kembali anda harus memasukkan passwordnya (jika sudah mengetikan password tekan tombol + untuk memasukkannya). Jika benar maka akan membuka kunci, tetapi jika salah kunci tidak akan terbuka. Ketika sudah terbuka maka cara kerjanya kembali lagi ke awal. Sedangkan tombol ON/C saya gunakan untuk menghapus password jika salah dalam pengetikannya. Untuk indikator kuncinya saya menggunakan sebuah LED, jika LED menyala maka dalam keadaan tidak terkunci dan jika mati dalam keadaan terkunci.



/*****************************************************
This program was produced by the
CodeWizardAVR V1.24.6 Professional
Automatic Program Generator
© Copyright 1998-2005 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
e-mail:office@hpinfotech.com

Project : 
Version : 
Date    : 9/20/2011
Author  : F4CG                            
Company : F4CG                            
Comments: 


Chip type           : ATmega16
Program type        : Application
Clock frequency     : 12.000000 MHz
Memory model        : Small
External SRAM size  : 0
Data Stack size     : 256
*****************************************************/

#include <mega16.h>
#include <delay.h>
#include <stdlib.h>
#include <stdio.h>


// Alphanumeric LCD Module functions
#asm
   .equ __lcd_port=0x15 ;PORTC
#endasm
#include <lcd.h>

// Declare your global variables here
float nilai=0,password=321;
char temp[12],array[10],i=0,index=0;

void lock()
{
while(index==0)
{
  lcd_gotoxy(0,0);
  lcd_putsf("please press #");
  lcd_gotoxy(0,1);
  lcd_putsf("to lock");
  
  PORTB=0b10111111;
  delay_ms(10);
  if(PINB.3==0)
  {
  index=1;
  PORTD.1=1;//terkunci
  lcd_clear();
  lcd_gotoxy(0,0);
  lcd_putsf("LOCKED");
  delay_ms(100);
  lcd_clear();
  
  }
}
 }

void enter()
{
if(nilai==password)
{                  
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Unlock");
delay_ms(100);
i=0; nilai=0;
PORTD.1=0;//kunci terbuka
index=0;
}       
else
{
lcd_clear();
lcd_gotoxy(0,0);
lcd_putsf("Wrong Password");
i=0; nilai=0;
index=1;//masih terkunci
}
}                       

void simpan_dalam1variabel()
{
if(i==1)
{nilai=array[i];}
if(i>=2 && i<=11)
{nilai=(nilai*10)+array[i];}
}                           

void scanning_keypad()
{                              

lcd_gotoxy(0,0);
lcd_putsf("enter u'r pass:");

PORTB=0b11101111;
delay_ms(3);
if(PINB.0==0)
{i++;array[i]=1;simpan_dalam1variabel();delay_ms(30);}
if(PINB.1==0)
{i++;array[i]=4;simpan_dalam1variabel();delay_ms(30);}
if(PINB.2==0)
{i++;array[i]=7;simpan_dalam1variabel();delay_ms(30);}
if(PINB.3==0)
{enter();delay_ms(30);}

PORTB=0b11011111;
delay_ms(3);
if(PINB.0==0)
{i++;array[i]=2;simpan_dalam1variabel();delay_ms(30);}
if(PINB.1==0)
{i++;array[i]=5;simpan_dalam1variabel();delay_ms(30);}
if(PINB.2==0)
{i++;array[i]=8;simpan_dalam1variabel();delay_ms(30);}
if(PINB.3==0)
{i++;array[i]=0;simpan_dalam1variabel();delay_ms(30);}

PORTB=0b10111111;
delay_ms(3);
if(PINB.0==0)
{i++;array[i]=3;simpan_dalam1variabel();delay_ms(30);}
if(PINB.1==0)
{i++;array[i]=6;simpan_dalam1variabel();delay_ms(30);}
if(PINB.2==0)
{i++;array[i]=9;simpan_dalam1variabel();delay_ms(30);}
if(PINB.3==0)
{delay_ms(30);}
}        
void tampil_lcd()
{
if(nilai>0)
{
ftoa(nilai,0,temp);
lcd_gotoxy(0,1);
lcd_puts(temp);
}
}
void main(void)
{
// Declare your local variables here

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

// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In 

April 19, 2012

Tutorial Seven Segment dengan AVR GCC / winAVR

 
Sebelumnya saya sudah pernah memposting tentang Tutorial Seven Segment dengan CodeVision AVR, untuk mengetahui tentang Seven Segment itu sendiri bisa dilihat pada postingan sebelumnya tersebut.
Kali ini saya akan memberikan tutorial untuk menampilkan dispkay angka pada Seven Segment dengan program AVR Studio atau winAVR.


Rangkaian Skematiknya sbb:




Ada dua cara untuk menampilkan tulisan pada Seven Segment dengan AVR Studio ini, cara pertama listing programnya sebagai berikut:

/*
================================================
Program Seven Segment Display dengan AVR Studio
Programmer     : Wahyu Rahmaniar
Company        : Technologination                
================================================
 */


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

#define DATA_DDR     DDRC
#define DATA_PORT      PORTC
#define Pin_a             0
#define Pin_b             1
#define Pin_c             2
#define Pin_d             3
#define Pin_e             4
#define Pin_f             5
#define Pin_g             6
//#define Pin_Dec         7
#define F_CPU 12000000ul

void Display(int a);

  void main(void)
 
  {
  unsigned int i;
  i=0;
  DATA_DDR = 0XFF;
  do
  {
  Display(i);
  i++;
  if(i>9) i=0;
  _delay_ms(3000);
  }
  while(1);
   
 }

  void Display(int a)
  {
  switch(a)
  {
  case 0: 
  DATA_PORT = 0b11000000;
  break;           
  case 1:           
  DATA_PORT = 0b11111001;
  break;           
  case 2: 
  DATA_PORT = 0b10100100;
  break;
           
  case 3: 
  DATA_PORT = 0b10110000;
  break;       
  case 4: 
  DATA_PORT = 0b10011001;
  break;
  case 5: 
  DATA_PORT = 0b10010010;
  break;           
  case 6: 
  DATA_PORT = 0b10000011;
  break;           
  case 7: 
  DATA_PORT = 0b11111000;
  break;           
  case 8: 
  DATA_PORT = 0b10000000;
  break;       
  case 9: 
  DATA_PORT = 0b10011000;
  break;                   
    }
}


Cara Kedua listing programnya sebagai berikut:

/* 
================================================
Program Seven Segment Display dengan AVR Studio
Programmer     : Wahyu Rahmaniar
Company        : Technologination     
================================================           
*/

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

#define DATA_DDR     DDRC
#define DATA_PORT      PORTC
#define Pin_a             0
#define Pin_b             1
#define Pin_c             2
#define Pin_d             3
#define Pin_e             4
#define Pin_f             5
#define Pin_g             6
#define Pin_Dec         7
#define F_CPU 12000000ul

void Display(int a);

  void main(void) 
  {
  unsigned int i;
  i=0;
  DATA_DDR = 0XFF;
  do
  {
  Display(i);
  i++;
  if(i>9) i=0;
  _delay_ms(3000);
  }
  while(1);   
 }

  void Display(int a)
  {
  switch(a)
  {
  case 0: 
            DATA_PORT|=_BV(Pin_g);
            DATA_PORT&=~(_BV(Pin_a)|_BV(Pin_b)|_BV(Pin_c)|_BV(Pin_d)|_BV(Pin_e)|_BV(Pin_f));
            break;           
  case 1:           
            DATA_PORT|=(_BV(Pin_a)|_BV(Pin_d)|_BV(Pin_e)|_BV(Pin_f)|_BV(Pin_g));
            DATA_PORT&=~(_BV(Pin_b)|_BV(Pin_c));
            break;           
  case 2:
            DATA_PORT|=(_BV(Pin_c)|_BV(Pin_f));
            DATA_PORT&=~(_BV(Pin_b)|_BV(Pin_d)|_BV(Pin_e)|_BV(Pin_a)|_BV(Pin_g));
            break;
  case 3: 
            DATA_PORT|=(_BV(Pin_e)|_BV(Pin_f));
            DATA_PORT&=~(_BV(Pin_c)|_BV(Pin_d)|_BV(Pin_a)|_BV(Pin_b)|_BV(Pin_g));
            break;
  case 4: 
            DATA_PORT|=(_BV(Pin_a)|_BV(Pin_d)|_BV(Pin_e));
            DATA_PORT&=~(_BV(Pin_c)|_BV(Pin_b)|_BV(Pin_f)|_BV(Pin_g));
            break;
  case 5: 
            DATA_PORT|=(_BV(Pin_b)|_BV(Pin_e));
            DATA_PORT&=~(_BV(Pin_a)|_BV(Pin_c)|_BV(Pin_d)|_BV(Pin_f)|_BV(Pin_g));
            break;
           
  case 6: 
            DATA_PORT|=(_BV(Pin_a)|_BV(Pin_b));
            DATA_PORT&=~(_BV(Pin_c)|_BV(Pin_d)|_BV(Pin_f)|_BV(Pin_g)|_BV(Pin_e));
            break;
  case 7: 
            DATA_PORT|=(_BV(Pin_d)|_BV(Pin_e)|_BV(Pin_f)|_BV(Pin_g));
            DATA_PORT&=~(_BV(Pin_a)|_BV(Pin_c)|_BV(Pin_b));
            break;
  case 8: 
            DATA_PORT&=~(_BV(Pin_a)|_BV(Pin_d)|_BV(Pin_e)|_BV(Pin_c)|_BV(Pin_b)|_BV(Pin_f)|_BV(Pin_g));
            break;
  case 9: 
            DATA_PORT|=(_BV(Pin_d)|_BV(Pin_e));
            DATA_PORT&=~(_BV(Pin_a)|_BV(Pin_c)|_BV(Pin_b)|_BV(Pin_f)|_BV(Pin_g));
            break;                   
    }
}


Kedua program di atas fungsinya sama yaitu untuk menampilkan angka 0 sampai 9 pada 7 segment display.

Simulasi dan listing program lengkapnya bisa di download disini.


sumber

April 16, 2012

Alasan Koruptor Disamakan dengan Tikus

gambar tikus-tikus berdasi


Kalo DK perhatikan di media kenapa koruptor dilambangkan dengan tikus kenapa tidak tomket saja atau komodo kan lebih asik di lihat? Hmm, mungkin karena mereka memiliki beberapa kesamaan, antara lain sama-sama:
1. Suka Nyolong
Koruptor dan tikus dua-duanya memiliki kesamaan suka nyolong. Bedanya kalo tikus nyolong makanan kamu, sementara kalo koruptor nyolong duit kamu (yang harusnya bisa buat beli makanan juga).Tapi mungkin perbedaan mendasarnya adalah apa yang mendasari mereka nyolong. Tikus nyolong karena memang mereka harus bertahan hidup, sementara koruptor nyolong karena…karena apa ya? Karena hobi mugkin. Hanya dia dan tuhan saja yang tau alasannya :D

2. Susah Ditangkep
Tikus dan koruptor sama-sama susah ditangkap. Mereka sangat gesit dalam hal kabur dan pinter banget sembunyi. Bedanya kalo tikus sembunyi di belakang lemari atau di gorong-gorong, kalo koruptor sembunyinya di luar negeri, pake duit yang dia colong dari kamu.hemmm :3

3. Pantesnya Dihukum Mati
Koruptor dan tikus memang pantesnya dihukum mati aja. Bedanya kalo tikus pantesnya dihukum mati karena bisa menyebarkan penyakit, sementara kalo koruptor p dihukum mati karena…menyebarkan penyakit juga sih. Sama nyolong duit kamu. Tapi lebih ke karena mereka nyolong duit kamu. Kampret lah pokoknya.

4. Bermuka Busuk
Yah, biasanya keduanya sama-sama bermuka busuk. Kamu kadang-kadang bisa nemu tikus yang lucu sih, tapi lebih sering kamu udah jijik duluan kan liatnya. Sama halnya dengan koruptor lah.

Yah begitulah kira-kira. Semoga membantu kamu dalam mempelajari perkorupsian. Ada yang kurang? kalo DK_lover ingin menambahkan Silakan tambahkan pendapat kamu di comment. :)



April 14, 2012

Tutorial Seven Segment dengan CodeVision AVR

Tutorial Seven Segment dengan CodeVision AVR

Seven Segment adalah komponen yang terdiri dari tujuh led yang tersusun sedemikian rupa sehingga dapat digunakan untuk menampilkan angka 0-9 dan titik atau koma. Seven Segment seperti led pada umunya memiliki berbagai macam tampilan warna, yaitu merah, kuning, hijau, dsb dan berbagai macam ukuran.
Seven segment berdasarkan input logikanya terbagi menjadi dua macam, yaitu Common Anoda (input logika 0) dan Common Cathoda (input logika 1).
Hal yang perlu diperhatikan dalam setiap komponen seven segment adalah pin-pin pada yang mewakili urutan segmentnya (A-G dan titik), karena tidak semua seven segment sama urutannya walaupun sama ukurannya.

Salah satu contoh urutan kaki pada seven segment adalah sbb:



Ada berbagai macam cara dalam menampilkan seven segment, antara lain dengan menggabungkan langsung setiap pin 7 segment ke pin mikro, menggabungkan pin-pin 7 segment (sehingga yang terhubung ke mikro cuma 7 pin walaupun memakai lebih dari satu buah 7 segment) dengan common setiap 7 segment ke satu pin mikro, menggunakan IC BCD (cara ini lebih mudah, karena tidak perlu memikirkan data setiap led 7 segment, hanya mengirimkan data angka 0-9), dan menggunakan IC Shift Register.

Pada tutorial kali ini saya menggunakan cara kedua, yaitu menggabungkan setiap pin-pin 7 segment (saya menggunakan 3 buah 7 segment) dengan setiap pin common masing-masing 7 segment terhubung pada 1 pin mikrokontroler.


Seven Segment yang saya gunakan adalah Common Anoda, karena logika yang dikirimkan adalah 0 sehingga lebih sedikit power yang terbagi.


Contoh programnya dengan CodeVision AVR adalah sbb:

/*****************************************************
Tutorial 7SEGMENT dengan CodeVision AVR
Programmer : WAHYU RAHMANIAR
Company : TECHNOLOGINATION
*****************************************************/

#include
#include
#include
// Alphanumeric LCD Module functions
#asm
.equ __lcd_port=0x1B ;PORTA
#endasm
#include


// Declare your global variables here
char satuan, puluhan, ratusan, urut;
unsigned int data, data_temp;
unsigned int i;
unsigned char Baris1[16];

void tampil()
{
PORTD=ratusan;//mengirimkan data ratusan
PORTB=0x80;//menyalakan digit1
delay_ms(50);

PORTD=puluhan;//mengirimkan data puluhan
PORTB=0x40;//menyalakan digit2
delay_ms(50);

PORTD=satuan;//mengirimkan data satuan
PORTB=0x20;//menyalakan digit3
delay_ms(50);
//lamanya waktu scanning ditentukan oleh intruksi delay
}

void nyala_led()//fungsi untuk mengubah kedalam format 7segment
{
if (urut==0){urut=0xc0;}
if (urut==1){urut=0xf9;}
if (urut==2){urut=0xa4;}
if (urut==3){urut=0xb0;}
if (urut==4){urut=0x99;}
if (urut==5){urut=0x92;}
if (urut==6){urut=0x82;}
if (urut==7){urut=0xf8;}
if (urut==8){urut=0x80;}
if (urut==9){urut=0x90;}
}

void main(void)
{
PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0xE0;

PORTC=0x00;
DDRC=0x00;

PORTD=0xFF;
DDRD=0xFF;

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

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

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

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

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

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

// LCD module initialization
lcd_init(16);
//PORTB.0=1;
i=0;
while (1)
{
if(PORTB.0==0)
{
i++;
}

data=i;

sprintf(Baris1,"Counter=%5u",data);
lcd_gotoxy(0,0);
lcd_puts(Baris1);

data_temp=data;
ratusan=data_temp/100;
urut=ratusan;
nyala_led();
ratusan=urut;

data_temp=data_temp%100;
puluhan=data_temp/10;
urut=puluhan;
nyala_led();
puluhan=urut;

satuan=data_temp%10;
urut=satuan;
nyala_led();//fungsi untuk menyalakan led 7segment
satuan=urut;

tampil();//fungsi untuk mengaktifkan 7segment berdasarkan urutan
delay_ms(1000);
lcd_clear();

};
}

Simulasi dengan proteus dan program dengan CV AVR dapat didownload
disini.

sumber

program Jam Digital

DS1307 merupakan IC Real Time Clock (RTC) yang dapat diakses dengan mikrokontroler menggunakan komunikasi serial I2C. Berikut ini saya beri contoh untuk menampilkan RTC DS1307 pada LCD dan Hyperterminal menggunakan Bascom AVR. Dengan adanya RTC ini maka kita dapat menampilkan waktu yang berupa jam, menit, dan detik, serta tanggal, yaitu hari, bulan dan tahun, untuk selengkapnya bisa dilihat di datasheet.

Berhubung gambar dibawah ini dimaksudkan untuk kepentingan simulasi langsung dengan Proteus, maka kalau ingin mempraktekkannya dengan alat yang nyata, virtual terminal ini dapat diganti dengan rangkaian serial atau biasanya menggunakan IC MAX232, sebagai berikut:



Hyperterminal dapat diakses dengan meng-klik Start --> All Programs --> Accessories --> Communications --> Hyperterminal. Kemudian lakukan pengaturan sesuai yang diminta pada wizard jika Hyperterminal baru pertama kali dibuka, selanjutnya pilih COM port yang digunakan atau terhubung dengan kabel DB9 atau USB, dan baud rate yang digunakan, dalam program ini saya menggunakan baud rate 9600.

Contoh tampilan pada Hyperterminal sbb:


Dan jangan lupa, agar jam dan tanggal pada RTC tetap dapat berjalan pada alat, pasang baterai lithium 3 volt pada kaki 3 atau VBat.

Simulasi dengan Proteus:



Data jam dan tanggal pada RTC dapat diubah pada Hyperterminal, tekan huruf "A" pada keyboard untuk mengganti data jam, dan huruf "B" untuk mengganti data tanggal.



Listing program Bascom AVR nya:
'=======================================================
'Programmer: Wahyu Rahmaniar
'Company   : Technologination
'
'RTC DS1307
'=======================================================

$regfile = "m32def.dat"
$crystal = 8000000
$baud = 9600

Config Lcdpin = Pin , Rs = Portc.2 , E = Portc.3 , Db4 = Portc.4 , Db5 = Portc.5 , Db6 = Portc.6 , Db7 = Portc.7
Config Lcd = 16 * 2

$lib "ds1307clock.lib"

Config Sda = Portc.1
Config Scl = Portc.0
Const Ds1307w = &HD0
Const Ds1307r = &HD1

Config Clock = User

Dim Weekday As Byte
Dim Char As String * 10 , Tanda As String * 1
Dim Jam As String * 10 , Menit As String * 10 , Detik As String * 10
Dim Hari As String * 10 , Bulan As String * 10 , Tahun As String * 10
Dim A As Byte , B As Byte , C As Byte
Dim X As Byte , Y As Byte , Z As Byte
Dim Waktu As String * 10
Dim Tanggal As String * 10

Print "DS1307"
Waitms 100

Time$ = "15:30:00"
Date$ = "04-30-11"

Print "Tanggal: " ; Date$
Print "Waktu:" ; Time$

  Cls
  Cursor Off
  Locate 1 , 1
  Lcd "Tanggal: " ; _day ; ":" ; _month ; ":" ; _year
  Locate 2 , 1
  Lcd "Waktu : " ; _hour ; "-" ; _min ; "-" ; _sec
  Wait 1

Mulai:
Do
Tanda = Inkey()
   If Tanda = "A" Then
   'untuk ganti settingan waktu RTC tekan huruf A pada keyboard
      Input "Masukkan waktu (hh:mm:ss):" , Waktu
      Jam = Mid(waktu , 1 , 2)
      Menit = Mid(waktu , 4 , 2)
      Detik = Mid(waktu , 7 , 2)
      Time$ = Jam + ":" + Menit + ":" + Detik
      A = Val(jam)
      B = Val(menit)
      C = Val(detik)

      _hour = A
      _min = B
      _sec = C
      Gosub Settime
    End If

    If Tanda = "B" Then
   'untuk ganti settingan tanggal RTC tekan huruf A pada keyboard
      Input "Masukkan Tanggal (mm-dd-yy):" , Tanggal
      Bulan = Mid(tanggal , 1 , 2)
      Hari = Mid(tanggal , 4 , 2)
      Tahun = Mid(tanggal , 7 , 2)
      Date$ = Bulan + "-" + Hari + "-" + Tahun
      X = Val(bulan)
      Y = Val(hari)
      Z = Val(tahun)

      _day = Y
      _month = X
      _year = Z
      Gosub Setdate
    End If

Print "Tanggal: " ; Date$
Print "Waktu:" ; Time$
  Cls
  Cursor Off
  Locate 1 , 1
  Lcd "Tanggal: " ; _day ; ":" ; _month ; ":" ; _year
  Locate 2 , 1
  Lcd "Waktu : " ; _hour ; "-" ; _min ; "-" ; _sec
  Wait 1
Loop
End

'Pengambilan data RTC DS1307
Getdatetime:
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0

  I2cstart
  I2cwbyte Ds1307r
  I2crbyte _sec , Ack
  I2crbyte _min , Ack
  I2crbyte _hour , Ack
  I2crbyte Weekday , Ack
  I2crbyte _day , Ack
  I2crbyte _month , Ack
  I2crbyte _year , Nack
  I2cstop
  _sec = Makedec(_sec) : _min = Makedec(_min) : _hour = Makedec(_hour)
  _day = Makedec(_day) : _month = Makedec(_month) : _year = Makedec(_year)
Return

Setdate:
  _day = Makebcd(_day) : _month = Makebcd(_month) : _year = Makebcd(_year)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 4
  I2cwbyte _day
  I2cwbyte _month
  I2cwbyte _year
  I2cstop
Return

Settime:
  _sec = Makebcd(_sec) : _min = Makebcd(_min) : _hour = Makebcd(_hour)
  I2cstart
  I2cwbyte Ds1307w
  I2cwbyte 0
  I2cwbyte _sec
  I2cwbyte _min
  I2cwbyte _hour
  I2cstop
Return


atau download simulasi RTC DS1307 dan source code.

Jika sudah didownload sekali, maka download kembali dengan menghapus bagian program:
Time$ = "15:30:00"
Date$ = "04-30-11"
Karena RTC sekali download sudah tersimpan datanya dan jika ingin diubah bisa menggunakan Hyperterminal seperti yang telah dijelaskan diatas. 

Kalau bagian tsb tidak dihapus maka jam dan tanggal akan terus mengulang dari pengaturan tsb.

sumber

Tutorial Desain PCB dengan Eagle


Membuat desain PCB sendiri itu mudah dan menyenangkan loh, berikut ini saya beri contoh sederhana membuat PCB untuk minimum sistem mikrokontroler AVR ATMega8535/16/32. Software Eagle yang saya gunakan adalah seri 5.6.0.


1) Buka Eagle Layout Editor dan pilih File --> New --> Schematic

2) Maka akan tampil layout Schematic, dan pilih Add untuk menambahkan komponen:

3) Setelah add dipilih maka tampil pilihan berbagai macam komponen, pilih Atmel dan cari microcontroller ATMega32-P dengan kaki DIP (40 buah):

4) Kemudian klik OK dan letakkan komponen dengan meng-klik kiri mouse dan lepaskan dengan menekan Delete atau X pada toolbar. Untuk me-Rotate komponen gunakan klik kanan pada mouse, untuk memindahkan klik move pada toolbar dan tahan dengan tombol kiri mouse.

5) Lanjutkan dengan menambahkan komponen-komponen lainnya, seperti:
- Crystal/oscillator:

- Capacitor (rcl --> C-EU):

- Button (switch omron):

- Pin Head 1x5:
- Pin Head 1x8:

- Pin Head 2x8:

- Con --> jack DC:

- Diode 1N4004:

- V-reg 78xxL (regulator yang digunakan adalah 7805):

- Resistor (rcl --> R-EU):

- Capacitor polar (rcl --> Cpol-EU):

- Led 5mm:
- Supply +5v:

- Supply GND:

6) Kemudian susun semua komponen-komponen tersebut pada Schematic Editor sehingga tampak seperti gambar berikut:
    Kemudian beri nilai pada masing-masing komponen dengan meng-klik kanan pada komponen dan pilih Value, sbb:
 
Beri nilai pada komponen-komponen tsb sebagai berikut:
    -  Kapasitor Polar (100uf/16v)
    -  Kapasitor kecil (22pf)
    -  Crystal (bebas, misalnya: 8MHz)
    -  Resistor (330)

7) Pilih Wire pada Toolbar (/) dan hubungkan setiap komponen seperti ini:
8) Setelah semua selesai dihubungkan, coba angkat atau move komponen-komponen tersebut untuk memastikan bahwa kabel sudah terhubung. Pin head 1x5 pada Schematic adalah untuk pin-pin downloader, yaitu MOSI, MISO, SCK, Reset, dan GND.

9) Kemudian klik Board pada Toolbar bagian atas
     Jika ada peringatan seperti ini, maka klik Yes:

10) Maka akan tampil Board Editor dengan komponen-komponen yang masih belum tersusun sbb:

11) Susunlah setiap komponen tersebut dengan meng-klik move dan tahan dengan tombol kiri mouse, kemudian letakkan ke dalam kotak di sebelah kanannya, ketika komponen diangkat maka jalur-jalur tipis atau benang penghubung komponen juga ikut berpindah, sehingga saat menyusun komponen pastikan sesuai dengan jalur tersebut. Jika jalur kemudian menjadi ruwet, sederhanakan dengan meng-klik Rip-up pada jalur tsb.

Susunlah komponen-komponen tersebut sehingga tampak seperti ini:


12) Agar lebih bebas dalam membuat jalur, lakukan pengaturan pada View --> Grid sbb:

13) Kemudian hubungankan setiap kaki-kaki pada komponen sesuai dengan benang atau jalur yang sudah terpasangan dengan Route
Lakukan pengaturan pada Route sbb:
Besarnya wire yang akan digunakan bebas, normalnya sekitar 0.6 - 0.8 (dalam mm).

Bentuk jalur bisa diubah menjadi lurus, miring 45derajat, atau melengkung dengan meng-klik tombol kanan mouse.

14) Susun jalur pada PCB sehingga tampak seperti ini:


atau bebas sesuai keinginan, asalkan terhubung semua dan tidak salah hubung.
Frame PCB dapat diubah ukurannya sesuai keinginan dengan meng-klik kiri mouse dan geser.

15) Agar PCB menjadi lebih sempuran tambahkan Circle pada masing-masing sudut PCB yang nantinya digunakan untuk menempatkan speser atau kaki PCB.
Dan letakkan Polygon disekeliling PCB dengan pengaturan sbb:


Pastikan ujung-ujung Polygon tidak bertumpuk, kalau bertumpuk maka akan tampil peringatan ERROR. Kemudian klik Rastnest.

16) Jika PCB telah selesai maka akan tampil sbb:


17) Untuk mengeprint hanya jalur dan kaki komponen saja, lakukan pemilihan pada Display sbb:


Sehingga PCB editor akan tampil sbb:


Kemudian pilih File --> Print, maka akan tampil pengaturan print sbb:


Jika hanya ingin menampilkan layoutnya saja, maka lakukan pengaturan pada Display sbb:

Demikianlah tutorial Dasain PCB dengan Eagle, selanjutnya akan saya uraikan cara membuat Library sendiri di Eagle, serta Desain PCB dengan Protel DXP 2004.

Silahkan download hasil desain Eagle sesuai dengan contoh di atas.


sumber