Society of Robots - Robot Forum
Software => Software => Topic started by: Karlis.Rasis on March 19, 2012, 10:21:51 AM
-
Sorry for my English and re posting, I' am from Latvia and Working on my bachelor's work.
Project is Control Robot via Bluetooth.
Months was spent before I get some results, but they are far from necessary
I use Atmega16 and connected Bluetooth module "linvor" to receive and send characters via Hyper-terminal on integrated Bluetooth adapter in my laptop. Bluetooth is connected tx-rx, rx-tx, gnd-gnd directly to MCU.
I found code that sends received character back. I modificate code and flashed to Atmega16.
When i send Characters via hyper-terminal it sends it back but, not all symbols.
To test all this for next steps I connected 3 leds on ports PB0-PB2 and want to get this- when i send characters- 'l' first diode light up, when 'n'- second, when 'p' third, when "r" all power down.
Problem is when i send those characters 'l, n, p' or 'r' nothing happened. But first diode light up when i press 'j' on keyboard second when 'k' and third when 'l' ,to switch all off 'm'.
That means MCU understands l as j, n as k, p as l, and r as m...
how it can be?
Maybe there is problems with BoudRate or clock speed, or protocol at all?
I used external oscilator- 14.7456 Mhz
I readed many websites, and MCU Atmega16, Atmega8 Datasheets, but can not find information, about my problem. Hope someone will help.
Waiting for posts, thank You!
#define F_CPU 7372800UL //Defines clock speed
#include <avr/io.h>
#include <avr/interrupt.h>
#define USART_BAUDRATE 115200 //Baudrate for serial comm.
#define BAUD_PRESCALE 3
//Serial com. Interrupt Service Routine (runs each time a byte is received)
ISR(USART_RXC_vect)
{
char ReceivedByte;
ReceivedByte = UDR; // Retrieves byte from serial port (bluetooth module)
UDR = ReceivedByte; // Echoes it back for fun
switch (ReceivedByte) //Which ASCII character was received?
{
case 'p': PORTB = 0b00000100;//l
break;
case 'n': PORTB = 0b00000010;//k
break;
case 'r': PORTB = 0;//m
break;
case 'l': PORTB = 0b00000001;//j
break;
default: break; //Character unknown to my routine, discard character
}
}
int main(void)
{
//I/O Initialization
DDRB |= (1<<PIN0) | (1<<PIN1) | (1<<PIN2); //DIR1, DIR2 and Enable pins as outputs
PORTB=0; //All initialized to 0
//UART
UCSRB |= (1 << RXEN) | (1 << TXEN); //Enable Tx and Rx
UCSRC |= (1 << UCSZ0) | (1 << UCSZ1);
UBRRL = BAUD_PRESCALE; //Sets
UBRRH = (BAUD_PRESCALE >> 8); //baudrate registers
UCSRB |= (1 << RXCIE); //Enable USART-interrupt
sei(); //Enable global interrupt
/* This program is completely interrupt driven, so nothing goes on in while loop*/
while(1); //Never gets out from here!
return 0; //Never reaches this point!
}
-
No need to double-post.