UART Empfansproblem

Gast #850666
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);
  }


}
Gast #850676
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.
#850717
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.
#850743
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.
#850847
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 ;)

Antwort schreiben

Hinweis: der ursprüngliche Beitrag ist mehr als 6 Monate alt. Bitte hier nur auf die ursprüngliche Frage antworten, für neue Fragen einen neuen Beitrag erstellen.

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.