MSP430F248 RS232

OP #2152623
Lesenswert?

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
Gast #2152652
Lesenswert?

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.
OP #2152981
Lesenswert?

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
Gast #2153189
Lesenswert?

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.

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren