Hallo Gemeinde, ich habe folgendes Problem mit Uart0 MSP430F449 32.768 Khz Quarz an XT1. Eigenes Board, 1Startbit, 8 Datenbits 1 Stopbit kein Paritybit. Hardwarefehler schließe ich nun mal aus (Messungen ergaben keine Fehler an und vor dem MAX3221) Senden und empfangen funktioniert mit 9600 Baud tadellos 100% fehlerfrei. Bei 19200 Baud gibts bei ca 3000 Empfangenen zeichen im Schnitt 1-2 verschlucktes Zeichen (vermutlich kein RX Interrupt ausgelöst) hier mein Quellcode: .... TACTL = TASSEL0 + TACLR + TAIE; // ACLK, Clear TAR, Interrupt enable //FLL init SCFQCTL = 0x3C; //ignores M bit 7 SCFI0 = 0x40;//FLL_D.0 SCFI1 = 0; FLL_CTL0 |= (DCOPLUS + XCAP14PF); // load caps FLL_CTL1 = 0x20;//XT2OFF .... Uart Initialisierung // ================================================================ // Funktionsname: init_UART0() // ================================================================ void init_UART0(void) { STOP_WATCHDOG // Watchdog stoppen _BIS_SR(GIE); P2DIR |= 0x10; // P2.4 output direction P2SEL |= 0x30; // P2.4,5 = USART0 TXD/RXD U0CTL |= SWRST; // UART Control Register: Reset SWRST = 1 before initialisation Step <1> UCTL0 |= CHAR; // 8-bit character SWRST <Step 2> // Transmit Control Register U0TCTL |= SSEL1; // Transmitter Control Register: UCLK = SMCLK // Uart Baud register UBR00=0xD0; // 0xA0 = 9600 Baud 0xD0 = 19200 Baud UBR10=0x00; // 0x01 = 9600 Baud 0x00 = 19200 Baud UMCTL0=0x08; // 0x4A = 9600 Baud 0x08= 19200 Baud // UBR00=0xA0; // 0xA0 = 9600 Baud 0xD0 = 19200 Baud // UBR10=0x01; // 0x01 = 9600 Baud 0x00 = 19200 Baud // UMCTL0=0x4A; // 0x4A = 9600 Baud 0x08= 19200 Baud ME1 |= (UTXE0 + URXE0); // Enable USART0 TXD/RXD <Step 3> U0CTL &= ~SWRST; // UART Control Register: Clear Bit SWRST=0 <Step 4> IE1 |= URXIE0; // Enable USART0 RX interrupt <Step 5> } // End init_UART0 auf http://www.msp430.info/modules.php?name=Sections&op=viewarticle&artid=2 steht, dass es Probleme beim Empfang geben kann und man das Modulationsregister auf Receive speziell anpassen muss um Fehler zu vermeiden. Sind meine Modulationsregister richtig? (Für die Korrektur) FLL Clock D=2, wurde auf 3.9977 MHz initialisiert. An was könnte es liegen? Für alle Kritik / Tipps dankbar! Grüße Uli
Der Baudraten-Rechner sagt 0x84 für die Modulation: http://mspgcc.sourceforge.net/baudrate.html Kann eigentlich nur am Timing liegen. Stimmen denn die 3,9977MHz? Was sagt das Oszi dazu?
Hallo SupaChris! vielen Dank für die schnelle Antwort, werde den Wert 0x84 am Montag nochmal ausprobieren. Habe den Wert 0x84, nach meiner 1. Fragestellung schon probiert, der Uart arbeitete aber gar nicht mehr mit diesem Wert. Ich muss die Frequenz nochmals messen 3.9977 MHz ob die nicht irgendwie abweichen. Hatte vorgestern 48 us für 1 Bit gemessen rein rechnerisch müssten es 52 us sein, mit den obigen Einstellungen. Und werde natürlich mein Datenblatt weiter studieren... mfG Uli
Naja, zuerst musst du sicherstellen, dass die Frequenz des MCLK stimmt, und dass die FLL+ so eingestellt ist, dass diese Frequenz ständig nachgeregelt wird. Die FLL+ kann das ja. Erst dann kannst du dich weiter auf die Suche machen.
Lass am besten die verschiedenen Freuquenzen wie ACLK und MCLK und SMCLK an den entsprechenden Pins ausgeben und miss da mit einem Oszi nach. Das hat mir schon öfters geholfen.
Hallo Gemeinde Es funktioniert mit 8 MHz fDCo. Das ist aber zu hoch für meine Betriebsspannung 3.3V Die Clocks passen alle ! Danke für den Tipp Habe nun den Takt raufgesetzt auf einen Wert, der mit 3.3 V noch läuft. Glücklicherweise bin auch auf einen Beitrag von Joerg H. gestossen, der 7.14324 MHz verwendet - und dadurch wird das Modulationsregister 0. Ich glaube dass es sonst immer zu Abweichungen kommen kann u. evtl Interruptprobleme je nach Interrupt-/Programmumfang auftreten können. Hat das mit dem Jitter was zu tun und der worst case Zeitabweichung wie sie Lutz Bierl in seinem Buch beschreibt? Empfehlung D hoch setzen DCO 0 setzen dann sei der Fehler kleiner. Mit diesem Code funktionierts: .... FLL_CTL0 = DCOPLUS + XCAP14PF; // set load capacitance for xtal // funktioniert 7.143424 MHz // N = 108, fDCO= 7.143424 SCFQCTL = (108 & 0x7f); // Multiplikationsfaktor setzen f_DCO = 32.768 kHz* (N+1) * 2^D // D // | SCFI0 = ((1 & 3) << 6) | FN_3; .... void init_UART0(void) { STOP_WATCHDOG // Watchdog stoppen _BIS_SR(GIE); P2DIR |= 0x10; // P2.4 output direction P2SEL |= 0x30; // P2.4,5 = USART0 TXD/RXD U0CTL |= SWRST; // UART Control Register: Reset SWRST = 1 before initialisation Step <1> UCTL0 |= CHAR; // 8-bit character SWRST <Step 2> // Transmit Control Register U0TCTL |= SSEL1; // Transmitter Control Register: UCLK = SMCLK // Uart Baud register // 7.143424 MHz mit diesem auch Baudrateregister berechnet UBR00=0x74; // 0x74 = 19202 Baud UBR10=0x01; // 0x01 = 19202 Baud UMCTL0=0x00; // 0x00 = 19202 Baud ME1 |= (UTXE0 + URXE0); // Enable USART0 TXD/RXD <Step 3> U0CTL &= ~SWRST; // UART Control Register: Clear Bit SWRST=0 <Step 4> IE1 |= URXIE0; // Enable USART0 RX interrupt <Step 5> } // End init UART0 Danke und Grüße an alle
Beitrag #6765273 wurde von einem Moderator gelöscht.
Beitrag #6768033 wurde von einem Moderator gelöscht.
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.