Gast
#5774015
Hallo liebes Forum,
ich habe ein Problem mit meinem uC, welcher durch ein Bluetooth-Modul
Daten senden und empfangen soll. Andere Beiträge im Forum konnten mir
bisher auch nicht weiterhelfen. Folgende Situation liegt vor:
Ich verwende einen ATMega88 mit einem internen Takt von 8 MHz. Daran
habe ich das Bluetooth-Modul RN 42 von Sparkfun angeschlossen. Dies ist
ein 0815 Bluetooth-Modul: Arbeitet mit 3,3V und ist auf 9600 Baud und
8N1 eingestellt. Die am BT-Modul ankommenden Pegel werden durch einen
Spannungsteiler auf 3,3V heruntergeteilt. Die vom BT-Modul ausgehenden
Signale werden direkt an den uC angeschlossen. Da dieser mit 5V arbeitet
erkennt dieser Spannungen größer Ub/2 als logische 1. Das
Bluetooth-Modul stammt aus einer vorhergehenden Arbeit, bei der das
Modul einwandfrei gearbeitet hat. Am Modul sollte meiner Meinung nach
der Fehler also nicht liegen.
An das BT-Modul werden lediglich die TX- und RX-Leitungen sowie die
Versorgungsspannung angeschlossen. Die Anbindung an den uC erfolgt über
die UART-Schnittstelle. RX wird mit TX und TX wird mit RX verbunden.
Auf meinem PC (Windows 7) verwende ich die Tools H Term als auch Tera
Term. Bei beiden kann ich mich mit dem BT-Modul verbinden. Nun kann ich
Daten vom uC an den PC senden --> funktioniert einwandfrei. Jedoch kann
ich keine Daten vom PC an den uC senden.
Testweise habe ich auf einem zweiten PC (MAC OS X) Cool Term (ähnlich
wie Tera Term und H Term) installiert. Auch hier kann ich mich mit dem
BT-Modul verbinden aber nur Daten vom uC empfangen!!!
Hier ist der C-Code für den uC:
#define F_CPU 8000000UL
#include <avr/io.h>
#include <avr/wdt.h>
#include <util/delay.h>
#include "stdlib.h"
#include <avr/interrupt.h>
#include <string.h>
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define BAUD 9600UL
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
#error Systematischer Fehler zu groß!
#endif
void uart_init(void)
{
UBRR0 = UBRR_VAL;
UCSR0B |= (1<<RXEN0)|(1<<TXEN0) ;
UCSR0C = (1<<UCSZ01)|(1<<UCSZ00);
}
int uart_putc (char data, FILE* stream)
{
while(!(UCSR0A & (1 << UDRE0)));
UDR0 = (char)data;
return 0;
}
unsigned char uart_getc(void) // Zeichen empfangen
{
while (!(UCSR0A & (1<<RXC0))); // warten bis Zeichen verfuegbar
return UDR0; // Zeichen aus UDR an Aufrufer
zurueckgeben
}
//uart_putcund uart_getcals Standard IO eintragen
FILE mystdout = FDEV_SETUP_STREAM(uart_putc, uart_getc, _FDEV_SETUP_RW);
int main(void)
{
int i = 0;
char Buffer [20];
uart_init();
DDRD &= ~(1<<PD0); //PD0 = RX als Eingang
PORTD |= (1<<PD0); //Pullup ein
DDRD |= (1<<PD1); //PD1 = TX als Ausgang
stdout= stdin= &mystdout; // IO Funktionen als Standard IO eintragen
while(1)
{
printf("Test BT 1 \r \n"); //Ausgabe 1
scanf("%d \r \n%", &i); //Eingabe 1
printf("Eingelesen: %d \r \n", i); //Ausgabe 2
}
}
Dazu ist zu Sagen, dass mehr Bibliotheken eingebunden wurden, als
hierfür notwendig sind. Dies liegt daran, dass der uC die empfangenen
Daten wieterverarbeiten soll. Dies sollte erstmal nicht stören.
Auf dem PC kann ich die Ausgabe 1 sprich "Test BT 1" sehen. Wenn ich
bspw. in H Term als Type Dec einstelle und eine Zahl eingebe und mit
Enter bestätige passiert nichts mehr. Ausgabe 2 wird nicht ausgeführt.
Der uC scheint beim Einlesen hängen zu bleiben.
Die Einstellungen in H Term sollten auch stimmem. Dort ist die Baudrate
auf 9600 und 8N1 eingestellt. Es wird die COM4 Schnittstelle des PCs
verwendet.
Im Anhang ist die H Term Konsole zu sehen.
Ich bin über jeden Tipp dankbar!


