Uart gibt keine Wert aus

Gast #465906
Lesenswert?

Was meinst du mit "gesendet wirds über ponyprog"? Du brauchst auf der PC 
Seite ein Terminalprogramm wie z.B. das Bray-Terminal, HTerm oder zur 
Not Hyperterminal...

Wo hast du TX vom µC und RX vom PC miteinander verbunden? Ein Schaltplan 
deines Aufbaus wäre nicht schlecht.

Aus main() kehrt man i.A. nicht zurück. Wenn der C-Startup-Code darauf 
nicht eingerichtet ist und z.B. keine eigene Endlosschleife vorsieht, 
rast dein µC direkt ins Nirvana.

Die Schnittstelleneinstellung habe ich nicht geprüft, du wirst das 
sicher anhand des Datenblatts geschrieben haben. Nur zwei Sachen - läuft 
der AVR sicher mit 4 MHz und weisst du, dass man mit dem ungenauen 
internen RC-Oszillator auch Pech bei der genauen Baudratengenerierung 
haben kann?

Hast du einen Oszi zur Überwachung der TX-Leitung bzw. eine einfache 
Low-Current-LED inkl. Vorwiderstand, die eine Sendetätigkeit auf TX 
zwischen C und MAX232 anzeigen kann?
Gast #465928
Lesenswert?

In 2.jpg hast du einen 16 MHz Quarz extern drin. Mit 4 MHz im Programm 
wird das nix. Wo du RS232 angeschlossen hast, sehe ich auf die Schnelle 
nicht. Du wirst das gescheckt haben, ob diese Pins von UART bedient 
werden.

In rs232.jpg ist C8 verkehrt gepolt eingezeichnet. Am V- ist die 
positivere Seite GND.

Beim käuflichen Nullmodemkabel sind mehr Leitungen verknotet als man 
denkt. Ich bevorzuge es die TX/RX Dreherei unter eigener Kontrolle zu 
haben z.B. zwischen MAX232 und DB-Sub9 Female und dann mit einem 1:1 
stinknormalen RS232 Kabel zu verbinden.

PS: Die Bilder sind gruselig schlecht ;-)
Gast #465960
Lesenswert?

Das sieht so aus, als ob der µC mit 1 MHz rennt (9600/600 = 16). 
Zufällig ist das die Werkseinstellung des internen R-Oszillators. Hast 
du die Fuses auch auf die externe Taktquelle (Quarz) gebrannt (Obacht 
vorher schlau machen!!!)?
Gast #466641
Lesenswert?

Ah, du hast jetzt den externen Quarz aussen vor gelassen und die 
gewünschte Baudrate auf den internen RC-Oszillator bezogen.

Du willst 9600 Baud einstellen und fütterst das Baudratenregister mit 
dem Wert 6.

Dieser Wert wird üblicherweise so berechnet (Atmega32 Datenblatt, 
Tabelle 60):

Baudratenwert = Uarthaupttakt / (Baudrate * 16) - 1

1'000'000 / (9'600 * 16) - 1 = 5,51

Wenn du auf 6 aufrundest, machst du einen Fehler von -7.0% (Tabelle 68). 
Das ist für UART schon happig. Zum Vergleich: Für den Empfängermodus 
gibt Atmel einen "Recommended Max  Receiver Error (%) von +- 2.0% vor 
(Tabelle 61)...

Wie sieht es mit den Bits überhaupt aus? Leider hast du die 
ASCII-Darstellung im Empfangsprogramm gewählt, die BIN-Darstellung wäre 
jetzt hilfreicher. Das blau unterlegte a kann ich so nicht zuordnen.

Gesendet  wird "1". In HEX ist das 0x31 und in BIN 0b00110001.
Empfangen wird "q". In HEX ist das 0x71 und in BIN 0b01110001.

Verdammt nah dran... ich schätze mit einem besseren UART-Baudratenwert 
mit weniger Fehlanpassung wird das was.

Ich würde zuerst mal eine Baudrate mit weniger Fehlanpassung versuchen 
und da springen 2400 und 4800 Baud sprichwörtlich ins Auge: 0,2% 
Fehler... Und höhere Baudraten dann später mit externem Quarz.




Gast #466644
Lesenswert?

BTW. ich würde den µC mal auf "Dauerfeuer" einstellen:
1
// Quellcode wir dein serial.c nur main() anders:
2

3
int main(void)
4
{
5
    unsigned char c;
6
 
7
    while(1)    // für immer und ewig
8
    {
9
        // Alle möglichen Bytes inkl. solche mit gesetztem 8. Bit
10
        for (c = 0; c <= 255; c++)
11
        // Alternative z.B. nur Grossbuchstaben
12
        // for (c = 'A'; c <= 'Z'; c++)
13
        {
14
            uart_putc(c);
15
        }
16
    }
17
    
18
    return 0;   // wird nie erreicht
19
}
Gast #466990
Lesenswert?

> Verdammt nah dran... ich schätze mit einem besseren UART-Baudratenwert
> mit weniger Fehlanpassung wird das was.

> Ich würde zuerst mal eine Baudrate mit weniger Fehlanpassung versuchen
> und da springen 2400 und 4800 Baud sprichwörtlich ins Auge: 0,2%
> Fehler... Und höhere Baudraten dann später mit externem Quarz.

Der interen RC-Oszillator ist für solide UART Kommunikation viel zu 
ungenau!
Also gleich nen Quarz benutzten (FUSE-Bits), dann klappts auch mit dem 
UART ohne Baudratenquarz.

MfG
Falk


Angehängte Dateien:

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