problem with serial asinkron communication


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

this program :
1. master

code: [select]
//ujian tengah semester (uts) tam_0001
//komunikasi serial asinkron
//created : 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 , 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;
 
}


2. slave

code: [select]
//ujian tengah semester (uts) tam_0001
//komunikasi serial asinkron
//created : 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 , 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 me! thanks.

moderator edit: [code] ... [/code] tags added. (nick gammon)

oh, i'm sorry, slave code wrong. here slave code case. please me solved problem, thanks.
code: [select]
//ujian tengah semester (uts) tam_0001
//komunikasi serial asinkron
//created : 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 , 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 , 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)


Arduino Forum > Using Arduino > Networking, Protocols, and Devices (Moderator: fabioc84) > problem with serial asinkron communication


arduino

Comments

Popular posts from this blog

Thread: PKI Client 5.00 install (for eToken Pro)

ATmega2560-Arduino Pin Mapping

Crossfader Arduino Tutorial