www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik ATMEGA16 USART UCSRC und UBRRH nicht einzeln ansprechbar


Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

ich habe ein Problem mit der USART Initialisierung beim Atmega 16.
Die Register UCSRC und UBRRH sind im gleichen Speicherbereich. Leider 
gelingt es mir nicht, trotz Verwendung des URSEL-Bits die Register 
einzeln anzusprechen.

Dadurch werden mir immer bereits gesetzte Einstellungen wieder 
überschrieben.

Weiß jemand Rat???

Grüße Jörg

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Program-Code?

Autor: Magnus Müller (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ich habe ein Problem mit der USART Initialisierung beim Atmega 16.
> Die Register UCSRC und UBRRH sind im gleichen Speicherbereich. Leider
> gelingt es mir nicht, trotz Verwendung des URSEL-Bits die Register
> einzeln anzusprechen.
>
> Dadurch werden mir immer bereits gesetzte Einstellungen wieder
> überschrieben.

Hast du das Problem nur bei der Simulation (AVRStudio) oder auch in der 
Zielhardware?

AVRStudio ist leider bei Weitem nicht fehlerfrei. Selbst bei 
einwandfreiem / funktionsfähigem Code kann AVRStudio nicht zwischen 
einem Schreibzugriff auf UCSRC (URSEL gesetzt) und UBRRH (URSEL 
gelöscht) unterscheinden, so dass bei der Simulation IMMER beide 
Register beschrieben werden.

Gruß,
Magnetus

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Problem besteht auch bei der Hardware. Auch der Simulator (AVR 
STUDIO) verhält sich gleich.

Also die Hardware verhält sich genau so, als ob die Register richtig 
angezeigt also falsch beschrieben werden. Es werden nämlich nur 5bit 
gesendet statt 8. DAs sit das einzige was ich definitiv sagen kann.


Jörg

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

Bewertung
0 lesenswert
nicht lesenswert
Noch mal:
Zeig bitte deinen Code!

Autor: Jörg (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,

hier der Code:

Zur Initialisierung:
void Uart0_init(void)
{
 UCSRB = 0x00; /*disable while setting baud rate*/
 UCSRA = 0x00;
 UCSRC = BIT(URSEL) | 0x06; /*keine AUSWIRKUNG im DEBUGGER*/
 UBRRL = 0x19; /*set baud rate lo*/
 UBRRH = 0x00; /*set baud rate hi
 UCSRB = 0x08;
}

/*Senden über UART**/
    while ( !(UCSRA & (1<<UDRE)) )   /*Warte auf leeren Sendepuffer */
    NOP();

   UDR |= 0xAA;               /* Synchro-Byte senden*/
   while ( !(UCSRA & (1<<TXC)) )     /*Warte auf vollständige 
Übertragung*/
    NOP();
    UCSRA = UCSRA &~0x32;       /*Rücksetzen des TXC Bits*/



  for (i = 0; i < 255; i++)           /*Warteschleife*/
  {
       NOP();
  }




Bereits bei der Initialisierung wird im Debug-Mode das Schreiben von
UCSRC = BIT(URSEL) | 0x06; /*keine AUSWIRKUNG im DEBUGGER*/
nicht angezeigt. Dadurch erklärt sich auch dass nur 5 Bit anstatt 8 
gesendet werden.

Autor: inoffizieller WM-Rahul (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Zum Problem:
Was macht BIT(...)?
Benutze doch einfach


UCSSRC = (1<<URSEL) | (1<<UCSZ0) | (1<<UCSZ1);

Auch deine Baudrate kann man durch Verwendung der Zahlen nicht wirklich 
herausfinden. Die Berechnung der Baudrate kann man ganz wunderbar dem 
Preprozessor überlassen.
Übrigens wird in der Regel erst UBRRH und dann erst UBRRL übergeben (bin 
mir nicht ganz sicher, ob der Mega16 damit auch "Probleme" hat.

Hast du dir die Beispiel-Initialisierung im Datenblatt (Seite 148) mal 
angeguckt?

>UDR |= 0xAA;

Sollte auch lieber UDR = 0xAA; heissen. (kanst ja mal herausfinden, was 
der Compiler aus deinem Konstrukt macht).

Es bietet sich auch an, mal ein Blick in AVR-GCC-Tutorial zu werfen...

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.