Forum: Mikrocontroller und Digitale Elektronik UART sendet nur Nullzeichen


von Paul W. (paulw)


Lesenswert?

Hallo,
Ich habe mal wieder ein Problem... wahrscheinlich sogar ein sehr 
simples, aber ich kann den Fehler einfach nicht finden.
Und zwar will ich über den UART Daten senden. Dazu habe ich folgende 
Funktionen aus dem Tutorial übernommen:
1
void uart_putc(unsigned char c)
2
{
3
    while (!(UCSRA & (1<<UDRE)))  /* warten bis Senden moeglich */
4
    {
5
    }
6
7
    UDR = c;                      /* sende Zeichen */
8
}
9
10
11
void uart_puts (const char *s)
12
{
13
    while(*s)
14
    {
15
        uart_putc (*s);
16
        ++s;
17
    }
18
}
Der MAX232 ACPE ist richtig angeschlossen (Versorgungsspannung und RX/TX 
sind richtig angeschlossen) weil ich an Pin 2 des 9-poligen Kabels sehe, 
dass da was gesendet wird (wechselnde +10V und -10V Pegel). Die 
while-Schleife der main-Funktion sieht sehr simpel aus:
1
UBRRH = UBRR_VAL >> 8;
2
UBRRL = UBRR_VAL & 0xFF;
3
  
4
UCSRB = (1<<TXEN) | (1<<RXEN) | (1<<RXCIE);
5
UCSRC = (1<<URSEL)| (1<<UCSZ0) | (1<<UCSZ1);
6
  
7
  
8
do
9
{
10
  // UDR auslesen (Wert wird nicht verwendet)
11
  UDR;
12
}
13
while (UCSRA & (1 << RXC));
14
15
// Rücksetzen von Receive und Transmit Complete-Flags
16
UCSRA = (1 << RXC) | (1 << TXC);
17
18
while(1)
19
{
20
  uart_putc('*'); //irgendein Zeichen senden
21
}

Die Baudrate ist auf 9600 eingestellt und es wird ein 
16MHz-Quarzoszillator verwendet. Die Fuses sind korrekt eingestellt 
(hatte zuerst den Oszillator falsch angeschlossen und es lief nix, ich 
konnte mit AVRDude keine Verbindung zum µC aufbauen).
Soweit so schlecht. Wenn ich nun am PC HTerm öffne und alle 
Einstellungen richtig setze empfange ich nur Null-Zeichen.

Folgendes konnte ich bisher ausschließen:
- falscher Anschluss vom Max232 ACPE
- Fuses falsch gesetzt
- Baudrate falsch eingestellt

Folgendes könnte eventuell den Fehler verursachen:
- Beim Max232 ACPE werden 0.1µF-Elkos empfohlen, ich verwende aber 
1µF-Elkos
- Auf der Platine, wo ich die ACPEs her habe, werden gar keine Elkos 
verbaut sondern Tantal-Kondensatoren, aber wieso? Hab sie mir nicht 
weiter angeschaut, aber hat man die Möglichkeit den ACPE mit einer 
externen -10V-Spannung zu versorgen? Oder alternativ mit drei 
Spannungen: +5V, +10V, -10V?

Ich bin echt ratlos... bei der Suche bin ich auf einen Thread gestoßen, 
wo das selbe Problem bestand, aber da wurde der Max232 falsch 
angeschlossen (Versorgungsspannung war nicht richtig angeschlossen), 
aber wenn ich -10V an Pin 6 (V-) messe, müsste der doch richtig 
angeschlossen sein?
Hat jemand eine Idee, was ich noch versuchen könnte?

Ich wünsch euch noch ein frohes Fest :-)

//codes ein wenig besser formatiert

von Simon K. (simon) Benutzerseite


Lesenswert?

Wie wird denn die Baudrate berechnet?
Am besten hängst du mal den ganzen Quälcode an und auch ein Bild von den 
Fuses, nur um sicher zu gehen.
Das hört sich nämlich stark nach einem Taktfehler an.
Hast du die Möglichkeit die Daten mit einem Oszilloskop zu begutachten?
Die 1µF sollten eigentlich keine Probleme machen. Die "normalen" MAX232 
funktionieren ja auch mit 22µF statt 1µF.

von Paul W. (paulw)


Angehängte Dateien:

Lesenswert?

Die Baudrate wird berechnet mit:
1
#ifndef F_CPU
2
  #define F_CPU 16000000
3
#endif
4
5
#define BAUD 9600UL      // Baudrate
6
7
#define UBRR_VAL ((F_CPU+BAUD*8)/(BAUD*16)-1)   // clever runden
8
#define BAUD_REAL (F_CPU/(16*(UBRR_VAL+1)))     // Reale Baudrate
9
#define BAUD_ERROR ((BAUD_REAL*1000)/BAUD) // Fehler in Promille, 1000 = kein Fehler.
10
11
#if ((BAUD_ERROR<990) || (BAUD_ERROR>1010))
12
  #error Systematischer Fehler der Baudrate grösser 1% und damit zu hoch!
13
#endif

Ich hab mir mal die beiden Register UBRRL und UBRRH angesehen: UBRRLH = 
0 und UBRRL = 103. Laut den Baud-Rechnern stimmt das auch...

Oszilloskop ist zwar vorhanden, aber ist ein älteres Baujahr... 
irgendein Hameg. Auf jeden Fall ist es kein Speicheroszilloskop :-(.
Mit Taktfehlern bringe ich eigentlich immer komische verschiedene 
Zeichen in Verbindung?!
Im Anhang ist das Programm.
Es steht nirgendwo, also sage ich es lieber spät als nie: Ich verwende 
einen Atmega32. In der Simulation (VMLab) funktioniert es auch ohne 
Probleme...

von spess53 (Gast)


Lesenswert?

Hi

Hat dein Controller eine CKDIV8-Fuse?

MfG Spess

von Lothar M. (Firma: Titel) (lkmiller) (Moderator) Benutzerseite


Lesenswert?

1
  // UDR auslesen (Wert wird nicht verwendet)
2
  UDR;
Der Kommentar sollte eher lauten:
1
  // Zeile ignorieren
2
  UDR;

> Oszilloskop ist zwar vorhanden,
Dann schick ein Bitmuster, das dir die Bitzeitermittlung leicht macht: 
0x55
Da kannst du dann ohne Probleme ablesen, wie lange 1 Bit ist. Bei 9600 
solltest du auf etwa 104us kommen.

von Simon K. (simon) Benutzerseite


Lesenswert?

Lothar Miller schrieb:
>
1
>   // UDR auslesen (Wert wird nicht verwendet)
2
>   UDR;
3
>
> Der Kommentar sollte eher lauten:
>
1
>   // Zeile ignorieren
2
>   UDR;
3
>

Die Zeile funktioniert ohne Probleme, da UDR als volatile definiert ist 
(wie alle Register).

von Paul W. (paulw)


Lesenswert?

Ich gestehe... Copy & Paste ausm Roboternetz... ich weiß was da gemeint 
ist, und der Kommentar ist mir eigentlich egal :-).
Der Controller hat ein Bit im UCSRA-Register, U2X. Beschreibung aus dem 
Datenblatt:

Writing this bit to one will reduce the divisor of the baud rate divider 
from 16 to 8 effectively doubling
the transfer rate for asynchronous communication.

Aber dieses Bit ist nicht gesetzt. Gut, ich werde gleich erstmal die 
Bitzeit messen.
Ich danke euch für die bisherige Hilfe :-).

von Simon K. (simon) Benutzerseite


Lesenswert?

Wie gesagt, gib mal ein Bild von den Fuses.

von Paul W. (paulw)


Angehängte Dateien:

Lesenswert?

Ich kann Gedanken lesen :O...
Nachdem ich die Bitzeit gemessen hatte, habe ich mich an das Bild der 
Fuses erinnert ... was für ein Zufall ^^... hier ist es.
Die Bitzeit beträgt erschreckende ~1.75ms. Also auf dem Oszilloskop habe 
ich ein sauberes Rechtecksignal gesehen (Pegel von +10V und -10V) und 
die Zeit, in der der Pegel +10V beträgt ~1.75ms.

Ach... das Problem ist gelöst: Ich hatte den µC vor einiger Zeit 
programmiert und auch damals die Fuses gesetzt. Ich hatte sie falsch 
gesetzt. Es wurde der interne Oszillator verwendet (1MHz), und jetzt 
läuft er mit echten 16MHz und ich bekomme lauter 'U's in HTerm.

Anders: Ich könnte mir echt in den Ar*** beißen für so einen doofen 
Fehler...

Ich danke euch für die Hilfe. Ich habe versucht diesmal logisch 
ranzugehen, aber manchmal kommen doch diese Schusselfehler rein...

So, ich wünsche euch ein frohes Fest!

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.