robo_tom_24
21.05.2012, 20:55
Hallo
Ich bekomm keine richtigen Zeichen gesendet über BT auf meinen PC
Egal welche Zeichen ich versende, das kommt: "ðððððððððððððððððððððððððððððððð"
Was noch ist: es kommt nicht jedes Zeichen direkt, immer so 50 auf einmal alle 25 sec.
Code:
#define BAUD 19200 // Baudrate
#define F_CPU 8000000
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error Systematischer Fehler der Baudrate groesser 1% und damit zu hoch!
#endif
//-------------- INCLUDES
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
void USART_Init( void )
{
UCSR0B |= (1<<TXEN0); //UART TX (Transmit - senden) einschalten
UCSR0C |= (3<<UCSZ00); //Modus Asynchron 8N1 (8 Datenbits, No Parity, 1 Stopbit)
UBRR0H = 0; //Highbyte ist 0
UBRR0L = (F_CPU/(BAUD*16))-1; //Lowbyte ist 103 (dezimal) -> (Frequenz_in_Hz / (Baudrate * 16)) - 1 <- Quarfrequenz = 16*1000*1000 Hz!!!!
}
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1<<UDRE0)) );
/* Put data into buffer, sends the data */
UDR0 = data;
}
unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSR0A & (1<<RXC0)) );
/* Get and return received data from buffer */
return UDR0;
}
int main(void)
{
DDRC |= 1<<PINC0; //LED init
PORTC &= ~(1<<PINC0);
DDRB |= 1<<PINB6;
PORTB |= 1<<PINB6;
USART_Init(); // USART einstellen
_delay_ms(250);
PORTB &= ~(1<<PINB6); //LED aus
while(1)
{
USART_Transmit('t'); //Send thomas
USART_Transmit('h');
USART_Transmit('o');
USART_Transmit('m');
USART_Transmit('a');
USART_Transmit('s');
PORTC ^= 1<<PINC0; //toggle LED (red)
_delay_ms(250);
}
}//end main
Habt ihr da eine Idee?
Ich bekomm keine richtigen Zeichen gesendet über BT auf meinen PC
Egal welche Zeichen ich versende, das kommt: "ðððððððððððððððððððððððððððððððð"
Was noch ist: es kommt nicht jedes Zeichen direkt, immer so 50 auf einmal alle 25 sec.
Code:
#define BAUD 19200 // Baudrate
#define F_CPU 8000000
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error Systematischer Fehler der Baudrate groesser 1% und damit zu hoch!
#endif
//-------------- INCLUDES
#include <avr/io.h>
#include <avr/interrupt.h>
#include <util/delay.h>
void USART_Init( void )
{
UCSR0B |= (1<<TXEN0); //UART TX (Transmit - senden) einschalten
UCSR0C |= (3<<UCSZ00); //Modus Asynchron 8N1 (8 Datenbits, No Parity, 1 Stopbit)
UBRR0H = 0; //Highbyte ist 0
UBRR0L = (F_CPU/(BAUD*16))-1; //Lowbyte ist 103 (dezimal) -> (Frequenz_in_Hz / (Baudrate * 16)) - 1 <- Quarfrequenz = 16*1000*1000 Hz!!!!
}
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSR0A & (1<<UDRE0)) );
/* Put data into buffer, sends the data */
UDR0 = data;
}
unsigned char USART_Receive( void )
{
/* Wait for data to be received */
while ( !(UCSR0A & (1<<RXC0)) );
/* Get and return received data from buffer */
return UDR0;
}
int main(void)
{
DDRC |= 1<<PINC0; //LED init
PORTC &= ~(1<<PINC0);
DDRB |= 1<<PINB6;
PORTB |= 1<<PINB6;
USART_Init(); // USART einstellen
_delay_ms(250);
PORTB &= ~(1<<PINB6); //LED aus
while(1)
{
USART_Transmit('t'); //Send thomas
USART_Transmit('h');
USART_Transmit('o');
USART_Transmit('m');
USART_Transmit('a');
USART_Transmit('s');
PORTC ^= 1<<PINC0; //toggle LED (red)
_delay_ms(250);
}
}//end main
Habt ihr da eine Idee?