Hallo,
ich habe eine RS232 Verbindung zwischen ATMEGA16 und seriellem
Port des PC aufgebaut. Mein Code sieht dabei folgendermaßen aus:
Wenn ich dann den Controller über MAX232 an den COM4 stecke, dannCode:// 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';
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
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.
Disclaimer: none. Sue me.
Lesezeichen