Pada kesempatan kali ini saya akan membagikan trik saya
dalam menampilkan waktu yang diberikan oleh IC RTC DS1307 menggunakan Seven
Segment. Sekedar share aja siapa tau bisa dijadikan referensi buat temen –
temen yg hobi oprek mikrokontroller. Karena saya yakin setiap engineer
mempunyai trik masing – masing untuk membuat sesuatu dengan hasil yang sama
karena banyak jalan menuju roma he..
OK langsung saja.
Step 1: Komponen
Siapkan komponen yang dibutuhkan yaitu:
1.
IC DS1307
2.
Mikrokontroller (Atmega8)
3.
Battery CR302 / Battery CMOS
4.
Crystal RTC 32.768kHz
5.
4 buah 7 segment 1 digit
6.
2 buah IC 74HC595
7.
2 buah led 3mm merah
DS1307 merupakan IC RTC (Real
Time Clock) yang mempunyai interface serial I2C. Untuk lebih jelasnya bisa
baca datasheet IC nya.
Atmega8 sebagai kontroller untuk melakukan baca tulis waktu
dari/ke IC DS1307 dan menampilkanya ke 7 Segment dengan interface IC shift register 74HC595. Atmega8 ini bisa
diganti dengan mikrokontroller lain sesuai kebutuhan dan kesukaan anda. 74HC595
saya gunakan sebagai interface karena saya lebih menyukai menggunakan shift
register dari pada decoder BCD to 7segment dengan alasan personal tentunya.
Step 2: Simulator & Skematik
Pada langkah ini, saya menggunakan ISIS proteus sebagai
simulator dengan skema sebagai berikut.
Tabel koneksi mikrokontroller Atmega8
PIN NAME
|
PIN NO
|
DEVICE
|
PIN NAME
|
PIN NO
|
PD2/INT0
|
4
|
DS1307
|
SOUT
|
7
|
PD5
|
11
|
74HC595(U3)
|
DS
|
14
|
PD6
|
12
|
74HC595(U3)
|
SH_CP
|
11
|
PD7
|
13
|
74HC595(U3)
|
ST_CP
|
12
|
PC4/SDA
|
27
|
DS1307
|
SDA
|
5
|
PC5/SCL
|
28
|
DS1307
|
SCL
|
6
|
PIN 7 dari DS1307 juga terhubung dengan pin (+) LED D1 dan
D2 sebagai indikator detik.
Step 3: Programming /Coding
Untuk programming saya menggunakan program compiler AVR
CodeVision (CVAVR). Dengan source code sebagai berikut.
/*****************************************************
This program was
produced by the
CodeWizardAVR
V2.05.3 Standard
Automatic Program
Generator
© Copyright
1998-2011 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com
Project :
Version :
Date : 1/18/2018
Author : DWI KURNIAWAN
Company : COMUTECH
Comments:
Chip type : ATmega8L
Program type : Application
AVR Core Clock
frequency: 8.000000 MHz
Memory model : Small
External RAM
size : 0
Data Stack
size : 256
*****************************************************/
#include
<mega8.h>
#include
<i2c.h>
#include
<ds1307.h>
#include
<delay.h>
#include
<stdio.h>
#define SHPORT PORTD.6
#define DSPORT PORTD.5
#define STPORT PORTD.7
#define DDRDIS DDRD
flash char
angka[]={0xC0,0xF9,0xA4,0xB0,0x99,0x92,0x82,0xF8,0x80,0x90,0x88,0x83,0xC6,0xA1,0x86,0x8E,0x7F};
unsigned char
hour,min,sec;
interrupt
[EXT_INT0] void ext_int0_isr(void)
{
rtc_get_time(&hour,&min,&sec);
}
void shiftout(char
scan,int data1)
{
unsigned char i;
DDRDIS = 0xF0;
STPORT = 0;
for ( i=0; i<8;i++)
{
SHPORT = 0;
DSPORT = (scan >> i)&
0x01;
delay_us(1);
SHPORT = 1;
delay_us(1);
}
for ( i=0; i<8;i++)
{
SHPORT = 0;
DSPORT = (data1 << i)&
0x80;
delay_us(1);
SHPORT = 1;
delay_us(1);
}
STPORT = 1;
}
void
display(unsigned char jam, unsigned char menit)
{
shiftout(0x01,angka[menit%10]);
shiftout(0x02,angka[menit/10]);
shiftout(0x04,angka[jam%10]);
shiftout(0x08,angka[jam/10]);
}
void main(void)
{
// External
Interrupt(s) initialization
// INT0: On
// INT0 Mode:
Rising Edge
// INT1: Off
GICR|=0x40;
MCUCR=0x03;
//GIFR=0x40;
i2c_init();
// DS1307 Real Time
Clock initialization
// Square wave
output on pin SQW/OUT: On
// Square wave
frequency: 1Hz
rtc_init(0,1,0);
#asm("sei");
while (1)
{
display(hour,min);
}
}
Penjelasan program:
Program utama pada source code diatas adalah fungsi main(void){…}. Struktur program ini memang
hasil dari CodeWizard, tetapi akan lebih baik jika kita memahami satu persatu
tiap syntact yang dihasilkan.
Pada program utama, pertama yang di eksekusi adalah
inisialisasi interupsi eksternal. Register yang berhubungan dengan interupsi
external adalah register
GICR // General
Interrupt Control Register
MCUCR // MCU
Control Register
GIFR // General
Interrupt Flag Register
Pada aplikasi ini kita akan memanfaatkan interupsi eksternal
0(INT0 ) dengan triger berupa pulsa yang diberikan oleh DS1307 pin
SOUT(Squarewave Output). Itulah kenapa PORTD.2 dihubungkan dengan pin SOUT
DS1307.
Bit – bit pada register GICR adalah sebagai berikut.
Bit7
|
Bit6
|
Bit5
|
Bit4
|
Bit3
|
Bit2
|
Bit1
|
Bit0
|
INT1
|
INT0
|
INT2
|
-
|
-
|
-
|
IVSEL
|
IVCE
|
Kita akan memanfaatkan eksternal interrupt 0 sehingga bit6
pada register GICR harus di set (1) sehingga register GICR bernilai 0x40;
Bit – bit pada register MCUCR adalah sebagai berikut.
Bit7
|
Bit6
|
Bit5
|
Bit4
|
Bit3
|
Bit2
|
Bit1
|
Bit0
|
SE
|
SM2
|
SM1
|
SM0
|
ISC11
|
ISC10
|
ISC01
|
ISC00
|
Bit yang terpenting dari interupsi eksternal adalah bit 0
s/d bit 3. Yaitu tipe trigger eksternal interrupt 0 dan eksternal interrupt 1.
ISC01
|
ISC00
|
Trigger type external interrupt 0
|
0
|
0
|
Low level
|
0
|
1
|
Toggle (any change)
|
1
|
0
|
Falling edge
|
1
|
1
|
Rising edge
|
ISC11
|
ISC10
|
Trigger type external interrupt 1
|
0
|
0
|
Low level
|
0
|
1
|
Toggle (any change)
|
1
|
0
|
Falling edge
|
1
|
1
|
Rising edge
|
Kita memanfaatkan external interrupt 0 dengan trigger rising
edge sehingga nilai register MCUCR adalah 0x03.
Bit – bit pada register GIFR adalah sebagai berikut.
Bit7
|
Bit6
|
Bit5
|
Bit4
|
Bit3
|
Bit2
|
Bit1
|
Bit0
|
INTF1
|
INTF0
|
INTF2
|
-
|
-
|
-
|
-
|
-
|
Bit – bit pada register ini adalah flag untuk eksternal
interrupt 0,1,dan 2.Masing – masing bit akan set(1) ketika mendeteksi trigger interrupt.
Karena kita memanfaatkan interrupt 0 dan trigger rising edge, sehingga ketika pin
INT0 berubah kondisi dari 0 ke 1 akan terjadi interrupt dan bit INTF0 akan bernilai
1 sehingga nilai register GIFR = 0x40 dan akan reset(0) ketika vector interrupt
dieksekusi.
0 komentar:
Posting Komentar