• Category Archives electronics
  • MSP430: Custom calibration for DCO

    While using the launchpad and Value line chips, I was a little Disappointed in lack of calibration data and no way to reliably change the default settings. So I started flashing the DCO calibrations data –> original post http://www.43oh.com/forum/viewtopic.php?f=10&t=239&hilit=calibration
    Now the default 1 8 12 and 16 MHZ settings are fine but what if you wanted a bunch of chips to run on 3MHz or 500KHz. Are you will to try and figure out the RSEL and MOD and DCO bits and start randomly flipping testing settings? To me this sounds like a long and boring process and I don’t have the time to test and try and get 2MHz, or what if I need 10MHz , my scope doesn’t even come close to that 🙁 .

    So I decided to modify the TI DCO flash calibration code from TIs examples, these changes allow me to set the default and the other calibration data to the settings I want.
    The few changes I made are,

    • Added Xcap setting to BCSCTL3 to make internal cap 12.5pF
    • Added custom constant to replace 1MHz default(244), – new one is for 2MHz

    no other changes made to the code.



    Now there is a few things to remember, This code will re-write over TI calibrated constants if you have An F series (IE everything but value line G series) chips. Or it will Write the calibration to the G line chips – which are not calibrated when you get them except the 1MHz default.



    // Custom DCO settings- based on TI code example
    // MSP430F20xx Demo - DCO Calibration Constants Programmer
    // MSP430F20xx
    // ---------------
    // /|| XIN|-
    // | | | 32kHz
    // --|RST XOUT|-
    // | |
    // | P1.0|--> LED
    // | P1.4|--> SMLCK = target DCO
    // Orignal Code By
    // A. Dannenberg
    // Texas Instruments Inc.
    // May 2007
    // Built with CCE Version: 3.2.0 and IAR Embedded Workbench Version: 3.42A
    /*Flash Custom DCO settings, This will replace The default 1MHz */
    /* to use
    //Custom calibration
    BCSCTL1 = CALBC1_1MHZ; // Set range
    DCOCTL = CALDCO_1MHZ; // Set DCO step + modulation
    //ACLK = LFXT1/8 = 32768/8, MCLK = SMCLK = target DCO
    //* External watch crystal installed on XIN XOUT is required for ACLK *//
    #include "msp430f2013.h"
    #define DELTA_CUSTOM 489 // 489 x 4096Hz = 2002944Hz or 2.02MHz
    #define DELTA_8MHZ 1953 // 1953 x 4096Hz = 7.99MHz
    #define DELTA_12MHZ 2930 // 2930 x 4096Hz = 12.00MHz
    #define DELTA_16MHZ 3906 // 3906 x 4096Hz = 15.99MHz
    unsigned char CAL_DATA[8]; // Temp. storage for constants
    volatile unsigned int i;
    int j;
    char *Flash_ptrA; // Segment A pointer
    void Set_DCO(unsigned int Delta);
    void main(void)
    for (i = 0; i < 0xfffe; i++); // Delay for XTAL stabilization P1OUT = 0x00; // Clear P1 output latches P1SEL = 0x10; // P1.4 SMCLK output P1DIR = 0x11; // P1.0,4 output BCSCTL3 = XCAP_3; // Set internal cap to 12.5 j = 0; // Reset pointer Set_DCO(DELTA_16MHZ); // Set DCO and obtain constants CAL_DATA[j++] = DCOCTL; CAL_DATA[j++] = BCSCTL1; Set_DCO(DELTA_12MHZ); // Set DCO and obtain constants CAL_DATA[j++] = DCOCTL; CAL_DATA[j++] = BCSCTL1; Set_DCO(DELTA_8MHZ); // Set DCO and obtain constants CAL_DATA[j++] = DCOCTL; CAL_DATA[j++] = BCSCTL1; Set_DCO(DELTA_CUSTOM); // Set DCO and obtain constants CAL_DATA[j++] = DCOCTL; CAL_DATA[j++] = BCSCTL1; Flash_ptrA = (char *)0x10C0; // Point to beginning of seg A FCTL2 = FWKEY + FSSEL0 + FN1; // MCLK/3 for Flash Timing Generator FCTL1 = FWKEY + ERASE; // Set Erase bit FCTL3 = FWKEY + LOCKA; // Clear LOCK & LOCKA bits *Flash_ptrA = 0x00; // Dummy write to erase Flash seg A FCTL1 = FWKEY + WRT; // Set WRT bit for write operation Flash_ptrA = (char *)0x10F8; // Point to beginning of cal consts for (j = 0; j < 8; j++) *Flash_ptrA++ = CAL_DATA[j]; // re-flash DCO calibration data FCTL1 = FWKEY; // Clear WRT bit FCTL3 = FWKEY + LOCKA + LOCK; // Set LOCK & LOCKA bit while (1) { P1OUT ^= 0x01; // Toggle LED for (i = 0; i < 0x4000; i++); // SW Delay } } void Set_DCO(unsigned int Delta) // Set DCO to selected frequency { unsigned int Compare, Oldcapture = 0; BCSCTL1 |= DIVA_3; // ACLK = LFXT1CLK/8 TACCTL0 = CM_1 + CCIS_1 + CAP; // CAP, ACLK TACTL = TASSEL_2 + MC_2 + TACLR; // SMCLK, cont-mode, clear while (1) { while (!(CCIFG & TACCTL0)); // Wait until capture occured TACCTL0 &= ~CCIFG; // Capture occured, clear flag Compare = TACCR0; // Get current captured SMCLK Compare = Compare - Oldcapture; // SMCLK difference Oldcapture = TACCR0; // Save current captured SMCLK if (Delta == Compare) break; // If equal, leave "while(1)" else if (Delta < Compare) { DCOCTL--; // DCO is too fast, slow it down if (DCOCTL == 0xFF) // Did DCO roll under? if (BCSCTL1 & 0x0f) BCSCTL1--; // Select lower RSEL } else { DCOCTL++; // DCO is too slow, speed it up if (DCOCTL == 0x00) // Did DCO roll over? if ((BCSCTL1 & 0x0f) != 0x0f) BCSCTL1++; // Sel higher RSEL } } TACCTL0 = 0; // Stop TACCR0 TACTL = 0; // Stop Timer_A BCSCTL1 &= ~DIVA_3; // ACLK = LFXT1CLK }

    So you want a your own custom frequency, now the easiest way to do this is take your target clk speed and divide it by 4096. which 4096 is 32KHz clock divided by 8. For my 2MHz calculation I did 489 x 4096Hz = 2002944Hz or 2.02MHz
    you division will get you close to the number you will need, round up or down according to your frequency. I choose to go a little over/ round up.

    Remember the Faster your clock, the farther you will be away from your target
    example - 488 x 4096 = 1,998,848
    489 x 4096 = 2,002,944
    difference 4,096

    Its not too bad but if you are going for a specific CLK speed you may need to try a different method like an oscilloscope, and manually changing the DCO, RSEL, MOD bits .

    FYI there is a test program included in the zip file to test your new calibration data.

  • MSP430: SDA16? what would I ever use that for.

    SDA16 is a 16Bit sigma-delta ADC, and is one of the options for MSP430 line of chips. But then you ask, doesn’t the mps430 have a ADC with 10 to 12 bits? Yes it does but the SDA is a different beast all together, with more settings and registers. For more information on how it works please feel free to read some application notes and the Wiki. I personally cant answer how or why you need to send your oversampled , comb filtered, decimated and modulated signal to get 16 Bit resolution.

    application notes on SDADC

    WIKI on how its done.

    But lets get started by going over some of the Registers you will need to setup and or modify.

    SD16CTL – control register
    controls Clock source, power mode, clock divider, V ref selection, overflow interrupt.

    SD16CCTL0 – channel register
    Controls Buffer mode(no buffer in F2013), Bipolar or unipolar, conversion mode over
    sampling and LSBACC enable, conversion interrupt, data format, interrupt flag and
    conversion start

    SD16INCTL0 – input control
    Sampling rate, preamplifier gain, differential pair select

    SD16AE – analog enable
    Selects external Analog input

    SD16IV – Interrupt vector – self explanatory

    SD16MEM0 – conversion memory – where your conversion will end up when sda16 is finished with conversion.

    ** all these registers mentioned are reset with PUC

    Yes I know it looks like a lot, but it really doesn’t take that much to start getting readings .
    So the first thing you need to do is select your differential pair/ Pins you will be using. ** you will have to use the Data sheet to pick your Pairs, and remember if you are using an external VREF P1.3 will be used on the F2013 so that leaves open 7 other pairs to select from.
    Continue reading  Post ID 961

  • MSP430: VLO and You!!

    So what is the VLO? The VLO is the very low- freq Oscillator, low power and low frequency(12KHz). So how does this change things, well now you can source your clocks from the DCO or the VLO instead of the 32Khz watch crystal. …….and now your asking yourself “Do I really need another clock source?” I say “yes!!”

    Now what can you do or how can i use the VLO? Its super easy to setup the VLO. In the Family user guide for the MSP430, Basic Clock Module+ will be your reference to set up the VLO.
    Registers that you will be concerned about are BCSCTL2, BCSCTL3 and the special functions registers.


    • BCSCTL3 needs LFXT1S_2 to be set

    BCSCTL3 |= LFXT1S_2;                      // LFXT1 = VLO

    • BCSCTL2 needs to be set

    BCSCTL2 |= SELM_3 + SELS;                 // SMCLK  = MCLK = VLO = 12Khz

    • Clear OSC fault flag

    IFG1 &= ~OFIFG;                           // Clear OSCFault flag

    • Turn off DCO if not used

    _BIS_SR(SCG1 + SCG0);                // Stop DCO


    And that is all you need to do to setup your msp430 to use the VLO for SMCLK, AMCLK and MCLK @ 12KHz.  So now you need more control. so here are your VLO options

    BCSCTL1 –  controls XTS(not avalable on msp430x20xx), Divider for ACLK, and DCO range select.

    • DIVAx  – divide ACLK source by 1,2,4,8 or 00, 01, 10, 11(bit settings). Pretty much this will divide your Clock source by 1 – 8. This setting is just for ACLK which will be the crystal or VLO. (this only affects ACLK)
    • XTS, XT2OFF, and RSELx are not used for VLO but may be a good idea to read up on what they do.



    BCSCTL2  – controls MCLK divider, SMCLK divider MCLK and SMCLK clock source, each one is configurable.

    • SELMx – selects MCLK clock source, your choices are DCOCLK or LFXT1CLK/VLOCLK  just remember you cant use the VLO and the crystal
    • DIVMx – MCLK divider, divides the clock source by given amount, 1,2,4,8
    • SELS – select SMCLK source  DCOCLK or LFXT1CLK/VLOCLK
    • DIVSx – look another Divider, this one is for SMCLK
    • DCOR- not used – sets DCO resister to internal or external


    BCSCTL3 – XT and LFXT setting, only one setting is really used here.

    • LFXT1Sx – source of LFXT1,  00(0) for 32KHz crystal and  10(2) for VLO instead of the crystal
    • XT2Sx, XCAPx, XT2OF, LFXT1OF are not set or used for the VLO



    So now you have a basic understanding on how to setup your VLO, now let me give you a quick  VLO test


    /* VLO clock as main source instead of the DCO */
    #include  <msp430x20x3.h>
    void main(void)
    WDTCTL = WDTPW + WDTHOLD;                 // Stop watchdog timer
    BCSCTL3 |= LFXT1S_2;                      // LFXT1 = VLO
    IFG1 &= ~OFIFG;                           // Clear OSCFault flag
    __bis_SR_register(SCG1 + SCG0);           // Stop DCO
    BCSCTL2 |= SELM_3;               // MCLK = LFXT1
    P1DIR |= 0x01;                            // Set P1.0 to output direction
    for (;;)
    volatile unsigned int i;
    P1OUT ^= 0x01;                          // Toggle P1.0 using exclusive-OR
    i = 50000;                              // Delay
    do (i--);
    while (i != 0);

    code for use with mspgcc


    Now that we have the basics down on the VLO, what are some of the uses for it? Really low power clock, or a 3rd clock source that’s a different frequency then the main, really slow ADC conversions, odd SDA16 filter frequency, a low frequency tone generator.


    What other uses can you find? Let me know in the comments 🙂

  • 430 work shop links and source code

    source code zip of all the projects that were demoed at workshop 88 http://www.workshop88.com/
    (the code is in mspgcc format and may need alterations to compile for CCS & IAR)

    Sources code for Shift register demo
    original code here

    servo demo
    original source

    Music demo
    Original source here

    The RGB demo was not there
    source http://justinstech.org/projects/msp430-rgb-flower-pot/

  • Things I forget to do!! lol part 2

    As i was testing my battery with my helicopter, this is not going to be the battery i use, It is a 7.2v 2A Nimh battery pack that i had acquired, as i was putting stuff together and testing my servos, I also wanted to do a quick battery test, so i rigged everything up like it supposed to, i also created a quick motor test on mbed.org to program the uC and get the servos at 90o and get the blades leveled so i can do the motor test.
    servos work great with this setup, that test is done, went with out a problem. next was the motor test, so i removed the blades to protect me and the wires. Then i hooked everything up. checked the motor, and the battery connection, perfect no problems. next i hook up the uC control lines and ground (I learned 🙂 ). or so what i thought was ground. so i power every thing up. nothing goes, check the battery and all the power, looks good. next i remove the control lines.(or so i thought) checked the voltage from the pwm line, about 3v, looks good. so i use the control line that was being used for the main rotor and hooked it up to 5v nothing happened, so i thought ok maybe my gate voltage wants high enough, (last time it was 5v source and 5v gate and it worked) so i get the brilliant idea of trying to hook it up to one of the power line, a full 7.2v (8.5v fully charged) thinking that should be enough power to get it going ………………guess what ……………
    Continue reading  Post ID 961

  • Things I forget to do!! lol

    Have you ever worked on a project or tried to trouble shoot some sort of complex technical thingy and cant figure out why its not working like it should? If your reading this most of us have some sort of problem like this. Recently I have been working on trying to get my NXP Mbed Challenge up and running and working on the last few hardware requirements. This last week i have been trying to get my servos and motors working together and have started to make some good progress. until i hooked up power. Servos would not move nor did they seem like they were even powered……double checked them with an arduino and they worked. So i put it all back together and tried again, still no movement from the servos, now i start all over again with the trouble shooting, I did this about 3 times tracing out all the wires, doing electrical conductivity tests, the whole 9 yards. After a few hours and a day of rest i went back to it………
    re-connected everything back up and tried again…………And this is what I concluded ……

    Continue reading  Post ID 961