Forum: Compiler & IDEs ATMEGA32 UART mag nich


von Tobias M. (twam) Flattr this


Lesenswert?

Hallo!

Hab eine kleine Testroutine gebastelt und meinen UART zum Alphabet
aufsagen zu überreden.
1
#define FCPU 8000000L
2
#define UART_BAUD_RATE 9600
3
#define UART_BAUD_CALC(UART_BAUD_RATE,F_OSC)
4
((F_OSC)/((UART_BAUD_RATE)*16L)-1)
5
6
#include <inttypes.h>
7
#include <stdio.h>
8
#include <stdlib.h>
9
#include <avr/io.h>
10
11
int uart_putc(unsigned char c)
12
{
13
    while (!(UCSRA & (_BV(UDRE))));
14
    UDR = c;
15
    return 0;
16
}
17
18
int main( void )
19
{
20
21
    UCSRB |= _BV(TXEN);
22
    UCSRC |= _BV(URSEL)|_BV(UCSZ0);
23
24
    UBRRH=(uint8_t)(UART_BAUD_CALC(UART_BAUD_RATE,F_CPU)>>8);
25
    UBRRL=(uint8_t)UART_BAUD_CALC(UART_BAUD_RATE,F_CPU);
26
27
    for (int i='A';i<'A'+26;i++) {
28
        uart_putc(i);
29
    }
30
31
}

Am PC kommt aber nur Ah"Et!IibMzP5QUuaY an. Dort sind 9600 Baud mit
8N1 eingestellt. Was mach ich denn falsch?

Grüße
  Tobias

von Tobias M. (twam) Flattr this


Lesenswert?

Hi

#define FCPU statt F_CPU war/ist übrigens nicht der Grund, da F_CPU eh
im makefile auf 8000000 gesetzt wird.

Grüße

von Tobias M. (twam) Flattr this


Lesenswert?

Hi,

ich habs endlich gefunden:

    UCSRC |= _BV(URSEL)|_BV(UCSZ0)|_BV(UCSZ1);

Wenn man 8 bit möchte. :)

von Jörg W. (dl8dtl) (Moderator) Benutzerseite


Lesenswert?

Am besten UCSRC gar nicht anfassen, das schützt vor
schieß-dir-ins-Knie-Fehlern.  Die Voreinstellung ist
(vernünftigerweise) 8n1 als Frame-Format.

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.