Forum: Mikrocontroller und Digitale Elektronik MSP430F248 RS232


von Mathias K. (underworldgamer)


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

von Dennis (Gast)


Lesenswert?

Mathias K. schrieb:
> UCA1BR0 = 6;                              // 1MHz 9600
> UCA1BR1 = 0;                              // 1MHz 9600

Wie errechnet sich denn das zu 9600 bei 1MHz?

von Dennis (Gast)


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.

von Mathias K. (underworldgamer)


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

von Dennis (Gast)


Lesenswert?

Wie bist du denn auf UCA0BR0 = 6; gekommen? Und du hast nu immernoch 
TX-IR freigegeben, aber keinen Handler dafür.

von Mathias K. (underworldgamer)


Angehängte Dateien:

Lesenswert?

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

von Jörg S. (joerg-s)


Lesenswert?

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.

von Dennis (Gast)


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.

von Mathias.K (Gast)


Lesenswert?

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
Noch kein Account? Hier anmelden.