Hallo, Leute! Versuche seit mehreren Stunden die Kommunikation zwischen µC und PC hinzubekommen. Habe entsprechende Schaltung mit MAX232 realisiert. µC-Board hat einen 16MHZ Quarz, die Clock-Fuses sind auf externen Quarz eingestellt. D.h. ich habe nun alles mögliche gemacht, trotzdem kommt am PC-Terminal "fast" nur Müll an. Here ist der Code: #define BAUD 9600UL #define UBRR_BAUD ((F_CPU/(16UL*BAUD))-1) // USART initialisieren void uart_init(void) { UBRR0H = (uint8_t) (UBRR_BAUD>>8); UBRR0L = (uint8_t) (UBRR_BAUD & 0x0FF); UCSR0B = (1<<RXEN0)|(1<<TXEN0); UCSR0C = (0 << USBS) | (3 << UCSZ00); } // Get data from the input uint8_t get_data(void) { while(!(UCSR0A & (1<<RXC))); return UDR0; } // put data to the output void put_data(uint8_t c) { while(!( UCSR0A & (1<<UDRE))); UDR0 = c; } // LOOP back int main(void) { // USART initialisieren uart_init(); put_data(0x20); put_data('h'); put_data('e'); put_data('l'); put_data('l'); put_data('o'); put_data('!'); put_data('\n'); // loopback schleife while (1) { //int i; //for (i=0; i < 100; i++) _delay_ms(10); put_data(0xFF); } } Das Board verfügt über einen ATmega128. Die Fusebits sind richtig gesetzt (stehen auf 1111, d.h. ext. Quarz). Am Board ist ein 16MHZ Quartz. Mit Hilfe von _delay_ms Schleifen konnte ich ein Zeichen am Terminal jede Sekunde empfangen, d.h. der Takt scheint wohl zu stimmen. Wenn ich nun 0xFF sende, kommt immer nur 0x01 an. Das Terminalprogramm ist auf 8N1 eingestellt. Baudrate ist 9600. Was kan ich denn noch tun, um die Signale korrekt zu senden. Vielen Dank!
Habe nun herausgefunden, dass der FE0 ab und zumal gesetzt wird. D.h. ich habe Frame Errors, wenn ich Daten vom Rechner empfange. Dies kann aber kaum sein, da die Terminalsoftware genauso gesetzt ist, wie die avr. Was nun?
Ohne mir Dein Programm detailliert angesehen zu haben: Welches Terminalprogramm nimmst Du denn? Wir haben mit Hyperlink (mit Windows mitgeliefert) sehr schlechte Erfahrungen gemacht. Vielleicht solltest Du einfach mal ein anderes versuchen. Vielleicht auch einen anderen Rechner. Oder einen anderen USB-Serial-Adapter. Oder hast Du noch eine "richtige" RS232-Schnittstelle, das wäre das allerbeste. Ist das BIOS richtig konfiguriert? Hast Du eine Möglichkeit, den Pegel zu messen? Für den PC sollen es schon 12V sein. Das mit den Frame-Errors würde ich erst einmal noch nicht so eng sehen. Kurz zusammengefasst: Vielleicht ist es Deine Schaltung/Programm nicht, sondern der PC ? Versuch doch auch mal, einen Kurzschluss zwischen RxD und TxD zu machen, um zu sehen, ob Du Deine eigenen Daten empfangen kannst. Auf beiden Seiten! Möge es helfen Willi Wacker
Willi Wacker wrote: > Ohne mir Dein Programm detailliert angesehen zu haben: Welches > Terminalprogramm nimmst Du denn? Wir haben mit Hyperlink (mit Windows > mitgeliefert) sehr schlechte Erfahrungen gemacht. Vielleicht solltest Du > einfach mal ein anderes versuchen. Ich benutze minicom (Linux). Ausserdem habe ich versucht die ttyS1 (Com1) Schnittstelle direkt in eine Datei umzuleiten (cat /dev/ttyS1 > test.log). Zuvor natürlich mit stty die richtigen Parameter eingestellt. Tortzdem keine Verbesserung. > Vielleicht auch einen anderen Rechner. Das werde ich heute ausprobieren. > Oder einen anderen USB-Serial-Adapter. Oder hast Du noch eine "richtige" > RS232-Schnittstelle, das wäre das allerbeste. Ist das BIOS richtig > konfiguriert? Ich habe noch eine richtige RS232-Schnittstelle. Habe extra beim Kauf des Rechners darauf geachtet :-) > Hast Du eine Möglichkeit, den Pegel zu messen? Für den PC sollen es > schon 12V sein. Der Pegel liegt im Bereich von +-10V. Mehr schafft der MAX232 auch nicht. > Das mit den Frame-Errors würde ich erst einmal noch nicht so eng sehen. > > Kurz zusammengefasst: Vielleicht ist es Deine Schaltung/Programm nicht, > sondern der PC ? Kann auch sein. So langsam glaube ich wirklich dass dies der Fall sein könnte. Obowhl dieser Rechner schafft es Problemlos durch das Nullmodemkabel die dBox oder andere Reciever zu programmieren. > Versuch doch auch mal, einen Kurzschluss zwischen RxD und TxD zu machen, > um zu sehen, ob Du Deine eigenen Daten empfangen kannst. Auf beiden > Seiten! Bereits probiert und es klappt. Habe sogar einen Kurzschluss nach dem MAX232 ausprobiert, um zu sehen, ob die Daten vom PC zu MAX und zurück richtig ankommen. Und es scheint zu funktionieren. Habe zudem anderes SUBD Kabel probiert und die VCC,GND von MAX232 an eigenes Netzwerk zu legen (also nicht die vom AVR board). Trotzdem kein Erfolg.
Ja F_CPU ist gesetzt. Am anderen Rechner ausprobiert und trotzdem das gleiche Problem. Komischerweise sind die Fehler, also die falschen Zeichen, immer gleich falsch. D.h. für gleichen Output ist fast immer das gleiche Zeichen was rauskommt. Tue ich im AVR ein Echo programmieren, dann sehe ich zwischen den komischsten Zeichen auch den den ich vom PC aus abgeschickt habe. Sieht wirklich nach einem Timing Problem aus, nur das Problem ist, dass alles richtig eingestellt ist. Ich habe nun 1200 Baudrate probiert und die Fehler sind die gleichen. Kann es vielleicht sein, dass der Quartz spinnt? Wie könnte man ihn prüfen? Ich weiss nicht mehr weiter.
Hallo, bin jetzt nicht so der C-Experte, frage mich aber warum das Baudratensetting so kompliziert berechnet/eingestellt wird!? Für 9600 Baud bei 16 MHz ist UBRR 103. Kommt das bei dieser komischen Berechnung auch raus? Hatte selber mit der USART und Mega128 nie Probleme.
Ich habe auch dierekt 103 probiert anzugeben, tortzdem gab es Problemen. Habe zum testen 4 mal 01010101, also 0xAA durchgeschickt. Ich bekamm dann 0x58 0x58 0x58 0x15 zurück. In bitschreibweise sieht es fast so aus, wie die 01010101, dennoch nicht ganz. Kann mir jemand seine Einstellungen von den UCSSR0A/B/C schicken, aber nur falls ihr auch mega128 habt.
Hab meinen Mega128 zufällig auch mit 9600 Baud laufen (aber bei 14,7456MHz) hier meine Einstellungen: clr r16 ;Konfiguration RS232Funk ldi r17,$5f ;Baudrate= 9600 ($5F) sts UBRR1H,r16 sts UBRR1L,r17 ;Set Baudrate ldi r16,$6 ;8Data/1Stop/No Parity sts UCSR1C,r16 ;Set Configuration ldi r16,$98 ;Receiver+INT & sts UCSR1B,r16 ;Enable
Ja deine Einstellungen ensprechen meinen. Trotzdem hilfts es nicht. Das ist mein aktuelle Setup code:
1 | UCSR1A &= ~(1<<U2X); |
2 | UCSR1B = (1<<TXEN1) | (1 << RXEN1); |
3 | UCSR1C = (1 << UCSZ10) | (1 << UCSZ11); |
4 | UBRR1H = (uint8_t) 0;//(UBRR_BAUD >> 8); |
5 | UBRR1L = (uint8_t) 103;//(UBRR_BAUD & 0xFF); |
Ok, danke. Ich habe endlich mal den Bug gefunden. Nichts war an den Einstellungen falsch. Das Board was ich benutze hat bereits einen ICL3232 Chip eingebaut, der bereits die Pegelumwandlung vornimmt. Die Pegelumwandlung ist aber leider nur bis +-5V, und nicht +-10V wie bei MAX232. Im Internet konnte man wenig über den ICL Chip finden, und alle swas man fand, war irgendwie in chin. Sprache :-) Warum ich das übersehen habe, weiss ich auch nicht. Ohne den MAX läuft die Verbindung zum Rechner problemlos. Hoffentlich hält der ICL3232 die RS-232 Spannung von bis zu 12V aus :-)
Schön, dass Du auch gesagt hast, wo Dein Fehler lag ! Ciao
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.