ATmega8 +16Mhz +9600Baud Problem

OP #2899225
Lesenswert?

Guten Abend zusammen,

ich verzweigel langsam.

mit dem folgendem code kann ich super daten bis 4800 baud übertragen.
1
#define F_CPU 16000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
2
#include <stdint.h>
3
#include <util/delay.h>
4
#include <avr/io.h>
5
#include <avr/interrupt.h>
6

7

8
#define BAUD 4800UL      // Baudrate
9
#define UBRR_VAL ((F_CPU+BAUD * 8)/(BAUD*16)-1)   // clever runden
10
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
11
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
12
 
13
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
14
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
15
#endif
16

17

18
void uart_init(void)
19
{
20
  UCSRB |= (1<<TXEN)|(1<<RXEN)|(1<<RXCIE);  // UART TX einschalten
21
  UCSRC |= (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);  // Asynchron 8N1 
22

23
  UBRRH = UBRR_VAL >> 8;
24
  UBRRL = UBRR_VAL & 0xFF;
25
}
26

27
void uart_senden_c(char zeichen)
28
{
29
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
30
    {
31
    }
32
  
33
  UDR = zeichen;
34
  
35
  return;
36
}
37

38

39
ISR(USART_RXC_vect)
40
{
41
  
42
  uart_senden_c( UDR+1);
43
  
44
  
45
}
46

47

48
int main()
49
{
50

51
  uart_init();
52
  sei();
53

54

55
  while(1)
56
  {
57
  
58

59

60

61
    
62
  }
63

64
  return 0;
65
}

Wenn ich jedoch mit 9600 Baud daten übertragen möchte kommt es zu 
absolutem Blödsinn. ich empfange dann nur irgendwelche zusammenhanglosen 
Bytes.

Kann mir jemand sagen was ich falsch mache?
System...
ATmega8 - 16
Externer 16Mhz Quarz

Vielen Dank.
#2899230
Lesenswert?

Habe keine Lust, zu suchen.
// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: On
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x18;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x67;

Damit funktionierts jedenfalls, musst halt mal schauen, was dein 
Compiler so berechnet...

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