Guten Tag, Ich möchte vom meinem Msp430F248 über Port P3.5 / P3.6 (RX / TX) serielle Daten senden. Doch irgendwie funktionieren diese Einstellungen nicht so ganz. mfg Mathias #pragma vector=USCIAB1RX_VECTOR __interrupt void USCI0RX_ISR(void) { command = UCA1RXBUF; /* if(UCA1RXBUF == 'a'){ UCA1TXBUF = 'V'; } */ } void initsci(){ WDTCTL = WDTPW + WDTHOLD; // Stop WDT if (CALBC1_1MHZ ==0xFF || CALDCO_1MHZ == 0xFF) { while(1); // If calibration constants erased // do not load, trap CPU!! } BCSCTL1 = CALBC1_1MHZ; // Set DCO DCOCTL = CALDCO_1MHZ; P3SEL = BIT6 + BIT7; // P3.4,5 = USCI_A0 TXD/RXD UCA1CTL1 |= UCSSEL_2; // SMCLK UCA1BR0 = 6; // 1MHz 9600 UCA1BR1 = 0; // 1MHz 9600 UCA1MCTL = UCBRF3 + UCOS16; // Modln UCBRSx=1, over sampling UCA1CTL1 &= ~UCSWRST; // **Initialize USCI state machine** UC1IE |= UCA1RXIE; // Enable USCI_A0 RX interrupt // UCA1IE |= UCTXIE + UCRXIE; // Enable USCI_A1 TX/RX interrupt __bis_SR_register(GIE); // Enter LPM3 w/ int until Byte RXed
Mathias K. schrieb: > UCA1BR0 = 6; // 1MHz 9600 > UCA1BR1 = 0; // 1MHz 9600 Wie errechnet sich denn das zu 9600 bei 1MHz?
Noch was anderes: Mathias K. schrieb: > #pragma vector=USCIAB1RX_VECTOR > __interrupt void USCI0RX_ISR(void) > { > command = UCA1RXBUF; > /* > if(UCA1RXBUF == 'a'){ > > UCA1TXBUF = 'V'; > } > */ > } Wenn du den Buffer schon ausliest, dann arbeite lieber mit der anderen Variable weiter, als ihn nochmal auszulesen. Mathias K. schrieb: > UCA1IE |= UCTXIE + UCRXIE; Wenn du den TX-IR freigeben solltest, dann musst du dafür auch einen Handler haben, zumindest nen leeren - sonst kann es sein, dass ich das Programm verläuft.
BCSCTL1 = CALBC1_1MHZ; // Set DCO DCOCTL = CALDCO_1MHZ; P3SEL = BIT6 + BIT7; // P3.6,7 = USCI_A1 TXD/RXD UCA0CTL1 |= UCSSEL_2; // SMCLK UCA0BR0 = 6; // 1MHz 9600 UCA0BR1 = 0; // 1MHz 9600 UCA0MCTL = UCBRF3 + UCOS16; // Modln UCBRSx=1, over sampling UCA0CTL1 &= ~UCSWRST; // **Initialize USCI state machine** UCA1CTL1 &= ~UCSWRST; // Initialize USCI state machine UC1IFG &= ~(UCA1TXIFG | UCA1RXIFG); // clear possible pending interrupts UC1IE |= (UCA1RXIE | UCA1TXIE); // Enable USCI_A1 TX & RX interrupt //_EINT(); __bis_SR_register(GIE); // sleep, leave interrupts on while(1){}; } #pragma vector=USCIAB1RX_VECTOR __interrupt void USCI1RX_ISR(void) { UCA1TXBUF = UCA1RXBUF; // TX -> RXed character } ich habs mal so gemacht nur verstehe ich deine Antwort zuvor nicht. mfg Mathias
Wie bist du denn auf UCA0BR0 = 6; gekommen? Und du hast nu immernoch TX-IR freigegeben, aber keinen Handler dafür.
i wie meinst du das mit dem freigeben i weiss echt nicht weiter ? Wie schaut den dieser Handler aus ? Aus dieser Datei habe ich die 6 raus. lg
Mathias K. schrieb: > i wie meinst du das mit dem freigeben i weiss echt nicht weiter ? Du hast dem µC gesagt das er bei leerem TX Buffer einen Interrupt auslösen soll (UC1IE |= (UCA1RXIE | UCA1TXIE);), hast aber keine Interruptroutine dafür geschrieben.
Mathias K. schrieb: > Aus dieser Datei habe ich die 6 raus. Und wo steht da die 6? Rechne doch mal: Du hast nen CLOCK von 1MHz und willst ne Baudrate von 9600. 1.000.000 / 9.600 = 104 Und genauso steht es doch auch in der Tabelle - wo hast du die 6 her? Und dir 104 musst du ins BR0 eintragen, nicht ins BR1, da sich der Prescaler aus (BR0 + 256*BR1) ergibt.
interessant ist es nur das ich diese einstellung aus einem denoprogramm vn ti i habe gg komische sache halt. mfg mathias
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.