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/
>
Reply by Blake●June 2, 20032003-06-02
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;
> > }
Reply by Hugh Molesworth●June 2, 20032003-06-02
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;
> }
Reply by Blake●June 2, 20032003-06-02
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;
> }
Reply by Hugh Molesworth●June 2, 20032003-06-02
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;
}
Reply by Blake●June 2, 20032003-06-02
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
Reply by Hugh Molesworth●May 30, 20032003-05-30
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
Reply by Blake●May 30, 20032003-05-30
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