PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART sendet nur a´s statt x´s



cesupa
03.09.2007, 15:25
Hallo,

ich versuche grade eine Verbindung über die RS232 Schnittstelle ziwschen meinem ATMEGA8 und PC herzustellen. Also Windows-Empfangssoftware verwende ich HyperTerminal. Mein UART-Code (von mikrocontroller.net) sieht so aus:




#include <avr/io.h>

#define F_CPU 16000000L
#define BAUD 9600L
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000)

#if((BAUD_ERROR>10) || (BAUD_ERROR<-10))
#error FEHLER! BAUD Rate fehlerhaft!!!
#endif

int main(void)
{

UCSRB|=(1<<TXEN);
UCSRC|=(1<<URSEL) | (3<<UCSZ0);

UBRRH=UBRR_VAL >>8;
UBRRL=UBRR_VAL & 0xFF;

while(1){
while(!(UCSRA & (1<<UDRE)))
{
}

UDR='x';
}
return 0;
}


Wenn ich das ganze laufen lasse, empfange ich über HyperTerminal lauter a Zeichen, es sollten aber lauter x Zeichen sein. Hab ich irgendwo einen Fehler gemacht?

Gruß
cesupa

Reeper
03.09.2007, 15:44
Hier:

UCSRC|=(1<<URSEL) | (3<<UCSZ0);

Neu:

UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);
(8-bit, Asynchron, 1xStopp-bit)


Mit geänderten #define's funktioniert es bei mir:

#include <avr/io.h>

#define BAUD 115200UL
#define UBRR_BAUD ((F_CPU/(16L*BAUD))-1)

int main(void)
{

UBRRH = (uint8_t) (UBRR_BAUD>>8);
UBRRL = (uint8_t) (UBRR_BAUD & 0xFF);

UCSRB =(1<<TXEN);
UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);

while(1){
while(!(UCSRA & (1<<UDRE)))
{
}

UDR='x';
}
return 0;
}

(F_CPU steht bei mir im Makefile)

Gruß
Stefan

cesupa
03.09.2007, 16:42
Also ich hab jetzt alles umgändert und zunächst kamen wieder nur a's, dann hab ich mal versuchsweise auf RESET gedrückt und aufeinmal kamen wie erwünscht lauter x's. Kann es sein, das der UART auch beim Senden erst eine "Aufwärmungsphase" braucht?

Gruß
cesupa