Komunikasi dua mikrokontroler menggunakan serial Usart

Komunikasi dua mikrokontroler menggunakan serial Usart yaitu menghubungkan dua mikrokontroler agar bisa berkomunikasi, disini saya menggunakan masing-masing mikrokontroler avr atmega32. Satu mikro berfungsi mengirim data (transimitter) dan mikro yang satunya berfungsi menerima data (receiver).

Mikro satu mengirim data sensor push button, saat push button ditekan/tidak ditekan maka mikro ini mengirim data melalui serial dan mikro yang satunya menerima data tersebut dan memprosesnya untuk ditampilkan pada LCD dan mengirimkannya melalui serial untuk ditampilkan di virtual terminal (bukan dikirim kembali ke mikro yang satunya) .  Untuk menghubungkan mikro satu dengan mikro dua maka pin tx pada mikro satu yang berfungsi mengirimkan data dihubungkan dengan pin rx yang berfungsi menerima data. Jadi ini merupakan komunikasi satu arah saja, ada yang bertugas mengirim dan ada yang hanya menerima data.

PB1 ditekan mengirim karakter ‘1’ dengan indikator led paling kiri berkedap kedip
PB2 ditekan mengirim karakter ‘2’ dengan indikator led nomor dua dari kiri berkedap kedip
PB3 ditekan mengirim karakter ‘3’ dengan indikator led nomor tiga dari kiri berkedap kedip
PB4 ditekan mengirim karakter ‘4’ dengan indikator led paling kanan berkedap kedip
Saat tidak ada penekanan sama sekali maka mengirim karakter ‘0’ dengan indicator led mati semua

Berikut blok diagram system :

Berikut rangkaian lengkapnya yang telah saya simulasikan pada proteus :

Setelah itu kita membuat program disini saya menggunakan codevision avr berikut setting code wizard untuk mikro pada sisi Transmitter :


 

 

 

 

 

 

 

 

 

 

 

 

Sedangkan pada sisi Receiver adalah sebagai berikut :

-Setting USART pada mode RECEIVE INTERUPT agar data yang dikirim oleh mikro transmit dapat langsung diproses

dan mengaktifkan juga mode TRANSMITTER agar data yang telah diterima dapat dikirimkan ke Virtual Terminal

-LCD pada PORTC

=================================================

Berikut program dan keterangannya untuk mikro pada sisi Transmit :

#include <mega32.h>
#include <delay.h>
// Standard Input/Output functions
#include <stdio.h>

#define button1 PINC.4
#define button2 PINC.5
#define button3 PINC.6
#define button4 PINC.7

#define lamp1 PORTC.0
#define lamp2 PORTC.1
#define lamp3 PORTC.2
#define lamp4 PORTC.3

// Declare your global variables here

void main(void)
{
unsigned int i;

PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0x00;

PORTC=0xFF;//Setting pull up (aktif low)
DDRC=0x0F;//Setting led sebagai output(bit 0-3) dan push button sebagai input (bit 4-7)

PORTD=0x00;
DDRD=0x00;

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

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;

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

while (1)
{
if (button1==0)
{

printf(“1”); //Megirim data karakter ‘1’ ke serial
lamp1 = 0;
delay_ms(100);
lamp1 = 1;
delay_ms(100);
lamp1 = 0;
delay_ms(100);
lamp1 = 1;
}
if (button2==0)
{

printf(“2”); //Megirim data karakter ‘2’ ke serial
lamp2 = 0;
delay_ms(100);
lamp2 = 1;
delay_ms(100);
lamp2 = 0;
delay_ms(100);
lamp2 = 1;

}
if (button3==0)
{

printf(“3”);  //Megirim data karakter ‘3’ ke serial
lamp3 = 0;
delay_ms(100);
lamp3 = 1;
delay_ms(100);
lamp3 = 0;
delay_ms(100);
lamp3 = 1;

}
if (button4==0)
{

printf(“4”);  //Megirim data karakter ‘4’ ke serial
lamp4 = 0;
delay_ms(100);
lamp4 = 1;
delay_ms(100);
lamp4 = 0;
delay_ms(100);
lamp4 = 1;
}
if ((button1 == 1)||(button2 == 1)||(button3 == 1)||(button4 == 1)) //Saat tidak ada penekanan push button
{
printf(“0”);  //Megirim data karakter ‘0’ ke serial
lamp4 = 1;
lamp3 = 1;
lamp2 = 1;
lamp1 = 1;
delay_ms(100);

}

};
}

 

===============================================

Berikut program dan keterangannya untuk mikro pada sisi Receiver

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

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

#define RXB8 1
#define TXB8 0
#define UPE 2
#define OVR 3
#define FE 4
#define UDRE 5
#define RXC 7

#define FRAMING_ERROR (1<<FE)
#define PARITY_ERROR (1<<UPE)
#define DATA_OVERRUN (1<<OVR)
#define DATA_REGISTER_EMPTY (1<<UDRE)
#define RX_COMPLETE (1<<RXC)

// USART Receiver buffer
#define RX_BUFFER_SIZE 8
char rx_buffer[RX_BUFFER_SIZE];

#if RX_BUFFER_SIZE<256
unsigned char rx_wr_index,rx_rd_index,rx_counter;
#else
unsigned int rx_wr_index,rx_rd_index,rx_counter;
#endif

// This flag is set on USART Receiver buffer overflow
bit rx_buffer_overflow;

// USART Receiver interrupt service routine
interrupt [USART_RXC] void usart_rx_isr(void)
{
char status,data;
status=UCSRA;
data=UDR;
if ((status & (FRAMING_ERROR | PARITY_ERROR | DATA_OVERRUN))==0)
{
rx_buffer[rx_wr_index]=data;
if (++rx_wr_index == RX_BUFFER_SIZE) rx_wr_index=0;
if (++rx_counter == RX_BUFFER_SIZE)
{
rx_counter=0;
rx_buffer_overflow=1;
};
};
}

#ifndef _DEBUG_TERMINAL_IO_
// Get a character from the USART Receiver buffer
#define _ALTERNATE_GETCHAR_
#pragma used+
char getchar(void)
{
char data;
while (rx_counter==0);
data=rx_buffer[rx_rd_index];
if (++rx_rd_index == RX_BUFFER_SIZE) rx_rd_index=0;
#asm(“cli”)
–rx_counter;
#asm(“sei”)
return data;
}
#pragma used-
#endif

// Declare your global variables here

void main(void)
{
int i,j;

PORTA=0x00;
DDRA=0x00;

PORTB=0x00;
DDRB=0x00;

PORTC=0x00;
DDRC=0x00;

PORTD=0x00;
DDRD=0x00;

TCCR0=0x00;
TCNT0=0x00;
OCR0=0x00;

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: 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=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x98;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x47;

// 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);

// Global enable interrupts
#asm(“sei”)

while (1)
{

// Place your code here
printf(“%c “,rx_buffer[0]); //Mengirim data yang diterima dari mikro 1 untuk dikirim kembali untuk ditampilkan ke virtual terminal
//i=0;

//Menampilkan data ke LCD
lcd_gotoxy(i,j);
lcd_putchar(rx_buffer[0]);
i=i+1;
if (i == 16 && j == 0) {i=0;j=1;}
if (i == 17 && j == 1){i=0;j=0;lcd_clear();}

delay_ms(100);
};
}

Berikut hasilnya setelah saya simulasikan di proteus.

Selamat mencoba dan semoga tutorial newbie Komunikasi dua mikrokontroler menggunakan serial Usart ini bermanfaat. Semangat…………………………………………………..

 

Leave a Reply