www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART Anfängerproblem


Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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:
#ifndef F_CPU
  #define F_CPU 16000000UL    // Systemtakt in Hz - Definition als unsigned long beachten 
                             // Ohne ergeben sich unten Fehler in der Berechnung
#endif
#define BAUD 9600UL      // Baudrate
 
// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden

#include <avr/io.h>

int main(void)
{
  USART_Init();
   USART_Transmit(65);  //Sende ein 'A'
  while(1)
    {

    }
    return 0;
}


void USART_Init()
{
  /* Set baud rate */
  UBRR0H = (unsigned char)(UBRR_VAL>>8);
  UBRR0L = (unsigned char)UBRR_VAL;
  /* Enable receiver and transmitter */
  UCSR0B = (1<<RXEN0)|(1<<TXEN0);
  /* Set frame format: 8data, 1stop bit */
  UCSR0C = (1<<UCSZ00)|(1<<UCSZ10);
}

void USART_Transmit(unsigned char data)
{
  /* Wait for empty transmit buffer */
  while ( !( UCSR0A & (1<<UDRE0)));
  /* Put data into buffer, sends the data */
  UDR0 = data;
}

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

Autor: Ich kann das (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Hubert G. (hubertg)
Datum:

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

Autor: Lord Ziu (lordziu)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo. Ist die Fuse CKDIV8 gesetzt?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Tom M. (tomm) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Hc Zimmerer (mizch)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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?

Autor: Peter (Gast)
Datum:

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

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt.
Bitte hier nur auf die ursprüngliche Frage antworten,
für neue Fragen einen neuen Beitrag erstellen.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.