Forum: Mikrocontroller und Digitale Elektronik USART ATmega8


von Thomas M. (Gast)


Angehängte Dateien:

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!

von Jens123 (Gast)


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

von Thomas M. (Gast)


Lesenswert?

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

von Peter Wilbert (Gast)


Lesenswert?

versuch es doch mal damit:

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

Peter

von Zotteljedi (Gast)


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.

von peter dannegger (Gast)


Lesenswert?


von josef (Gast)


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

von Rahul (Gast)


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).

von thkais (Gast)


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.

von Thomas M. (Gast)


Angehängte Dateien:

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?

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.