Custom Search

Category Archives: programing

New Toys, Bigger msp430 and a stellaris launchpad

0
Filed under General, Hardware, MSP430, programing
Tagged as ,

New toys came in the other day from the 43oh.com store.
I ordered 2x msp430f5510 USB dev boards, created By Robg , also I received a Stellaris Launchpad (on loan till mine come in) .

 

These are Nice little boards, and will work great for any one trying with a Launchpad and would like to try some of the bigger flagships. These are very easy to solder and get up and running.

image

 

image

To program them, all I did was connect the RST, TST, Vcc, Gnd between the launchpad and the dev board. Ran mspdebug, and it worked on the first try.

Sorry for the poor screen shot.

 

 

image

 

As of right now, I am working on porting msp430USBDev API from TI. It is both IAR and CCS code, and both will not work out of the box with mspgcc.

But with some minor changes I think I can get it to work.

There is a Port of the devpack, but It has an autogen.sh file that makes the makefile and links things automatically…… and in general I had issues with it, it compiled correctly but did not run on my 5510, even after I changed the minimal configuration options it gave.
Now I don’t know what the guy changed or what he did to get it to work other then some linker options about the usb buffer/ram.

I will give an update on this as soon as I get it to work.

 

Coders with a sense of humor!

0
Filed under General, Linux, OS, programing, software
Tagged as , ,

image

This is one of the best comments on commercial source code I have ever seen. This is from the dgrp source code for a Digiport driver, from around 1999, I think.

MSP430 – different Interrupts for different compilers

3
Filed under MSP430, programing

The different compilers out there for msp430 chips and Launchpad have different syntax for each one -

Hopefully this post will help you find out which one you need.

(all examples are for chip msp430g2231, just substitute your chip that you are working with)

First – CSS/IAR — TI officially supported compilers/IDEs

#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A1(void)    { //ISR code

}

 

 

second – mspgcc4 – IDE of your choice

Makefile — must have this option to compile correctly to chip -mmcu=msp430x2231 –most chips are supported but you will have to find the correct one for yours.

Main.c file or main project file

you must include these

#include <msp430g2231.h>
#include <signal.h>

and then the syntax for your ISR

interrupt(TIMERA0_VECTOR) Timer_A (void) {  //code goes here}

 

Third — Uniarch mspgcc – Newest compiler – replacement for mspgcc4

 

makefile– -mmcu=msp430g2231   you must use the one specific for your chip and should not include an x in the mmcu option since that is for the depreciated mspgcc4

inlcude these header files

#include <msp430.h>
#include <legacymsp430.h>

ISR syntax

interrupt(TIMERA0_VECTOR) Timer_A (void)
{  //code goes here}

 

Fourth way– Offiacial uniarch mspgcc ISR syntax

makefile – same as before

no extra includes needed, just the msp430.h or specific chip header

__attribute__((interrupt(TIMERA0_VECTOR)))
void Timer_A(void){ //code goes here }

Source link

 

This is not complete, I am waiting for an answer on what the syntax should be for uniarch branch of mspgcc for interrupts. So far my testing has only allowed using interrupts using the lgacymsp430.h header. Once I get an answer I will update this post.

update –


so far this alternative works – (works == compiles with no errors)

The syntax for declaring an interrupt with gcc is (as far as I learnt so far)

__attribute__((interrupt(VECTOR_NAME)))
void irq_handler_for_vector(void);

with VECOR_NAME the name of the IRQ vector. example:

__attribute__((interrupt(USCI_A2_VECTOR)))
void usbRxISR(void){ 

Thank you Matthias - for this alternative.

MSP430 Uniarch mspgcc or mspgcc4?

8
Filed under MSP430, programing

You are probably asking yourself which compiler for your launchpad/msp430, you should use. Me personally, I don’t really care which one works Better, I just need one to compile for my launchpad and supports the chips I use.

some similarities  –

Both create files for your msp430 chip,

both are compiled  with GCC 4.x+

Both use libc for the msp430.

They pretty much fill the same function.

 

Now some of the major differences, mspgcc4 is stable and  can be used with production code, Uniarch is still being developed and is changing a lot still. mspgcc4 supports most of the chips for msp430 except the very newest (since it is hard to add newer chips with out rebuilding and adding a lot of code).  Uniarch is trying to make adding chip support as easy as possible, and unifying all the branches of mspgcc. Even coding is slightly different, interrupts are coded different and even the headers you use may be different(FYI).

 

So which one should I choose?

Well that is a tough question, what are your goals?

are you trying to get one just up and running or do you need support for the newest chips? — Have you compiled programs from source or are you new to linux?

Will you give up after you get an error or will you work through it and figure it out?

 

Well if you need just something up and running just to be able to compile a few programs for your launch pad , I would suggest using mspgcc4 , using the build script or using the pre-built binaries. pre- built binaries, to install, you just add a folder to usr/local/ and call it mspgcc4 and unpack your binaries in there and that it.  The build script is pretty self explanatory, and it compiles everything from source . I have used it multiple times and works as long as you have all the dependencies. IE(ncurses-dev, cvs, lidreadline-dev etc…)

A very simple way to get it up and running -

 

Now if you want access to the New uniarch mspgcc, that supports the new chips like msp430g2452 or others. you will need to go the long and hard route of patching compiling linking and more compiling lol. but there are some great directions to do it. Here (Thank you sergio). But it is not for the faint of heart….lol /JK

Read More »

MSP430: Custom calibration for DCO

0
Filed under electronics, Hardware, MSP430, programing, Uncategorized

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.

custom_dco

 

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.

SO USE THIS CODE AT YOUR OWN RISK!!

 



//******************************************************************************
// Custom DCO settings- based on TI code example
//
// MSP430F20xx Demo - DCO Calibration Constants Programmer
//
// NOTE: THIS CODE REPLACES THE TI FACTORY-PROGRAMMED DCO CALIBRATION
// CONSTANTS LOCATED IN INFOA WITH NEW VALUES. USE ONLY IF THE ORIGINAL
// CONSTANTS ACCIDENTALLY GOT CORRUPTED OR ERASED.
//
//
// 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)
{
WDTCTL = WDTPW + WDTHOLD; // Stop WDT
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.