MIKROKONTROLER ATMEGA BERBASIS CODEVISION AVR (I2C DAN APLIKASI RTC)
dins
DEPOK INSTRUMENTS
Teori
2 I2C/I C
I2C/I2C (Baca: I-Two-C atau I-Squared-C) = Inter-Integrated Circuit adalah salah satu teknik komunikasi serial dengan menggunakan dua jalur, yaitu SCL (Serial Clock), dan SDA (Serial Data).
Fitur
2 I2C/I C
ATmega16A
PORTC.0 = SCL PORTC.1/PINC.1 = SDA I2C/I2C dapat dibangkitkan pula di PORT lain. Contoh perangkat yang menggunakan I2C/I2C: IC
RTC (Real Time Clock) DS1307
DI-Smart AVR.16 System (Sistem Plus µC. ATmega16A) RP1 D0
L6 PC2
L7 PC1
L8 PC0
VCC
JP3 LED CONNECTED
VCC
C11 1uF
2 6 16
C10 1uF
DB1 SERIAL
+ C12 1uF
+
+
1 2 3 4 5 6 7 8
PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7
14 15 16 17 18 19 20 21
X2 X1
12 13
PB0 (T0) PB1 (T1) PB2 (AIN0) PB3 (AIN1) PB4 (SS) PB5 (MOSI) PB6 (MISO) PB7 (SCK)
PA0 (ADC0) PA1 (ADC1) PA2 (ADC2) PA3 (ADC3) PA4 (ADC4) PA5 (ADC5) PA6 (ADC6) PA7 (ADC7)
PD0 (RXD) PD1 (TDX) PD2 (INT0) PD3 (INT1) PD4 (OC1B) PD5 (OC1A) PD6 (ICP ) PD7 (OC2)
(TOSC2) PC7 (TOSC1) PC6 PC5 PC4 PC3 PC2 PC1 PC0
1
40 39 38 37 36 35 34 33
PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7
29 28 27 26 25 24 23 22
PC7 PC6 PC5 PC4 PC3 PC2 PC1 PC0
VCC PA0 PA1 PA2 PA3 PA4 PA5 PA6 PA7
V+ VVCC GND
7
15
MAX232CPE
12 9 14 7 4 5
RXD SERIAL
X2 X1
RST
9
RESET
C13 1uF
X1
VCC
2
20pF C2
3
1K
POWER 9-12VDC
C3 RXD SERIAL PD0 RXD ISP
VCC + C5 10uF
S2
VCC 3
3
PD2
C7 + C6 100nF 100nF
PD2 S3 PD3
1 2 3 4 5 6 7 8 9 10
VCC
2 4 6 8 10
RXD ISP TXD ISP
4
RST
100nf
PD3 C4 470uF
2
+
+5V
PD0 PD1 PD2 PD3 PD4 PD5 PD6 PD7
9 6
JP1
JP2
1 2 3
1 2 3
TXD SERIAL PD1 TXD ISP
VR1 2
5
1 2 3 4 5 6 7 8 9 10 P3 PORTD
VCC
1 3 5 7 9
RST
W
AREF 2
1
Vin
GND
1
LM7805CT
PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7
P4 ISP PROG PB5 LED RST PB7 PB6
SW1
VCC
1 2 3 4 5 6 7 8 9 10
VCC
R1
20pF D1 4002
30
AVCC
C1
VCC PC0 PC1 PC2 PC3 PC4 PC5 PC6 PC7
31
AGND
Y1 11059200 X2
U0
32 AREF
AREF
10K 1
C9 1uF
R1 OUT R2 OUT T1 OUT T2 OUT C2+ C2 -
+
R1 IN R2 IN T1 IN T2 IN C1+ C1 -
1 2 3 4 5 6 7 8 9 10
P1 PORTB
P2 PORTC
U2 13 8 11 10 1 3
+
5 9 4 8 3 7 2 6 1
TXD SERIAL
PB0 PB1 PB2 PB3 PB4 PB5 PB6 PB7
P0 PORTA
AT MEGA
IC1
PC0
PC1
PC2
PC3
PC4
PC5
8
L5 PC3
D1
L4 PC4
D2
L3 PC5
D3
D4
L2 PC6 PC6
PC7
2 1
L1 PC7
D5
D0 D1 D2 D3 D4 D5 D6 D7
D6
D7
1 2 3 4 5 6 7 8 9
C17 100nF
POWER
R3
L10
2K2
VCC
DI-Smart AVR.16 System 1. 2. 3. 4. 5. 6. 7. 8. 9.
ATmega16A Crystal Reset ISP Power Vref ADC RS232 LED Array Push Button
3 4 1 7 2 5
9
PC0=SCL PC1=SDA
6
8
Pemrograman
2 I2C/I C
pada CVAVR
Inisialisasi “Wizard” I2C/I2C. Pilih perangkat yang akan digunakan (RTC DS1307). Pilih PIN untuk SDA dan SCL. Aktivasi LCD Alphanumeric untuk menampilkan data dari RTC. Aktivasi
2 I2C/I C
Pemrograman (Setup “Wizard”)
1
2
4
3
2 I2C/I C
Pemrograman 2 (Inisialisasi I2C/I C Hasil “Wizard”) Inisialisasi I2C sesuai dengan yang diinputkan saat Wizard. i2c.h library sintaks/perintah untuk i2c ds1307.h library sintaks/perintah untuk RTC DS1307
Pemrograman (i2c.h)
i2c_init(void); //Inisialisasi I2C.
i2c_start();
i2c_stop(void); //Menghentikan proses komunikasi.
i2c_init();
i2c_start(void); //Mengaktifkan proses komunikasi.
2 I2C/I C
i2c_stop();
i2c_read([char ack]); //Membaca data i2c.
unsigned char char_data;
void main(void) {char_data = i2c_read(0);}
i2c_write([char data]); //Menulis data i2c.
unsigned char char_data;
void main(void) {char_data = i2c_write(255);}
2 I2C/I C
Pemrograman (ds1307.h) [1/2]
rtc_init(void); //Inisialisasi rtc ds1307. rtc_init();
rtc_read([char address]); //Membaca data rtc. unsigned char char_data;
void main(void)
{char_data = rtc_read(0);}
rtc_write([char address, char data]); //Menulis data rtc. unsigned char char_data;
void main(void)
{rtc_write(0,0);}
rtc_get_time([char *hour, char *min, char *sec]); //Membaca- waktu (jam, menit, detik). unsigned char cjm, cmn, cdt;
void main(void)
{rtc_get_time(&cjm, &cmn, &cdt);}
2 I2C/I C
Pemrograman (ds1307.h) [2/2]
rtc_set_time([char hour, char min, char sec]); //Mengeset waktu (jam, menit, detik). unsigned char cjm, cmn, cdt;
void main(void)
{rtc_set_time(cjm, cmn, cdt);}
rtc_get_date([char *week_day, char *day, char *month, char *year]); //Membaca tanggal
//(hari ke-, tanggal, bulan, tahun). unsigned char chr, ctg, cbl, cth;
void main(void)
{rtc_get_date(&chr, &ctg, &cbl, &cth);}
rtc_get_date([char *week_day, char *day, char *month, char *year]); //Mengeset tanggal
//(hari ke-, tanggal, bulan, tahun). unsigned char chr, ctg, cbl, cth;
void main(void)
{rtc_get_date(chr, ctg, cbl, cth);}
2 I2C/I C
Pemrograman “Jam Digital” [1/3]
#include <mega16.h>
#include <delay.h>
#include <stdio.h>
#asm // I2C Bus functions
.equ __i2c_port=0x15 ;PORTC
.equ __sda_bit=1
.equ __scl_bit=0
#endasm
#include
#include // DS1307 Real Time Clock functions
#include // Alphanumeric LCD Module functions
// Declare your global variables here
unsigned char cstr[16];
unsigned char jm=0, dt=0, mn=0, hr=0, tg=0, bl=0, th=0;
2 I2C/I C
Pemrograman “Jam Digital” [2/3]
void main(void)
{
// DS1307 Real Time Clock initialization
// Square wave output on pin SQW/OUT: Off
// SQW/OUT pin state: 0
rtc_init(0,0,0);
lcd_init(16);
hr=1;tg=6;bl=9;th=15;
rtc_set_date(hr,tg,bl,th);
jm=13;mn=52;dt=59;
rtc_set_time(jm,mn,dt);
2 I2C/I C
Pemrograman “Jam Digital” [3/3]
while (1) { // Place your code here rtc_get_date(&hr,&tg,&bl,&th); sprintf(cstr,"%02d-%02d-%02d",tg,bl,th); lcd_gotoxy(0,0); lcd_puts(cstr); rtc_get_time(&jm,&mn,&dt); sprintf(cstr,"%02d:%02d:%02d",jm,mn,dt); lcd_gotoxy(0,1); lcd_puts(cstr); delay_ms(100); }
}