Forum: Mikrocontroller und Digitale Elektronik UART zeichen einlesen/empfangen


von jamest (Gast)


Lesenswert?

Moin!
Ich benutze für meinen AT90CAN128 folgende Befehle um Zeichen einzulesen 
und zu versenden (RS232):

void uart_putc( uint8_t data )
{
  while ( !(UCSR0A & (1<<UDRE0)) );

  UDR0 = data;
}

uint8_t uart_getc(void)
{

    while (!(UCSR0A & (1<<RXC0)));
    return UDR0;                   // Zeichen aus UDR an Aufrufer 
zurueckgeben
}

So siehts dann in der Main schleife aus:
  NextChar=uart_getc();
  uart_putc(NextChar);

Ich will mir also vom programm die eingegebenen Zeichen anzeigen lassen!
Aber leider kommt nur Müll zurück, undzwar jedes mal anderer Müll. Wenn 
ich hingegen uart_putc('A'); schreibe gibt er mir ganz normal ein A 
raus!
Kann mir da jemand helfen?

von Timmo H. (masterfx)


Lesenswert?

Immer andere Müll ist ein Anzeichen dafür dass die Baudrate nicht 100% 
stimmt

von jamest (Gast)


Lesenswert?

okay! aber wenn ich zeichen vom µc aus sende kommen die ja einwandfrei 
an. dann scheint ja die baudrate für den empfang beim µc falsch zu 
sein.. aber die kann ich doch nicht separat einstellen... ist ein 
at90can128 auf nem evaluationsboard...

von Karl H. (kbuchegg)


Lesenswert?

leg dir mal das empfangene Zeichen auf einen Port und sieh mit 8 LED 
(oder einem Voltmeter) nach, wo das Problem liegt. Beim Senden oder beim 
Empfangen.

von jamest (Gast)


Lesenswert?

danke für den tipp! und an der LED wird tatsächlich die richtige zahl 
dargestellt. Ich habe folgendes festgestellt. Ich kann die Funktion 
putchar erstmal ohne probleme verwenden, getchar dann auch einmal. wenn 
ich jetz wieder putchar verwenden will klappt nichts mehr! Das muss also 
doch irgendwie mit meinen Funktionen zusammenhängen dass ich in dem UART 
register irgendwas vergessen hab. Aber ich benutz doch die Standard 
Funktionen aus den Beisipelprogrammen...

von Timmo H. (masterfx)


Lesenswert?

Wie sieht denn deine Init-Funktion für den UART aus und wie ist dein 
Takt (auch FUSES richtig eingestellt, wegen internen und externen Takt?)
Bedenke, dass der Interne Oszillator nicht so genau ist und daher 
durchaus Störungen auftreten können.

von jamest (Gast)


Lesenswert?

JTAGEN und SPIEN wobei an SPIEN son kleines rotes fragezeichen hängt.
ext crystl. osz 8Mhz Start up time  16K Cycles + 65ms

die uart init:

U8 uart_init (U8 mode, U32 baudrate)
{
    Uart_clear();       // Flush, Disable and Reset UART
    if (Uart_set_baudrate(baudrate) == 0) return 0;  //!<  c.f. macro in 
"uart_drv.h"
    Uart_hw_init(mode);     //!<  c.f. macro in "uart_drv.h"
    Uart_enable();          //!<  c.f. macro in "uart_drv.h"
    return (1);
}

also das is aus der uart_lib.c und ich initalisiere das ganz dann so:

Uart_select(UART_0);
uart_init(CONF_8BIT_NOPAR_1STOP,9600);

von Karl H. (kbuchegg)


Lesenswert?

Und was verbirgt sich hinter all den Funktionen?

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.