hc-05 echo code

Gast #4455843
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
}
Gast #4455855
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
}
Gast #4455857
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ß
Gast #4456031
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.
Gast #4456034
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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren