Tutorial komunikasi I2C pada ATMega 32 (Mikrokontroller) dengan menggunakan CV (CodeVision) AVR dan simulasi Proteus

Posted by


Oke teman teman , kemarin kita sudah membahas tentang I/O (input output), adc, timer, pwm, bagi yang belum membaca silahkan klik disini . Dan sekarang kita akan membahas tentang komunikasi antar mikrokontroler dengan metode I2C. metode i2C ini terdapat 1 buah master dan 1 buah slave. sebenarnya bisa saja slavenya lebih dari satu tetapi pada latihan kita ini kita akan bahas 1 slave saja, intinya adalah untuk saling berhubungan dibutuhkan kecocokan alamat / address i2c satu sama lain, untuk kali ini kita akan memakai address atau alamat 0x07 (bisa kalian ubah menjadi berapapun dengan minimal 1 dan maksimal FF).
pada eksperimen kali ini kita akan menggunakan fitur i2c pada master dan 2 wire pada slave
langsung saja kita buka proteus yang digunakan untuk simulasi .dan ambil beberapa komponen sebagai berikut :
nah setelah itu kita rangkai rangkaian yang pertama adalah masternya. master ini yang akan mengambil data dari slave. rangkaiannya sebagai berikut :
lcd pada Port C . sda pada Port A Pin 1 dan scl pada Port A Pin 0

 jangan salah merangkai ya sobat.. kalo master sudah terangkai maka berikutnya slavenya. slave rangkaiannya sebagai berikut :

 Lcd pada port B, ADC pada Port A, SDA SCL pada Port C
 secara lengkap rangkaian tadi seperti pada gambar dibawah ini :

 setelah selesai konfigurasi rangkaian pada proteus maka kita siap untuk memprogramnya, buka codevision avrnya lalu pilih new project dan setting project seperti pada gambar dibawah ini :
1. Project pertama adalah MASTER
kita menggunakan ATMega 32 dengan detak 16MHz
 setelah itu kita setting LCD di port C seperti pada gambar dibawah ini :
 setelah LCD maka setting i2c sebagai berikut :
karena kita menggunakan Port A dan sda Pin 1 scl Pin 0 maka setting sebagai berikut:
 setelah setting selesai maka save generate and exit sebagai master.
setelah itu kita program seperti berikut :

 program sub fungsi ambil digunakan untuk mengambil data yang dikirimkan slave
untuk dapat berkomunikasi i2c membutuhkan sebuah protokol sebagai berikut:
a. i2c start
b. i2c write (addres/ alamat slave )
c. data slave diambil
d. i2c stop
program << 8 digunakan karena kita akan mengirim nilai adc yang bernilai 10 bit, ketika data tidak digeser(<<) maka data tidak akan terkirim dengan utuh
 setelah itu di program while kita panggil fungsinya dan ditampilkan pada lcd
 untuk lebih lengkapnya program seperti berikut :
/*****************************************************
This program was produced by the
CodeWizardAVR V2.05.0 Professional
Automatic Program Generator
© Copyright 1998-2010 Pavel Haiduc, HP InfoTech s.r.l.
http://www.hpinfotech.com

Project :
Version :
Date    : 10/10/2012
Author  : NeVaDa
Company :
Comments:


Chip type               : ATmega32
Program type            : Application
AVR Core Clock frequency: 16.000000 MHz
Memory model            : Small
External RAM size       : 0
Data Stack size         : 512
*****************************************************/

#include <mega32.h>
#include <stdio.h>
#include <stdlib.h>

// I2C Bus functions
#asm
   .equ __i2c_port=0x1B ;PORTA
   .equ __sda_bit=1
   .equ __scl_bit=0
#endasm
#include <i2c.h>

#define write   0
#define read    1
#define address 0x07

int a, b, c;
char screen[16];

// Alphanumeric LCD Module functions
#include <alcd.h>

// Declare your global variables here

void ambil(void)
{
    i2c_start();
    i2c_write((address<<1)|read);
    a = i2c_read(1)<<8;
    a |= i2c_read(1);
    b = i2c_read(1)<<8;
    b |= i2c_read(1);
    c = i2c_read(1)<<8;
    c |= i2c_read(0);
    i2c_stop();
}

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
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTB=0x00;
DDRB=0x00;

// Port C 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
PORTC=0x00;
DDRC=0x00;

// Port D 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
PORTD=0x00;
DDRD=0x00;

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

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

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer2 Stopped
// Mode: Normal top=0xFF
// 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=0x00;

// USART initialization
// USART disabled
UCSRB=0x00;

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

// ADC initialization
// ADC disabled
ADCSRA=0x00;

// SPI initialization
// SPI disabled
SPCR=0x00;

// TWI initialization
// TWI disabled
TWCR=0x00;

// I2C Bus initialization
i2c_init();

// Alphanumeric LCD initialization
// Connections specified in the
// Project|Configure|C Compiler|Libraries|Alphanumeric LCD menu:
// RS - PORTC Bit 0
// RD - PORTC Bit 1
// EN - PORTC Bit 2
// D4 - PORTC Bit 4
// D5 - PORTC Bit 5
// D6 - PORTC Bit 6
// D7 - PORTC Bit 7
// Characters/line: 16
lcd_init(16);

while (1)
      {
      // Place your code here
      ambil();
      lcd_gotoxy(0,0);
      sprintf(screen,"%d %d %d",a,b,c);
      lcd_puts(screen);
      }
}

2. Program Slave
program slave kita gunakan ATMega dengan detak yang sama juga :
kita setting LCD pada Port B
 Setting TWI dengan settingan sebagai berikut: slave addres harus sama dengan master yaitu 0x07
 setelah setting TWI maka setting nilai ADC sebagai berikut:
setelah selesai maka save generate and exit. dan waktunya untuk kita memprogram :

 program diatas adalah program hasil generate project . nah cari interrupt TWI dan hapus isinya diganti dengan program dibawah ini:
kegunaan interrupt intinya adalah tanpa di program di while maka otomatis mikrokontroller akan mengirimkan terus menerus data yang dikirimkan
 setelah itu scroll ke bawah dan pastikan settingan dari generate sebagai berikut :
 jika sudah sama maka selanjutnya kita program di while sebagai berikut :
setelah itu build dan kita buka proteus dan klik pada masing masing mikrokontroler dan diisi program masing masing.
setelah itu jalankan simulasi maka akan tampil sebagai berikut :
 ubah nilai ADCnya untuk mengetahui responnya :
itulah tadi komunikasi i2c pada ATMega 32 dengan proteus dan CV AVC


selanjutnya kita akan bahas komunikasi dengan serial pada mikrokontroler, klik disini ya kalau ingin membaca. :)


FOLLOW and JOIN to Get Update!

Social Media Widget SM Widgets




kelaselektronika Updated at: 08:29

2 comments:

  1. Mas mau tanya kalau misalnya pas di compile ada warning "Error during Assembly" gimana ya?

    ReplyDelete
  2. Kurang lengkap penjelasannya bro

    ReplyDelete