USART ATmega8

Gast #144148
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!
Angehängte Dateien:
Gast
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
Gast
@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.
Gast
//*****************************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
Gast
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).
Gast
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.
Gast
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?
Angehängte Dateien:

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 21 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.