Ich versuche, USART auf meinem atmega8-16PU-Mikrocontroller zum Laufen zu bringen. Ich habe die Dokumentation studiert und die Codebeispiele von dort genommen. Ich habe es geschafft, die Daten vom Mikrocontroller zum PL-2303HX-Chip zu übertragen, der über USB mit meinem Computer verbunden ist
Das Problem ist, dass ich andere Daten erhalte als die, die ich von mcu sende. Hier ist der Code:
#define F_CPU 8000000UL // Clock Speed
#define BAUD 9600
#define MYUBRR (((F_CPU / (BAUD * 16UL))) - 1)
void USART_Init( unsigned int ubrr)
{
/* Set baud rate */
UBRRH = (unsigned char)(ubrr>>8);
UBRRL = (unsigned char)ubrr;
/* Enable receiver and transmitter */
UCSRB = (1 << RXEN) | (1 << TXEN);
/* Set frame format: 8 data bits, 1 stop bit */
UCSRC = (1 << URSEL) | (1 << USBS) | (1 << UCSZ0);
}
void USART_Transmit( unsigned char data )
{
/* Wait for empty transmit buffer */
while ( !( UCSRA & (1<<UDRE)) );
/* Put data into buffer, sends the data */
UDR = data;
}
int main()
{
USART_Init(MYUBRR);
while(1) /* run continuously */
{
USART_Transmit('a');
_delay_ms(100);
}
}
Ich bekomme 0x80 0x00 auf der Seite des Empfängers und das ist nicht das 'a'-Symbol. Wenn es wichtig ist, wird ein 12-MHz-Quarz an den PL-2303HX-Chip angeschlossen. Was mache ich falsch?
Häufigster Fehler: Sie haben die (Standard-)Clock Div8 Fuse vergessen und Ihre MCU läuft mit 1 MHz statt 8 MHz. Versuchen Sie, Ihre COM-Baudrate auf dem PC auf 1200 Baud einzustellen.
Noch ein Nitpick:
#define FOSC 8000000UL // Clock Speed
...
#define MYUBRR (((F_CPU / (BAUD * 16UL))) - 1)
Beachten Sie, dass Sie es in Ihrem Makro definiert FOSC
, aber dann verwendet haben .F_CPU
Sie berechnen Ihre Baudrate falsch. Sie haben #define FOSC 8000000UL als Taktgeschwindigkeit Ihrer Uhr definiert, aber Ihre Baudratenberechnung erfordert ein F_CPU-Symbol. Dieses Symbol wird in der #include-Bibliothek als 1 MHz definiert. Ihre berechnete Baudrate ist also falsch, ebenso wie die Zeit in Ihrer Verzögerung. Ändern Sie also diesen FOSC in F_CPU und definieren Sie ihn vor dem #include oder definieren Sie ihn so, dass Sie die Option -D für Ihren Compiler verwenden. Hoffe das hilft
römisch
römisch
Standard-Sandun