Hallo,
ich möchte mit einem ATMEGA644p ein Zeichen über das USART0 senden. Dazu
habe ich die Routienen zum initialisieren und senden aus dem Datenblatt
übernommen und die Register (USART0) und das Frame Format (8 Bit, 1 Stop
Bit) angepasst. Das makro zur Bausratenberechnung habe ich von hier.
Hier der ganze code:
1 | #ifndef F_CPU
|
2 | #define F_CPU 16000000UL // Systemtakt in Hz - Definition als unsigned long beachten
|
3 | // Ohne ergeben sich unten Fehler in der Berechnung
|
4 | #endif
|
5 | #define BAUD 9600UL // Baudrate
|
6 |
|
7 | // Berechnungen
|
8 | #define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // clever runden
|
9 |
|
10 | #include <avr/io.h>
|
11 |
|
12 | int main(void)
|
13 | {
|
14 | USART_Init();
|
15 | USART_Transmit(65); //Sende ein 'A'
|
16 | while(1)
|
17 | {
|
18 |
|
19 | }
|
20 | return 0;
|
21 | }
|
22 |
|
23 |
|
24 | void USART_Init()
|
25 | {
|
26 | /* Set baud rate */
|
27 | UBRR0H = (unsigned char)(UBRR_VAL>>8);
|
28 | UBRR0L = (unsigned char)UBRR_VAL;
|
29 | /* Enable receiver and transmitter */
|
30 | UCSR0B = (1<<RXEN0)|(1<<TXEN0);
|
31 | /* Set frame format: 8data, 1stop bit */
|
32 | UCSR0C = (1<<UCSZ00)|(1<<UCSZ10);
|
33 | }
|
34 |
|
35 | void USART_Transmit(unsigned char data)
|
36 | {
|
37 | /* Wait for empty transmit buffer */
|
38 | while ( !( UCSR0A & (1<<UDRE0)));
|
39 | /* Put data into buffer, sends the data */
|
40 | UDR0 = data;
|
41 | }
|
Ich mache das ganze auf einem STK500 mit 16MHz Quarz, Fuse SUT_CKSEL ist
auf "Ext. Crystal Osc. 8.0- MHz; Start-up time: 258 CK + 65 ms". mein
Terminalprogramm (Docklight) empfängt aber statt des "A" nur 80 00 HEX.
Sende ich andere Werte, wird manchmal 00 00 HEX, manchmal 80 00 Hex
empfangen. Ich weiß nun nicht, ob ich bei der Baudratenberechnung, der
Initialisierung, dem Senden oder ganz wo anders einen Fehler gemacht
habe. Kann mir jemand weiter helfen?
MfG Peter