Forum: Mikrocontroller und Digitale Elektronik UART Empfansproblem


von Florian idb (Gast)


Lesenswert?

Hi Leute hab da ein kleines Problem mit meiner UART schaltung oder der 
Software bin nicht sicher.

Und zwar hab ich einen Atmega8515.

Die Uart ausgabe von uC zum PC klappt allerding scheint es so als würde 
der uC nichts vom PC empfangen.Die Leitungen sind soweit alle in Ordnung 
(denke ich).

hier mein Programm:

#include <avr/io.h>
#include <stdio.h>
#include <inttypes.h>
#include <stdlib.h>
#include <eeprom.h>

// Berechnungen
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille
#define BAUD 9600L

uint8_t ein;
uint8_t Taster;
uint8_t myByte;

uint8_t uart_getc(void)
{
    while (!(UCSRA & (1<<RXC)));   // warten bis Zeichen verfuegbar
    return UDR;                   // Zeichen aus UDR an Aufrufer 
zurueckgeben
}

int uart_putc(unsigned char c)
{
    while (!(UCSRA & (1<<UDRE)))
    {
    }

    UDR = c;
    return 0;
}

void uart_puts (char *s)
{
    while (*s)
    {
        uart_putc(*s);
        s++;
    }
}


int main(void)
{
    UCSRB |= (1<<TXEN);                // UART TX einschalten
    UCSRC |= (1<<URSEL)|(3<<UCSZ0);    // Asynchron 8N1
    UCSRB |= (1<<RXEN);                //UART RX einschalten
    UBRRH = UBRR_VAL >> 8;
    UBRRL = UBRR_VAL & 0xFF;


  while(1)
  {
  ein=uart_getc();
  uart_putc(ein);
  }


}

von Ja mann (Gast)


Lesenswert?

Schreib das mal vernünftig hin:
1
UCSRC = 1<<URSEL | 1<<UCSZ1 | 1<<UCSZ0;    // Asynchron 8N1

Das andere kannst du auch in einer Anweisung schreiben:
1
UCSRB = 1<<TXEN | 1<<RXEN;

Ansonsten: "UART geht nicht" kommt ungefähr 7392 mal jeden Tag, also 
bitte Forensuche und die Artikelsammlung belästigen.

von Mr K. (mrk)


Lesenswert?

>// Berechnungen
>#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
>#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
>#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille
>#define BAUD 9600L

Habe mir nicht alles angeschaut aber sollte man die BAUD nicht vorher 
definieren bevor man sie verwenden kann. der compiler müsste doch 
meckern oder wird das in C so gemacht?
Außerdem ist F_CPU auch nirgends definiert.

von Karl H. (kbuchegg)


Lesenswert?

Mr K. wrote:
>>// Berechnungen
>>#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
>>#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
>>#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD-1000) // Fehler in Promille
>>#define BAUD 9600L
>
> Habe mir nicht alles angeschaut aber sollte man die BAUD nicht vorher
> definieren bevor man sie verwenden kann.

Das ist schon ok.

> der compiler müsste doch
> meckern

Der Compiler kriegt das so nie zu Gesicht. Das sind Anweisungen
an den Preprozessor, er möge doch bitte Textersetzungen im eigentlichen
Quelltext vornehmen.
Im Grunde ist das nur die Anweisung:
Wenn immer du im Quelltext auf den Text UBRR_VAL stösst, dann ersetzte
diesen Text doch bitte durch "((F_CPU+BAUD*8)/(BAUD*16)-1)".
In diesem ersetzten Text wird dann wieder BAUD durch "9600L" ersetzt
usw. bis es nichts mehrzum Ersetzen gibt.
Die Reihenfolge in der du dem Präprozessor aber die zu ersetzenden
Texte bekannt gibst, ist ziemlich unerheblich, solange sie nur vor
dem eigentlichen Quelltext passieren.

> Außerdem ist F_CPU auch nirgends definiert.

Das könnte tatsächlich ein Problem sein. F_CPU wird aber auch
zb. von AVR-Studio extern bereits vorbelegt, wenn man im Optionen-
dialog eine Taktrate eingestellt hat.

von Mr K. (mrk)


Lesenswert?

wieder was über C gelernt.
das mit dem preprozessor Anweisungen ist mir klar aber wusste nicht das 
die Reihenfolge egal ist. Mit compiler meinte den gesammten 
Compilervorgang; von lexikalischen analyse bis zum linker bzw. von ascii 
source bis zum hex code.

ich sollte mal aufhören in assembler und basic zu programmieren und 
endlich mal anfangen C zu lernen ;)

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.