mikrocontroller.net

Forum: Mikrocontroller und Digitale Elektronik UART-PROBLEM


Autor: P23C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo zusammen,

ich habe bisher 8051 programmiert. Nur möchte ich auf grund der größeren 
Community auf die AVRs umsteigen. Deswegen habe nun erstmal angefangen 
meine bestehenden Projekte soweit umzuschreiben. Alles funktioniert 
auch. Nur der UART nicht. Deswegen habe ich erstmal ein ganz einfaches 
Programm geschrieben (aus dem Inet zusammenkopiert - Weil mein eigenes 
nicht funzt)...
#include <avr/io.h>

#define F_CPU 4000000UL 
#define UART_BAUD_RATE    2400UL

#define UBRR_BAUD ((F_CPU/(16L*UART_BAUD_RATE))-1)

int main (void)
{
         /* Special for ATMEGA8, ATMEGA16 */
    UCSRB = (( 1 << RXCIE ) | ( 1 << RXEN ) | ( 1 << TXEN ));   
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);                   
  UBRRH = (uint8_t) (UBRR_BAUD>>8);
  UBRRL = (uint8_t) (UBRR_BAUD & 0xFF);
 
 
  
  while (1){
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
    {
    }

    UDR = 's';
    
    }
return 0;
}

Verbunden ist alles wie bei meinem 8051 mit max232 USB->COm-Converter. 
Das ist alles fehlerfrei.

Die Ausgabe in Terminalv1.9b ist:
xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€ 
xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€xü€ø

Einstellungen im Terminal-Programm ist:
2400 8N1

Sieht jemand meinen Fehler??

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>Sieht jemand meinen Fehler??

Falsche Baudrate.
F_CPU in den Text zu schreiben reicht nicht.
Die Fuses müssen auch entsprechend programmiert sein.

> UCSRB = (( 1 << RXCIE ) | ( 1 << RXEN ) | ( 1 << TXEN ));

RXCIE da wegmachen wenn keine Interuptroutine dazu vorhanden ist.

Autor: P23C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hab das RXCIE weg gemacht. Immernoch der gleiche Fehler.

An die Fuses bin ich gar nicht ran gegangen. Arbeite ohne externen 
Taktgeber. Im Makefile-Editor, habe ich ebenfalls die Baudrate 
vorgegeben...

Autor: Floh (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
P23C schrieb:
> Arbeite ohne externen
> Taktgeber.
Nachgerechnet, ob dein Baudratenfehler klein genug ist?

Autor: holger (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
>An die Fuses bin ich gar nicht ran gegangen.

Dann läuft er mit 1MHz.

Autor: P23C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
WIeso läuft er noch mit 1Mhz wenn ich im Makefile und nochmal zusätzlich 
im Quellprogramm auf 4Mhz hochgehe?

Was ist gemeint, ob der Baudratenfehler klein genug ist? Habe auch 
schonmal andere Baudraten ausprobiert.

Schonmal Danke für die Mühen...

Autor: Andreas M. (elektronenbremser)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Das Makefile ist dem egal. Du musst mit den Fusebits explizit eine 
externe Taktquelle und diese dann auch entsprechend an den Controller 
anschliessen.

Autor: P23C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Geht das nicht mit dem internen Takt? Das habe ich aber so im Internet 
gelesen.

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Geht das nicht mit dem internen Takt?

Jaschonirgendwie, aber..

> #define F_CPU 4000000UL

und

>> An die Fuses bin ich gar nicht ran gegangen.
>
> Dann läuft er mit 1MHz.

Passen nicht zusammen :-) 2400 @ 1MHz sollte übrigens mit einem 
hinreichend kleinen Fehler funktionieren.

HTH

Autor: ./. (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
g457 schrieb:
> 2400 @ 1MHz sollte übrigens mit einem
> hinreichend kleinen Fehler funktionieren.

Der Fehler bleibt relativ immer gleich.
Egal ob 2400 oder 38400...

Autor: P23C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Aber wo könnte dann noch der Fehler liegen? So ein Mist, da will man 
umstellen und es happert schon an so kleinen Dingen

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Der Fehler bleibt relativ immer gleich.
> Egal ob 2400 oder 38400...

Nope, eben genau ∗nicht∗, weil man die höhere Baudrate bei gleichem Takt 
nicht hinreichend genau einstellen kann - UBRR wird dann einfach zu 
grob.

In Zahlen: F_CPU mit 1MHz und 2400 Baud ergibt ein UBRR von 25 mit einem 
Fehler von grob 0.2% - geht so eben.
F_CPU mit 1MHz und 38400 Baud ergibt ein UBRR von 1 und einen Fehler von 
grob 23% - absolut unmöglich.

HTH

Autor: g457 (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
> Aber wo könnte dann noch der Fehler liegen?

F_CPU und/oder Fuses und/oder Taktquelle anpassen.

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

Bewertung
0 lesenswert
nicht lesenswert
P23C schrieb:
> Aber wo könnte dann noch der Fehler liegen?

Wieso 'noch'?

Der Fehler liegt darin, dass dein µC mit 1Mhz läuft.
Da kannst du ins Makefile Dinge eintragen bis du schwarz wirst, das 
beeindruckt deinen µC herzlich wenig.

Die Angabe im Makefile dient dazu, den Compiler darüber zu informieren 
wie schnell der µC läuft. Aber das ist auch schon alles. Wenn diese 
Angabe nicht mit der Realität übereinstimmt, dann funktioniert eben 
nichts.

Hör auf deinen Compiler anzulügen, schrieb 1Mhz für F_CPU rein und fuse 
bei nächster Gelegenheit deinen µC um, so dass er schneller läuft. Siehe 
Datenblatt

Autor: Michael S. (Firma: electro-tester) (michael0307)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hallo , Probier mal das Makro. :D
/* 
  UART-Init: 
Berechnung des Wertes für das Baudratenregister 
aus Taktrate und gewünschter Baudrate
*/
 
#ifndef F_CPU
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
   F_CPU im Makefile definiert werden, eine nochmalige Definition
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
   #ifndef/#endif 
 
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
   verwendet wird und dort eine andere, nicht zur Hardware passende 
   Taktrate eingestellt ist: Dann wird die folgende Definition 
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
   noch nicht definiert: */
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
#define F_CPU 1000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
                         // Ohne ergeben sich unten Fehler in der Berechnung
#endif
 
#define BAUD 2400UL      // Baudrate
 
// 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))
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
#endif 

und dann , schau dir das mal an!

AVR-GCC-Tutorial:Der Uart

und...

AVR-Tutorial: UART


Grüße...

Autor: P23C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Danke... Es klappt jetzt. Das mit den Fuses guck ich mir mal an, beide 
anderen Links habe oich bereits durchgearbeitet.

Noch eine letzte Frage:
Ich arbeite zum ersten mal mit WinAVR. Wie kann ich ein Project mit 
mehreren Dateien compilieren? Also uart.h, uart.c und main 
beispielsweise.

Ich hab dazu kein Tutorial gefunden.

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

Bewertung
0 lesenswert
nicht lesenswert
Links ist ein Fenster mit deiner Projektübersicht.
Da ist eine Baumanzeige.
In dieser Baumanzeige gibt es den Punkt "Source Files".

Maus drauf, rechte MAustaste. Aus dem Kontextmenü "Add existing Source 
Files" oder "Create New" oder was du dann eben brauchst.

Autor: P23C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Ich habe in der Baumanzeige nur New Project Group ->test und wenn ich 
dann rechtsklick mache, kann ich kein "Add existing File" oder Create 
New auswählen.

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

Bewertung
0 lesenswert
nicht lesenswert
Ach. Entschuldigung.
Installier dir AVR-Studio. Das nimmt dir den ganzen Krempel mit Makefile 
ab. Und dort geht das dann so.

Ich hab überlesen, dass du noch kein AVR-Studio drauf hast.

Autor: P23C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Hey,

ich möchte keinen neuen Thread anfangen. Geht das auch mit Win-AVR?

AVR-Studio bekomme ich irgendwie nicht richtig konfiguriert. Bei Win-AVR 
nutze ich einen USB-ISP Programmer mit STK500V2 über virtuellen 
Com-Port. Aber diese Einstellung finde ich im Studio nicht.

Nochmals vielen Dank für die Hilfe...

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

Bewertung
0 lesenswert
nicht lesenswert
P23C schrieb:
> Hey,
>
> ich möchte keinen neuen Thread anfangen. Geht das auch mit Win-AVR?

Du meinst mit Notepad+ als IDE?
Meines Wissens musst du dann die Dateien selbst ins Makefile eintragen.

http://www.mikrocontroller.net/articles/FAQ#Ich_ha...

> AVR-Studio bekomme ich irgendwie nicht richtig konfiguriert. Bei Win-AVR
> nutze ich einen USB-ISP Programmer mit STK500V2 über virtuellen
> Com-Port. Aber diese Einstellung finde ich im Studio nicht.

Auf welchem Com-Port? (Nummer)
Schlimmsten Falls musst du den vírtuellen COM-Port auf kleiner COM5 
runterdrücken (Gerätemanager). Habe sowas bei mir am laufen. Geht 
einwandfrei.

Autor: P23C (Gast)
Datum:

Bewertung
0 lesenswert
nicht lesenswert
Com-Port ist auf 1 eingestellt.

Welches Programmer wähle ich dann aus?

Ich hab STK500 und Comport 1 ausgewähkt bekomme aber da die Störung bei 
HW-Signal oder so. Wo man die externe Spannung einliest. Bin gerade 
nicht zu hause, kann es nicht ausprobieren.

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.