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
2. slave
any body please me! thanks.
moderator edit: [code] ... [/code] tags added. (nick gammon)
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.
moderator edit: [code] ... [/code] tags added. (nick gammon)
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
Post a Comment