www.mikrocontroller.net

Forum: Compiler & IDEs UART zu langsam - wo ist der Fehler?


Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo, ich weiß nicht weiter mit diesem Mini-Codeschnipsel. Er soll 
einfach permanent via printf "12345" ausgeben. Aber die UART sendet sehr 
langsam. Ist evtl. mein Chip defekt? Hat jemand gerade einen Mega8 und 
könnte das mal ausprobieren? oder sieht jemand den Fehler? Ich hatte 
schonmmal gepostet und die Register überprüft.. Mit dem Mega2560 und 
angepaßten Registern geht es.. seltsam..
#ifndef F_CPU
  #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 1000000"
  #define F_CPU 1000000UL
#endif

// Berechnungen für RS232
#define BAUD 1200UL          // Baudrate 1200
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1) // USART Baud Rate Register 
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1))) 
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD)
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif

#include <avr/io.h>
#include <stdio.h>

int main(void);
static void USART_Init( unsigned int ubrr);
int uart_putchar(char c, FILE *stream);
static FILE mystdout = FDEV_SETUP_STREAM( uart_putchar, NULL, _FDEV_SETUP_WRITE );

//*******************************************************
int main(void)
{
  USART_Init(UBRR_VAL);
    stdout = &mystdout;
  while(1) { printf("12345\n"); }
}

int uart_putchar( char c, FILE *stream )
{
    if( c == '\n' )
        uart_putchar( '\r', stream );
 
    loop_until_bit_is_set( UCSRA, UDRE );
    UDR = c;
    return 0;
}
 
void USART_Init( unsigned int ubrr)
{
  UBRRH = (unsigned char)(ubrr>>8);
  UBRRL = (unsigned char)ubrr;
  //Enable receiver and transmitter 
  UCSRB = (1<<RXEN)|(1<<TXEN);
  //Set frame format: 8N1
  UCSRC = (3<<UCSZ0);
}

Autor: Johannes M. (johnny-m)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
CAnfänger wrote:
>   UCSRC = (3<<UCSZ0);
Schon mal ins Datenblatt vom ATMega8 geschaut? Beim ATMega8 und 16 
teilen sich UCSRC und UBRRH die selbe Adresse, weshalb der Zugriff auf 
UCSRC anders ist. Dabei muss das Bit URSEL gesetzt sein, sonst landet 
alles in UBRRH!

Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Arrgh.. jetzt sehe ich es auch.. ich war schon dicht dran, hab aber für 
die Init (c-code-example) ins falsche Datenblatt geschaut.. Der Hinweis 
kam ja schonmal im anderen Thread, aber im falschen Datenblatt konnte 
ich natürlich keinen Fehler feststellen.. :-)

Autor: CAnfänger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
und schon funktioniert es.. :-)

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.