PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : UART Problem mit Übertragung



ricola
23.10.2005, 19:29
Hallo,
ich habe eine RS232 Verbindung zwischen ATMEGA16 und seriellem
Port des PC aufgebaut. Mein Code sieht dabei folgendermaßen aus:


// external clock speed (12.0 MHz)
#define CPU_SPEED 12000000
// Baudrate for USART Interface
#define UART_BAUDRATE 9600
// UART UBRR Value
#define UART_UBRR ((CPU_SPEED/(16l*UART_BAUDRATE))-1)



// init USART transmit
UBRRH = (unsigned char)(UART_UBRR>>8);
UBRRL = (unsigned char) UART_UBRR;

// enable USART transmit
UCSRB |= (1<<TXEN); // set UART TX
UCSRC |= (1<<URSEL) | (1<<UCSZ1) | (1<<UCSZ0); // Asynchronous 8N1

// wait for empty transmit buffer
while ( !(UCSRA & (1<<UDRE)) ) ;
// put data into buffer and send
UDR = 'M';



Wenn ich dann den Controller über MAX232 an den COM4 stecke, dann
kommt dort aber nur Müll an (9600Baud eingestellt, 8 Daten, 1 Stop)
Also habe ich mir den Pin2 mit dem Oszy angesehen:

Signalpegel von -8V (High), Peaks bei +8V (Low):

0 1 0 1 1 0 0 1 0 dann immer 1 (Stop+Ruhe)

das würde also einem Startbit und einem invertierten M (0 1 0 0 1 1 0 1) entsprechen.
Wo liegt jetzt das Problem, dass ich kein M bekomme?

Ach so: Die Breite eines Bits beträgt laut Oszy etwas über 100µs, also
genau 9600 Baud, hier liegt das Problem demnach nicht!

DANKE für Hilfe
Gruß
RICOLA

SprinterSB
24.10.2005, 10:39
Wie kommst du darauf, daß 'M' invertiert übertragen wird?
RS232 ist little Endian, d.h. Bit 0 wird zuerst gesendet ;-)

Initialisieren würde ich immer mit =, nicht mit |= oder &=
so daß du immer weißt, was in den SFRs wirklich steht.

UCSRA=?

Bei Taktraten, die zu gebrochenem Wert für UBRR führen, wird UBRR abgerundet. Das ist aber nicht unbedingt die Rundung, die zum kleinsten Fehler in der Baudrate hinführt.