www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik USART


Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo!

Jetzt muss ich euch nochmals nerve - aber ich verspreche, es war das
lezte Mal vorm Wochenende g

Für alle die's noch nicht wissen: Ich arbeite mit dem Mega8515 und dem
IAR Workbench AVR C Compiler.

Ich initialisiere das USART so:

UCSRA = 0x00;
UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0) ;
UBRRH = 0x00;
UBRRL = 0x19;
UCSRB = (1 << TXEN);

Also:
- asynkron
- keine Parität
- 1 Stoppbit
- 8 Datenbits
- Baudrate: 38400 (25 in das Baudratenregister)

Wenn ich nun mit puts("F"); oder printf("F"); versuche etwas
auszugeben, meldet sich weder am PC was noch kann ich mit dem Oszi was
am TXD Pin messen.

Ich habe alle Registereinstellungen mehrfach kontrolliert - aber ich
finde den Fehler nicht ...

Viele Grüße Ralf

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
So ich nochmal ...

Wenn ich das UDR Register von Hand setze funktioniert es einwandfrei.
Mir reicht das so, aber rein aus Interesse wüsste ich nun schon gerne,
warum die anderen Funktionen (Printf und puts) nicht funktionieren ...

Grüße Ralf

Autor: Michael (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
bit 6 von UCSRB muß noch gesetzt werden und der gener. Interrupt Enable
SREG |= 128;
Michael

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Achso - die Funktionen benötigen Interrupts dazu. Ok - danke!
Ralf

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
hm - also ich hab die Interrupts jetzt aktiviert und es funktioniert
dennoch noch nicht ...

#include <stdio.h>

  UCSRA = 0x00;
  UCSRC = (1 << URSEL) | (1 << UCSZ1) | (1 << UCSZ0);
  UBRRH = 0x00;
  UBRRL = 0x19;
  UCSRB = (1 << TXEN) | (1 << RXEN) | (1 << TXCIE) | (1 << RXCIE) | (1
<< UDRIE);

  __enable_interrupt();


    printf("t");
oder
    puts("t");

Grüße Ralf

Autor: Ralf (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ach ja: ich habs auch versucht von Hand zu machen. Setze uch das UDR
Register, so geht das auch:

UDR = 0x20;

Mit zwei funktioniert er auch noch

UDR = 0x20;
UDR = 0x30;

aber alles was drüber ist funktioniert nicht korrekt.

So habe ich versucht zwischen den einzelnen UDR immer zu warten, bis
das USART Transmit Complete Bit gesetzt ist (und hab es anschließend
durch setzen auf 1 wieder auf 0 zurück gesetzt).

Wo liegt jetzt schon wieder das Problem?

Ralf

Antwort schreiben

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.