Forum: Mikrocontroller und Digitale Elektronik UART über HC-05


von Stefan S. (sschultewolter)


Lesenswert?

Hallo,

ich bekomme mit Putty und CoolTerm keine Werte mehr von meinen HC-05 
angezeigt.

Der ATtiny841 sendet fleißig jede Sekunde Daten heraus. Ich habe zum 
Test eine Led eingebaut.
VCC --- R4k7 --- HC-05(RXD) angeschlossen. Diese blinkt im Sekundentakt 
immer einmal auf. Das Modul selber leuchtet durchgehend (verbunden), 
solange ich mit CoolTerm oder Putty damit verbunden bin.

In Putty und CoolTerm habe ich genauso wie im AVR-Code auf 8-bit, no 
parity, 1 stop bit gestellt.

Ich habe bereits auch das Gerät am PC entfernt und neugepaired mit einem 
anderen Port. Ebenfalls keine Ausgabe.

Ich habe den AVR-Code heute mehrmals umgeschrieben und dabei die 
Sicherung überschrieben. Ich denke aber, der Code passt.

Habe ihn aus den Datenblättern von Atmel übernehmen können.
1
/*
2
* tiny841_blink.c
3
*
4
*  Created: 19.09.2014
5
*   Author: sschultewolter
6
* Hardware: ATtiny841 5V 8MHz (internal Oscillator)
7
*/
8
9
10
#include <avr/io.h>
11
#include <avr/interrupt.h>
12
#include <util/delay.h>
13
14
#include "uart0.h"
15
16
volatile uint32_t millis;
17
18
ISR(TIMER0_COMPA_vect) { millis++; }
19
20
int main(void)
21
{
22
  uart0_init(9600);
23
24
  // millis
25
  TCCR0A = (1 << WGM01);          // CTC Mode
26
  TCCR0B |= (1 << CS01) | (1 << CS00);  // Prescaler 64
27
  OCR0A = 124;              // (F_CPU/PRESCALER)/1000-1
28
  TIMSK0 |= (1 << OCIE0A);        // Compare Interrupt
29
  sei();
30
31
  while(1)
32
  {
33
    static uint32_t last_millis;
34
    if(millis - last_millis >= 1000)
35
    {
36
      last_millis = millis;
37
      uart0_putc('A');
38
      uart0_putc('\n');
39
      uart0_putc('\r');
40
    }
41
  }
42
}
1
/*
2
* uart0.h
3
*
4
* Created: 19.09.2014 16:06:17
5
*  Author: sschultewolter
6
*/
7
8
9
#ifndef UART0_H_
10
#define UART0_H_
11
12
void uart0_init(uint32_t baud)
13
{
14
  UBRR0H = (unsigned char)(baud >> 8);
15
  UBRR0L = (unsigned char)baud;
16
  
17
  // Enable receiver and transmitter
18
  UCSR0B = (1 << RXEN0) | (1 << TXEN0);
19
  
20
  // Set frame format
21
  //  UMSELn1    UMSELn0          Mode
22
  //  0      0            Asynchronous USART
23
  //  0      1            Synchronous USART
24
  //  1      0            Reserved
25
  //  1      1            Master SPI (MSPIM)(1)
26
  
27
  //  UPMn1    UPMn0          Parity Mode
28
  //  0      0            Disabled
29
  //  0      1            Reserved
30
  //  1      0            Enabled, Even Parity
31
  //  1      1            Enabled, Odd Parity
32
  
33
  //  USBSn                Stop Bit(s)
34
  //  0                  1-bit
35
  //  1                  2-bit
36
  
37
  //  UCSZn2    UCSZn1    UCSZn0    Character Size
38
  //  0      0      0      5-bit
39
  //  0      0      1      6-bit
40
  //  0      1      0      7-bit
41
  //  0      1      1      8-bit
42
  //  1      0      0      Reserved
43
  //  1      0      1      Reserved
44
  //  1      1      0      Reserved
45
  //  1      1      1      9-bit
46
  UCSR0C = (1 <<UCSZ01) | (1 << UCSZ00); // 8N1
47
}
48
49
int uart0_putc(uint8_t c)
50
{
51
  while(!(UCSR0A & (1<<UDRE0)));
52
  UDR0 = c;
53
  return 0;
54
}
55
56
uint8_t uart0_getc(void)
57
{
58
  while(!(UCSR0A & (1<<RXC0)));
59
  return UDR0;
60
}
61
62
#endif /* UART0_H_ */

von Max H. (hartl192)


Lesenswert?

Ich würde um die Fehlerquelle zu bestimmen versuchen am HC-05 Rx und Tx 
zu verbinden und mit dem PC Daten senden. Kommt ein Echo zurück liegt 
der Fehler beim µC, kommt keines liegt er beim Bluetooth Modul.

von Stefan S. (sschultewolter)


Lesenswert?

Habe vor einer Stunde sowas in der Art gemacht. Habe mehrere von den 
Teilen rumliegen.

Habe beide Dongles mit Spannung versorgt und Rx und Tx vertauscht 
angeschlossen. Wenn ich dann in Putty etwas sende, erhalte ich es in dem 
anderen Terminal. Soweit scheinen die Module zu funktionieren.

von Marc V. (Firma: Vescomp) (logarithmus)


Lesenswert?

Stefan S. schrieb:
> Habe beide Dongles mit Spannung versorgt und Rx und Tx vertauscht
> angeschlossen. Wenn ich dann in Putty etwas sende, erhalte ich es in dem
> anderen Terminal. Soweit scheinen die Module zu funktionieren.

 Tun die ja auch. Nur verstehen die deinen Tiny841 nicht.
1
  uart0_init(9600);
2
3
void uart0_init(uint32_t baud)
4
{
5
  UBRR0H = (unsigned char)(baud >> 8);
6
  UBRR0L = (unsigned char)baud;

 Ich glaube, Tiny sendet locker mit 50 Baud oder sogar schneller ;-D
 Richtiger Wert für UBRR0 ist 51.

von Stefan S. (sschultewolter)


Lesenswert?

Danke für den Hinweis,

Problem dank dir gefunden
1
UBRR0 = ((F_CPU+baud*8)/(baud*16)-1);
=> 51,583

Edit:

Warum schreib Atmel dann sowas in die Datenblätter?
http://www.atmel.com/Images/Atmel-8495-8-bit-AVR-Microcontrollers-ATtiny441-ATtiny841_Datasheet-Summary.pdf
Seite 166
1
void USART_Init( unsigned int baud )
2
{
3
/* Set baud rate */
4
UBRRnH = (unsigned char)(baud>>8);
5
UBRRnL = (unsigned char)baud;
6
/* Enable receiver and transmitter */
7
UCSRnB = (1<<RXENn)|(1<<TXENn);
8
/* Set frame format: 8data, 2stop bit */
9
UCSRnC = (1<<USBSn)|(3<<UCSZn0);
10
}

von Donni D. (Gast)


Lesenswert?

Weil sie weiter oben erklärt haben wie baud berechnet wird. Schau mal 
auf Seite 163 in der Tabelle nach.

von Mw E. (Firma: fritzler-avr.de) (fritzler)


Lesenswert?

Also wie rausgefunden ist erstmal die Baudrate Falsch und \n\r ist kein 
Newline sondern \r\n ;).

von Mike (Gast)


Lesenswert?

Martin Wende schrieb:
> Also wie rausgefunden ist erstmal die Baudrate Falsch und \n\r ist kein
> Newline sondern \r\n ;).

Ein Newline (LF) ist wohl immer noch "\n" (0x0a).
"\r\n" ist ein komplettes CRLF (0x0d 0x0a).

von Stefan S. (sschultewolter)


Lesenswert?

Danke für die ungefragten Antworten! Hatte schon ein paar mal, dass ich 
davor stand, \r\n oder \n\r

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.