AVR UART mal wieder

Gast #5316195
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!
#5316210
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.
Gast #5316214
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?
Gast #5316220
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!
Gast #5316723
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

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren