Hoffe, es kann mir wer helfen :P Hab ein MyAvr LPT-Board mit Atmega8. Funktioniert soweit, nur die serielle Kommunikation haut nicht hin. Wenn ich ein 'a' schicke, wird ein 'O' am LCD-Display des µC ausgegeben, schicke ich ein 'q' kommt ein 'G' raus, usw. Hab ein wenig die Ascii-Tabelle durchstudiert und bin auf folgendes draufgekommen: 'a' entspricht 0110 0001 'O' entspricht 0100 1111 Um also vom Binärcode 'a' nach 'O' zu kommen, muss man das Byte zuerst invertieren und dann einmal rechts schieben. 'a' --> 'O' 0110 0001 --> 1001 1110 --> 0100 1111 Diese "Umrechnung" funktioniert aber nur bei Zeichen, deren Binärcode mit einer 1 endet, z.B. 'a', 'c', 'e', ... Also irgendwo in der Übertragung wird das gesendete Byte verfälscht. Senden eines Bytes an den PC funktioniert gar nicht. Hier der C-Code: ------------------------------------------------------------------------ - #include "lcd.h" #include "lcd.c" #include <avr/io.h> #include "stdio.h" #define F_CPU 3686400 //Prozessortakt #define BAUD 9600 //RS232-Baudrate #define MYUBRR F_CPU/16/BAUD-1 void USART_INITIALISIEREN(unsigned int); unsigned char USART_EMPFANGEN(void); void USART_SENDEN(unsigned char); int main(void) { char Zeichen,i; DDRC = 0xFF; USART_INITIALISIEREN(MYUBRR); lcd_init(); lcd_clear(); i = 0; Zeichen = 'a'; lcd_write(Zeichen); while(1) { Zeichen = USART_EMPFANGEN(); lcd_write(Zeichen); } return 0; } void USART_INITIALISIEREN(unsigned int ubrr) { //setzen der Baudrate UBRRH = 0;//(unsigned char) (ubrr>>8); //Setzen des HIGH-Bytes des Baudraten-Registers UBRRL = 23;//(unsigned char) ubrr; //Setzen des LOW -Bytes des Baudraten-Registers //UCSRA |= 0x02; //Einschalten des Senders und Empfaengers UCSRB = (1<<RXEN)|(1<<TXEN); //Setzen des Nachrichtenformats: 8 Datenbits, 2 Stopbits UCSRC = (1<<URSEL)|(1<<UCSZ0)|(1<<UCSZ1); } unsigned char USART_EMPFANGEN(void) { //Warten bis die Daten empfangen wurden while( !(UCSRA & (1<<RXC)) ) ; //Holen und Zurueckgenben der vom Puffer Empfangenen Daten return UDR; } void USART_SENDEN(unsigned char daten) { //Warten bis der Uebertragungspuffer leer ist while( !(UCSRA & (1<<UDRE)) ) ; //Daten inden Puffer schreiben und Uebertragen UDR = daten; } ------------------------------------------------------------------------ --- Übrigens schließe ich das Board per USB-Seriell-Converter an den PC an, da der Converter aber ein Male-Stecker ist und das Board ebenso, verbinde ich den Converter mit dem Board über ein selbstgemachter Nullmodemkabel (ungeschirmte Flachbandleitung). Hat irgendjemand ne Idee, wo der Fehler liegen könnte?
Übrigens der USB-Seriell-Converter funktioniert tadellos, mit meinem ATMEGA32-Board klappt der serielle Dtaenverkehr problemlos. Könnte der Max232 kaputt sein oder muss ich Fuse-Bits setzen bevor ich kommunizieren kann?
sind sind die seriellen Übertragungsparameter identisch? also Baudrate,Stopbits,paritybit usw.? Lötkünstler <Mit der Lizenz zum löten>
Hab ich schon überprüft, das passt überein. Was ich aber durch Googeln gefunden habe ist dieser Thread, in dem jemand das selbe Problem hat: Beitrag "wieder mal uart. Falsche Zeichen" Darin wird dem falsch eingebautem Max232 die Schuld gegeben. Könnte es sein, dass da ein Fehler im Board ist? http://www.myavr.de/download/techb_myavr_board_lpt.pdf
Wenn das ein "neuer" Mega8 ist must du den erst auf externene Takt konfigurieren!
Hi
>#define MYUBRR F_CPU/16/BAUD-1
Wenn der Compiler nach der Methode 'Punktrechnung vor Strichrechnung'
arbeitet wird die Baudrate falsch berechnet:
Teste mal: #define MYUBRR F_CPU/16/(BAUD-1).
MfG Spess
Das hab ich schon gemacht, der µC läuft mit 3.6864 MHz. Aja, um die Sache noch verwirrender zu machen, an nem Seriellen Computer-Port direkt angeschlossen hat (zumindest das Empfangen) einwandfrei funktioniert
Wenn die seriellen Parameter stimmen würde ich mal den Quarz des Boards unter die Lupe nehmen ob der auf der richtigen Frequenz schwingt. (Mit nem Frequenzzähler direkt messen oder mit nem Oszilloskop die Frequenz ermitteln die aufgedruckt ist). Bei verdächtigen Kabeln würde ich Rxd und TXD am Kabelende verbinden und mit einen einfachen Datenmonitor die gesendeten/empfangenen Daten darstellen um das Kabel als Fehlerquelle auszuschließen. Prüfen ob die Masse vom Kabel vom PC zum Board o.k.ist. Auf den High/low-Pegel der RS 232 Schnittstelle würde ich auch mal ein Auge werfen (High=-5--12V Low=+5-12V)Evtl. Kann der RS 232 -Baustein oder die Elko`s ne Macke haben.Dann ist die Datenübertragung natürlich nicht sichergestellt. Mehr fällt mir dazu im Moment auch nicht ein. Gruß Lötkünstler <Mit der Lizenz zum löten>
MyAvr User wrote: > Übrigens schließe ich das Board per USB-Seriell-Converter an den PC an, > da der Converter aber ein Male-Stecker ist und das Board ebenso, > verbinde ich den Converter mit dem Board über ein selbstgemachter > Nullmodemkabel (ungeschirmte Flachbandleitung). Wenn ich mich nicht irre, ergibt diese Konstruktion eine 1:1 Verbindung female:female. Ein Nullmodemkabel tauscht aber zusätzlich TxD/RxD, CTS/RTS etc. Ist sichergestellt, daß TxD(Board) mit RxD(PC) etc. verbunden ist? Siehe auch Wikipedia: http://de.wikipedia.org/wiki/RS232#Verkabelung_und_Stecker Gruß Martin
OK, ich glaub ich komm dem Fehler langsam näher. Wenn am PIN R1IN -8V anliegt ist RXD auf Low, der Ruhepegel müsste aber High sein, d.h. der MAX232 setzt nicht richtig um. Bei meinem ATMEGA32 Board ist der Ruhepegel wie es sich gehört auf High. Obwohl beide Boards den selben MAX232 - Aufbau haben invertiert der MAX232 auf dem Atmega8 Board nicht, was den Fehler verursacht. Hab die MAX232 der Boards ausgetauscht (der eine ist ein MAX232N, der andere ein MAX232CPE, hat aber nichts an der Situation verändert. Kondensatoren scheinen auch übereinzustimmen (es sei denn die am Atmega8-Board sind falsch bedruckt). Es ist mir unerklärbar wieso bei dem Atmega8 Board der Ruhepegel und somit warscheinlich auch die anderen Pegel verkehrt sind. Hab die falsch gesendeten Bytes nochmal unter die Lupe genommen und bin mir jetzt 99% sicher, dass die Bitfehler allein durch die Invertierung zustande kommen, weil dadurch alle Bits invertiert sowie das Startbit "verschoben" wird.
Haste auch die Elko`s(manchmal sind`s auch Tantal`s)mit ausgewechselt? Wenn einer davon defekt ist funktioniern die Spannungswandler meist nicht mehr richtig. Lötkünstler <Mit der Lizenz zum löten>
So, jetz bin ich komplett verwirrt. Hab die Vermutung von Martin L. nachgeprüft, und es waren wirklich die beiden Buchsen verkehrt, d.h. man braucht wirklich kein gekreuztes Nullmodemkabel. Jetzt funktioniert die serielle Kommunikation mit der seriellen Schnittstelle meines alten Computers. Seltsamerweise kann ich jetzt aber gar keine Zeichen mehr per USB-Seriell-Konverter senden, das Board empfängt nix. Der Konverter is aber ok, mit dem Atmega32 Board funktioniert er.
Hatte schon probleme mit gewissen usb-seriell konvertern (HP), halten teils die spezifikationen zu wenig genau ein... --> hast du mal einen anderen konverter ausprobiert?
Juhu, es haut hin! Hatte doch ein Nullmodemkabel gebraucht, aber zuvor hab ich den Aufbau eines Solchen Kabels falsch verstanden gehabt und die falschen Leitungen vertauscht. Jetzt klappts einwandfrei!
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.