UART-PROBLEM

Gast #2029446
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??
Gast #2029449
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.
Gast #2029475
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...
Gast #2029488
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...
Gast #2029514
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
Gast #2029541
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
#2029554
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
(Firma: electro-tester) #2029559
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...
Gast #2029573
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.
Gast #2030334
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...
#2030341
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.
Gast #2030543
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

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren