Forum: Compiler & IDEs UART Zeichen werden nicht korrekt übertragen


von Erdbeer G. (Firma: HTL-Braunau) (erdbeergulasch)


Lesenswert?

Hallo!

Habe ein Problem mit dem Microcontroller ATMEGA 8, ich habe ihn bereits 
erfolgreich mit einer Demo-Version von CodeVision so programmiert, dass 
er mir jedes Zeichen, das ich mittels UART übertragen will, richtig 
überträgt. Allerdings überträgt er mir wenn ich mit dem AVR-Studio 
programmiere (GCC-Plugin) nicht die richtigen Zeichen. In einem Terminal 
Programm sehe ich nur sowas: "eeueeuueeuueeuueeuueeueeuueeuu" usw.usw.
wenn ich eigentlich lauter "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa" übertragen 
will. Wisst ihr, was das Problem dabei sein kann?

der Programmcode ist 1:1 von dem CodeVision Assistenten übernommen und 
lautet wie folgt:


#include <avr/io.h>

// Standard Input/Output functions
#include <stdio.h>

// Declare your global variables here

int main(void)
{
// Declare your local variables here

// Input/Output Ports initialization
// Port B initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTB=0x00;
DDRB=0x00;

// Port C initialization
// Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In Func0=In
// State6=T State5=T State4=T State3=T State2=T State1=T State0=T
PORTC=0x00;
DDRC=0x00;

// Port D initialization
// Func7=In Func6=In Func5=In Func4=In Func3=In Func2=In Func1=In 
Func0=In
// State7=T State6=T State5=T State4=T State3=T State2=T State1=T 
State0=T
PORTD=0x00;
DDRD=0x00;

// Timer/Counter 0 initialization
// Clock source: System Clock
// Clock value: Timer 0 Stopped
TCCR0=0x00;
TCNT0=0x00;

// Timer/Counter 1 initialization
// Clock source: System Clock
// Clock value: Timer 1 Stopped
// Mode: Normal top=FFFFh
// OC1A output: Discon.
// OC1B output: Discon.
// Noise Canceler: Off
// Input Capture on Falling Edge
// Timer 1 Overflow Interrupt: Off
// Input Capture Interrupt: Off
// Compare A Match Interrupt: Off
// Compare B Match Interrupt: Off
TCCR1A=0x00;
TCCR1B=0x00;
TCNT1H=0x00;
TCNT1L=0x00;
ICR1H=0x00;
ICR1L=0x00;
OCR1AH=0x00;
OCR1AL=0x00;
OCR1BH=0x00;
OCR1BL=0x00;

// Timer/Counter 2 initialization
// Clock source: System Clock
// Clock value: Timer 2 Stopped
// Mode: Normal top=FFh
// OC2 output: Disconnected
ASSR=0x00;
TCCR2=0x00;
TCNT2=0x00;
OCR2=0x00;

// External Interrupt(s) initialization
// INT0: Off
// INT1: Off
MCUCR=0x00;

// Timer(s)/Counter(s) Interrupt(s) initialization
TIMSK=0x00;

// USART initialization
// Communication Parameters: 8 Data, 1 Stop, No Parity
// USART Receiver: Off
// USART Transmitter: On
// USART Mode: Asynchronous
// USART Baud Rate: 9600
UCSRA=0x00;
UCSRB=0x08;
UCSRC=0x86;
UBRRH=0x00;
UBRRL=0x17;

// Analog Comparator initialization
// Analog Comparator: Off
// Analog Comparator Input Capture by Timer/Counter 1: Off
ACSR=0x80;
SFIOR=0x00;

   while(1) {
      while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich 
*/
      {
      }

      UDR = 'z';                    /* schreibt das Zeichen x auf die 
Schnittstelle */
   }

   /* wird nie erreicht */
   return 0;
}

von Johannes M. (johnny-m)


Lesenswert?

Martin Wührer wrote:
> der Programmcode ist 1:1 von dem CodeVision Assistenten übernommen
Das ist schon mal das erste Problem. Ich hab keine Lust, jetzt im 
Datenblatt nachsehen zu müssen, was Du da überhaupt konfiguriert hast...

> und lautet wie folgt:
> [...]
> UCSRA=0x00;
> [...]
> UBRRH=0x00;
> UBRRL=0x17;
UBRR = 0x17 bei nicht gesetztem U2X => F_CPU = 3,6864 MHz. Hast Du die 
tatsächlich? Hast Du die Fusebits richtig gesetzt? Die Symptome sehen 
mir nämlich verdächtig nach zu großer Baudraten-Abweichung aus.

von Stefan B. (stefan) Benutzerseite


Lesenswert?

Martin Wührer:
> Programm sehe ich nur sowas: "eeueeuueeuueeuueeuueeueeuueeuu" usw.usw.
> wenn ich eigentlich lauter "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa" übertragen
> ...
>       UDR = 'z';                    /* schreibt das Zeichen x auf die

Du kannst keine "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa" sehen, höchstens 
"zzzzzzzzzzzzzzzz".

Was machst du wirklich?

von Johannes M. (johnny-m)


Lesenswert?

Stefan "stefb" B. wrote:
> Was machst du wirklich?
...Denn sie wissen nicht, was sie tun...

von Falk B. (falk)


Lesenswert?

@ Martin Wührer (Firma HTL-Braunau) (erdbeergulasch)

>Programm sehe ich nur sowas: "eeueeuueeuueeuueeuueeueeuueeuu" usw.usw.
>wenn ich eigentlich lauter "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa" übertragen
>will. Wisst ihr, was das Problem dabei sein kann?

http://www.mikrocontroller.net/articles/AVR_Checkliste#UART.2FUSART

MfG
Falk

von Icke M. (Firma: my-solution) (hendi)


Lesenswert?

Es trägt zwar nicht zur Lösung bei, interessiert mich aber einfach.
>Du kannst keine "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa" sehen, höchstens
>"zzzzzzzzzzzzzzzz".
Ist das wirklich so? Ich hab bis jetzt bei falscher Baudrate immer was 
absolut(zumindest für mich nicht) Nachvollziehbares heraus bekommen.

von Karl H. (kbuchegg)


Lesenswert?

Icke Muster wrote:
> Es trägt zwar nicht zur Lösung bei, interessiert mich aber einfach.
>>Du kannst keine "aaaaaaaaaaaaaaaaaaaaaaaaaaaaa" sehen, höchstens
>>"zzzzzzzzzzzzzzzz".
> Ist das wirklich so?

Er sagte ja: 'höchstens'
Damit war gemeint: Selbst wenn alles so funktioniert wie es soll
und die Übertragung absolut fehlerfrei funktioniert, so wird
am anderen Ende niemals nicht "aaaaaaaaaaaaaaa" herauskommen,
sondern da steht dann "zzzzzzzzzzzzzzzzz".
Warum? Ganz einfach: Weil das Programm so programmiert ist, dass
es lauter 'z' wegschickt und nicht lauter  'a'.

> Ich hab bis jetzt bei falscher Baudrate immer was
> absolut(zumindest für mich nicht) Nachvollziehbares heraus bekommen.

Das ist schon richtig. Ist bei mir ganz genauso. Wenn die
Baudrate nicht stimmt, dann kommt auf der Gegenseite Merkwürdiges
raus. Allerdings: meistens kommt da ein wirrer Zeichensalat aus
den merkwürdigsten Buchstaben. Eine Folge von immer dem gleichen
Zeichen ist mir noch nie untergekommen (zumindest erinnere ich
mich nicht daran).

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.