Forum: Mikrocontroller und Digitale Elektronik UART-PROBLEM


von P23C (Gast)


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)...
1
#include <avr/io.h>
2
3
#define F_CPU 4000000UL 
4
#define UART_BAUD_RATE    2400UL
5
6
#define UBRR_BAUD ((F_CPU/(16L*UART_BAUD_RATE))-1)
7
8
int main (void)
9
{
10
         /* Special for ATMEGA8, ATMEGA16 */
11
    UCSRB = (( 1 << RXCIE ) | ( 1 << RXEN ) | ( 1 << TXEN ));   
12
  UCSRC = (1<<URSEL)|(1<<UCSZ1)|(1<<UCSZ0);                   
13
  UBRRH = (uint8_t) (UBRR_BAUD>>8);
14
  UBRRL = (uint8_t) (UBRR_BAUD & 0xFF);
15
 
16
 
17
  
18
  while (1){
19
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich                   */
20
    {
21
    }
22
23
    UDR = 's';
24
    
25
    }
26
return 0;
27
}

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??

von holger (Gast)


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.

von P23C (Gast)


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...

von Floh (Gast)


Lesenswert?

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

von holger (Gast)


Lesenswert?

>An die Fuses bin ich gar nicht ran gegangen.

Dann läuft er mit 1MHz.

von P23C (Gast)


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...

von Andreas M. (elektronenbremser)


Lesenswert?

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

von P23C (Gast)


Lesenswert?

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

von g457 (Gast)


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

von ./. (Gast)


Lesenswert?

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

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

von P23C (Gast)


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

von g457 (Gast)


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

von g457 (Gast)


Lesenswert?

> Aber wo könnte dann noch der Fehler liegen?

F_CPU und/oder Fuses und/oder Taktquelle anpassen.

von Karl H. (kbuchegg)


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

von Michael S. (Firma: electro-tester) (michael0307)


Lesenswert?

Hallo , Probier mal das Makro. :D
1
/* 
2
  UART-Init: 
3
Berechnung des Wertes für das Baudratenregister 
4
aus Taktrate und gewünschter Baudrate
5
*/
6
 
7
#ifndef F_CPU
8
/* In neueren Version der WinAVR/Mfile Makefile-Vorlage kann
9
   F_CPU im Makefile definiert werden, eine nochmalige Definition
10
   hier wuerde zu einer Compilerwarnung fuehren. Daher "Schutz" durch
11
   #ifndef/#endif 
12
 
13
   Dieser "Schutz" kann zu Debugsessions führen, wenn AVRStudio 
14
   verwendet wird und dort eine andere, nicht zur Hardware passende 
15
   Taktrate eingestellt ist: Dann wird die folgende Definition 
16
   nicht verwendet, sondern stattdessen der Defaultwert (8 MHz?) 
17
   von AVRStudio - daher Ausgabe einer Warnung falls F_CPU
18
   noch nicht definiert: */
19
#warning "F_CPU war noch nicht definiert, wird nun nachgeholt mit 4000000"
20
#define F_CPU 1000000UL  // Systemtakt in Hz - Definition als unsigned long beachten 
21
                         // Ohne ergeben sich unten Fehler in der Berechnung
22
#endif
23
 
24
#define BAUD 2400UL      // Baudrate
25
 
26
// Berechnungen
27
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
28
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
29
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
30
 
31
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
32
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch! 
33
#endif

und dann , schau dir das mal an!

AVR-GCC-Tutorial:Der Uart

und...

AVR-Tutorial: UART


Grüße...

von P23C (Gast)


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.

von Karl H. (kbuchegg)


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.

von P23C (Gast)


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.

von Karl H. (kbuchegg)


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.

von P23C (Gast)


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...

von Karl H. (kbuchegg)


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_hab_da_mehrere_.2A.c_und_.2A.h_Dateien._Was_mache_ich_damit.3F

> 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.

von P23C (Gast)


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.

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.