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


von CAnfänger (Gast)


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..
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
}

von Johannes M. (johnny-m)


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!

von CAnfänger (Gast)


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.. :-)

von CAnfänger (Gast)


Lesenswert?

und schon funktioniert es.. :-)

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.