Forum: Mikrocontroller und Digitale Elektronik hc-05 echo code


von julius (Gast)


Lesenswert?

hi,

habe hier ein hc05 modul das von der android app "bluetooth terminal" 
als "HC-05" erkannt wird, eine verbindung zum modul scheint möglich.

jedenfalls gibt es keine verbindungs fehler, die android anwendung zeigt 
daraufhin ein terminal prompt ähnlich einer bash shell.

bevor die verbindung besteht blinkt die rote led am HC-05 modul 
kontinuierlich, nach einem verbindungsaufbau nur noch sporadisch.


der code stammt hier aus dem forum, dort hat er angeblich funktioniert.
eine kleine erweiterung meinersets ist das ein/ausschalten von leds bei 
RX / TX.
der gedanke war: wenn daten empfangen wurden, er aber probleme beim 
senden hat geht wenigstens kurz die RX led an.
ich bin mir nicht sicher wie oft die ISR von empfang/transmit aufgerufen 
wird, falls dies zu häufig passiert würde man die led natürlich nicht 
aufleuchten sehen - einfach zu schnell.


hat jemand eine idee was es sein kann? es leuchten weder die leds noch 
kommt eine antwort von modul am handy an.
1
/*
2
 *  * Bluetooth_Dongle_test.cpp
3
 *   *
4
 *    * Created: 18.01.2014 16:59:18
5
 *     *  Author: h0d3nt3uf3l
6
 *      */ 
7
8
9
#include <avr/io.h>
10
#include <avr/interrupt.h>
11
#include <util/delay.h>
12
13
14
//#define F_CPU 800000
15
#define BAUD 9600
16
#define MYUBRR F_CPU/16/BAUD-1
17
18
uint8_t data;
19
20
21
void USART_Init(unsigned int ubrr)
22
{
23
      /*Set baud rate*/
24
    UBRRH = (unsigned char)(ubrr>>8);
25
    UBRRL = (unsigned char)(ubrr);
26
    /* Enable receiver and transmitter  & Interrupts for RX & TX*/
27
    UCSRB = (1<<RXEN) | (1<<TXEN) | (1<<RXCIE) | (1<< TXCIE);
28
    /* Set frame format: 8data, 1stop bit */
29
    UCSRC = (1<<UCSZ0) | (1<<UCSZ1);
30
  
31
}
32
33
void USART_transmit()
34
{
35
       UDR = (data);
36
}
37
38
int main(void)
39
{
40
    DDRD |= (1 << PD6) | (1 << PD7);
41
    sei();
42
43
    USART_Init(MYUBRR);
44
    _delay_ms(10);
45
      
46
        while(1)
47
              ;
48
}
49
50
ISR(USART_RXC_vect) //Receive complete
51
{
52
    data = UDR;
53
    USART_transmit();
54
    PORTD |= (1 << PD6); // Turn on LED1
55
  PORTD &= ~(1 << PD7); // Turn off LED2
56
}
57
58
ISR(USART_TXC_vect) //Transmit complete
59
{
60
    data = 0;
61
  PORTD &= ~(1 << PD6); // Turn off LED1
62
  PORTD |= (1 << PD7); // Turn on LED2
63
}

von julius (Gast)


Lesenswert?

led test:

mit dieser angepassten main funktion gehen die leds vor der while 
schleife einmal 3s an und dann aus. sind also richtig angeschlossen.
1
int main(void)
2
{
3
    DDRD |= (1 << PD6) | (1 << PD7);
4
    //led test
5
    PORTD |= (1 << PD6); // Turn on LED1
6
    PORTD |= (1 << PD7); // Turn on LED2
7
    _delay_ms(3000);
8
        PORTD &= ~(1 << PD6); // Turn off LED1
9
    PORTD &= ~(1 << PD7); // Turn off LED2
10
11
    sei();
12
13
    USART_Init(MYUBRR);
14
    _delay_ms(10);
15
16
        while(1)
17
              ;
18
}

von Jens (Gast)


Lesenswert?

Hallo,

dein #define F_CPU scheint falsch zu sein. Ich vermute du arbeitest mit 
8MHz und nicht mit 800kHz.
Auch ein UL am Ende hilft dem Compiler bei der Berechnung.
Schau mal ob im Register die richtigen Werte stehen (zuerst zu Fuß 
ausrechnen).
Vielleicht stimmen nämlich deine Baudrate nicht mir der des Moduls 
überein.
Und hast du in den Fuses den Clockdivder /8 ausgeschaltet? Sonst läuft 
dein Controller mit 1MHz. Dann kann das auch nicht gehen.

Gruß

von julius (Gast)


Lesenswert?

F_CPU, steht zwar noch im code...wird aber aus der Makefile verwendet.
dort auch mit 6 nullen.
sonst wäre es falsch.

habe mit diesem chip bereits einen adc code erfolgreich getestet.
led1 an wenn poti unter der hälfte des wiederstandes, danach led2 an
code siehe: http://codepad.org/HJ0bXL8i


Clockdivder /8:
dieser fusecalculator: http://www.engbedded.com/fusecalc/  zeigt für den 
m32 keine "div" auswahl möglichkeit an, aber beim 168. sieht so aus als 
wenn der 32. das nicht hat.


was allerdings falsch war war der anschluss von Modul(RX) -> avr(tx)
siehe:
http://www.martyncurrey.com/arduino-with-hc-05-bluetooth-module-in-slave-mode/

rx vom modul soll wohl doch nur bis 3.3v gehen, ist jetzt die frage ob 
die 5v die er bisher bekommen hat das modul bereits zerschossen haben.

von julius (Gast)


Lesenswert?

hab gerade nochmal die baudraten berechnung gegen das hier getauscht:
1
#define MYUBRR ((uint16_t) ((F_CPU / ((BAUD) * 16.0)) + .5) - 1)

damit hatte jedenfalls mein usart code aus einem anderem stück code 
funktioniert.
jetzt flackert die erste led ganz kurz, die zweite geht kurz aus, geht 
dann gleich wieder an und bleibt an.

also irgendwelche daten empfängt er jetzt, und die TX ISR wird auch 
aufgerufen. beim handy kommt aber nichts an.

von julius (Gast)


Lesenswert?

die ganze schaltung läuft jetzt mit 3,3v anstatt mit 5v

von julius (Gast)


Lesenswert?

wenn man am modul direkt rx mit tx und tx mit rx verbindet ohne avr 
sendet er die daten wie erwartet zurück. also lebt das modul.

von julius (Gast)


Lesenswert?

code funktioniert mit änderungen an einem 168.
vielleicht ist der externe 16mhz quarz besser für den code...wer weiß.

von 占卜者 (Gast)


Lesenswert?

julius schrieb:
> vielleicht ist der externe 16mhz quarz besser für den code...wer weiß.

In diesem Stadium der Erkenntnis wären ein paar Hühnerknochen nicht 
schlecht ...

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.