Forum: Mikrocontroller und Digitale Elektronik Initialisierung UART an Atmega 16


von Strippi (Gast)


Lesenswert?

Hallo zusammen

ich habe ein Problem mit der Initialisierung der UART Schnittselle am 
Atmega16.

Wärend der Initialisierungsphase soll das UCSRC gelesen Beziehungsweise 
die Steuerbits geschaltet werden. Diese fuktioniert leider nicht ich 
habe schon so ziemlich alles versucht.
Das UBRRH Register was die gleich Adresse verwendet läßt sich auch nicht 
beschreiben.

Hat jemand einen Tipp ?

von Rahul, der Trollige (Gast)


Lesenswert?

>Hat jemand einen Tipp ?

USREL-Bit

von johnny.m (Gast)


Lesenswert?

Guckst Du Datenblatt: URSEL gesetzt -> UCSRC wird geschrieben
                      URSEL nicht gesetzt -> UBRRH wird geschrieben

von Strippi (Gast)


Lesenswert?

Hallo

danke für eure Antworten habe ich schon getestet funzt  leider nicht.

URSEL habe ich gelöscht und gesetzt leider alles zecklos.


von Rahul, der Trollige (Gast)


Lesenswert?

Zeigen!

von Rahul, der Trollige (Gast)


Lesenswert?

Warum gibt sich Atmel eigentlich immer solche Mühe mit den 
Datenblättern, wenn keiner reinguckt?

Auf Seite 148 ist die USART-Initialisierung inklusive Beispiel 
beschrieben.

von Rahul, der Trollige (Gast)


Lesenswert?

Das Bit heisst USBS...

von Strippi (Gast)


Lesenswert?

Hier der Code


void init_uart (unsigned char baud   )
{

// baud = 51

 UBRRH = (unsigned char)(baud>>8);

 UBRRL = (unsigned char)baud;

 /* Enable  Transmitter */

 UCSRB = (1<<TXEN);
 UCSRC = (1<<USBS)|(1<<UCSZ0);;


}

von johnny.m (Gast)


Lesenswert?

> UCSRC = (1<<USBS)|(1<<UCSZ0);
Und wo hast Du da URSEL gesetzt? Es muss heißen
1
UCSRC = (1 << URSEL) | (1 << USBS) | (1 << UCSZ0);

von Rahul, der Trollige (Gast)


Lesenswert?

baud sollte eigentlich eher einen grösseren Datentyp haben.
Tut hier aber nichts zur Sache.

Welche Taktfrequenz und Baudrate hast du denn?

von Rahul, der Trollige (Gast)


Lesenswert?

Und woran merkst du, dass es nicht funktioniert?

von Karl H. (kbuchegg)


Lesenswert?

Bei F_CPU musst du noch deine tatsächliche Taktfrequenz
einstellen.

Die Initialisierung des Baudratenregisters klappt bei mir
nur dann, wenn ich sie nach dem Beschreiben von UCSCRC mache.
1
#ifndef F_CPU
2
#define F_CPU 7372800UL
3
#endif
4
5
#include <avr/io.h>
6
7
8
void InitUart( unsigned int Baud )
9
{
10
  UCSRB |= (1<<TXEN) | (1<<RXEN);
11
  UCSRC |= (1<<URSEL)| (1<<USBS) | (3<<UCSZ0);
12
13
  Baud = F_CPU / (Baud * 16L) - 1;
14
15
  UBRRH = (unsigned char)( Baud >> 8 );
16
  UBRRL = (unsigned char)Baud;
17
}
18
19
void uart_putc( const char c )
20
{
21
  while( !( UCSRA & (1<<UDRE) ) )
22
    ;
23
  UDR = c;
24
}
25
26
int main()
27
{
28
  InitUart( 4800U );
29
30
  while( 1 ) {
31
    uart_putc( 'X' );
32
  }
33
}

von Strippi (Gast)


Lesenswert?

Habe ich hier nochmal sder neue Code mit URSEL

P.s ich verwende einen JTAG von Atmel und AVR Studio mit Sp2

void init_uart (unsigned char baud   )
{

// baud = 51

 UBRRH = (unsigned char)(baud>>8);

 UBRRL = (unsigned char)baud;

 /* Enable Receiver and Transmitter */

 UCSRB = (1<<TXEN);
 UCSRC = (1<<URSEL)|(1<<USBS)|(1<<UCSZ0);;
 /* Set data Frame 8 Data Bits 1 Parity */

}

von Rahul, der Trollige (Gast)


Lesenswert?

>ich verwende einen JTAG von Atmel und AVR Studio mit Sp2

Was soll uns das sagen?

von johnny.m (Gast)


Lesenswert?

...Und, klappt es? Vermutlich nicht. Aber wenn Du jetzt noch, wie von 
Karl Heinz angemerkt, erst die Steuerregister und dann die 
Baudratenregister schreibst, dann sollte es gehen, vorausgesetzt, Du 
hast die korrekte Taktfrequenz eingestellt...

von Strippi (Gast)


Lesenswert?

Danke
an alle funzt leider nicht

UBRRH und UCSRC werden nicht beschieben


von johnny.m (Gast)


Lesenswert?

Wird das Unterprogramm denn überhaupt (korrekt) aufgerufen?

von Strippi (Gast)


Lesenswert?

ja wir es, UCSRB = (1<<TXEN) wird ausgeführt

von Karl H. (kbuchegg)


Lesenswert?

Strippi wrote:
> ja wir es, UCSRB = (1<<TXEN) wird ausgeführt

Woher weist du das?
Simulator? Vergiss ihn!

Welches Program?
Das das ich gepostet habe stammt von gestern abend
direkt von meinem Mega16. Das geht nachweislich.
Wenn du damit am PC keinen Empfang hast, dann hast du
ein anderes Problem. (Kabel gekreuzt, MAX232 geht nicht,
flasche Taktfrequenz, etc...)

von Rahul, der Trollige (Gast)


Lesenswert?

>Woher weist du das?
>Simulator? Vergiss ihn!

>ich verwende einen JTAG von Atmel und AVR Studio mit Sp2

Nix Simulator...Emulator!
Solange die Baudrate und die Taktfrequenz unbekannt sind, ist das wieder 
nur Rumgestochere...

von Strippi (Gast)


Lesenswert?

Ich messe direkt an dem TX Pin vom ATmega 16.

Taktfrequenz ist 8 MHz intern.

Kabel sind auch nicht gekreuzt.

von Rahul, der Trollige (Gast)


Lesenswert?

>// baud = 51

Würde zu 2MHz und 2400Baud (0,2%Fehler) oder 8MHz und 9600baud oder 
16MHz und 19,2kbaud oder 16MHz, 38,4kbaud und U2X=1 passen...

Mehr dazu findet man in Tabelle 68ff im Datenblatt...

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.