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


von Jörg (Gast)


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

von inoffizieller WM-Rahul (Gast)


Lesenswert?

Program-Code?

von Magnus Müller (Gast)


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

von Jörg (Gast)


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

von Karl H. (kbuchegg)


Lesenswert?

Noch mal:
Zeig bitte deinen Code!

von Jörg (Gast)


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.

von inoffizieller WM-Rahul (Gast)


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

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.