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 :
- 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;
}
- 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)