Forum: Mikrocontroller und Digitale Elektronik MSP430 FR5739 UART Probleme


von AlexanderS. (Gast)


Lesenswert?

Hallo liebe Community,

ich probiere gerade die UART Kommunikation auf einem MSP 430 
Experimentierboard zu implementieren.

Leider funktioniert das ganze nicht wirklich so wie gedacht.

Die wichtigsten Eckparameter sind CLK von 8 MHz, SMCLK von 250 kHz und 
eine UART Kommunikation über das Integrierte eUSCI - Modul.

Hier einmal meine Main.c für euch
1
  #define UART_TXD BIT4
2
  #define UART_RXD BIT5
3
4
5
int main(void) {
6
7
  /*CLK EINSTELLUNGEN*/
8
    WDTCTL = WDTPW | WDTHOLD;  // Stop watchdog timer
9
    CSCTL0_H = 0xA5; //TI möchte einen Passwortschutz auf die CS Register
10
    CSCTL1 = 0x7; //8 MHz
11
    CSCTL2 = SELA_3 | SELS_3 | SELM_3;        // Setzen von  ACLK = MCLK= SMCLK
12
    CSCTL3 = DIVA_0 | DIVS_0 | DIVM_0;        // Alle Teiler auf Null
13
    CSCTL3 |= DIVS_5; //Setzen von SMCLK auf DIV = 32
14
15
    /*UART EINSTELLUNGEN*/
16
17
18
  //Wir gehen von 9600 Baud aus -> N = 250 kHz / 9600 =>  26,04
19
  //Dieser Wert ist größer 16 -> OS16 = 1
20
  //26,04 / 16 = 1.64 (int) -> UCBRx = 1
21
  //UCBRFx = (int)((26,04/16)-((int)(26,04/16))*16) => 10 dez
22
  //UCBRSx = 0,04 => 0x01
23
24
25
  //Baud,etc .. Einstellungen
26
  UCA0CTLW0 &= ~(0x8000);//Keine Parität
27
  UCA0CTLW0 &= ~(0x1000);//8 Bit daten
28
  UCA0CTLW0 &= ~(0x0800);//1 Stopbit
29
  UCA0CTLW0 &= ~(0x0600);//Ab in den UART Mode
30
  UCA0CTLW0 &= ~(0x0060);//Wählen von SMCLK als Clock Source
31
  //Konfiguration der Berechnung oben
32
  UCA0MCTLW |= 0x1;//Setzen von Oversampling
33
  UCA0BRW |= 0x1;//UCBRx = 1
34
  UCA0MCTLW |= 0x00A0;//UCBRFx = 1010;
35
  UCA0MCTLW |= 0x0100;//UCBRSx = 1
36
  //Konfigurieren der Ports
37
  //P3.4 TX
38
  //P3.5 RX
39
  P3SEL0 |=  UART_TXD | UART_RXD; //Definieren der Pins als besondere Funktion   IST das so richtig ? 
40
  P3OUT |= UART_TXD; //Laut Datenblatt muss OUT auch bei SELX gesetzt werden
41
42
43
  /*INIT DES UARTS*/
44
45
  UCA0CTLW0 &= ~(0x1); //Entfernen der RESET bedinung
46
  UCA0IE |= UCRXIE; //Aktivieren des RX Interrupts
47
  UCA0IE |= UCTXIE;//Aktivieren des TX Interrupts
48
49
50
  __bis_SR_register(GIE); //Aktivieren der Globalen Interrupts
51
52
  while (true)
53
  {
54
    _delay_cycles(1);
55
  }
56
57
}
58
59
#pragma vector=USCI_A0_VECTOR
60
__interrupt void USCI0_ISR(void)
61
{
62
  switch (UCA0IFG){
63
  case 0x2:
64
     UCA0TXBUF = 'a'; //Senden von 'a' auf die TX Leitung
65
     break;
66
  case 0x1:
67
      if (UCA0RXBUF == 'a') // 'a' erhalten ?
68
      {
69
        UCA0RXBUF &= 0x0; // Kein Nutzen hinter dieser Anweisung
70
      }
71
    break;
72
  }
73
}

Mit dem Debugger kann ich das Programm soweit nachvollziehen, das es in 
den Interrupt springt und case 0x2 anspringt. Dort setzt er dann den 
Ausgangsbuffer und idled dann in der while(true) Schleife in der Main.


Ich hoffe Ihr könnte mir helfen, den Fehler in meinem Code zu finden. 
Bei dem Experimenterboard handelt es sich um MSP-EXP430FR5739 FRAM 
Board. (Link Datasheet: http://www.farnell.com/datasheets/1684431.pdf)
Es soll der auf dem Board vorhandene RS232 to USB Wandler benutzt 
werden.


Gruß

AlexanderS.

von USCI (Gast)


Lesenswert?

AlexanderS. schrieb:
> Mit dem Debugger kann ich das Programm soweit nachvollziehen, das es in
> den Interrupt springt und case 0x2 anspringt. Dort setzt er dann den
> Ausgangsbuffer und idled dann in der while(true) Schleife in der Main.
>
> Ich hoffe Ihr könnte mir helfen, den Fehler in meinem Code zu finden.

Und wie soll es deiner Meinung nach im Programm weiter gehen.

von AlexanderS. (Gast)


Lesenswert?

Hallo,

ich würde erwarten, das auf meiner Seriellen Konsole etwas ausgegeben 
wird oder das er zumindest mehrfach in die Interruptroutine springt, da 
der TX Buffer nach dem Senden ja wieder leer ist.

Wenn ich damit falsch liege, bitte ich um Richtigstellung.

Gruß

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.