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

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.

Formatierung
  • [c]C-Code[/c]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] – Link zu einem Artikel
  • Verweis auf einen anderen Beitrag: Rechtsklick auf dessen Beitrags-ID (#8078628), „Adresse kopieren“, in den Text einfügen

Mehr zur Formatierung

Längeren Sourcecode als Anhang, nicht in den Text. JPG nur für Fotos und Scans; Zeichnungen und Screenshots als PNG oder GIF. Siehe Bildformate.

Schon registriert? Anmelden

Wird nicht angezeigt. Wir schicken dir einen Link; sobald du damit bestätigst, erscheint dein Beitrag.

Mit dem Abschicken legst du einen kostenlosen Account an und erkennst die Nutzungsbedingungen und die Datenschutzerklärung an.