EmbeddedRelated.com
Forums
The 2024 Embedded Online Conference

setting up uart communication for 9600 baud rate

Started by Blake May 30, 2003
Hello, I'm trying to set up uart communication for receiving NMEA 
messages from a GPS module.  However it seems like the interrupt is 
never being called.  Here's the code I have to set up the UART 
communication.


WDTCTL = WDTPW + WDTHOLD;             // turn watch dog timer off


  BCSCTL1 = 0x04;                       // ACLK = LFXT1 = LF XTAL 
(32.768 kHz)
                                        // This leaves XT2 on and 
                                        // able to be
                                        // used for MCLK
  do {
    IFG1 &= ~OFIFG;                     // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);         // Time for flag to set
  }
  while ((IFG1 & OFIFG) == OFIFG);      // OSCFault flag still set?

  BCSCTL2 |= SELM1 + SELS;              // MCLK = SMCLK = 7.3728 MHz


  UCTL1 = CHAR + PENA;                    // 8 bit data, odd parity 
                                          // enabled

//  UTCTL1 |= SSEL0 + SSEL1 + TXWAKE;             // UCLK = SMCLK
  UTCTL1 |= SSEL0 + SSEL1;             // UCLK = SMCLK
//  URCTL1 = URXEIE;

// 7.3728 MHz/9600 = 0768 = 0x0300

  UBR01  = 0xc0;
  UBR11  = 0x04;
  UMCTL1 = 0x00;                      // no modulation because it 
                                      // divides evenly.

  P3SEL |= 0x30;                      // P3.6,7 = USART0 TXD/RXD
  P3DIR |= 0x10;                      // P3.6 output direction
  P1DIR |= 0x10;    // direction out on P1.4 GPS enable
  P1OUT &= 0xEF;    //enable P1.4 OE low for the GPS

  ME2 |= UTXE1 + URXE1;               // Enable USART0 TXD/RXD
  IE2 |= URXIE1 + UTXIE1;             // Enable USART0 RX/TX interrupt

  

  _EINT();                              // Enable interrupts


Does this look like the correct way to set up the uart?

Thanks,
Blake


Beginning Microcontrollers with the MSP430

You're pretty close but some numbers are wrong. This code works for
the 
449, so you'll need to change the port pins to match whatever chip you
have.

/* Uart 1 */

   UCTL1 = CHAR|SWRST;                   // Set 8-bit character mode, leave 
in reset

   UTCTL1 = SSEL1;                       // UCLK = SMCLK

   UBR01 = 0x00;                         // 7.3728MHz 9600 baud - 768 or 0x0300
   UBR11 = 0x03;                         //
   UMCTL1 = 0x00;                        // no modulation

   ME2 |= (UTXE1 + URXE1);               // Enable USART1 TXD/RXD
   IE2 |= URXIE1;                        // Enable USART1 RX interrupt
   IE2 |= UTXIE1;                        // Enable USART1 TX interrupt
   URCTL1 |= URXEIE;                     // UART 1 Receive Control - Allow 
error characters to set interrupt

   P4SEL |= (SER_RX1_MASK|SER_TX1_MASK);   // P4.0,1 = USART1 TXD/RXD
   P4DIR |= (SER_TX1_MASK);                // P4.0 output direction

   UCTL1 &= ~SWRST;                        // Clear SWRST to enable uart

   _EINT();                              // Enable interrupts

Regards, Hugh

 >Hello, I'm trying to set up uart communication for receiving NMEA
messages from a GPS module.  However it seems like the interrupt is
never being called.  Here's the code I have to set up the UART
communication.


WDTCTL = WDTPW + WDTHOLD;             // turn watch dog timer off


   BCSCTL1 = 0x04;                       // ACLK = LFXT1 = LF XTAL
(32.768 kHz)
                                         // This leaves XT2 on and
                                         // able to be
                                         // used for MCLK
   do {
     IFG1 &= ~OFIFG;                     // Clear OSCFault flag
     for (i = 0xFF; i > 0; i--);         // Time for flag to set
   }
   while ((IFG1 & OFIFG) == OFIFG);      // OSCFault flag still set?

   BCSCTL2 |= SELM1 + SELS;              // MCLK = SMCLK = 7.3728 MHz


   UCTL1 = CHAR + PENA;                    // 8 bit data, odd parity
                                           // enabled

//  UTCTL1 |= SSEL0 + SSEL1 + TXWAKE;             // UCLK = SMCLK
   UTCTL1 |= SSEL0 + SSEL1;             // UCLK = SMCLK
//  URCTL1 = URXEIE;

// 7.3728 MHz/9600 = 0768 = 0x0300

   UBR01  = 0xc0;
   UBR11  = 0x04;
   UMCTL1 = 0x00;                      // no modulation because it
                                       // divides evenly.

   P3SEL |= 0x30;                      // P3.6,7 = USART0 TXD/RXD
   P3DIR |= 0x10;                      // P3.6 output direction
   P1DIR |= 0x10;    // direction out on P1.4 GPS enable
   P1OUT &= 0xEF;    //enable P1.4 OE low for the GPS

   ME2 |= UTXE1 + URXE1;               // Enable USART0 TXD/RXD
   IE2 |= URXIE1 + UTXIE1;             // Enable USART0 RX/TX interrupt



   _EINT();                              // Enable interrupts


Does this look like the correct way to set up the uart?

Thanks,
Blake


Hugh, thanks for your help, but I still seem to be having some 
problems.  Does there seem to be anything wrong with the code below?  
Using the MSP430F149.

int gps_config(void)
{
  unsigned int i;

  WDTCTL = WDTPW + WDTHOLD;  // turn watch dog timer off


  BCSCTL1 = 0x04;  // ACLK = LFXT1 = LF XTAL (32.768 kHz)
                   // This leaves XT2 on and able to be
                   // used for MCLK
  do {
    IFG1 &= ~OFIFG;  // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);  // Time for flag to set
  }
  while ((IFG1 & OFIFG) == OFIFG);  // OSCFault flag still set?

  // UCTL1 = CHAR + PENA;  // 8 bit data, odd parity enabled
  UCTL1 = (CHAR + PENA) + SWRST;  // 8 bit data, odd parity enabled
  //UTCTL1 |= SSEL0 + SSEL1 + TXWAKE;
  UTCTL1 = SSEL1;  // UCLK = SMCLK
  //URCTL1 = URXEIE;

  UBR01 = 0x00;  // 7.3728MHz 9600 baud - 768 or 0x0300
  UBR11 = 0x03;  //
  UMCTL1 = 0x00;  // no modulation because it divides evenly.

  ME2 |= UTXE1 + URXE1;  // Enable USART1 TXD/RXD
  IE2 |= URXIE1 + UTXIE1;  // Enable USART1 RX/TX interrupt
  URCTL1 |= URXEIE;  // UART 1 Receive Control - Allow error 
characters to set interrupt

  P3SEL |= 0xc0;  // P3.6,7 = USART1 TXD/RXD
  P3DIR |= 0x40;  // P3.6 output direction
  
  P4DIR |= 0x20;  //P4.5 GPS enable output direction
  P4OUT &= 0xDF;  //p4.5 GPS enable low
  
  UCTL1 &= ~SWRST;  // Clear SWRST to enable uart

  _EINT();  // Enable interrupts
  
  P2DIR |= 0x80;  //turn on yellow LED light, for testing purposes
  P2OUT &= 0x7F;
  
  //send messages configuring the GPS
  xmit_buffer(&PortConfigString, PortConfigStringLength);
  for(i = 0; i<1000; i++){} //pause to give it time to process
  xmit_buffer(&NMEAConfigString, NMEAConfigStringLength);
  
  //loop to wait for interrupt
  dollarflag = 0;
  while(dollarflag != 1){     
  }
  
  P4DIR |= 0x80;  //turn on red LED light, for testing purposes
  P4OUT &= 0x7F;
  
  return 1;
}

--- In msp430@msp4..., Hugh Molesworth <nzbackpackers@y...> 
wrote:
> You're pretty close but some numbers are wrong. This code works for 
the 
> 449, so you'll need to change the port pins
to match whatever chip 
you have.
> 
> /* Uart 1 */
> 
>    UCTL1 = CHAR|SWRST;                   // Set 8-bit character 
mode, leave 
> in reset
> 
>    UTCTL1 = SSEL1;                       // UCLK = SMCLK
> 
>    UBR01 = 0x00;                         // 7.3728MHz 9600 baud - 
768 or 0x0300
>    UBR11 = 0x03;                         //
>    UMCTL1 = 0x00;                        // no modulation
> 
>    ME2 |= (UTXE1 + URXE1);               // Enable USART1 TXD/RXD
>    IE2 |= URXIE1;                        // Enable USART1 RX 
interrupt
>    IE2 |= UTXIE1;                        // Enable
USART1 TX 
interrupt
>    URCTL1 |= URXEIE;                     // UART 1
Receive Control -
 Allow 
> error characters to set interrupt
> 
>    P4SEL |= (SER_RX1_MASK|SER_TX1_MASK);   // P4.0,1 = USART1 
TXD/RXD
>    P4DIR |= (SER_TX1_MASK);                // P4.0
output direction
> 
>    UCTL1 &= ~SWRST;                        // Clear SWRST to enable 
uart
> 
>    _EINT();                              // Enable interrupts
> 
> Regards, Hugh
> 
>  >Hello, I'm trying to set up uart communication for receiving NMEA
> messages from a GPS module.  However it seems like the interrupt is
> never being called.  Here's the code I have to set up the UART
> communication.
> 
> 
> WDTCTL = WDTPW + WDTHOLD;             // turn watch dog timer off
> 
> 
>    BCSCTL1 = 0x04;                       // ACLK = LFXT1 = LF XTAL
> (32.768 kHz)
>                                          // This leaves XT2 on and
>                                          // able to be
>                                          // used for MCLK
>    do {
>      IFG1 &= ~OFIFG;                     // Clear OSCFault flag
>      for (i = 0xFF; i > 0; i--);         // Time for flag to set
>    }
>    while ((IFG1 & OFIFG) == OFIFG);      // OSCFault flag still set?
> 
>    BCSCTL2 |= SELM1 + SELS;              // MCLK = SMCLK = 7.3728 
MHz
> 
> 
>    UCTL1 = CHAR + PENA;                    // 8 bit data, odd parity
>                                            // enabled
> 
> //  UTCTL1 |= SSEL0 + SSEL1 + TXWAKE;             // UCLK = SMCLK
>    UTCTL1 |= SSEL0 + SSEL1;             // UCLK = SMCLK
> //  URCTL1 = URXEIE;
> 
> // 7.3728 MHz/9600 = 0768 = 0x0300
> 
>    UBR01  = 0xc0;
>    UBR11  = 0x04;
>    UMCTL1 = 0x00;                      // no modulation because it
>                                        // divides evenly.
> 
>    P3SEL |= 0x30;                      // P3.6,7 = USART0 TXD/RXD
>    P3DIR |= 0x10;                      // P3.6 output direction
>    P1DIR |= 0x10;    // direction out on P1.4 GPS enable
>    P1OUT &= 0xEF;    //enable P1.4 OE low for the GPS
> 
>    ME2 |= UTXE1 + URXE1;               // Enable USART0 TXD/RXD
>    IE2 |= URXIE1 + UTXIE1;             // Enable USART0 RX/TX 
interrupt
> 
> 
> 
>    _EINT();                              // Enable interrupts
> 
> 
> Does this look like the correct way to set up the uart?
> 
> Thanks,
> Blake


Hi.

Doesn't look like you're setting up SMCLK. Here's some old
MSP430F149 code 
I wrote which works fine, maybe you can see from this what the difference 
is. I'm just about to leave for the airport so I hope that helps.

Regards, Hugh

void Start_Osc(void)
{
/*
  * DCO is CR typically ?
  *
  * LFXT1CLK is typically 32.768kHz watch crystal used for low power.
  *
  * XT2CLK is typically 7.3728MHz crystal used for accurate high-speed comms.
  *
  * There are 3 system clock lines: ACLK, MCLK & SMCLK.
  *
  * Auxilliary clock ACLK is buffered LFXT1CLK divided by 1, 2, 4 or 8.
  * Typically 32.768kHz watch crystal.
  *
  * Master clock MCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1, 2, 4 or 8.
  *
  * Submain clock SMCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1, 2, 4 or 8.
  */

   WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
   IFG2 = 0; // Interrupt flag 2
   IFG1 = 0; // Interrupt flag 1

/*
  * Enable LFXT1CLK (typically 32.768kHz watch crystal used for low power)
  *
  * Enable XT2CLK (typically 7.3728MHz crystal used for accurate high-speed 
comms)
  *
  */
    BCSCTL1 &= ~XT2OFF;        // Enable XT2 crystal oscillator
    BCSCTL1 &= ~XTS;           // Enable low-frequency XT1 crystal
oscillator
    do                          //wait in loop until crystal is stable
    {
      IFG1 &= ~OFIFG;
    } while (OFIFG&IFG1);
    Delay1();
    IFG1 &= ~OFIFG;             // Reset osc. fault flag again

/*
  * DCO is CR typically ? let's go max speed
  *
  */
   DCOCTL |= DCO0 | DCO1 | DCO2;         // Max speed for DCO!

/* Auxilliary clock ACLK is buffered LFXT1CLK divided by 1, 2, 4 or 8. */
    BCSCTL1 &= ~(DIVA0|DIVA1);     // Set DCO clock ACLK is buffered 
LFXT1CLK divided by 1

/* Master clock MCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1, 2, 4 or 8. */
    BCSCTL2 &= ~(DIVM1|DIVM0);   /* Set Master clock MCLK to XT2CLK div 1 */
    BCSCTL2 &= ~(SELM0);   /* Set Master clock MCLK to XT2CLK div 1 */
    BCSCTL2 |= (SELM1);    /* Set Master clock MCLK to XT2CLK div 1 */
                                   //Then set MCLK same as LFXT1CLK
                                   //and SMCLK = XT2CLK/2
//   BCSCTL2 = DIVS0+SELS+SELM0+SELM1;


/* Submain clock SMCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1, 2, 4 or 
8. */
    BCSCTL2 &= ~(DIVS1|DIVS0);     /* Set Submain clock SMCLK divider to 
div 1 */
    BCSCTL2 |= (SELS);             /* Set Submain clock SMCLK to XT2CLK */
}

 >Hugh, thanks for your help, but I still seem to be having some
problems. Does there seem to be anything wrong with the code below?
Using the MSP430F149.

int gps_config(void)
{
unsigned int i;

WDTCTL = WDTPW + WDTHOLD; // turn watch dog timer off


BCSCTL1 = 0x04; // ACLK = LFXT1 = LF XTAL (32.768 kHz)
// This leaves XT2 on and able to be
// used for MCLK
do {
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG) == OFIFG); // OSCFault flag still set?

// UCTL1 = CHAR + PENA; // 8 bit data, odd parity enabled
UCTL1 = (CHAR + PENA) + SWRST; // 8 bit data, odd parity enabled
//UTCTL1 |= SSEL0 + SSEL1 + TXWAKE;
UTCTL1 = SSEL1; // UCLK = SMCLK
//URCTL1 = URXEIE;

UBR01 = 0x00; // 7.3728MHz 9600 baud - 768 or 0x0300
UBR11 = 0x03; //
UMCTL1 = 0x00; // no modulation because it divides evenly.

ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
IE2 |= URXIE1 + UTXIE1; // Enable USART1 RX/TX interrupt
URCTL1 |= URXEIE; // UART 1 Receive Control - Allow error
characters to set interrupt

P3SEL |= 0xc0; // P3.6,7 = USART1 TXD/RXD
P3DIR |= 0x40; // P3.6 output direction

P4DIR |= 0x20; //P4.5 GPS enable output direction
P4OUT &= 0xDF; //p4.5 GPS enable low

UCTL1 &= ~SWRST; // Clear SWRST to enable uart

_EINT(); // Enable interrupts

P2DIR |= 0x80; //turn on yellow LED light, for testing purposes
P2OUT &= 0x7F;

//send messages configuring the GPS
xmit_buffer(&PortConfigString, PortConfigStringLength);
for(i = 0; i<1000; i++){} //pause to give it time to process
xmit_buffer(&NMEAConfigString, NMEAConfigStringLength);

//loop to wait for interrupt
dollarflag = 0;
while(dollarflag != 1){
}

P4DIR |= 0x80; //turn on red LED light, for testing purposes
P4OUT &= 0x7F;

return 1;
}



Okay, I still can't seem to get it working.  I tried to implement 
some of your code, and here is what I have come up with.  Is there 
something else I need to be doing to set up SMCLK?  Thanks so much 
for all your help.  I really appreciate it!
Blake

int gps_config(void)
{
  unsigned int i;

  WDTCTL = WDTPW + WDTHOLD;  // turn watch dog timer off
  IFG2 = 0; // Interrupt flag 2
  IFG1 = 0; // Interrupt flag 1

  BCSCTL1 = 0x04;  // ACLK = LFXT1 = LF XTAL (32.768 kHz)
                   // This leaves XT2 on and able to be
                   // used for MCLK
                   
  /* do I need any of this stuff?
  BCSCTL1 &= ~XT2OFF; // Enable XT2 crystal oscillator
  BCSCTL1 &= ~XTS; // Enable low-frequency XT1 crystal oscillator

  BCSCTL2 &= ~(DIVM1|DIVM0); //Set Master clock MCLK to XT2CLK div 1
  BCSCTL2 &= ~(SELM0); //Set Master clock MCLK to XT2CLK div 1
  BCSCTL2 |= (SELM1); //Set Master clock MCLK to XT2CLK div 1
  */
  
  /* is this correct? */
  BCSCTL2 &= ~(DIVS1|DIVS0); /* Set Submain clock SMCLK divider to 
div 1 */
  BCSCTL2 |= (SELS); /* Set Submain clock SMCLK to XT2CLK */
  
  do {
    IFG1 &= ~OFIFG;  // Clear OSCFault flag
    for (i = 0xFF; i > 0; i--);  // Time for flag to set
  }
  while ((IFG1 & OFIFG) == OFIFG);  // OSCFault flag still set?

  // UCTL1 = CHAR + PENA;  // 8 bit data, odd parity enabled
  UCTL1 = (CHAR + PENA) + SWRST;  // 8 bit data, odd parity enabled
  //UTCTL1 |= SSEL0 + SSEL1 + TXWAKE;
  UTCTL1 = SSEL1;  // UCLK = SMCLK
  //URCTL1 = URXEIE;

  UBR01 = 0x00;  // 7.3728MHz 9600 baud - 768 or 0x0300
  UBR11 = 0x03;  //
  UMCTL1 = 0x00;  // no modulation because it divides evenly.

  ME2 |= UTXE1 + URXE1;  // Enable USART1 TXD/RXD
  IE2 |= URXIE1 + UTXIE1;  // Enable USART1 RX/TX interrupt
  URCTL1 |= URXEIE;  // UART 1 Receive Control - Allow error 
characters to set interrupt

  P3SEL |= 0xc0;  // P3.6,7 = USART1 TXD/RXD
  P3DIR |= 0x40;  // P3.6 output direction
  
  P4DIR |= 0x20;  //P4.5 GPS enable output direction
  P4OUT &= 0xDF;  //p4.5 GPS enable low
  
  UCTL1 &= ~SWRST;  // Clear SWRST to enable uart

  _EINT();  // Enable interrupts
  
  P2DIR |= 0x80;  //turn on yellow LED light, for testing purposes
  P2OUT &= 0x7F;
  
  //send messages configured the GPS
  xmit_buffer(&PortConfigString, PortConfigStringLength);
  for(i = 0; i<1000; i++){}
  xmit_buffer(&NMEAConfigString, NMEAConfigStringLength);
  
  //loop to wait for interrupt
  dollarflag = 0;
  while(dollarflag != 1){     
  }
  
  P4DIR |= 0x80;  //turn on red LED light, for testing purposes
  P4OUT &= 0x7F;
  
  return 1;
}

--- In msp430@msp4..., Hugh Molesworth <nzbackpackers@y...> 
wrote:
> Hi.
> 
> Doesn't look like you're setting up SMCLK. Here's some old 
MSP430F149 code 
> I wrote which works fine, maybe you can see from
this what the 
difference 
> is. I'm just about to leave for the airport
so I hope that helps.
> 
> Regards, Hugh
> 
> void Start_Osc(void)
> {
> /*
>   * DCO is CR typically ?
>   *
>   * LFXT1CLK is typically 32.768kHz watch crystal used for low 
power.
>   *
>   * XT2CLK is typically 7.3728MHz crystal used for accurate high-
speed comms.
>   *
>   * There are 3 system clock lines: ACLK, MCLK & SMCLK.
>   *
>   * Auxilliary clock ACLK is buffered LFXT1CLK divided by 1, 2, 4 
or 8.
>   * Typically 32.768kHz watch crystal.
>   *
>   * Master clock MCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1, 
2, 4 or 8.
>   *
>   * Submain clock SMCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1, 
2, 4 or 8.
>   */
> 
>    WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
>    IFG2 = 0; // Interrupt flag 2
>    IFG1 = 0; // Interrupt flag 1
> 
> /*
>   * Enable LFXT1CLK (typically 32.768kHz watch crystal used for low 
power)
>   *
>   * Enable XT2CLK (typically 7.3728MHz crystal used for accurate 
high-speed 
> comms)
>   *
>   */
>     BCSCTL1 &= ~XT2OFF;        // Enable XT2 crystal oscillator
>     BCSCTL1 &= ~XTS;           // Enable low-frequency XT1 crystal 
oscillator
>     do                          //wait in loop
until crystal is 
stable
>     {
>       IFG1 &= ~OFIFG;
>     } while (OFIFG&IFG1);
>     Delay1();
>     IFG1 &= ~OFIFG;             // Reset osc. fault flag again
> 
> /*
>   * DCO is CR typically ? let's go max speed
>   *
>   */
>    DCOCTL |= DCO0 | DCO1 | DCO2;         // Max speed for DCO!
> 
> /* Auxilliary clock ACLK is buffered LFXT1CLK divided by 1, 2, 4 or 
8. */
>     BCSCTL1 &= ~(DIVA0|DIVA1);     // Set DCO
clock ACLK is 
buffered 
> LFXT1CLK divided by 1
> 
> /* Master clock MCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1, 2, 
4 or 8. */
>     BCSCTL2 &= ~(DIVM1|DIVM0);   /* Set Master
clock MCLK to XT2CLK 
div 1 */
>     BCSCTL2 &= ~(SELM0);   /* Set Master clock
MCLK to XT2CLK div 1 
*/
>     BCSCTL2 |= (SELM1);    /* Set Master clock
MCLK to XT2CLK div 1 
*/
>                                    //Then set MCLK
same as LFXT1CLK
>                                    //and SMCLK = XT2CLK/2
> //   BCSCTL2 = DIVS0+SELS+SELM0+SELM1;
> 
> 
> /* Submain clock SMCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1, 
2, 4 or 
> 8. */
>     BCSCTL2 &= ~(DIVS1|DIVS0);     /* Set Submain clock SMCLK 
divider to 
> div 1 */
>     BCSCTL2 |= (SELS);             /* Set Submain clock SMCLK to 
XT2CLK */
> }
> 
>  >Hugh, thanks for your help, but I still seem to be having some
> problems. Does there seem to be anything wrong with the code below?
> Using the MSP430F149.
> 
> int gps_config(void)
> {
> unsigned int i;
> 
> WDTCTL = WDTPW + WDTHOLD; // turn watch dog timer off
> 
> 
> BCSCTL1 = 0x04; // ACLK = LFXT1 = LF XTAL (32.768 kHz)
> // This leaves XT2 on and able to be
> // used for MCLK
> do {
> IFG1 &= ~OFIFG; // Clear OSCFault flag
> for (i = 0xFF; i > 0; i--); // Time for flag to set
> }
> while ((IFG1 & OFIFG) == OFIFG); // OSCFault flag still set?
> 
> // UCTL1 = CHAR + PENA; // 8 bit data, odd parity enabled
> UCTL1 = (CHAR + PENA) + SWRST; // 8 bit data, odd parity enabled
> //UTCTL1 |= SSEL0 + SSEL1 + TXWAKE;
> UTCTL1 = SSEL1; // UCLK = SMCLK
> //URCTL1 = URXEIE;
> 
> UBR01 = 0x00; // 7.3728MHz 9600 baud - 768 or 0x0300
> UBR11 = 0x03; //
> UMCTL1 = 0x00; // no modulation because it divides evenly.
> 
> ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
> IE2 |= URXIE1 + UTXIE1; // Enable USART1 RX/TX interrupt
> URCTL1 |= URXEIE; // UART 1 Receive Control - Allow error
> characters to set interrupt
> 
> P3SEL |= 0xc0; // P3.6,7 = USART1 TXD/RXD
> P3DIR |= 0x40; // P3.6 output direction
> 
> P4DIR |= 0x20; //P4.5 GPS enable output direction
> P4OUT &= 0xDF; //p4.5 GPS enable low
> 
> UCTL1 &= ~SWRST; // Clear SWRST to enable uart
> 
> _EINT(); // Enable interrupts
> 
> P2DIR |= 0x80; //turn on yellow LED light, for testing purposes
> P2OUT &= 0x7F;
> 
> //send messages configuring the GPS
> xmit_buffer(&PortConfigString, PortConfigStringLength);
> for(i = 0; i<1000; i++){} //pause to give it time to process
> xmit_buffer(&NMEAConfigString, NMEAConfigStringLength);
> 
> //loop to wait for interrupt
> dollarflag = 0;
> while(dollarflag != 1){
> }
> 
> P4DIR |= 0x80; //turn on red LED light, for testing purposes
> P4OUT &= 0x7F;
> 
> return 1;
> }


You need these (which could be combined):

BCSCTL2 |= (SELM1); //Set Master clock MCLK to XT2CLK div 1 */
BCSCTL2 |= (SELS); /* Set Submain clock SMCLK to XT2CLK */

UTCTL1 = SSEL1; // UCLK = SMCLK

Most of the other stuff is already as you want it after a power-on reset.

I don't see anything obvious, maybe it's time to put a 'scope on
the rx pin 
at the MSP430 and also pulse a pin from within the rx interrupt. Just to be 
sure a valid signal is actually reaching the micro pin and that the 
interrupt really isn't being triggered. I'm assuming your transmit
routine 
is talking correctly to the GPS?

 >Okay, I still can't seem to get it working. I tried to implement
some of your code, and here is what I have come up with. Is there
something else I need to be doing to set up SMCLK? Thanks so much
for all your help. I really appreciate it!
Blake

int gps_config(void)
{
unsigned int i;

WDTCTL = WDTPW + WDTHOLD; // turn watch dog timer off
IFG2 = 0; // Interrupt flag 2
IFG1 = 0; // Interrupt flag 1

BCSCTL1 = 0x04; // ACLK = LFXT1 = LF XTAL (32.768 kHz)
// This leaves XT2 on and able to be
// used for MCLK

/* do I need any of this stuff?
BCSCTL1 &= ~XT2OFF; // Enable XT2 crystal oscillator
BCSCTL1 &= ~XTS; // Enable low-frequency XT1 crystal oscillator

BCSCTL2 &= ~(DIVM1|DIVM0); //Set Master clock MCLK to XT2CLK div 1
BCSCTL2 &= ~(SELM0); //Set Master clock MCLK to XT2CLK div 1
BCSCTL2 |= (SELM1); //Set Master clock MCLK to XT2CLK div 1
*/

/* is this correct? */
BCSCTL2 &= ~(DIVS1|DIVS0); /* Set Submain clock SMCLK divider to
div 1 */
BCSCTL2 |= (SELS); /* Set Submain clock SMCLK to XT2CLK */

do {
IFG1 &= ~OFIFG; // Clear OSCFault flag
for (i = 0xFF; i > 0; i--); // Time for flag to set
}
while ((IFG1 & OFIFG) == OFIFG); // OSCFault flag still set?

// UCTL1 = CHAR + PENA; // 8 bit data, odd parity enabled
UCTL1 = (CHAR + PENA) + SWRST; // 8 bit data, odd parity enabled
//UTCTL1 |= SSEL0 + SSEL1 + TXWAKE;
UTCTL1 = SSEL1; // UCLK = SMCLK
//URCTL1 = URXEIE;

UBR01 = 0x00; // 7.3728MHz 9600 baud - 768 or 0x0300
UBR11 = 0x03; //
UMCTL1 = 0x00; // no modulation because it divides evenly.

ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
IE2 |= URXIE1 + UTXIE1; // Enable USART1 RX/TX interrupt
URCTL1 |= URXEIE; // UART 1 Receive Control - Allow error
characters to set interrupt

P3SEL |= 0xc0; // P3.6,7 = USART1 TXD/RXD
P3DIR |= 0x40; // P3.6 output direction

P4DIR |= 0x20; //P4.5 GPS enable output direction
P4OUT &= 0xDF; //p4.5 GPS enable low

UCTL1 &= ~SWRST; // Clear SWRST to enable uart

_EINT(); // Enable interrupts

P2DIR |= 0x80; //turn on yellow LED light, for testing purposes
P2OUT &= 0x7F;

//send messages configured the GPS
xmit_buffer(&PortConfigString, PortConfigStringLength);
for(i = 0; i<1000; i++){}
xmit_buffer(&NMEAConfigString, NMEAConfigStringLength);

//loop to wait for interrupt
dollarflag = 0;
while(dollarflag != 1){
}

P4DIR |= 0x80; //turn on red LED light, for testing purposes
P4OUT &= 0x7F;

return 1;
}

--- In msp430@msp4..., Hugh Molesworth <nzbackpackers@y...>
wrote:
 > Hi.
 >
 > Doesn't look like you're setting up SMCLK. Here's some old
MSP430F149 code
 > I wrote which works fine, maybe you can see from this what the
difference
 > is. I'm just about to leave for the airport so I hope that helps.
 >
 > Regards, Hugh
 >
 > void Start_Osc(void)
 > {
 > /*
 > * DCO is CR typically ?
 > *
 > * LFXT1CLK is typically 32.768kHz watch crystal used for low
power.
 > *
 > * XT2CLK is typically 7.3728MHz crystal used for accurate high-
speed comms.
 > *
 > * There are 3 system clock lines: ACLK, MCLK & SMCLK.
 > *
 > * Auxilliary clock ACLK is buffered LFXT1CLK divided by 1, 2, 4
or 8.
 > * Typically 32.768kHz watch crystal.
 > *
 > * Master clock MCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1,
2, 4 or 8.
 > *
 > * Submain clock SMCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1,
2, 4 or 8.
 > */
 >
 > WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
 > IFG2 = 0; // Interrupt flag 2
 > IFG1 = 0; // Interrupt flag 1
 >
 > /*
 > * Enable LFXT1CLK (typically 32.768kHz watch crystal used for low
power)
 > *
 > * Enable XT2CLK (typically 7.3728MHz crystal used for accurate
high-speed
 > comms)
 > *
 > */
 > BCSCTL1 &= ~XT2OFF; // Enable XT2 crystal oscillator
 > BCSCTL1 &= ~XTS; // Enable low-frequency XT1 crystal
oscillator
 > do //wait in loop until crystal is
stable
 > {
 > IFG1 &= ~OFIFG;
 > } while (OFIFG&IFG1);
 > Delay1();
 > IFG1 &= ~OFIFG; // Reset osc. fault flag again
 >
 > /*
 > * DCO is CR typically ? let's go max speed
 > *
 > */
 > DCOCTL |= DCO0 | DCO1 | DCO2; // Max speed for DCO!
 >
 > /* Auxilliary clock ACLK is buffered LFXT1CLK divided by 1, 2, 4 or
8. */
 > BCSCTL1 &= ~(DIVA0|DIVA1); // Set DCO clock ACLK is
buffered
 > LFXT1CLK divided by 1
 >
 > /* Master clock MCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1, 2,
4 or 8. */
 > BCSCTL2 &= ~(DIVM1|DIVM0); /* Set Master clock MCLK to XT2CLK
div 1 */
 > BCSCTL2 &= ~(SELM0); /* Set Master clock MCLK to XT2CLK div 1
*/
 > BCSCTL2 |= (SELM1); /* Set Master clock MCLK to XT2CLK div 1
*/
 > //Then set MCLK same as LFXT1CLK
 > //and SMCLK = XT2CLK/2
 > // BCSCTL2 = DIVS0+SELS+SELM0+SELM1;
 >
 >
 > /* Submain clock SMCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1,
2, 4 or
 > 8. */
 > BCSCTL2 &= ~(DIVS1|DIVS0); /* Set Submain clock SMCLK
divider to
 > div 1 */
 > BCSCTL2 |= (SELS); /* Set Submain clock SMCLK to
XT2CLK */
 > }
 >
 > >Hugh, thanks for your help, but I still seem to be having some
 > problems. Does there seem to be anything wrong with the code below?
 > Using the MSP430F149.
 >
 > int gps_config(void)
 > {
 > unsigned int i;
 >
 > WDTCTL = WDTPW + WDTHOLD; // turn watch dog timer off
 >
 >
 > BCSCTL1 = 0x04; // ACLK = LFXT1 = LF XTAL (32.768 kHz)
 > // This leaves XT2 on and able to be
 > // used for MCLK
 > do {
 > IFG1 &= ~OFIFG; // Clear OSCFault flag
 > for (i = 0xFF; i > 0; i--); // Time for flag to set
 > }
 > while ((IFG1 & OFIFG) == OFIFG); // OSCFault flag still set?
 >
 > // UCTL1 = CHAR + PENA; // 8 bit data, odd parity enabled
 > UCTL1 = (CHAR + PENA) + SWRST; // 8 bit data, odd parity enabled
 > //UTCTL1 |= SSEL0 + SSEL1 + TXWAKE;
 > UTCTL1 = SSEL1; // UCLK = SMCLK
 > //URCTL1 = URXEIE;
 >
 > UBR01 = 0x00; // 7.3728MHz 9600 baud - 768 or 0x0300
 > UBR11 = 0x03; //
 > UMCTL1 = 0x00; // no modulation because it divides evenly.
 >
 > ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
 > IE2 |= URXIE1 + UTXIE1; // Enable USART1 RX/TX interrupt
 > URCTL1 |= URXEIE; // UART 1 Receive Control - Allow error
 > characters to set interrupt
 >
 > P3SEL |= 0xc0; // P3.6,7 = USART1 TXD/RXD
 > P3DIR |= 0x40; // P3.6 output direction
 >
 > P4DIR |= 0x20; //P4.5 GPS enable output direction
 > P4OUT &= 0xDF; //p4.5 GPS enable low
 >
 > UCTL1 &= ~SWRST; // Clear SWRST to enable uart
 >
 > _EINT(); // Enable interrupts
 >
 > P2DIR |= 0x80; //turn on yellow LED light, for testing purposes
 > P2OUT &= 0x7F;
 >
 > //send messages configuring the GPS
 > xmit_buffer(&PortConfigString, PortConfigStringLength);
 > for(i = 0; i<1000; i++){} //pause to give it time to process
 > xmit_buffer(&NMEAConfigString, NMEAConfigStringLength);
 >
 > //loop to wait for interrupt
 > dollarflag = 0;
 > while(dollarflag != 1){
 > }
 >
 > P4DIR |= 0x80; //turn on red LED light, for testing purposes
 > P4OUT &= 0x7F;
 >
 > return 1;
 > }



Thanks Hugh.  We'll try using the oscilloscope.  I think it is 
communicating correctly with the GPS, but truthfully I don't really 
know for sure.  I'll try working on it some more.  Thanks!

--- In msp430@msp4..., Hugh Molesworth <nzbackpackers@y...> 
wrote:
> You need these (which could be combined):
> 
> BCSCTL2 |= (SELM1); //Set Master clock MCLK to XT2CLK div 1 */
> BCSCTL2 |= (SELS); /* Set Submain clock SMCLK to XT2CLK */
> 
> UTCTL1 = SSEL1; // UCLK = SMCLK
> 
> Most of the other stuff is already as you want it after a power-on 
reset.
> 
> I don't see anything obvious, maybe it's time to put a
'scope on 
the rx pin 
> at the MSP430 and also pulse a pin from within the
rx interrupt. 
Just to be 
> sure a valid signal is actually reaching the micro
pin and that the 
> interrupt really isn't being triggered. I'm assuming your
transmit 
routine 
> is talking correctly to the GPS?
> 
>  >Okay, I still can't seem to get it working. I tried to implement
> some of your code, and here is what I have come up with. Is there
> something else I need to be doing to set up SMCLK? Thanks so much
> for all your help. I really appreciate it!
> Blake
> 
> int gps_config(void)
> {
> unsigned int i;
> 
> WDTCTL = WDTPW + WDTHOLD; // turn watch dog timer off
> IFG2 = 0; // Interrupt flag 2
> IFG1 = 0; // Interrupt flag 1
> 
> BCSCTL1 = 0x04; // ACLK = LFXT1 = LF XTAL (32.768 kHz)
> // This leaves XT2 on and able to be
> // used for MCLK
> 
> /* do I need any of this stuff?
> BCSCTL1 &= ~XT2OFF; // Enable XT2 crystal oscillator
> BCSCTL1 &= ~XTS; // Enable low-frequency XT1 crystal oscillator
> 
> BCSCTL2 &= ~(DIVM1|DIVM0); //Set Master clock MCLK to XT2CLK div 1
> BCSCTL2 &= ~(SELM0); //Set Master clock MCLK to XT2CLK div 1
> BCSCTL2 |= (SELM1); //Set Master clock MCLK to XT2CLK div 1
> */
> 
> /* is this correct? */
> BCSCTL2 &= ~(DIVS1|DIVS0); /* Set Submain clock SMCLK divider to
> div 1 */
> BCSCTL2 |= (SELS); /* Set Submain clock SMCLK to XT2CLK */
> 
> do {
> IFG1 &= ~OFIFG; // Clear OSCFault flag
> for (i = 0xFF; i > 0; i--); // Time for flag to set
> }
> while ((IFG1 & OFIFG) == OFIFG); // OSCFault flag still set?
> 
> // UCTL1 = CHAR + PENA; // 8 bit data, odd parity enabled
> UCTL1 = (CHAR + PENA) + SWRST; // 8 bit data, odd parity enabled
> //UTCTL1 |= SSEL0 + SSEL1 + TXWAKE;
> UTCTL1 = SSEL1; // UCLK = SMCLK
> //URCTL1 = URXEIE;
> 
> UBR01 = 0x00; // 7.3728MHz 9600 baud - 768 or 0x0300
> UBR11 = 0x03; //
> UMCTL1 = 0x00; // no modulation because it divides evenly.
> 
> ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
> IE2 |= URXIE1 + UTXIE1; // Enable USART1 RX/TX interrupt
> URCTL1 |= URXEIE; // UART 1 Receive Control - Allow error
> characters to set interrupt
> 
> P3SEL |= 0xc0; // P3.6,7 = USART1 TXD/RXD
> P3DIR |= 0x40; // P3.6 output direction
> 
> P4DIR |= 0x20; //P4.5 GPS enable output direction
> P4OUT &= 0xDF; //p4.5 GPS enable low
> 
> UCTL1 &= ~SWRST; // Clear SWRST to enable uart
> 
> _EINT(); // Enable interrupts
> 
> P2DIR |= 0x80; //turn on yellow LED light, for testing purposes
> P2OUT &= 0x7F;
> 
> //send messages configured the GPS
> xmit_buffer(&PortConfigString, PortConfigStringLength);
> for(i = 0; i<1000; i++){}
> xmit_buffer(&NMEAConfigString, NMEAConfigStringLength);
> 
> //loop to wait for interrupt
> dollarflag = 0;
> while(dollarflag != 1){
> }
> 
> P4DIR |= 0x80; //turn on red LED light, for testing purposes
> P4OUT &= 0x7F;
> 
> return 1;
> }
> 
> --- In msp430@msp4..., Hugh Molesworth <nzbackpackers@y...>
> wrote:
>  > Hi.
>  >
>  > Doesn't look like you're setting up SMCLK. Here's some
old
> MSP430F149 code
>  > I wrote which works fine, maybe you can see from this what the
> difference
>  > is. I'm just about to leave for the airport so I hope that
helps.
>  >
>  > Regards, Hugh
>  >
>  > void Start_Osc(void)
>  > {
>  > /*
>  > * DCO is CR typically ?
>  > *
>  > * LFXT1CLK is typically 32.768kHz watch crystal used for low
> power.
>  > *
>  > * XT2CLK is typically 7.3728MHz crystal used for accurate high-
> speed comms.
>  > *
>  > * There are 3 system clock lines: ACLK, MCLK & SMCLK.
>  > *
>  > * Auxilliary clock ACLK is buffered LFXT1CLK divided by 1, 2, 4
> or 8.
>  > * Typically 32.768kHz watch crystal.
>  > *
>  > * Master clock MCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1,
> 2, 4 or 8.
>  > *
>  > * Submain clock SMCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1,
> 2, 4 or 8.
>  > */
>  >
>  > WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
>  > IFG2 = 0; // Interrupt flag 2
>  > IFG1 = 0; // Interrupt flag 1
>  >
>  > /*
>  > * Enable LFXT1CLK (typically 32.768kHz watch crystal used for low
> power)
>  > *
>  > * Enable XT2CLK (typically 7.3728MHz crystal used for accurate
> high-speed
>  > comms)
>  > *
>  > */
>  > BCSCTL1 &= ~XT2OFF; // Enable XT2 crystal oscillator
>  > BCSCTL1 &= ~XTS; // Enable low-frequency XT1 crystal
> oscillator
>  > do //wait in loop until crystal is
> stable
>  > {
>  > IFG1 &= ~OFIFG;
>  > } while (OFIFG&IFG1);
>  > Delay1();
>  > IFG1 &= ~OFIFG; // Reset osc. fault flag again
>  >
>  > /*
>  > * DCO is CR typically ? let's go max speed
>  > *
>  > */
>  > DCOCTL |= DCO0 | DCO1 | DCO2; // Max speed for DCO!
>  >
>  > /* Auxilliary clock ACLK is buffered LFXT1CLK divided by 1, 2, 4 
or
> 8. */
>  > BCSCTL1 &= ~(DIVA0|DIVA1); // Set DCO clock ACLK is
> buffered
>  > LFXT1CLK divided by 1
>  >
>  > /* Master clock MCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1, 
2,
> 4 or 8. */
>  > BCSCTL2 &= ~(DIVM1|DIVM0); /* Set Master clock MCLK to XT2CLK
> div 1 */
>  > BCSCTL2 &= ~(SELM0); /* Set Master clock MCLK to XT2CLK div 1
> */
>  > BCSCTL2 |= (SELM1); /* Set Master clock MCLK to XT2CLK div 1
> */
>  > //Then set MCLK same as LFXT1CLK
>  > //and SMCLK = XT2CLK/2
>  > // BCSCTL2 = DIVS0+SELS+SELM0+SELM1;
>  >
>  >
>  > /* Submain clock SMCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 
1,
> 2, 4 or
>  > 8. */
>  > BCSCTL2 &= ~(DIVS1|DIVS0); /* Set Submain clock SMCLK
> divider to
>  > div 1 */
>  > BCSCTL2 |= (SELS); /* Set Submain clock SMCLK to
> XT2CLK */
>  > }
>  >
>  > >Hugh, thanks for your help, but I still seem to be having some
>  > problems. Does there seem to be anything wrong with the code 
below?
>  > Using the MSP430F149.
>  >
>  > int gps_config(void)
>  > {
>  > unsigned int i;
>  >
>  > WDTCTL = WDTPW + WDTHOLD; // turn watch dog timer off
>  >
>  >
>  > BCSCTL1 = 0x04; // ACLK = LFXT1 = LF XTAL (32.768 kHz)
>  > // This leaves XT2 on and able to be
>  > // used for MCLK
>  > do {
>  > IFG1 &= ~OFIFG; // Clear OSCFault flag
>  > for (i = 0xFF; i > 0; i--); // Time for flag to set
>  > }
>  > while ((IFG1 & OFIFG) == OFIFG); // OSCFault flag still set?
>  >
>  > // UCTL1 = CHAR + PENA; // 8 bit data, odd parity enabled
>  > UCTL1 = (CHAR + PENA) + SWRST; // 8 bit data, odd parity enabled
>  > //UTCTL1 |= SSEL0 + SSEL1 + TXWAKE;
>  > UTCTL1 = SSEL1; // UCLK = SMCLK
>  > //URCTL1 = URXEIE;
>  >
>  > UBR01 = 0x00; // 7.3728MHz 9600 baud - 768 or 0x0300
>  > UBR11 = 0x03; //
>  > UMCTL1 = 0x00; // no modulation because it divides evenly.
>  >
>  > ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
>  > IE2 |= URXIE1 + UTXIE1; // Enable USART1 RX/TX interrupt
>  > URCTL1 |= URXEIE; // UART 1 Receive Control - Allow error
>  > characters to set interrupt
>  >
>  > P3SEL |= 0xc0; // P3.6,7 = USART1 TXD/RXD
>  > P3DIR |= 0x40; // P3.6 output direction
>  >
>  > P4DIR |= 0x20; //P4.5 GPS enable output direction
>  > P4OUT &= 0xDF; //p4.5 GPS enable low
>  >
>  > UCTL1 &= ~SWRST; // Clear SWRST to enable uart
>  >
>  > _EINT(); // Enable interrupts
>  >
>  > P2DIR |= 0x80; //turn on yellow LED light, for testing purposes
>  > P2OUT &= 0x7F;
>  >
>  > //send messages configuring the GPS
>  > xmit_buffer(&PortConfigString, PortConfigStringLength);
>  > for(i = 0; i<1000; i++){} //pause to give it time to process
>  > xmit_buffer(&NMEAConfigString, NMEAConfigStringLength);
>  >
>  > //loop to wait for interrupt
>  > dollarflag = 0;
>  > while(dollarflag != 1){
>  > }
>  >
>  > P4DIR |= 0x80; //turn on red LED light, for testing purposes
>  > P4OUT &= 0x7F;
>  >
>  > return 1;
>  > }


I don't have the documentation with me now but I'm quite sure
oscilator
checking doesn't work with LF crystals. (You anre going to wait forever for
OFIFG).
Besides, take into account that the manual says that if you use such a
crystal for MCLK you are going to have "increased current
consumption".

One more: I tried to use a 32K Xtal for 9600 baud and the result were not
good. The MSP could transmit OK but once in a while it received a corrupted
byte.

Regards,

			Claudio


> -----Original Message-----
> From:	Blake [SMTP:blake@blak...]
> Sent:	Monday, June 02, 2003 6:16 PM
> To:	msp430@msp4...
> Subject:	[msp430] Re: setting up uart communication for 9600 baud
> rate
> 
> Thanks Hugh.  We'll try using the oscilloscope.  I think it is 
> communicating correctly with the GPS, but truthfully I don't really 
> know for sure.  I'll try working on it some more.  Thanks!
> 
> --- In msp430@msp4..., Hugh Molesworth <nzbackpackers@y...> 
> wrote:
> > You need these (which could be combined):
> > 
> > BCSCTL2 |= (SELM1); //Set Master clock MCLK to XT2CLK div 1 */
> > BCSCTL2 |= (SELS); /* Set Submain clock SMCLK to XT2CLK */
> > 
> > UTCTL1 = SSEL1; // UCLK = SMCLK
> > 
> > Most of the other stuff is already as you want it after a power-on 
> reset.
> > 
> > I don't see anything obvious, maybe it's time to put a
'scope on 
> the rx pin 
> > at the MSP430 and also pulse a pin from within the rx interrupt. 
> Just to be 
> > sure a valid signal is actually reaching the micro pin and that the 
> > interrupt really isn't being triggered. I'm assuming your
transmit 
> routine 
> > is talking correctly to the GPS?
> > 
> >  >Okay, I still can't seem to get it working. I tried to
implement
> > some of your code, and here is what I have come up with. Is there
> > something else I need to be doing to set up SMCLK? Thanks so much
> > for all your help. I really appreciate it!
> > Blake
> > 
> > int gps_config(void)
> > {
> > unsigned int i;
> > 
> > WDTCTL = WDTPW + WDTHOLD; // turn watch dog timer off
> > IFG2 = 0; // Interrupt flag 2
> > IFG1 = 0; // Interrupt flag 1
> > 
> > BCSCTL1 = 0x04; // ACLK = LFXT1 = LF XTAL (32.768 kHz)
> > // This leaves XT2 on and able to be
> > // used for MCLK
> > 
> > /* do I need any of this stuff?
> > BCSCTL1 &= ~XT2OFF; // Enable XT2 crystal oscillator
> > BCSCTL1 &= ~XTS; // Enable low-frequency XT1 crystal oscillator
> > 
> > BCSCTL2 &= ~(DIVM1|DIVM0); //Set Master clock MCLK to XT2CLK div 1
> > BCSCTL2 &= ~(SELM0); //Set Master clock MCLK to XT2CLK div 1
> > BCSCTL2 |= (SELM1); //Set Master clock MCLK to XT2CLK div 1
> > */
> > 
> > /* is this correct? */
> > BCSCTL2 &= ~(DIVS1|DIVS0); /* Set Submain clock SMCLK divider to
> > div 1 */
> > BCSCTL2 |= (SELS); /* Set Submain clock SMCLK to XT2CLK */
> > 
> > do {
> > IFG1 &= ~OFIFG; // Clear OSCFault flag
> > for (i = 0xFF; i > 0; i--); // Time for flag to set
> > }
> > while ((IFG1 & OFIFG) == OFIFG); // OSCFault flag still set?
> > 
> > // UCTL1 = CHAR + PENA; // 8 bit data, odd parity enabled
> > UCTL1 = (CHAR + PENA) + SWRST; // 8 bit data, odd parity enabled
> > //UTCTL1 |= SSEL0 + SSEL1 + TXWAKE;
> > UTCTL1 = SSEL1; // UCLK = SMCLK
> > //URCTL1 = URXEIE;
> > 
> > UBR01 = 0x00; // 7.3728MHz 9600 baud - 768 or 0x0300
> > UBR11 = 0x03; //
> > UMCTL1 = 0x00; // no modulation because it divides evenly.
> > 
> > ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
> > IE2 |= URXIE1 + UTXIE1; // Enable USART1 RX/TX interrupt
> > URCTL1 |= URXEIE; // UART 1 Receive Control - Allow error
> > characters to set interrupt
> > 
> > P3SEL |= 0xc0; // P3.6,7 = USART1 TXD/RXD
> > P3DIR |= 0x40; // P3.6 output direction
> > 
> > P4DIR |= 0x20; //P4.5 GPS enable output direction
> > P4OUT &= 0xDF; //p4.5 GPS enable low
> > 
> > UCTL1 &= ~SWRST; // Clear SWRST to enable uart
> > 
> > _EINT(); // Enable interrupts
> > 
> > P2DIR |= 0x80; //turn on yellow LED light, for testing purposes
> > P2OUT &= 0x7F;
> > 
> > //send messages configured the GPS
> > xmit_buffer(&PortConfigString, PortConfigStringLength);
> > for(i = 0; i<1000; i++){}
> > xmit_buffer(&NMEAConfigString, NMEAConfigStringLength);
> > 
> > //loop to wait for interrupt
> > dollarflag = 0;
> > while(dollarflag != 1){
> > }
> > 
> > P4DIR |= 0x80; //turn on red LED light, for testing purposes
> > P4OUT &= 0x7F;
> > 
> > return 1;
> > }
> > 
> > --- In msp430@msp4..., Hugh Molesworth <nzbackpackers@y...>
> > wrote:
> >  > Hi.
> >  >
> >  > Doesn't look like you're setting up SMCLK. Here's
some old
> > MSP430F149 code
> >  > I wrote which works fine, maybe you can see from this what the
> > difference
> >  > is. I'm just about to leave for the airport so I hope that
helps.
> >  >
> >  > Regards, Hugh
> >  >
> >  > void Start_Osc(void)
> >  > {
> >  > /*
> >  > * DCO is CR typically ?
> >  > *
> >  > * LFXT1CLK is typically 32.768kHz watch crystal used for low
> > power.
> >  > *
> >  > * XT2CLK is typically 7.3728MHz crystal used for accurate high-
> > speed comms.
> >  > *
> >  > * There are 3 system clock lines: ACLK, MCLK & SMCLK.
> >  > *
> >  > * Auxilliary clock ACLK is buffered LFXT1CLK divided by 1, 2, 4
> > or 8.
> >  > * Typically 32.768kHz watch crystal.
> >  > *
> >  > * Master clock MCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1,
> > 2, 4 or 8.
> >  > *
> >  > * Submain clock SMCLK is LFXT1CLK, XT2CLK or DCOCLK divided by
1,
> > 2, 4 or 8.
> >  > */
> >  >
> >  > WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
> >  > IFG2 = 0; // Interrupt flag 2
> >  > IFG1 = 0; // Interrupt flag 1
> >  >
> >  > /*
> >  > * Enable LFXT1CLK (typically 32.768kHz watch crystal used for
low
> > power)
> >  > *
> >  > * Enable XT2CLK (typically 7.3728MHz crystal used for accurate
> > high-speed
> >  > comms)
> >  > *
> >  > */
> >  > BCSCTL1 &= ~XT2OFF; // Enable XT2 crystal oscillator
> >  > BCSCTL1 &= ~XTS; // Enable low-frequency XT1 crystal
> > oscillator
> >  > do //wait in loop until crystal is
> > stable
> >  > {
> >  > IFG1 &= ~OFIFG;
> >  > } while (OFIFG&IFG1);
> >  > Delay1();
> >  > IFG1 &= ~OFIFG; // Reset osc. fault flag again
> >  >
> >  > /*
> >  > * DCO is CR typically ? let's go max speed
> >  > *
> >  > */
> >  > DCOCTL |= DCO0 | DCO1 | DCO2; // Max speed for DCO!
> >  >
> >  > /* Auxilliary clock ACLK is buffered LFXT1CLK divided by 1, 2, 4

> or
> > 8. */
> >  > BCSCTL1 &= ~(DIVA0|DIVA1); // Set DCO clock ACLK is
> > buffered
> >  > LFXT1CLK divided by 1
> >  >
> >  > /* Master clock MCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1,

> 2,
> > 4 or 8. */
> >  > BCSCTL2 &= ~(DIVM1|DIVM0); /* Set Master clock MCLK to
XT2CLK
> > div 1 */
> >  > BCSCTL2 &= ~(SELM0); /* Set Master clock MCLK to XT2CLK div
1
> > */
> >  > BCSCTL2 |= (SELM1); /* Set Master clock MCLK to XT2CLK div 1
> > */
> >  > //Then set MCLK same as LFXT1CLK
> >  > //and SMCLK = XT2CLK/2
> >  > // BCSCTL2 = DIVS0+SELS+SELM0+SELM1;
> >  >
> >  >
> >  > /* Submain clock SMCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 
> 1,
> > 2, 4 or
> >  > 8. */
> >  > BCSCTL2 &= ~(DIVS1|DIVS0); /* Set Submain clock SMCLK
> > divider to
> >  > div 1 */
> >  > BCSCTL2 |= (SELS); /* Set Submain clock SMCLK to
> > XT2CLK */
> >  > }
> >  >
> >  > >Hugh, thanks for your help, but I still seem to be having
some
> >  > problems. Does there seem to be anything wrong with the code 
> below?
> >  > Using the MSP430F149.
> >  >
> >  > int gps_config(void)
> >  > {
> >  > unsigned int i;
> >  >
> >  > WDTCTL = WDTPW + WDTHOLD; // turn watch dog timer off
> >  >
> >  >
> >  > BCSCTL1 = 0x04; // ACLK = LFXT1 = LF XTAL (32.768 kHz)
> >  > // This leaves XT2 on and able to be
> >  > // used for MCLK
> >  > do {
> >  > IFG1 &= ~OFIFG; // Clear OSCFault flag
> >  > for (i = 0xFF; i > 0; i--); // Time for flag to set
> >  > }
> >  > while ((IFG1 & OFIFG) == OFIFG); // OSCFault flag still set?
> >  >
> >  > // UCTL1 = CHAR + PENA; // 8 bit data, odd parity enabled
> >  > UCTL1 = (CHAR + PENA) + SWRST; // 8 bit data, odd parity enabled
> >  > //UTCTL1 |= SSEL0 + SSEL1 + TXWAKE;
> >  > UTCTL1 = SSEL1; // UCLK = SMCLK
> >  > //URCTL1 = URXEIE;
> >  >
> >  > UBR01 = 0x00; // 7.3728MHz 9600 baud - 768 or 0x0300
> >  > UBR11 = 0x03; //
> >  > UMCTL1 = 0x00; // no modulation because it divides evenly.
> >  >
> >  > ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
> >  > IE2 |= URXIE1 + UTXIE1; // Enable USART1 RX/TX interrupt
> >  > URCTL1 |= URXEIE; // UART 1 Receive Control - Allow error
> >  > characters to set interrupt
> >  >
> >  > P3SEL |= 0xc0; // P3.6,7 = USART1 TXD/RXD
> >  > P3DIR |= 0x40; // P3.6 output direction
> >  >
> >  > P4DIR |= 0x20; //P4.5 GPS enable output direction
> >  > P4OUT &= 0xDF; //p4.5 GPS enable low
> >  >
> >  > UCTL1 &= ~SWRST; // Clear SWRST to enable uart
> >  >
> >  > _EINT(); // Enable interrupts
> >  >
> >  > P2DIR |= 0x80; //turn on yellow LED light, for testing purposes
> >  > P2OUT &= 0x7F;
> >  >
> >  > //send messages configuring the GPS
> >  > xmit_buffer(&PortConfigString, PortConfigStringLength);
> >  > for(i = 0; i<1000; i++){} //pause to give it time to
process
> >  > xmit_buffer(&NMEAConfigString, NMEAConfigStringLength);
> >  >
> >  > //loop to wait for interrupt
> >  > dollarflag = 0;
> >  > while(dollarflag != 1){
> >  > }
> >  >
> >  > P4DIR |= 0x80; //turn on red LED light, for testing purposes
> >  > P4OUT &= 0x7F;
> >  >
> >  > return 1;
> >  > }
> 
> 
> 
> .
> 
>  
> 
> ">http://docs.yahoo.com/info/terms/ 
> 





We finally got it to work.  The problem was that we were trying to 
enable the interrups before we cleared the SWRST.  When I moved the 
interrupt enable line below the SWRST line, it started to work.  
Thanks for all your help!

--- In msp430@msp4..., "Blake" <blake@e...> wrote:
> Thanks Hugh.  We'll try using the
oscilloscope.  I think it is 
> communicating correctly with the GPS, but truthfully I don't really 
> know for sure.  I'll try working on it some more.  Thanks!
> 
> --- In msp430@msp4..., Hugh Molesworth <nzbackpackers@y...> 
> wrote:
> > You need these (which could be combined):
> > 
> > BCSCTL2 |= (SELM1); //Set Master clock MCLK to XT2CLK div 1 */
> > BCSCTL2 |= (SELS); /* Set Submain clock SMCLK to XT2CLK */
> > 
> > UTCTL1 = SSEL1; // UCLK = SMCLK
> > 
> > Most of the other stuff is already as you want it after a power-
on 
> reset.
> > 
> > I don't see anything obvious, maybe it's time to put a
'scope on 
> the rx pin 
> > at the MSP430 and also pulse a pin from within the rx interrupt. 
> Just to be 
> > sure a valid signal is actually reaching the micro pin and that 
the 
> > interrupt really isn't being triggered.
I'm assuming your 
transmit 
> routine 
> > is talking correctly to the GPS?
> > 
> >  >Okay, I still can't seem to get it working. I tried to
implement
> > some of your code, and here is what I have come up with. Is there
> > something else I need to be doing to set up SMCLK? Thanks so much
> > for all your help. I really appreciate it!
> > Blake
> > 
> > int gps_config(void)
> > {
> > unsigned int i;
> > 
> > WDTCTL = WDTPW + WDTHOLD; // turn watch dog timer off
> > IFG2 = 0; // Interrupt flag 2
> > IFG1 = 0; // Interrupt flag 1
> > 
> > BCSCTL1 = 0x04; // ACLK = LFXT1 = LF XTAL (32.768 kHz)
> > // This leaves XT2 on and able to be
> > // used for MCLK
> > 
> > /* do I need any of this stuff?
> > BCSCTL1 &= ~XT2OFF; // Enable XT2 crystal oscillator
> > BCSCTL1 &= ~XTS; // Enable low-frequency XT1 crystal oscillator
> > 
> > BCSCTL2 &= ~(DIVM1|DIVM0); //Set Master clock MCLK to XT2CLK div 1
> > BCSCTL2 &= ~(SELM0); //Set Master clock MCLK to XT2CLK div 1
> > BCSCTL2 |= (SELM1); //Set Master clock MCLK to XT2CLK div 1
> > */
> > 
> > /* is this correct? */
> > BCSCTL2 &= ~(DIVS1|DIVS0); /* Set Submain clock SMCLK divider to
> > div 1 */
> > BCSCTL2 |= (SELS); /* Set Submain clock SMCLK to XT2CLK */
> > 
> > do {
> > IFG1 &= ~OFIFG; // Clear OSCFault flag
> > for (i = 0xFF; i > 0; i--); // Time for flag to set
> > }
> > while ((IFG1 & OFIFG) == OFIFG); // OSCFault flag still set?
> > 
> > // UCTL1 = CHAR + PENA; // 8 bit data, odd parity enabled
> > UCTL1 = (CHAR + PENA) + SWRST; // 8 bit data, odd parity enabled
> > //UTCTL1 |= SSEL0 + SSEL1 + TXWAKE;
> > UTCTL1 = SSEL1; // UCLK = SMCLK
> > //URCTL1 = URXEIE;
> > 
> > UBR01 = 0x00; // 7.3728MHz 9600 baud - 768 or 0x0300
> > UBR11 = 0x03; //
> > UMCTL1 = 0x00; // no modulation because it divides evenly.
> > 
> > ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
> > IE2 |= URXIE1 + UTXIE1; // Enable USART1 RX/TX interrupt
> > URCTL1 |= URXEIE; // UART 1 Receive Control - Allow error
> > characters to set interrupt
> > 
> > P3SEL |= 0xc0; // P3.6,7 = USART1 TXD/RXD
> > P3DIR |= 0x40; // P3.6 output direction
> > 
> > P4DIR |= 0x20; //P4.5 GPS enable output direction
> > P4OUT &= 0xDF; //p4.5 GPS enable low
> > 
> > UCTL1 &= ~SWRST; // Clear SWRST to enable uart
> > 
> > _EINT(); // Enable interrupts
> > 
> > P2DIR |= 0x80; //turn on yellow LED light, for testing purposes
> > P2OUT &= 0x7F;
> > 
> > //send messages configured the GPS
> > xmit_buffer(&PortConfigString, PortConfigStringLength);
> > for(i = 0; i<1000; i++){}
> > xmit_buffer(&NMEAConfigString, NMEAConfigStringLength);
> > 
> > //loop to wait for interrupt
> > dollarflag = 0;
> > while(dollarflag != 1){
> > }
> > 
> > P4DIR |= 0x80; //turn on red LED light, for testing purposes
> > P4OUT &= 0x7F;
> > 
> > return 1;
> > }
> > 
> > --- In msp430@msp4..., Hugh Molesworth 
<nzbackpackers@y...>
> > wrote:
> >  > Hi.
> >  >
> >  > Doesn't look like you're setting up SMCLK. Here's
some old
> > MSP430F149 code
> >  > I wrote which works fine, maybe you can see from this what the
> > difference
> >  > is. I'm just about to leave for the airport so I hope that 
helps.
> >  >
> >  > Regards, Hugh
> >  >
> >  > void Start_Osc(void)
> >  > {
> >  > /*
> >  > * DCO is CR typically ?
> >  > *
> >  > * LFXT1CLK is typically 32.768kHz watch crystal used for low
> > power.
> >  > *
> >  > * XT2CLK is typically 7.3728MHz crystal used for accurate high-
> > speed comms.
> >  > *
> >  > * There are 3 system clock lines: ACLK, MCLK & SMCLK.
> >  > *
> >  > * Auxilliary clock ACLK is buffered LFXT1CLK divided by 1, 2, 4
> > or 8.
> >  > * Typically 32.768kHz watch crystal.
> >  > *
> >  > * Master clock MCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 1,
> > 2, 4 or 8.
> >  > *
> >  > * Submain clock SMCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 
1,
> > 2, 4 or 8.
> >  > */
> >  >
> >  > WDTCTL = WDTPW + WDTHOLD; // Stop watchdog timer
> >  > IFG2 = 0; // Interrupt flag 2
> >  > IFG1 = 0; // Interrupt flag 1
> >  >
> >  > /*
> >  > * Enable LFXT1CLK (typically 32.768kHz watch crystal used for 
low
> > power)
> >  > *
> >  > * Enable XT2CLK (typically 7.3728MHz crystal used for accurate
> > high-speed
> >  > comms)
> >  > *
> >  > */
> >  > BCSCTL1 &= ~XT2OFF; // Enable XT2 crystal oscillator
> >  > BCSCTL1 &= ~XTS; // Enable low-frequency XT1 crystal
> > oscillator
> >  > do //wait in loop until crystal is
> > stable
> >  > {
> >  > IFG1 &= ~OFIFG;
> >  > } while (OFIFG&IFG1);
> >  > Delay1();
> >  > IFG1 &= ~OFIFG; // Reset osc. fault flag again
> >  >
> >  > /*
> >  > * DCO is CR typically ? let's go max speed
> >  > *
> >  > */
> >  > DCOCTL |= DCO0 | DCO1 | DCO2; // Max speed for DCO!
> >  >
> >  > /* Auxilliary clock ACLK is buffered LFXT1CLK divided by 1, 2, 
4 
> or
> > 8. */
> >  > BCSCTL1 &= ~(DIVA0|DIVA1); // Set DCO clock ACLK is
> > buffered
> >  > LFXT1CLK divided by 1
> >  >
> >  > /* Master clock MCLK is LFXT1CLK, XT2CLK or DCOCLK divided by 
1, 
> 2,
> > 4 or 8. */
> >  > BCSCTL2 &= ~(DIVM1|DIVM0); /* Set Master clock MCLK to
XT2CLK
> > div 1 */
> >  > BCSCTL2 &= ~(SELM0); /* Set Master clock MCLK to XT2CLK div
1
> > */
> >  > BCSCTL2 |= (SELM1); /* Set Master clock MCLK to XT2CLK div 1
> > */
> >  > //Then set MCLK same as LFXT1CLK
> >  > //and SMCLK = XT2CLK/2
> >  > // BCSCTL2 = DIVS0+SELS+SELM0+SELM1;
> >  >
> >  >
> >  > /* Submain clock SMCLK is LFXT1CLK, XT2CLK or DCOCLK divided 
by 
> 1,
> > 2, 4 or
> >  > 8. */
> >  > BCSCTL2 &= ~(DIVS1|DIVS0); /* Set Submain clock SMCLK
> > divider to
> >  > div 1 */
> >  > BCSCTL2 |= (SELS); /* Set Submain clock SMCLK to
> > XT2CLK */
> >  > }
> >  >
> >  > >Hugh, thanks for your help, but I still seem to be having
some
> >  > problems. Does there seem to be anything wrong with the code 
> below?
> >  > Using the MSP430F149.
> >  >
> >  > int gps_config(void)
> >  > {
> >  > unsigned int i;
> >  >
> >  > WDTCTL = WDTPW + WDTHOLD; // turn watch dog timer off
> >  >
> >  >
> >  > BCSCTL1 = 0x04; // ACLK = LFXT1 = LF XTAL (32.768 kHz)
> >  > // This leaves XT2 on and able to be
> >  > // used for MCLK
> >  > do {
> >  > IFG1 &= ~OFIFG; // Clear OSCFault flag
> >  > for (i = 0xFF; i > 0; i--); // Time for flag to set
> >  > }
> >  > while ((IFG1 & OFIFG) == OFIFG); // OSCFault flag still set?
> >  >
> >  > // UCTL1 = CHAR + PENA; // 8 bit data, odd parity enabled
> >  > UCTL1 = (CHAR + PENA) + SWRST; // 8 bit data, odd parity 
enabled
> >  > //UTCTL1 |= SSEL0 + SSEL1 + TXWAKE;
> >  > UTCTL1 = SSEL1; // UCLK = SMCLK
> >  > //URCTL1 = URXEIE;
> >  >
> >  > UBR01 = 0x00; // 7.3728MHz 9600 baud - 768 or 0x0300
> >  > UBR11 = 0x03; //
> >  > UMCTL1 = 0x00; // no modulation because it divides evenly.
> >  >
> >  > ME2 |= UTXE1 + URXE1; // Enable USART1 TXD/RXD
> >  > IE2 |= URXIE1 + UTXIE1; // Enable USART1 RX/TX interrupt
> >  > URCTL1 |= URXEIE; // UART 1 Receive Control - Allow error
> >  > characters to set interrupt
> >  >
> >  > P3SEL |= 0xc0; // P3.6,7 = USART1 TXD/RXD
> >  > P3DIR |= 0x40; // P3.6 output direction
> >  >
> >  > P4DIR |= 0x20; //P4.5 GPS enable output direction
> >  > P4OUT &= 0xDF; //p4.5 GPS enable low
> >  >
> >  > UCTL1 &= ~SWRST; // Clear SWRST to enable uart
> >  >
> >  > _EINT(); // Enable interrupts
> >  >
> >  > P2DIR |= 0x80; //turn on yellow LED light, for testing purposes
> >  > P2OUT &= 0x7F;
> >  >
> >  > //send messages configuring the GPS
> >  > xmit_buffer(&PortConfigString, PortConfigStringLength);
> >  > for(i = 0; i<1000; i++){} //pause to give it time to
process
> >  > xmit_buffer(&NMEAConfigString, NMEAConfigStringLength);
> >  >
> >  > //loop to wait for interrupt
> >  > dollarflag = 0;
> >  > while(dollarflag != 1){
> >  > }
> >  >
> >  > P4DIR |= 0x80; //turn on red LED light, for testing purposes
> >  > P4OUT &= 0x7F;
> >  >
> >  > return 1;
> >  > }



The 2024 Embedded Online Conference