mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART Empfansproblem


Autor: Florian idb (Gast)
Datum:

Bewertung
0 lesenswert
nicht 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);
  }


}

Autor: Ja mann (Gast)
Datum:

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

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

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

Autor: Mr K. (mrk)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Karl Heinz (kbuchegg) (Moderator)
Datum:

Bewertung
0 lesenswert
nicht 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.

Autor: Mr K. (mrk)
Datum:

Bewertung
0 lesenswert
nicht 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

Die Angabe einer E-Mail-Adresse ist freiwillig. Wenn Sie automatisch per E-Mail über Antworten auf Ihren Beitrag informiert werden möchten, melden Sie sich bitte an.

Wichtige Regeln - erst lesen, dann posten!

  • Groß- und Kleinschreibung verwenden
  • Längeren Sourcecode nicht im Text einfügen, sondern als Dateianhang

Formatierung (mehr Informationen...)

  • [c]C-Code[/c]
  • [avrasm]AVR-Assembler-Code[/avrasm]
  • [code]Code in anderen Sprachen, ASCII-Zeichnungen[/code]
  • [math]Formel in LaTeX-Syntax[/math]
  • [[Titel]] - Link zu Artikel
  • Verweis auf anderen Beitrag einfügen: Rechtsklick auf Beitragstitel,
    "Adresse kopieren", und in den Text einfügen




Bild automatisch verkleinern, falls nötig
Bitte das JPG-Format nur für Fotos und Scans verwenden!
Zeichnungen und Screenshots im PNG- oder
GIF-Format hochladen. Siehe Bildformate.
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.

Mit dem Abschicken bestätigst du, die Nutzungsbedingungen anzuerkennen.