www.mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik atmega16 USART -> Terminal zeigt falsche Zeichen an


Autor: Julian D. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi
folgendes Problem, weiß es scheint es hier öfter zu geben, bin aber 
nicht schlauer geworden aus den Beiträgen.

Im Hyperterminal erhalte ich andere Zeichen als ich Schicke.
ändere ich die Bautrate, ändert sich das Zeichen.

Verwendet wird ein Atmega16 mit externem 8 MHz Quarz.

Mein Quellcode
------------------------------------------------------------------------
#include <avr/io.h>

#ifndef F_CPU
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
   F_CPU im Makefile definiert werden, eine nochmalige Definition
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
   #ifndef/#endif

   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio
   verwendet wird und dort eine andere, nicht zur Hardware passende
   Taktrate eingestellt ist: Dann wird die folgende Definition
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?)
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
   noch nicht definiert: */
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 
8000000"
#define F_CPU 8000000    // Systemtakt in Hz - Definition als unsigned 
long beachten >> Ohne ergeben Fehler in der Berechnung
#endif

#define BAUD 9600UL          // Baudrate

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = 
kein Fehler.

#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu 
hoch!
#endif


void initializeUSART()
{
  UCSRB |= (1<<TXEN);                            // UART TX einschalten
    UCSRC |= (1<<URSEL)|(1 << UCSZ1)|(1 << UCSZ0); // Asynchron 8 
Datenbits, kein Parity, 1 Stoppbit
  UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;
};

void putcUSART(char zeichen)
{
  while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich 
*/
    {}

    UDR = zeichen;                    /* schreibt das Zeichen x auf die 
Schnittstelle */
};


int main()
{
  initializeUSART();
  putcUSART('x');
  return 0;
}

-----------------------------------------------------------------------

was für Einstellungen sind noch zu tätigen?
wie vor allem wie, zb. Fusebits, da blick ich nicht richtig durch.

Hab ich sonst was übersehen?

Bin auch über Links dankbar die mich weiterbringen.

Danke im Voraus. Gruß Julian

Autor: Timmo H. (masterfx)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht es denn wenn du in UBBR fest "51" reinschreibst?

EDIT ahh, du hast bestimmt die Fuses noch nicht auf externen Quarz 
gestellt, oder? Zeig mal nen Screenshot von deinen Fuses.

Autor: Dennis U. (atmegadennis)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
ergänze mal deine F_CPU definition mit UL für unsigned Long

#define F_CPU 8000000UL


vllt wirds dann besser

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.