Forum: Mikrocontroller und Digitale Elektronik Uart - Datenproblem


von Sven H. (sven91)


Angehängte Dateien:

Lesenswert?

Hallo,

ich habe folgendes Problem bei der Datenübertragung vom Mikrocontroller 
zum PC:
1. die Daten sind oft durcheinander
(egal was und wie lange gesendet wird)
2. Fehler sind im Durchschnitt ca. 20%
3. senden geht besser als empfangen!?
4. manchmal kommt diese Meldung: Buffer overflow error

Hardware:
Atmega644P-20PU (läuft mit 20Mhz)
Schaltung: 20Mhz Quarz mit Folienkondensatoren, 10kOhm an Reset, 
Max-Kondensatoren: 4,7uF 35V
1.Versuch: Max3232CPE 2.Versuch(jetzt): Max232N

1.Versuch: Die Schaltung bekommt 3,3V von einem 
DC/DC-Wandler:AM1P-0503SZ
(mit einem Elko 4,7uF und einem Folienkondensator ?uF gestützt)
2.Versuch: Die Schaltung bekommt 5,2V von einem Netzteil
Beide Versuche haben etwa die Selben Fehler.

Der Atmega lässt sich ohne Probleme flashen.
Programmiersprache: C
Uartschnittstelle: 0 (die gleich neben dem Quarz)
Ich habe nur ein einfaches Multimeter das beim 
Versorgungsspannungsmessen aber keine "Schwingungen" anzeigt.

Nachdem mein Verdacht auf dem USB - Seriell-Wandler lag habe ich mir 
einen "hochwertigeren" mit FTDI Chip gekauft.
Den Adapter auf den Wandler habe ich selber gemacht: Pin 2,3 und 5 gehen 
zum Mikrocontroller.

Software:
Die Peter Fleury Dateien sind eingebunden.
Mit diesem habe ich es auch Probiert(ähnliche bis gleiche Fehler):
(Artikel 4):
http://www.roboternetz.de/community/threads/51364-UART-benutzen-Bibliothek-einbinden

Hterm - Einstellungen:
9600Baud, 8Bit, 1Stop, Parity None

Im Anhang 3 Musterbeispiele vom Hterm als PNG(das man es besser lesen 
kann)
(Buffer overflow error und "Kästchen" hörten nach vielen Zeilen von 
selber auf!)

Ich bin noch Anfänger und das ist mein erster verzweifelter Versuch von 
Bascom in C umzusteigen... xD

Danke für alle Antworten :D

Gruß
Sven

von Ingo (Gast)


Lesenswert?

Poste doch mal bitte deine Code

von Sven H. (sven91)


Lesenswert?

Ingo:

Uart.c und Uart.h sind eingebunden

#include <stdlib.h>
#include <avr/io.h>
#include <avr/interrupt.h>
#include <avr/signal.h>
#include <avr/pgmspace.h>

#include "uart.h"


/* define CPU frequency in Mhz here if not defined in Makefile */
#ifndef F_CPU
#define F_CPU 20000000UL
#endif

/* 9600 baud */
#define UART_BAUD_RATE      9600


int main(void)
{
    unsigned int c;
    char buffer[7];
    int  num=134;


    /*
     *  Initialize UART library, pass baudrate and AVR cpu clock
     *  with the macro
     *  UART_BAUD_SELECT() (normal speed mode )
     *  or
     *  UART_BAUD_SELECT_DOUBLE_SPEED() ( double speed mode)
     */
    uart_init( UART_BAUD_SELECT(UART_BAUD_RATE,F_CPU) );

    /*
     * now enable interrupt, since UART library is interrupt controlled
     */
    sei();

    /*
     *  Transmit string to UART
     *  The string is buffered by the uart library in a circular buffer
     *  and one character at a time is transmitted to the UART using 
interrupts.
     *  uart_puts() blocks if it can not write the whole string to the 
circular
     *  buffer
     */
    uart_puts("String stored in SRAM\n");

    /*
     * Transmit string from program memory to UART
     */
    uart_puts_P("String stored in FLASH\n");


    /*
     * Use standard avr-libc functions to convert numbers into string
     * before transmitting via UART
     */
    itoa( num, buffer, 10);   // convert interger into string (decimal 
format)
    uart_puts(buffer);        // and transmit string to UART


    /*
     * Transmit single character to UART
     */
    uart_putc('\r');

    for(;;)
    {
        /*
         * Get received character from ringbuffer
         * uart_getc() returns in the lower byte the received character 
and
         * in the higher byte (bitmask) the last receive error
         * UART_NO_DATA is returned when no data is available.
         *
         */
        c = uart_getc();
        if ( c & UART_NO_DATA )
        {
            /*
             * no data available from UART
             */
        }
        else
        {
            /*
             * new data available from UART
             * check for Frame or Overrun error
             */
            if ( c & UART_FRAME_ERROR )
            {
                /* Framing Error detected, i.e no stop bit detected */
                uart_puts_P("UART Frame Error: ");
            }
            if ( c & UART_OVERRUN_ERROR )
            {
                /*
                 * Overrun, a character already present in the UART UDR 
register was
                 * not read by the interrupt handler before the next 
character arrived,
                 * one or more received characters have been dropped
                 */
                uart_puts_P("UART Overrun Error: ");
            }
            if ( c & UART_BUFFER_OVERFLOW )
            {
                /*
                 * We are not reading the receive buffer fast enough,
                 * one or more received character have been dropped
                 */
                uart_puts_P("Buffer overflow error: ");
            }
            /*
             * send received character back
             */
            uart_putc( (unsigned char)c );
        }
    }

}

(Orginalbeispiel)

von Sven H. (sven91)


Lesenswert?

Ich seh grad Uart.c ist doch nicht eingebunden?

von Sven H. (sven91)


Lesenswert?

Doch ist eingebunden...

von Andreas B. (andreasb)


Lesenswert?

Versuche mal die Baudrate so niedrig wie möglich einzustellen, und 
schaue ob dann die Fehler weniger werden...

Oszi wäre jetzt nicht schlecht, aber versuche mal mit dem Multimeter die 
Pegel herauszukriegen, du hast mit ziemlicher Wahrscheinlichkeit ein 
Hardwareproblem.




mfg Andreas

von Sven H. (sven91)


Lesenswert?

Andreas B.

Baudrate 300:
Es kommen - egal was ich schreib - fast nur noch Kästchen an.

Pegel:
Vor dem USB - Seriellwandler:
bei 5,20 V
In : -6,30V
Out : -8,16V
Leider weis ich nicht mehr was TX und was RX ist... -_-

Soll ich noch etwas anderes messen?

von Andreas B. (andreasb)


Lesenswert?

Sven H. schrieb:
> Soll ich noch etwas anderes messen?

Kann dein Multimeter eine Frequenz messen?

Wenn ja: mach mal soetwas:


while(1) {
   PORTX |= (1 << Y);
   _delay_ms(50);

   PORTX &= ~(1 << Y);
   _delay_ms(50);
}

das gibt in etwa 10Hz, wenn es 9 oder 11 sind läuft was schief. (genauer 
wärs mit Timer)

bei mir war bis jetzt immer die Frequenz das Problem wenn UART nicht 
gelaufen ist...


mfg Andreas

von Sven H. (sven91)


Lesenswert?

Andreas B.

Danke für deine Antworten.

Hust...
stelle grad mit bedauern fest, dass ich mir mal ein neues Messgerät 
kaufen sollte!
-> Leider kann es keine Frequenzen messen...

Kann ich einen Anfängerfehler gemacht haben - irgendeinen einfachen?

Angenommen die Frequenz währe 9 oder 11 gewesen was währe dann die 
Fehlerbehebung gewesen bzw. währe diese in meinem Fall sinvoll?

mfg

Sven

von Andreas B. (andreasb)


Lesenswert?

Du hast ja das ganze mit einem Quarz am laufen, das ist relativ 
unproblematisch, da Quarze ziemlich genau sind.

Ich hatte noch nie einen defekten Quarz oder sowas...

Hast du einen anderen Controller / ein anderen Quarz zum testen?

Was du versuchen könntest wäre noch das umschalten auf den internen RC 
Oszillator, der ist zwar sehr ungenau, und ungeeignet, aber warum nicht 
mal testen?

Wenn dann besser geht dann hast du ein Problem mit deinem Quarz.

Wenn es gleich bleibt sagt es leider nichts aus, denn der interne RC 
Oszillator ist besonders bei Temperaturänderung sehr ungenau...



mfg Andreas

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Ich weiß jetzt nicht den uP, aber mein Tiny machte es auch so bis
ich die Taktfrequenz mit den Fuses richtig eingestellt hatte ...
Ncht, daß der heruntergetaktet ist.

von Andreas B. (andreasb)


Lesenswert?

Joachim Drechsel schrieb:
> Ich weiß jetzt nicht den uP, aber mein Tiny machte es auch so bis
> ich die Taktfrequenz mit den Fuses richtig eingestellt hatte ...
> Ncht, daß der heruntergetaktet ist.

Ja, das kenne ich auch, aber dann kommt garnichts an. Im Screenshot oben 
kommt aber teilweise etwas korrektes an, also kann die Frequenz nicht 
alzuweit daneben sein.

(Oder?)


mfg Andreas

von Juergen R. (stumpjumper)


Lesenswert?

Das Hardwareproblem heisst meiner Meinung nach "Handshake". Wie Du oben 
schreibst hast Du nur TX, RX und Masse nach dem USB/seriell Wandler 
weiterverdrahtet. Häng doch mal dein Multimeter an die diversen 
Handshakeleitungen und beobachte ob sich da der Pegel verändert.
Wenn dem so ist bedeutet das dass der empfangende Rechner die Daten 
nicht schnell genug vom Schnittstellenbaustein abholen kann und deshalb 
dem Sender signalisiert dass er mal eine Sendepause machen soll.
Bei Betriebssystemen wie Windows durchaus ein normaler Vorgang.

von Joachim D. (Firma: JDCC) (scheppertreiber)


Lesenswert?

Einfach auf XON/XOFF stellen. Das müßte aber eine ziemliche alte
Gurke von PC sein ...

von Sven H. (sven91)


Angehängte Dateien:

Lesenswert?

Andreas B.

Hey es sieht schon besser aus:
Quarz: 20Mhz ersetzt durch 12Mhz

Ergebnis:
Weniger Fehler
Im Anhang im Bild sieht man es.

Joachim Drechsel:
CKDIV 8 ist nicht aktiviert
Fuse Clock gesetzt:
Externer Osz. über 8Mhz 1KCK 65ms

mfg

Sven

von Sven H. (sven91)


Lesenswert?

Juergen Roeck:

Leider bin ich Einsteiger und kenne mich noch nicht so gut aus...
Wo die Handshake- leitungen liegen weiß ich leider nicht - ich hab 
einfach alle gemessen.
Mit niedriger Aktuallisierungsrate(beim Senden/Empfangen):
Pin 2: -8,17V
Pin 3: -6,31V
Pin 4: -6,42V
Pin 7: -6,41V

alle anderen ca. 0V


Joachim Drechsel:

Der Laptop ist sehr neu und hat Windows 7

Sorry aber was soll ich XON/XOFF stellen????

Danke für Eure Antworten

mfg

Sven

von Sven H. (sven91)


Lesenswert?

Ich hab grad im Internet nach dem Handshake usw gesucht und da habe ich 
ein Bild gefunden, wo am Seriell - USBwandler Pin 6 mit Pin 4 und Pin 7 
mit Pin 8 verbunden sind - muss ich das auch machen???
Den selbstgemachten Adapter hat mir mal ein Freund gezeigt, bei dem es 
anscheinend auch funktioniert hat!?

mfg

Sven

von Andreas B. (andreasb)


Lesenswert?

Handshake: http://de.wikipedia.org/wiki/Datenflusssteuerung

Wenn z.B. dein PC nicht nachkommt kann er das so sagen, wenn du die 
Leitungen nicht verbunden hast gibt es Probleme.

Du hast aber ein Problem mit dem Takt, vermute ich.

UART wird mit einer Startflanke synchronisiert. Wenn du nach jedem 
senden eines Strings _delay_ms(1) machst (etwas mehr schadet auch nicht) 
dann wirst du weniger Fehler haben.

Ich weiss nicht was du genau machen willst, aber warscheinlich läuft die 
Verbindung genug gut zum Debuggen oder so...



mfg Andreas

von Andreas B. (andreasb)


Lesenswert?

Sven H. schrieb:
> Ich hab grad im Internet nach dem Handshake usw gesucht und da habe ich
> ein Bild gefunden, wo am Seriell - USBwandler Pin 6 mit Pin 4 und Pin 7
> mit Pin 8 verbunden sind - muss ich das auch machen???
> Den selbstgemachten Adapter hat mir mal ein Freund gezeigt, bei dem es
> anscheinend auch funktioniert hat!?

Es geht ohne Handshake. Ich mache es auch immer ohne.

Du kannst Probleme kriegen, wenn der Controller nicht mehr nachkommt. 
Bei 9600 sollte aber der Controller nachkommen.





mfg Andreas

von Thomas B. (nichtessbar)


Lesenswert?

Wie groß sind die Kondensatoren am Quarz? Hast du diese richtig 
angeschlossen? (von XTAL1 und XTAL2 jeweils auf GND, Quarz zwischen 
XTAL1 und XTAL2)?

Probier evtl. mal wirklich 300 Baud oder ähnliches mit internem 1MHz 
Oszillator...

von Sven H. (sven91)


Lesenswert?

Andreas B.

Ich glaubs nicht:
Grad eben hab ich das Programm umgestellt und überall ne 1ms Pause 
reingemacht!
Dann sind nur noch W und viereckige Kästchen angekommen.
Ich hab alles wider rückgänig gemacht, die Kabel nochmal wie sooft 
überprüft usw... ABER NICHTS VERÄNDERT!

und jetzt geht es auf einmal Perfekt !!!!????

keine Ahnung warum...
und ich such schon seit 2 Tagen nach dem Fehler!

wenn ich herausfinde was es war, schreib ich es hir rein...

gruß

Sven

von Sven H. (sven91)


Lesenswert?

Thomas Bergmüller:

die Schaltung ist wie in alle Beispielen und die Kondensatoren sind 
22pF...
mit 300 Baud hab ich es schon ausprobiert...
Da sind leider nur Fehler angekommen.

Aber jetzt funktioniert es...

von Sven H. (sven91)


Angehängte Dateien:

Lesenswert?

Im Anhang sieht man die Daten vom Hterm.
Die Daten die gesendet und empfangen wurden stimmen alle...
Ich bin mir nicht sicher und weil ich an der Schaltung nichts geändert 
habe, war es vielleicht ein Wackelkontakt/kein Kontakt an dem 
Verlängerungskabel auf den USB - Seriellwandler, weil der Kunststoff von 
dem Kabel etwas übersteht!?

Wenn ich noch etwas genaueres herausfinde schreib ich es hier...

Danke für eure Hilfe

mfg

Sven

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.