Serielles Echo liefert nicht alle Tasten korrekt zurück

Gast #588506
Lesenswert?

Hi,

ich hab einen ATMega 8 mit einem FT232 mit dem PC verbunden.
Und wollte zum testen ein serielles Echos schreiben:

echo.c:
1
#include "serialIO.h"
2

3
#define FOSC 1200000
4
#define BAUD 9600
5
#define UBRR FOSC/16/BAUD-1
6

7

8
void main(void)
9
{
10
  USART_Init(UBRR) ;
11
  
12
  
13
  while(1)
14
  {
15
    USART_Transmit(USART_Receive());
16
  }
17
}

serialIO.c:
1
#include "serialIO.h"
2

3
void USART_Init(unsigned int ubrr)
4
{
5
  // Calc speed
6
  //unsigned int ubrr = freq / 16 / baud - 1;  
7

8
  // Set Baudrate 
9
  UBRRH = (unsigned char) (ubrr>>8);
10
  UBRRL = (unsigned char) ubrr;
11
  
12
  // Enable RX and TX
13
  UCSRB = (1<<RXEN)|(1<<TXEN);
14
  // Set 8n1
15
  UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1);
16
}
17

18
void USART_Transmit(char data)
19
{
20
  // Wait for empty transmit buffer
21
  while(!(UCSRA & (1<<UDRE)) );
22

23
  // Set data
24
  UDR = data;
25
}
26

27
char USART_Receive(void)
28
{
29
  // Wait for data to be received
30
  while(!(UCSRA & (1<<RXC)) );
31

32
  // Get Data and return
33
  return UDR;
34
}

Jedoch wird aus einem s  ein c  machmal werden die Buchstaben auch als 
Großbuchstaben ausgegeben. Woran könnte das liegen ?

Gruß SkySurfer
Gast #588510
Lesenswert?

Es könnte an deiner Quarzfrequenz liegen, 12MHz ist kein Baudratenquarz. 
Daher hast du evtl. zu große Toleranzen in den Bitzeiten (mehr als 3% 
Abweichung sind glaub ich nicht erlaubt). Probier es mal mit einem 
11,0592 MHz Quarz. Musst halt die Software entsprechend anpassen.

Ralf
Gast #588574
Lesenswert?

@M80:
schlaumeier ;)
> #define UBRR FOSC/16/BAUD-1
und
> #define UBRR FOSC/(16*BAUD)-1
ist das Gleiche, solange die Divisionen von links nach rechts 
abgearbeitet werden, was normalerweise der Fall ist.
scnr

-- Jörg
Gast #588634
Lesenswert?

Mit der Richtigen Frequenz funktioniert das gleich viel besser, nur noch 
Umlaute werden falsch dargestellt, könnte das an der Terminaleinstellung 
liegen?

Ich hab in der Main noch :
1
  USART_Receive(); // für einfacheres Programmieren
2

3
  USART_Transmit('H');
4
  USART_Transmit('a');
5
  USART_Transmit('l');
6
  USART_Transmit('l');
7
  USART_Transmit('o');

eingefügt bekomme aber immer noch die Zeichenkette : Tœeo  wobei das 2. 
Zeichen abhängig von der Eingabe ist mit der man das erste UART_Receive 
beendet.

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