Uart - Datenproblem

#2544306
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
Angehängte Dateien:
#2544325
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)
#2544371
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
#2544383
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
#2544407
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
#2544417
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
#2544421
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.
#2544468
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
#2544481
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
#2544490
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
#2544496
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
#2544554
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
#2544566
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
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