UART zu langsam - wo ist der Fehler?

Gast #1187086
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..
1
#ifndef F_CPU
2
  #warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 1000000"
3
  #define F_CPU 1000000UL
4
#endif
5

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

15
#include <avr/io.h>
16
#include <stdio.h>
17

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

23
//*******************************************************
24
int main(void)
25
{
26
  USART_Init(UBRR_VAL);
27
    stdout = &mystdout;
28
  while(1) { printf("12345\n"); }
29
}
30

31
int uart_putchar( char c, FILE *stream )
32
{
33
    if( c == '\n' )
34
        uart_putchar( '\r', stream );
35
 
36
    loop_until_bit_is_set( UCSRA, UDRE );
37
    UDR = c;
38
    return 0;
39
}
40
 
41
void USART_Init( unsigned int ubrr)
42
{
43
  UBRRH = (unsigned char)(ubrr>>8);
44
  UBRRL = (unsigned char)ubrr;
45
  //Enable receiver and transmitter 
46
  UCSRB = (1<<RXEN)|(1<<TXEN);
47
  //Set frame format: 8N1
48
  UCSRC = (3<<UCSZ0);
49
}
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!
Gast
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.. :-)

Antwort schreiben

Eine eigene Frage? Dieser Thread ist über 17 Jahre alt. Stell sie in einem eigenen Thread – dort lesen mehr Leute mit, und sie wird öfter und schneller beantwortet.

Neuen Thread starten

Eine Lösung, Ergänzung oder Rückmeldung zu diesem Thread? Dann antworte hier.

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.