Forum: Mikrocontroller und Digitale Elektronik MSP430 - serielle schnittstelle laeuft net -> TAKTPROBLEM???


von johannes (Gast)


Lesenswert?

Moin!

Ich hab den ganzen Tag am code rumgeschraubt und an meinen
MSP430F437IPZ an die Pins XIN und XOUT nen 32 kHz oszillator
angetuetert (gehause natuerlich gegrounded..)
Ich verwende keine externen kapazitaeten weil mein MSP die auf
software-anweisung hin intern zuschaltet.
das ganze laeuft aber immer noch nicht!
Ich bin die ganze geschichte mal schrittweise durchgegangen und das
programm haengt sich imm bei der character-zuweisung (ch = 'a';)
auf.
hat irgendwer von euch ne erklaerung dafuer? initialisiere ich
ueberhaupt den takt richtig - (ich erwaehne schliesslich nur bei der
USART inititalisierung dass ich den ACLK nutzen moechte - muss ich den
eventuell schon vorher aktivieren?)?


Ich bin fuer jede hilfe dankbar!



und hier nu der code:






#include <msp430x43x.h>
#include <stdio.h>




int main(void)
{
  char ch;

  WDTCTL = WDTPW + WDTHOLD;     // Stop watchdog timer

  P2SEL |= (BIT4 + BIT5);  //UTXD0 and URXD0 = activated
  P2DIR |= 0x1A;  //P2.4, P2.3 & P2.1 = outputs

  SCFQCTL = SCFQ_M;                   // Frequency modulation disabled

  FLL_CTL0 |= XCAP14PF;                     // Configure load caps

  U0CTL |= SWRST;   // Software-Reset activated
  U0CTL |= CHAR;     //no parity; 1 stop bits; 8-bit data;
LISTEN=disabled;
                    //UART mode; Idle-line MP protocol;
//  U0TCTL = 0x18;   // UCLKI=UCLK; ACLK; UART receive start-edge
feature; data
  UTCTL0 = SSEL0;    // UCLK = ACLK
  U0BR0 = 0x03;      // 9600 Baud
  U0BR1 = 0x00;
  UMCTL0 = 0x4A;

  U0IFG &= ~URXIFG0;                    // Clear USART0 RX interrupt
flag
  U0IFG |= UTXIFG0;                    // Clear USART0 TX interrupt
flag
  U0CTL &= ~(SWRST);                    // 8-bit character - clr SWRST
bit
  U0IE |= URXIE0+UTXIE0;                // Enable USART0 RX + TX
interrupt
  //U0IE |= U0RXIE;                       // Enable USART0 RX
interrupt
  U0ME |= UTXE0+URXE0 ;                 // Enabled USART0 TXD/RXD

  _BIS_SR(LPM4_bits + GIE);    //enable maskable interrupts and enter
LPM4

/*  UTCTL0 = SSEL0;                     // UCLK = ACLK
  UBR00 = 0x03;                         // 32k/9600
  UBR10 = 0x00;                         //
  UMCTL0 = 0x4a;                        //  */


  P2OUT = 0x02;
  ch = 'a';

  while (1)
  {
    while ((U0IFG&UTXIFG0)==0);            // wait till TX buf empty
    U0TXBUF = ch;
    P2OUT |= 0x08;
  } //while

}// main



// USART 0 Receive interrupt service routine
#pragma vector=USART0RX_VECTOR
__interrupt void USART0RX (void)
{
   char temp;

   temp=U0RXBUF;
   P2OUT = 0x08;

}

von Mario (Gast)


Lesenswert?

Hi Johannes,

ich schon wieder :-)

Wie schon im anderen Thread erwähnt, ist es immens wichtig, bei der
USART-Konfiguration die im Datenblatt erwähnte Reihenfolge
einzuhalten:

1) SWRST setzen
2) Alle USART-Register (incl. UCTL0) setzen, während SWRST = 1
3) USART-Module im MEx-Register enablen (URXEx / UTXEx)
4) SWRST zurücksetzen
5) optional: Interrupts in IEx freigeben (URXIEx / UTXIEx)

Stimmt die Reihenfolge nicht, verhält sich die USART nicht so, wie sie
soll (selbst alles schon erlebt - gibt ne lustige Fehlersuche).

Außerdem: Wenn du LPM4 setzt, wird die CPU und der MCLK abgeschalten,
d.h. das Hauptprogramm BLEIBT STEHEN und du kommst nie in deine
while(1)-Schleife rein. Lass den _BIS..-Befehl mal weg und setze nur
das GIE-Bit (müsste mit _EINT(); funktionieren).

Grüße, Mario

von thomas.o (Gast)


Lesenswert?

hallo!

hast du dir schon mal die C-Demos von TI angesehen?
da findest du ein programm, welches ein empfangenes Zeichen
zurücksendet! Probier das mal aus. Ist aber für einen MSP430F449
geschrieben. Eventuell musst du ein bisschen ändern. Da der 449 und der
von dir verwendete 437 ein gemeinsames Datenblatt haben, glaube ich ohne
nachzusehen, dass es auch so funktionieren wird.

hier mal der code:
1
//******************************************************************************
2
//  MSP-FET430P440 Demo - USART0, 2400 UART Ultra-low Pwr Echo ISR,
3
32kHz ACLK
4
//
5
//  Description: Echo a received character, RX ISR used. In the
6
Mainloop UART0
7
//  is made ready to receive one character with interrupt active. The
8
Mainloop
9
//  waits in LPM3. The UART0 ISR forces the Mainloop to exit LPM3
10
after
11
//  receiving one character which echo's back the received character.
12
//  Baud rate divider with 32768Hz XTAL @2400 = 32768/2400 = ~13.65
13
(00Dh|6Bh)
14
//  ACLK = LFXT1 = 32768Hz, MCLK = SMCLK = default DCO = 32 x ACLK =
15
1048576Hz
16
//  //* An external watch crystal between XIN & XOUT is required for
17
ACLK *//  
18
//
19
//                MSP430F449
20
//             -----------------
21
//         /|\|              XIN|-
22
//          | |                 | 32kHz
23
//          --|RST          XOUT|-
24
//            |                 |
25
//            |             P2.4|----------->
26
//            |                 | 2400 - 8N1
27
//            |             P2.5|<-----------
28
//
29
//
30
//  M. Buccini
31
//  Texas Instruments Inc.
32
//  Feb 2005
33
//  Built with IAR Embedded Workbench Version: 3.21A
34
//*****************************************************************************
35
#include <msp430x44x.h>
36
37
void main(void)
38
{
39
  WDTCTL = WDTPW + WDTHOLD;                 // Stop WDT
40
  FLL_CTL0 |= XCAP18PF;                     // Configure load caps
41
  P2SEL |= 0x30;                            // P2.4,5 = USART0 TXD/RXD
42
  ME1 |= UTXE0 + URXE0;                     // Enable USART0 TXD/RXD
43
  UCTL0 |= CHAR;                            // 8-bit character
44
  UTCTL0 |= SSEL0;                          // UCLK = ACLK
45
  UBR00 = 0x0D;                             // 32k/2400 - 13.65
46
  UBR10 = 0x00;
47
  UMCTL0 = 0x6B;                            // Modulation
48
  UCTL0 &= ~SWRST;                          // Initialize USART state
49
machine
50
  IE1 |= URXIE0;                            // Enable USART0 RX
51
interrupt
52
53
  // Mainloop
54
  for (;;)
55
  {
56
    _BIS_SR(LPM3_bits + GIE);               // Enter LPM3 w/interrupt
57
    while (!(IFG1 & UTXIFG0));              // USART0 TX buffer ready?
58
    TXBUF0 = RXBUF0;                        // RXBUF0 to TXBUF0
59
  }
60
}
61
62
// UART0 RX ISR will for exit from LPM3 in Mainloop
63
#pragma vector=UART0RX_VECTOR
64
__interrupt void usart0_rx (void)
65
{
66
  _BIC_SR_IRQ(LPM3_bits);                   // Clear LPM3 bits from
67
0(SR)
68
}

Hier ist es jetzt auf 2400 Bit/s eingestellt. Du solltest den Clock
dievider auf UBR00 = 0x03 setzen für 9600 Bit/s

mfg,
thomas

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.