AVR mit seltersamen Zeichen

OP #2220598
Lesenswert?

Hallo,

was mach ich jetzt schon wieder falsch ?
Über UART sollte der AVR eigentlich "Hallo myAVR!" ankommen, stattdessen 
kommt "À8 8ø8À8 8ø8À8 8ø8À8 8ø8À8". Das Problem ist, so wie die 
Schaltung verschaltet und eingestellt ist, hat es funktioniert bevor ich 
an den Fuses rumgespielt habe. Die Baud-Einstellung ist 9600.

Hat jemand ne Idee warum da son Murks kommt ???

1
#define F_CPU 3686400
2
#include <avr\io.h>
3
//----------------------------------------------------------------------
4
void uartInit()
5
{
6
  UBRRL  = 23;           //9600Baud siehe Baudratentabelle
7
  UCSRB = 0x08;           //Sender enable UCSRB / UCR bei z.B.: 2313
8
}
9
//----------------------------------------------------------------------
10
void uartPutChar(char data)
11
{
12
  //warte bis UDR leer ist UCSRA / USR bei z.B.: 2313
13
  while (!(UCSRA&32));
14
  //sende
15
  UDR=data;
16
}
17
//----------------------------------------------------------------------
18
void print(const char buffer[])
19
{
20
  for (int i=0;buffer[i]!=0;i++)
21
    uartPutChar(buffer[i]);
22
}
23
//======================================================================
24
main ()
25
{
26
  uartInit();
27
  while (true) // Mainloop
28
  {
29
    print("Hallo myAVR! ");
30
  }
31
}
32
//======================================================================
Gast #2220628
Lesenswert?

Möglicherweise hast Du von externem Quarz auf internen RC-Oszillator 
umgestellt.

Der Murks kommt, weil die Bits mit einer anderen Geschwindigkeit 
übertragen werden, als der Empfänger es erwartet. Die Geschwindigkeit 
muss genau stimmen, sonst liegen die Bits nicht in den vorgesehenen 
Zeitfensterchen und es kommt eben Murks raus.

Leider schreibst Du nicht, um welchen AVR es sich handelt, sonst könnte 
ich Dir eine Seitenzahl im Handbuch nennen. Beim ATmega8 ist es die 
Seite 26. Ansonsten suche mal nach "Clock Sources".
Gast #2220798
Lesenswert?

Thomas Eckmann schrieb:
> Oder "CKDIV8" gesetzt. Dann sendet er jetzt mit 1200.

Er hat 26 Zeichen bekommen und 13 Zeichen gesendet. Das würde eher auf 
4800 (oder etwas ähnliches) hindeuten, aber:
Wenn der Empfänger die Bits schneller erwartet, als sie kommen, und das 
mit etwa doppelter (oder mehr) Geschwindigkeit, dürften keine sich 
abwechselnden Bits empfangen werden, da ein Bit des Senders mehrfach 
empfangen wird.

Der empfangene String enthält Leerzeichen, also 0x20 binär 00100000.
Ein Zeichen mit nur einem Bit. Wo kommt das her? Desgleichen die "8", 
binär 00111000. Hier wurde eine ungerade Zahl (3) gleicher Bits 
empfangen.

Es kann natürlich auch sein, dass der String bei einem der vielen 
Schritte auf dem Weg vom Schnittstellentreiber bis hier ins Forum 
verfälscht wurde, z.B. Steuerzeichen (BS, Bell, etc..) verschluckt 
wurden oder Teile nach einem CR überschrieben wurden, und er eigentlich 
viel länger ist, als im Eingangsposting. Dann wäre die genau doppelte 
Länge ein Zufall.

Irgendwie unstimmig, das Ganze.

@Peter: Hast Du Dir zufällig die Fuses-Einstellungen vorher und nachher 
gemerkt oder aufgeschrieben?

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