Forum: Mikrocontroller und Digitale Elektronik ATmega8 +16Mhz +9600Baud Problem


von etechnik s. (espass)


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.

von H.Joachim S. (crazyhorse)


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...

von etechnik s. (espass)


Lesenswert?

Guten Abend,

Fehler gefunden...

es liegt nicht am Programm sondern am optokoppler :)...

danke für den tipp

von H.Joachim S. (crazyhorse)


Lesenswert?

Oh, böse Falle.

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.