USART Anfängerproblem

Gast #1718547
Lesenswert?

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
Gast #1718610
Lesenswert?

@Ich kann das
Das Terminalprogramm steht auf 9600, none, 8,1
Ich denke, dass mein Programm auch so konfiguriert ist...

@ Hubert G.
Danke, das ist wohl eine Fehler gewesen. Jetzt empfange ich am 
Terminalprogramm aber "80 00 80 HEX", da muß also noch was sein.

@ Lord Ziu
ja, Fuse CKDIV8 ist gesetzt.
Gast #1718648
Lesenswert?

@Tom M.
Danke. Da kommt alle 8 Sekunden ein Zeichen. Mit #define F_CPU 2000000UL 
funktioniert es jetzt, d.h. irgendwo ist ein fehler um den Faktor 8 
drin!
Ich verwende AVR Studio. Bei Project->Configuration Options ->Geberal -> 
Frequency steht gar nichst drin. Ich habe ein 16MHz Quartz auf dem 
STK500. Das schein auch am werkeln zu sein, wenn ich es rausziehe stopt 
die Zeichenausgabe, wenn ich's wieder rein stecke, gehts weiter.

ratlose Grüße
Peter

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren