ATMEL STUDIO 6.0 Programming:Serial Communication via USB RS-232

Please copy and Paste

Written by: Vinod Desai,Sachitanand Malewar NEX Robotics Pvt. Ltd.and
Edited by: e-Yantra team
AVR Studio Version 6

Date: 19th October 2012
 Application example: Robot control over serial port via USB-RS232 converter   (located on the ATMEGA260 microcontroller adaptor board)

 Concepts covered:  serial communication

 Serial Port used: UART2

 There are two components to the motion control:
 1. Direction control using pins PORTA0 to PORTA3
 2. Velocity control by PWM on pins PL3 and PL4 using OC5A and OC5B.

 In this experiment for the simplicity PL3 and PL4 are kept at logic 1.

 Pins for PWM are kept at logic 1.
 Connection Details:  
  Motion control: L-1---->PA0; L-2---->PA1;
    R-1---->PA2; R-2---->PA3;
    PL3 (OC5A) ----> Logic 1;  PL4 (OC5B) ----> Logic 1; 

  Serial Communication: PORTD 2 --> RXD1 UART1 receive for RS232 serial communication
PORTD 3 --> TXD1 UART1 transmit for RS232 serial communication

PORTH 0 --> RXD2 UART 2 receive for USB - RS232 communication
PORTH 1 --> TXD2 UART 2 transmit for USB - RS232 communication

PORTE 0 --> RXD0 UART0 receive for ZigBee wireless communication
PORTE 1 --> TXD0 UART0 transmit for ZigBee wireless communication

PORTJ 0 --> RXD3 UART3 receive available on microcontroller expansion socket
PORTJ 1 --> TXD3 UART3 transmit available on microcontroller expansion socket

Serial communication baud rate: 9600bps
To control robot use number pad of the keyboard which is located on the right hand side of the keyboard.
Make sure that NUM lock is on.

Keyboard Key   ASCII value Action
8 0x38 Forward
2 0x32 Backward
4 0x34 Left
6 0x36 Right
5 0x35 Stop
7 0x37 Buzzer on
9 0x39 Buzzer off


 1. Make sure that in the configuration options following settings are 
  done for proper operation of the code

  Microcontroller: atmega2560
  Frequency: 14745600
  Optimization: -O0  (For more information read section: Selecting proper optimization 
  options below figure 2.22 in the Software Manual)

 2. Difference between the codes for RS232 serial, USB and wireless communication is only in the serial port number.
  Rest of the things are the same. 

 3. For USB communication check the Jumper 1 position on the ATMEGA2560 microcontroller adaptor board

 4. Auxiliary power can supply current up to 1 Ampere while Battery can supply current up to 
  2 Ampere. When both motors of the robot changes direction suddenly without stopping, 
it produces large current surge. When robot is powered by Auxiliary power which can supply
only 1 Ampere of current, sudden direction change in both the motors will cause current
surge which can reset the microcontroller because of sudden fall in voltage. 
It is a good practice to stop the motors for at least 0.5seconds before changing 
the direction. This will also increase the useable time of the fully charged battery.
the life of the motor.




#define F_CPU 14745600

unsigned char data; //to store received data from UDR1

void buzzer_pin_config (void)
 DDRC = DDRC | 0x08; //Setting PORTC 3 as outpt
 PORTC = PORTC & 0xF7; //Setting PORTC 3 logic low to turnoff buzzer

void motion_pin_config (void)
 DDRA = DDRA | 0x0F;
 PORTA = PORTA & 0xF0;
 DDRL = DDRL | 0x18;   //Setting PL3 and PL4 pins as output for PWM generation
 PORTL = PORTL | 0x18; //PL3 and PL4 pins are for velocity control using PWM.

//Function to initialize ports
void port_init()

void buzzer_on (void)
 unsigned char port_restore = 0;
 port_restore = PINC;
 port_restore = port_restore | 0x08;
 PORTC = port_restore;

void buzzer_off (void)
 unsigned char port_restore = 0;
 port_restore = PINC;
 port_restore = port_restore & 0xF7;
 PORTC = port_restore;

//Function To Initialize UART2
// desired baud rate:9600
// actual baud rate:9600 (error 0.0%)
// char size: 8 bit
// parity: Disabled
void uart2_init(void)
 UCSR2B = 0x00; //disable while setting baud rate
 UCSR2A = 0x00;
 UCSR2C = 0x06;
 UBRR2L = 0x5F; //set baud rate lo
 UBRR2H = 0x00; //set baud rate hi
 UCSR2B = 0x98;

SIGNAL(SIG_USART2_RECV)  // ISR for receive complete interrupt
data = UDR2;  //making copy of data from UDR2 in 'data' variable 

UDR2 = data;  //echo data back to PC

if(data == 0x38) //ASCII value of 8
PORTA=0x06;  //forward

if(data == 0x32) //ASCII value of 2
PORTA=0x09; //back

if(data == 0x34) //ASCII value of 4
PORTA=0x05;  //left

if(data == 0x36) //ASCII value of 6
PORTA=0x0A; //right

if(data == 0x35) //ASCII value of 5
PORTA=0x00; //stop

if(data == 0x37) //ASCII value of 7

if(data == 0x39) //ASCII value of 9


//Function To Initialize all The Devices
void init_devices()
 cli(); //Clears the global interrupts
 port_init();  //Initializes all the ports
 uart2_init(); //Initailize UART1 for serial communiaction
 sei();   //Enables the global interrupts

//Main Function
int main(void)
ATMEL STUDIO 6.0 Programming:Serial Communication via USB RS-232  ATMEL STUDIO 6.0 Programming:Serial Communication via USB RS-232 Reviewed by Suresh Bojja on 9/07/2018 09:38:00 PM Rating: 5

Subjects & Labs

Theme images by sebastian-julian. Powered by Blogger.