problem with serial asinkron communication

today i have mid semester. and i have a test to make a communication between two microcontroller "in this case, i use arduino uno atmega 328". one micro as a master and the other as a slave. i must make baudrate 56000bps. the function of master to read analog input (potensio) and the slave to turn on/off the led (five led). it turn/off suitable to binary number (5 bit). but i can't make it, please help me.

this my program :

  1. Master
//Ujian Tengah Semester (UTS) TAM_0001
//Komunikasi Serial Asinkron
//Created By : Toni Firnandes (3211001056)

//Ardunio_Master//
//baudrate = 56000 bps//

//define fungsi pengaktifan bit di arduino
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))

//Deklarasi Variable,Start and Stop Bit
int data_potensio, data_master;

//Setup utama
void setup()
{
 //membuat fungsi baru khusus menginisialisasikan serial
 serial_asinkron(); 
 //mendeklarasikan pin A0 sebagai input 
 pinMode(A0, INPUT); 
}

//Fungsi berulang

void loop()
{
 //membaca data potensiometer 
 data_potensio = analogRead(A0);
 
 //memap nilai data potensiometer
 data_master = map(data_potensio, 0, 1023, 0, 31);  
 
 //waktu tunda, agar data perubahan potensiometer stabil
 //waktu tunda 10 ms
 delay(10);
 
 //memanggil fungsi parsing_data
 parsing_data();
 
}

//Fungsi tambahan
//fungsi pengiriman data_master ke slave
void sending_data_master (unsigned char data_kirim)
{
  while(! (UCSR0A & ( 1 << UDRE0)));  
  UDR0 = data_kirim;
}

//fungsi pemarsing data dari master ke slave
void parsing_data()
{
  //parsing data
  //start data
  sending_data_master(91);
  //bilangan ratusan
  sending_data_master((data_master/100)+48);
  //bilangan puluhan
  sending_data_master((data_master/10)+48);
  //bilangan satuan
  sending_data_master((data_master%10)+48);
  //stop data
  sending_data_master(90);
  //catatan besaran data start dan stop bit supaya tidak bertabrakan, 
  //lebih besar dari data yang dikirim
  
}

//fungsi penginisialisasian asingkron serial
void serial_asinkron()
{
  //baudrate yang digunakan = 1000*(2 digit nim terakhir "56") bps
  //jadi, baudrate = 56000 bps
  
  //setting double mode serial asinkron komunikasi
  sbi(UCSR0A, U2X0);
  //mengaktifkan usart transmit
  sbi(UCSR0B, TXEN0);
  
  //setting nilai ubrr untuk baudrate 56000 bps "USART komunikasi baudrate"
  //mengakses register UBRRH
  //karena UCSZ1:0 = 1 dan UCSZ2 pada register UCSRB 0, maka panjang data setiap framenya adalah 8 bit
  //mode paritas disabled, panjang stop bit 1
  UCSR0C = B00000110;
  UBRR0H= B0;
  //nilai UBRR yang didapatkan adalah 35, tetapi karena baudrate tidak aktual
  //maka ada persen error sebesar 0,8 %
  UBRR0L = B00100011;
  
}
  1. Slave
//Ujian Tengah Semester (UTS) TAM_0001
//Komunikasi Serial Asinkron
//Created By : Toni Firnandes (3211001056)

//Ardunio_Master//
//baudrate = 56000 bps//

//define fungsi pengaktifan bit di arduino
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))

//Deklarasi Variable,Start and Stop Bit
int potensiometer, slave, x;
unsigned char result;
int parsingd[5];
int biner[5];

//fungsi ISR, interupt usart reciever
ISR(USART_RX_vect){    
    biner[x]=UDR0;
    x++;
}

void uart_send(unsigned char dat) { 
    while(! (UCSR0A & ( 1 << UDRE0))  );  
    UDR0 = dat;                          
}

//Fungsi tambahan


//fungsi penginisialisasian asingkron serial
void serial_initial()
{
  //baudrate yang digunakan = 1000*(2 digit nim terakhir "56") bps
  //jadi, baudrate = 56000 bps
  
  //setting double mode serial asinkron komunikasi
  sbi(UCSR0A, U2X0);
  //mengaktifkan usart reciever
  sbi(UCSR0B, RXEN0);
  //mengaktifkan usart receiver complete interupt
  sbi(UCSR0B, RXCIE0);
  //setting nilai ubrr untuk baudrate 56000 bps "USART komunikasi baudrate"
  //mengakses register UBRRH
  //karena UCSZ1:0 = 1 dan UCSZ2 pada register UCSRB 0, maka panjang data setiap framenya adalah 8 bit
  //mode paritas disabled, panjang stop bit 1
  UCSR0C = B00000110;
  UBRR0H= B0;
  //nilai UBRR yang didapatkan adalah 35, tetapi karena baudrate tidak aktual
  //maka ada persen error sebesar 0,8 %
  UBRR0L = B00100011;
  
}
//Setup utama
void setup()
{
 //membuat fungsi baru khusus menginisialisasikan serial
 serial_initial(); 
 //mendeklarasikan pin 9-13 sebagai output 
 for(int a=2; a<=6; a++)
 {pinMode(a, OUTPUT);}
 
}

//Fungsi berulang

void loop()
{
 
 if(x>4)x=0;
    digitalWrite(2,biner[0]);
    digitalWrite(3,biner[1]);
    digitalWrite(4,biner[2]);
    digitalWrite(5,biner[3]);
    digitalWrite(6,biner[4]);
 
}

any body please help me! thanks.

Moderator edit: [code] ... [/code] tags added. (Nick Gammon)

oh, i'm so sorry, the slave code was wrong. here it is my slave code for that case. please help me to solved this problem, thanks.

//Ujian Tengah Semester (UTS) TAM_0001
//Komunikasi Serial Asinkron
//Created By : Toni Firnandes (3211001056)

//Ardunio_Master//
//baudrate = 56000 bps//

//define fungsi pengaktifan bit di arduino
#define sbi(sfr, bit) (_SFR_BYTE(sfr) |= _BV(bit))
#define cbi(sfr, bit) (_SFR_BYTE(sfr) &= ~_BV(bit))

//Deklarasi Variable,Start and Stop Bit
int nilai_potensiometer, data_slave, x;
unsigned char result;
int data_parsing[5];

//fungsi ISR, interupt usart reciever
ISR(USART_RX_vect)  
{     
 result = UDR0;
 parsing_data();
}

//Setup utama
void setup()
{
 //membuat fungsi baru khusus menginisialisasikan serial
 serial_asinkron(); 
 //mendeklarasikan pin 9-13 sebagai output 
 for(int a=9; a<=13; a++)
 {pinMode(a, OUTPUT);} 
}

//Fungsi berulang

void loop()
{
 //mengecheck kebenaran data "data start dan data stop" 
 if (data_parsing[0]==43 && data_parsing[4]==42)
 {
   nilai_potensiometer = ((data_parsing[1]*100) + (data_parsing[2]*10) + data_parsing[3]);
 }
 
 //menghidupkan led di slave
 for(int b=0;b<=4;b++)
 {
   if(nilai_potensiometer and 2^b == 0)
   digitalWrite(b+9,LOW);
   else
   digitalWrite(b+9, HIGH);
 }

 //waktu tunda, agar data perubahan potensiometer stabil
 //waktu tunda 10 ms
 delay(10);
 
}

//Fungsi tambahan


//fungsi pemarsing data dari master ke slave
void parsing_data()
{
 //menjadikan data master ke data slave dalam bentuk integer 
 data_slave = result-48;
 data_parsing[x] = data_slave;
 if(x==4)
 {x =0;}
 x++;

}

//fungsi penginisialisasian asingkron serial
void serial_asinkron()
{
  //baudrate yang digunakan = 1000*(2 digit nim terakhir "56") bps
  //jadi, baudrate = 56000 bps
  
  //setting double mode serial asinkron komunikasi
  sbi(UCSR0A, U2X0);
  //mengaktifkan usart reciever
  sbi(UCSR0B, RXEN0);
  //mengaktifkan usart receiver complete interupt
  
  //setting nilai ubrr untuk baudrate 56000 bps "USART komunikasi baudrate"
  //mengakses register UBRRH
  //karena UCSZ1:0 = 1 dan UCSZ2 pada register UCSRB 0, maka panjang data setiap framenya adalah 8 bit
  //mode paritas disabled, panjang stop bit 1
  UCSR0C = B00000110;
  UBRR0H= B0;
  //nilai UBRR yang didapatkan adalah 35, tetapi karena baudrate tidak aktual
  //maka ada persen error sebesar 0,8 %
  UBRR0L = B00100011;
  
}

Moderator edit: [code] ... [/code] tags added. (Nick Gammon)

I would guess that your problem is here:

void parsing_data()
{
 //menjadikan data master ke data slave dalam bentuk integer
 data_slave = result-48;
 data_parsing

    = data_slave;

if(x==4)
 {x =0;}
 x++;

}

I doubt that that is how the code actually looks on your computer. Modify your posts. Delete the code. Select the # icon, and paste the code again.

You might also explain what your problem is. "It doesn't work" doesn't give us anything to go on.

56000 is a non-standard rate. Why are you not using 57600? Why are you not using the standard Serial instance to send/receive data?

What are all the magic numbers? 43, 42, 48, 90, 91?

  //setting double mode serial asinkron komunikasi
  sbi(UCSR0A, U2X0);
  //mengaktifkan usart reciever
  sbi(UCSR0B, RXEN0);
  //mengaktifkan usart receiver complete interupt
  sbi(UCSR0B, RXCIE0);
  //setting nilai ubrr untuk baudrate 56000 bps "USART komunikasi baudrate"
  //mengakses register UBRRH
  //karena UCSZ1:0 = 1 dan UCSZ2 pada register UCSRB 0, maka panjang data setiap framenya adalah 8 bit
  //mode paritas disabled, panjang stop bit 1
  UCSR0C = B00000110;
  UBRR0H= B0;
  //nilai UBRR yang didapatkan adalah 35, tetapi karena baudrate tidak aktual
  //maka ada persen error sebesar 0,8 %
  UBRR0L = B00100011;

What's wrong with:

Serial.begin (56000);

Apart from the rather strange baud rate, as PaulS says.