Forum: Mikrocontroller und Digitale Elektronik USART Anfängerproblem


von Peter (Gast)


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

von Ich kann das (Gast)


Lesenswert?

hey

ohne jetzt deinen Code durchgelesen zu haben, bist du sciher, dass du im 
Terminalprogramm die gleiche Baud Rate eingestellt hast, wie am µC?

von Hubert G. (hubertg)


Lesenswert?

Sollte es statt
1
UCSR0C = (1<<UCSZ00)|(1<<UCSZ10);
nicht eher
1
UCSR0C = (1<<UCSZ00)|(1<<UCSZ01);
heißen.

von Lord Z. (lordziu)


Lesenswert?

Hallo. Ist die Fuse CKDIV8 gesetzt?

von Peter (Gast)


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.

von Tom M. (tomm) Benutzerseite


Lesenswert?

Nimm USART_Transmit() doch mal in den while() Block, zusammen mit einem 
_delay_ms(1000). Dazu noch util/delay.h "includen".

Damit solltest du jede Sekunde ein Zeichen am seriellen Port empfangen 
können und hast eine einfache Kontrolle, ob F_CPU die tatsächliche 
Taktfrequenz abbildet.

von Hc Z. (mizch)


Lesenswert?

Ist F_CPU bereits außerhalb definiert?  Verwendest Du einen Makefile, 
der F_CPU definiert?

Wie ist der USART angeschlossen?  Ist ein invertierender Pegelwandler 
vorhanden?

von Peter (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Peter schrieb:
> @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!

Deine Taktfrequenz stimmt um den Faktor 8 nicht.
Und du hast die CKDIV8 Fuse gesetzt, die die Quarzfrequenz um den Faktor 
8 runterteilt.
Was sagt dir das?

von Peter (Gast)


Lesenswert?

Sorry, ich hbae die CKDIV8 überhaupt nicht ebeachtet. Vielen Dank an 
alle!

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.