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
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)
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
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?
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
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
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
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.
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
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.
Einfach auf XON/XOFF stellen. Das müßte aber eine ziemliche alte Gurke von PC sein ...
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
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
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
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
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
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...
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
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...
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
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.