Forum: Mikrocontroller und Digitale Elektronik Uart gibt keine Wert aus


von Mathias K. (underworldgamer)


Angehängte Dateien:

Lesenswert?

Hallo


Könnt ihr mir helfen


beim MAx232 hab ich jeweils 1 µF Kondensator und verwende ein Atmega 32 
gesendet wirds über ponyprog

von Stefan (Gast)


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?

von Mathias K. (underworldgamer)


Angehängte Dateien:

Lesenswert?

Hier wärs mal


Verbindung über Nullmodemkabel 2-3 /3-2

von Stefan (Gast)


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 ;-)

von Jochen S. (jochen_s)


Lesenswert?

Blöde Frage aber vielleicht hilft es, hast du die Masse verbunden 
zwischen PC und ATMEL??


Jochen_s
www.rs485-hausbus.de.vu

von Mathias K. (underworldgamer)


Angehängte Dateien:

Lesenswert?

Das sind mal die Files in PCAD 2001


TXD wird mit RXD pc verbunden

RXD wird mit TXT pc verbunden

von Mathias K. (underworldgamer)


Angehängte Dateien:

Lesenswert?

wenn ich das programm von avr programm atmega rauflade kummt etwas 
heraus
low high low ein wenig verzerrt dargestellt (oszi)

kann mit HTerm 0.6.5.b das file auslesen  es kommt mal was raus aber mit 
baund 600 statt 9600 ?? komisch

aber war gehts es nicht mit dem serial.c was ich schon gepostet habe

von Stefan (Gast)


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

von Mathias K. (underworldgamer)


Angehängte Dateien:

Lesenswert?

Das komische ist das nur \n\r richtig angezeigt wird ???
was kann das sein
Ich muss den Reset drücken das etwas gesendet wird

mfg Mathias

von Stefan (Gast)


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.





von Stefan (Gast)


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
}

von Stefan (Gast)


Lesenswert?

Ähm: uart_init(); vor dem while(1) noch einfügen.

von Falk (Gast)


Angehängte Dateien:

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



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.