mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART - Kann Daten nicht empfangen


Autor: Carl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo,
finde den Fehler leider nicht, bei 1MHz geht es wunderbar, bei 10MHz 
geht gar nichts mehr.

Hier die Files:

uart.c:
/*** uart.c ***/
#include <avr/io.h>
#include "uart.h"

void init_uart(void)
{
  UBRR0H = (unsigned char)(UBRR_VAL>>8); // UBRR = UART Baud Rate Register
  UBRR0L = (unsigned char)(UBRR_VAL);   // UBRR Register zum berechnen/setzen der Baudrate

  UCSR0B = (1<<TXEN0) | (1<<RXEN0);      // tx & rx enable
                       // Wenn TXEN und RXEN gesetzt ist, arbeitet die UART,
                      // sonst sind die PINS normale I/O-Pins

  UCSR0C = (1<<UCSZ01) | (1<<UCSZ00);    // Asynchron 8N1
}

void uart_putc(unsigned char c)
{
  while (!(UCSR0A & (1<<UDRE0)))
  {
    /* warten bis Senden moeglich */
  }
  UDR0 = c;                 // UDR0 = UART Data Register
                       // Hier werden Daten zwischen UART und CPU übertragen
}

uart.h:
/*** uart.h ***/
#ifndef uart_h
#define uart_h

#define BAUD 9600UL          // Baudrate

#ifndef F_CPU
//#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 14745600UL"
#define F_CPU 9216000UL    // Systemtakt in Hz
// Definition als unsigned long beachten
// Ohne UL ergibt Fehler in der Berechnung
#endif
 
// 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)      
// Fehler in Promille, 1000 = kein Fehler
 
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
//#warning "Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!" 
#endif

void init_uart(void);
void uart_putc(unsigned char c);
#endif /* uart_h */

ps. Habs (wie man sieht) jetzt mal mit 9216000 Hz probiert, wegen der 
Rundung.

Bitte um Hilfe.

Danke schön.
Mfg

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> ps. Habs (wie man sieht) jetzt mal mit 9216000 Hz probiert, wegen der
> Rundung.

Das geht nicht. Du musst hier dem Kompiler den Takt verraten auf den du 
die Hardware eingestellt hast (10000000UL). Lügen gilt nicht.

Die Zeilen

> #ifndef F_CPU
> //#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 14745600UL"
> #define F_CPU 9216000UL    // Systemtakt in Hz
> // Definition als unsigned long beachten
> // Ohne UL ergibt Fehler in der Berechnung
> #endif

werden nur aktiv, wenn nirgends sonst F_CPU definiert ist. Potentielle 
Stellen sind die Projekteinstellungen von AVR Studio oder das Makefile. 
Leider ist die #warnung Zeile auskommentiert. An der könntest du sehen, 
ob diese Zeilen aktiv werden.

Autor: Carl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Sorry, aber das löst mein Problem nicht, da es ja bei 1 MHz geht und 
sonst nicht und die Liste habe ich schon gecheckt.

Autor: Falk Brunner (falk)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
@  Carl (Gast)

>Sorry, aber das löst mein Problem nicht, da es ja bei 1 MHz geht und
>sonst nicht und die Liste habe ich schon gecheckt.

Glaub ich nicht, dann würde es laufen.

MFg
Falk

Autor: Stefan B. (stefan) Benutzerseite
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Wo hattest du bei funktionierende UART die 1 MHz als F_CPU eingetragen? 
An der gleichen Stelle ist 10000000UL einzutragen.

Wie hast du die 10 MHz in der Hardware eingestellt: Quarz mit 
Kondensatoren an den AVR gelötet und AVR Fuses eingestellt? Das ist 
Thema der AVR-Checkliste!

Was sagt das Datenblatt oder diese Makroanweisung

> #if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
> //#warning "Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!"
> #endif

mit einkommentierter Warnung bei der Kombination 10 MHZ 9600 Baud?

Es ist ganz schlecht, wenn du #warnung oder gar #error auskommentierst. 
Man hat sich Gedanken gemacht, als man diese Zeilen geschrieben hat. Man 
will dich nicht damit ärgern. Du wirfst mutwillig Hilfe weg.

Autor: Carl (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hi,
danke für die Hilfe. Hab ein externen 14,etwas MHz Quarz am uC, hab 
diese 14,etwas MHz jetzt eingetragen, läuft immer noch nicht. Auch die 
die Fuses habe ich eingestellt.

Laut Datenblatt habe ich bei der frequenz und 9600 baud 0% Abweichung.

Hat jemand noch einen Wink für mich?

Danke nochmal
Mfg

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

Bewertung
0 lesenswert
nicht lesenswert
Carl schrieb:
> Hi,
> danke für die Hilfe. Hab ein externen 14,etwas MHz Quarz am uC, hab
> diese 14,etwas MHz jetzt eingetragen, läuft immer noch nicht. Auch die
> die Fuses habe ich eingestellt.

Sicher?
Hast du das kontrolliert?

Was ist mit der F_CPU Warnung? Ist die wieder einkommentiert? Schlägt 
sie an?

Autor: gsfsdfs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
sagt dochmal genau was du für einen quarz hast

welche fuses du gesetzt hast

welche F_CPU du angegeben hast

und welche baudrate

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Auch die die Fuses habe ich eingestellt.

CKDIV8 auch?

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

Bewertung
0 lesenswert
nicht lesenswert
Ausserdem wäre es gut den Prozessor zu kennen.
Dann könnte man entscheiden, ob ein URSEL Bit notwendig ist.

Autor: gsfsdfs (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
achso .. nutzt du AVR studio ?
wenn ja .. dann F_CPU nicht im code irgendwo hinschreiben
das gehört in die config und NUR dahin

und F_CPU ist genau die Frequenz die dein Quarz hat ...
nichts erechnetes oder gerundetes

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.