mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART ATmega8


Autor: Thomas M. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Ich weiss, dass das Thema schon öffter angesprochen wurde aber
eigentlich funktioniert mein USAR aber eben noch lange nicht 100% und
ich weiss nicht warum?

#define F_CPU            4000000      /* 4Mhz */
#define UART_BAUD_RATE      9600      /* 9600 baud */
// Berechnung des Inhalts des UBBR-Registers
#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1)

void USART_Init(void)
{
   // Set baud rate
   //UBRRH = 0;
   //UBRRL = 12;
  // Enable receiver and transmitter and Interrupts
  UCSRB = (1<<RXCIE) | (1<<TXCIE) | (1<<RXEN) | (1<<TXEN);
    // Set frame format: 8data, 1stop bit,no parity
  UCSRC = (1<<URSEL)|(3<<UCSZ0);
  UBRRL = (unsigned char) UART_BAUD_SELECT;
}
Das Ergebnis kann ma im Dateianhang sehen. Das ist nichts wildes aber
mit dem ATmega16 funktioniert das einwandfrei. Die auskommentierte
Variante ergibt das gleiche Resultat.

Ich würde mich über jede Hilfe freuen, Danke!

Autor: Jens123 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sieht schwer nach unterschiedliche Frequenz aus von der MCU
hast du einen QUARZ Dran oder nutzt du den internen RC Oszilator???

Such mal nach der LIB von Peter Flury.. mit der bin ich bisher immer
sehr gut gefahren

Gruss Jens

Autor: Thomas M. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich benutze die interne Clock aber vielleicht sollte ich das mal mit
einem externem Quarz versuchen

Autor: Peter Wilbert (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
versuch es doch mal damit:

#define UART_BAUD_RATE      9600L  /* 9600 als long */

Peter

Autor: Zotteljedi (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@Peter:

Ich glaube nicht, daß es daran liegt, denn:

#define UART_BAUD_RATE      9600      /* 9600 baud */
#define UART_BAUD_SELECT (F_CPU/(UART_BAUD_RATE*16l)-1)

Der Wert 9600 wird mit einem long int (16L) multipliziert, und dadurch
implizit zuerst auf long int promotet. Das Ergebnis ist ebenfalls long
int. Ob 9600 oder 9600L macht also keinen Unterschied.

Abgesehen davon empfängt er ja eine Reihe richtiger Zeichen, wäre die
Berechnung hier schon so katastrophal falsch, käme vermutlich nichtmal
ein Mucks raus (bzw. kein lesbarer). Es wird ja auch nur einmal
berechnet, vom Präprozessor, und landet direkt als Zahl im Code. Das
kann also nicht (alleine) für einen geht-geht-nicht-Fehler zur Laufzeit
verantwortlich sein.

Autor: peter dannegger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: josef (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
//*****************************INI UART 9800
Baud**********************************************
void Ini_Uart(void)

        {
        // USART Baud rate: 9600
        UCSRA=0x00;
        UCSRB=0x98;
        UCSRC=0x86;
        UBRRH=0x00;
        UBRRL=0x33;
        }

//*****************************Zeichen
senden***************************************************
void Put_char(char data)
{
    while    (  !  ( UCSRA &  (1 << UDRE) )    )    ;
//warten, bis Sender leer ist

   UDR  =       data;
}
//****************************Text aus Flashtabelle
ausgeben*****************************************
void Text_Uart(char flash *Table)
  {
         char Loop,Dat;
  while (1)
    {
          Dat = *Table++;            //char aus Tabelle holen
          if (Dat == 0) break;
          Put_char(Dat) ;
          }
         }
//********************************************************************** 
**********************

Läuft mit internem Quarz 8 Mhz sehr gut. Masseprobleme beachten !


SG Josef

Autor: Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
erst UBRRH und dann UBRRL übergeben...Zumidest ist das bei den Megas,
die ich bisher verwendet habe so. (Warum weiß ich jetzt auch nicht
mehr; liegt aber am UBRRH-Register).

Autor: thkais (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So, wie es ausschaut, ist es das erste Zeichen, das immer wieder
verstümmelt wird.
Wird dieser Text jedesmal nach Reset gesendet? Also hast Du jedesmal
Reset ausgelöst?
Dann könnte es daran liegen, daß der Uart kurz nach dem Reset noch
nicht definiert ist, der TXD dadurch floatet und irgendeinen Mist
ausgibt und dadurch dem PC ein Startbit vorgaukelt.
Das ist eine Hardware-Sache - abhängig vom µC, dem RS-232-Wandler,
Leiterbahnen, Mondphase etc...
Wenn Du nach der Initialisierung des UART eine Verzögerungsschleife von
min. der Dauer eines Bytes einfügst, sollte das Problem verschwunden
sein.

Autor: Thomas M. (Gast)
Datum:
Angehängte Dateien:

Bewertung
0 lesenswert
nicht lesenswert
Hi,

danke für eure Hilfe, es hat wohl an der internen Clock gelegen. Ich
habe jetzt ein externes Quarz angeschlossen und das Ergebnis könnt ihr
jetzt im Anhang sehen.
Da ich vorher ein 4433 auf dem Board hatte und der eben eine externe
Clock benötigt war es kein Problem. Ich habe nicht geglaubt, dass es
daran liegen könnte.
Diese Lösung gefällt mir nicht aber ich habe mir heute so wie so zwei
neue Atmega8 bestellt.

Wie kann ich eigentlich mit Hyperterminal Zeichen an den Atmel senden?

Muss ich das über eine Datei machen?

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.