Forum: Mikrocontroller und Digitale Elektronik AVR UART mal wieder


von Matze (Gast)


Lesenswert?

Hallöchen,

ich habe da ein Problem. Ich hab mal wieder die AVRs ausgegraben und 
wollt ein paar alte projekte weitermachen. Nun habe ich ein problem, das 
ich früher nie hatte... der UART will nicht.

Ich hab mal meinen Code hier.
es geht um einen ATmega32.
Wenn ich mir im Osci das Ausgabesignal am TX anschaue, dann sehe ich das 
der 50ms Delay prima funktioniert und auch passt - sind 50ms.
Dagegen sind die einzelnen Bits 7ms lang! Was erheblich zu viel ist. 
(bei korrekten 19200baud sollte ich die auf meinem alten röhren teil 
garnicht richtig auflösen können)

[c]
int main (void)
{
  //  uart_init(19200,8,2);
   uint16_t baudVal = 25; //(F_CPU / (baud * 16UL) - 1);

   UBRRH = (unsigned char)(baudVal >> 8);
   UBRRL = (unsigned char) baudVal;

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

   while(1)
   {
     // uart_putc(0b10101010);
      while(!(UCSRA & (1<<UDRE))); // Warte, bis Transmitter bereit.
      UDR = 0b10101010;
      _delay_ms(50);

   }
}
[c/]

Hat jemand ne Idee?
meine Fuse sind 0xD4 und 0xE4 (laut AtmelStudio) also sollte 8MHz sein

Könnte es am AtmelStudio liegen? - früher hab ich mim AVRdude gearbeitet 
und da tat alles...

Ich danke für eure Mühen!

von H.Joachim S. (crazyhorse)


Lesenswert?

Matze schrieb:
> | (3<<UCSZ0);

? Gewollt oder Schreibfehler ?

von Einer K. (Gast)


Lesenswert?

Matze schrieb:
> Könnte es am AtmelStudio liegen?
> früher hab ich mim AVRdude gearbeitet
Das ist eine Nebelkerze.

Matze schrieb:
> 19200baud 8MHz

http://www.gjlay.de/helferlein/avr-uart-rechner.html

von Georg G. (df2au)


Lesenswert?

Datenblatt, Zugriff auf UCSRC:
When doing a write access of this I/O location, the high bit of the 
value written, the USART Register
Select (URSEL) bit, controls which one of the two registers that will be 
written. If URSEL is
zero during a write operation, the UBRRH value will be updated. If URSEL 
is one, the UCSRC
setting will be updated.

von S. Landolt (Gast)


Lesenswert?

> (bei korrekten 19200baud sollte ich die auf meinem alten
> röhren teil garnicht richtig auflösen können)
Kann das sein, 52 us? Merkwürdiges Oszilloskop.

Im Programm sehe ich keinen Fehler; wurde das wirklich für den ATmega32 
übersetzt?

von Hermann (Gast)


Lesenswert?

Georg G. schrieb:
> Datenblatt, Zugriff auf UCSRC:
> When doing a write access of this I/O location, the high bit of the
> value written, the USART Register
> Select (URSEL) bit, controls which one of the two registers that will be
> written. If URSEL is
> zero during a write operation, the UBRRH value will be updated. If URSEL
> is one, the UCSRC
> setting will be updated.

Da bin ich auch für!

von S. Landolt (Gast)


Lesenswert?

Okay, jetzt sehe ich den Fehler mit dem fehlenden URSEL auch.

von Matze (Gast)


Lesenswert?

Oh in der Tat da fehlt das URSEL.
Seltsam.... der code ist ~5Jahre alt und hat nie probleme gemacht... 
keine ahnung wo das hin ist.

Vielen Dank für den Hinweiß!

von S. Landolt (Gast)


Lesenswert?

> ... und hat nie probleme gemacht...
Auf einem ATmega32? Kann eigentlich nicht sein!

Es passt übrigens:
UBRRL wird auf 25 gesetzt, UBRRH (fälschlicherweise per UCSRC) auf 0x0E, 
ergibt bei 8.00 MHz 138.5 Bd und folglich mit 7.22 ms recht gut

> die einzelnen Bits 7ms lang

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.