LaunchPadin DCO:n kellotaajuusasetukset

[size=150]
MSP430 Launchpad DCO(Digitally-controlled oscillator) > 1MHz
[/size]
TÀmÀ ohje ei ole oma ideani vaan suomennettu yhteenveto 43oh-foorumin nimimerkeillÀ maxpenna, simpleavr ja NatureTM esiintyvien henkilöiden pÀhkÀilyistÀ. Valokuvat ja skooppikaappaukset ovat omiani. AlkuperÀiset NatureTM:n aloittamat threadit löytyvÀt osoitteista Value Line series easy DCO setting library ja Flashing the missing DCO calibration constants.

VAROITUS: En ota vastuuta ohjeen oikeellisuudesta tai hajonneista laitteista, mutta olen itse onnistuneesti kalibroinut nÀillÀ ohjeilla oman Launchpadini tukemaan 1MHz, 4MHz, 8MHz ja 16MHz kellotaajuuksia. EsimerkissÀ kÀytetÀÀn Launchpadin mukana tullutta MSP430G2231-kontrolleria ja 32.768kHz-kidettÀ. Ilmeisesti tÀtÀ pitÀisi voida soveltaa muihinkin G-sarjalaisiin.

[size=150]SisÀltö[/size]

  1. Johdanto
  2. Kalibrointi
  3. Kiteen juottaminen
  4. Code Composerin muokkaus
  5. EntÀ nyt?
  6. Mittailuja
  7. Ylikellotusta
  8. Pikakertaus

[size=150]1. Johdanto[/size]

MSP430G2231:n sisÀinen DCO on kalibroitu toimimaan 1MHz taajuudella, jolla kyllÀ pÀÀsee hyvin alkuun. DatalehdessÀ mainitaan kyseisen kontrollerin toimivan myös sisÀisen oskilaattorin ajamana 16MHz taajuudella. 1MHz lisÀksi kontrolleriin ei ole kuitenkaan tallennettu kalibrointiarvoja nopeammille taajuuksille, mutta onneksi yllÀmainittujen nimimerkkien ansiosta itse kalibrointi eri taajuuksille on tehty helpoksi.

Kalibroinnissa kÀytetÀÀn hyvÀksi ulkoista vertailutaajuutta, joka tuotetaan Launchpadin mukana toimitetulla 32kHz kiteellÀ. Kiteen jakson aikana lasketaan DCO-oskillaattorissa tapahtuneita jaksoja, jolloin voidaan arvioida DCO:n taajuus. Kun ulkoisen 32kHz kiteen taajuus jaetaan kahdeksalla, voidaan laskea useampia DCO-oskillaattorin jaksoja, jolloin tarkkuus paranee. Kiteen vertailutaajuudeksi saadaan siis 4096Hz ja tÀmÀn perusteella voidaan laskea seuraavat kalibroinnissa tavoiteltavat DCO-jaksot/kidejakso:

  • 1MHz ˜ 4096Hz * 244 = 999 424Hz -596ppm
  • 2MHz ˜ 4096Hz * 488 = 1 998 848Hz -596ppm
  • 3MHz ˜ 4096Hz * 732 = 2 998 272Hz -596ppm
  • 4MHz ˜ 4096Hz * 977 = 4 001 792Hz 468ppm
  • 5MHz ˜ 4096Hz * 1221 = 5 001 216Hz 263ppm
  • 6MHz ˜ 4096Hz * 1465 = 6 000 640Hz 127ppm
  • 7MHz ˜ 4096Hz * 1709 = 7 000 064Hz 29ppm
  • 8MHz ˜ 4096Hz * 1953 = 7 999 488Hz -84ppm
  • 9MHz ˜ 4096Hz * 2197 = 8 998 912Hz -141ppm
  • 10MHz ˜ 4096Hz * 2441 = 9 998 336Hz -186ppm
  • 11MHz ˜ 4096Hz * 2686 = 11 001 856Hz 189ppm
  • 12MHz ˜ 4096Hz * 2930 = 12 001 280Hz 127ppm
  • 13MHz ˜ 4096Hz * 3174 = 13 000 704Hz 74ppm
  • 14MHz ˜ 4096Hz * 3418 = 14 000 128Hz 29ppm
  • 15MHz ˜ 4096Hz * 3662 = 14 999 552Hz -50ppm
  • 16MHz ˜ 4096Hz * 3906 = 15 998 976Hz -84ppm

[size=150]2. Kiteen juottaminen Launchpadiin[/size]

Kide juotetaan MSP430G2231-piirin oikealle puolelle C21:n ja C22:n vÀliin. C21 ja C22 ovat paikkoja kiteen kuormakondensaattoreille. NiitÀ ei kuitenkaan tarvitse lisÀtÀ, koska kalibroinnissa kÀytetÀÀn mikrokontrollerin sisÀisiÀ kuormakondensaattoreita (sÀÀdettÀvÀ 1-11pF).

launch_lahto_325.jpgMSP430 Launchpad

Juotetaan kide sille tarkoitettuun paikkaan. Juottamisessa kannattaa kÀyttÀÀ ohutta lankaa, ettÀ fluksia tulee tasaisesti ja juotoksista tulee nÀttejÀ. ItsehÀn oppikirjamaisesti luultavasti sotkin tuon lyijyttömÀn esitinauksen ja lyijyllisen. (pienemmÀt pÀdit himmeitÀ? paksumman pÀÀn koostumus taisi jo korjaantua sen verran tinan paljouden takia) :smiley:

kide_325.jpgPoistin piikkirimalle menevÀt hyppyvastukset. LyhemmÀt johtimet kiteelle(merkitystÀ?) ja empÀhÀn kytke sinne mitÀÀn vahingossa :smiley:.

[size=150]3. Kalibrointi[/size]

C-kielinen kalibrointiohjelma on saatavissa 43oh-foorumilta (
köh
BugMeNot) kĂ€yttĂ€jĂ€n maxpenna viestistĂ€. Kalibroinnin suoritettuaan ohjelma alkaa vilkuttaa vihreÀÀ lediĂ€(huomaa ketjun viimeisellĂ€ sivulla oleva korjaus). Kalibroinnin tuloksena MSP430G2231-kontrolleriin tallentui minulla ainakin seuraavanlaiset korjaukset. Vertailuarvona jbremnant-nimimerkin lĂ€hettĂ€mĂ€t tiedot 43oh-foorumilta:

kalibrointi_tulos_v1.0.pngArvot lÀhentelevÀt toisiaan aika paljon paitsi tuo DCOTL(hienosÀÀtö?). Muistia voi tutkia ainakin Code Composerin Memory-työkalulla debug-tilassa.

LisÀsin pienen tarran muokattuun kontrolleriin tietÀÀkseni, millÀ kontrollerilla voi kÀyttÀÀ suurempia taajuuksia.
launch_merkki_325.jpgMerkattu mikrokontrolleri.

Kalibroinnin jÀlkeen 32kHz kidettÀ ei tarvita, koska arvot on jo kirjoitettu flashiin talteen.

[size=150]4. Code Composerin muokkaus[/size]

Jotta uusia kalibroituja kellotaajuuksia voitaisiin kĂ€yttÀÀ, tĂ€ytyy meidĂ€n jotenkin kertoa kÀÀntĂ€jĂ€lle, missĂ€ ne sijaitsevat. Seikkaillaan aluksi Code Composerin include-kansioon “
\Texas Instruments\ccsv4\msp430\include”.

Luodaan kopiot nÀistÀ esimerkkimikrokontrolleriin liittyvistÀ tiedostoista:

  • msp430g2231.cmd
  • lnk_msp430g2231.cmd
  • msp430g2231.h

NimetÀÀn kopioidut tiedostot osuvasti:

  • msp430g2231_16MHz.cmd
  • lnk_msp430g2231_16MHz.cmd
  • msp430g2231_16MHz.h

Muokataan “msp430g2231_16MHz.cmd”-tiedoston kalibraatio kohta nĂ€yttĂ€mÀÀn tĂ€ltĂ€, eli mÀÀritellÀÀn nimellĂ€ esitettĂ€viĂ€ osoitteita mikrokontrollerin muistista.

[code]/************************************************************

  • Calibration Data in Info Mem
    ************************************************************/
    CALDCO_16MHZ = 0x10F8;
    CALBC1_16MHZ = 0x10F9;
    CALDCO_12MHZ = 0x10FA;
    CALBC1_12MHZ = 0x10FB;
    CALDCO_8MHZ = 0x10FC;
    CALBC1_8MHZ = 0x10FD;
    CALDCO_1MHZ = 0x10FE;
    CALBC1_1MHZ = 0x10FF;
    /************************************************************[/code]

Muokataan “lnk_msp430g2231_16MHz.cmd”-tiedoston loppua, jotta muistin kohdistus toimii.

[code]//
/
INCLUDE PERIPHERALS MEMORY MAP /
/
/

-l msp430g2231_16MHz.cmd[/code]

Korjataan vielĂ€ esikÀÀntĂ€jĂ€n mÀÀritelmĂ€t (“msp430g2231_16MHz.h”) kohdilleen, jotta eri muistialueisiin voidaan osoitella.

[code]/************************************************************

  • Calibration Data in Info Mem
    ************************************************************/

#ifndef __DisableCalData

SFR_8BIT(CALDCO_16MHZ); /* DCOCTL Calibration Data for 16MHz /
SFR_8BIT(CALBC1_16MHZ); /
BCSCTL1 Calibration Data for 16MHz /
SFR_8BIT(CALDCO_12MHZ); /
DCOCTL Calibration Data for 12MHz /
SFR_8BIT(CALBC1_12MHZ); /
BCSCTL1 Calibration Data for 12MHz /
SFR_8BIT(CALDCO_8MHZ); /
DCOCTL Calibration Data for 8MHz /
SFR_8BIT(CALBC1_8MHZ); /
BCSCTL1 Calibration Data for 8MHz /
SFR_8BIT(CALDCO_1MHZ); /
DCOCTL Calibration Data for 1MHz /
SFR_8BIT(CALBC1_1MHZ); /
BCSCTL1 Calibration Data for 1MHz */

#endif /* #ifndef __DisableCalData */

/************************************************************[/code]

[size=150]5. EntÀ nyt?[/size]

Uutta projektia luodessa Code Composerissa tĂ€ytyy muistaa, ettĂ€ valitsee Linker Command File -kohtaan oikean muokatun “lnk_msp430g2231_16MHz.cmd”-tiedoston.

tarkkana_325.pngValitse “lnk_msp430g2231_16MHz.cmd”.

Itse kun rakastan lukea nÀitÀ kÀdestÀpitÀen tutoriaaleja, niin laitampa tÀhÀn loppuun vielÀ yksinkertaisen koodin, jolla itse testasin eri kellotaajuuksia.

[code]#include <msp430g2231_16MHz.h> // <—HUOMAA :smiley:

void main( void ){
WDTCTL = WDTPW + WDTHOLD; // watchdog pois

//tarkista ettÀ [x]MHz on kalibroitu
if (CALBC1_16MHZ != 0xff && CALDCO_16MHZ != 0xff) {  
    //aseta kello
    BCSCTL1 = CALBC1_16MHZ;
    DCOCTL = CALDCO_16MHZ;
}

//kello ulos @ P1.4
P1SEL |= (1<<4);                             // P1.4 SMCLK output
P1DIR |= (1<<4);                             // P1.4 output
while(1);

}[/code]Anteeksi vÀlilyönnin kÀyttö koodissa, mutta tabulaattori ei toiminut BBCode:lla kirjoitetussa tekstissÀ?
Java-tyylisestÀ aaltosulkujen kÀytöstÀ en kyllÀ luovu :smiley:.

[size=150]6. Mittailuja[/size]

Mittasin edellÀ olevan kappaleen testiohjelman syöttÀmiÀ signaaleja eri taajuuksilla oskilloskoopilla. Kuvista huomaa, ettÀ toivotut taajuudet toteutuivat aika hyvin, mutta kellosignaalin jaksossa on aika paljon huojuntaa. Samanlaista huojuntaa ei esiinny uudella LaunchpadillÀ eikÀ kalibroidulla jos BCSCTL1 ja DCOCTL -rekisterit jÀttÀÀ mÀÀrittelemÀttÀ. Ilmeisesti tÀmÀ jitter on ominaisuus :smiley:, koska kellotaajuuden tarkka sÀÀtÀminen tapahtuu sÀÀtelemÀllÀ kahden eri kellotaajuuden suhdetta (tarkemmin alapuolen viestissÀni).

1MHz + jitterScope 1Mhz.png

8MHz + jitterScope 8Mhz.png

12MHz + jitterScope 12Mhz.png

16MHz + jitterScope 16Mhz.png

[size=150]7. Ylikellotusta[/size]

NÀköjÀÀn tuohon C-kalibrointi-ohjelmaan voi syöttÀÀ kÀsin vertailuarvoja, jolloin voi saada korkeampiakin taajuuksia. :smiley:

Scope 20Mhz_325.pngYlikellotettu MSP430G2231 vertailuarvona 4882.

Yritin saada vielÀ korkeampiakin taajuuksia, mutta kalibrointi ei suostunut asettumaan ja kalibrointiohjelma jÀi ikuiseen silmukkaan. Kontrolleri ei hajonnut, vaan ajoin kalibrointi-ohjelman uudestaan jÀrkevÀmmillÀ arvoilla ja taas mentiin. Luultavasti olisi mahdollista pÀÀstÀ korkeampiin taajuuksin kirjoittamalla kÀsin kalibrointiarvon flashiin.

[size=150]8. Pikakertaus[/size]

  1. Juota 32kHz kide
  2. Suorita kalibrointiohjelma
  3. Luo muokatut tiedostot Code Composeria varten (“msp430g2231_16MHz.cmd”,“lnk_msp430g2231_16MHz.cmd” ja “msp430g2231_16MHz.h”).
  4. Uutta projektia luodessasi muista valita “lnk_msp430g2231_16MHz.cmd”
  5. #Include <msp430g2231_16MHz.h>
  6. BCSCTL1 = CALBC1_16MHZ;
    DCOCTL = CALDCO_16MHZ;

[size=150]SiinÀpÀ se[/size]

Kumarrus ja kiitos loppuun asti lukeneille :smiley:

KysymyksiÀ voi esittÀÀ ja vastaan jos osaan.
Palaute ja parannusehdotukset ovat aina tervetulleita. :stuck_out_tongue:

EDIT:
LisÀsin noihin tavoite taajuuksiin Vuokon laskemat virheet ja lisÀsin siihen tuon ±20ppm ja ilmoitin worst case -tuloksen.

LisÀsin tuon kiteen tarpeettomuuden kalibroinnin jÀlkeen.

EDIT:
Jitterin selittellyÀ.

LisÀÀnpÀ virheen tÀuohon taulukon perÀÀn. Jos nyt laskin tÀmÀn oikein niin (kalibroitu taajuus-kellotaajuus)/kellotaajuus. 1MHz:lla tulee -576ppm. Jos tuolla tekee kellon niin silloin noin 29 minuutin pÀÀstÀ kello on sekunnin jÀlessÀ.

  • 1MHz ˜ 4096Hz * 244 = 999 424Hz -> -576 ppm
  • 2MHz ˜ 4096Hz * 488 = 1 998 848Hz -> -576 ppm
  • 3MHz ˜ 4096Hz * 732 = 2 998 272Hz -> -576 ppm
  • 4MHz ˜ 4096Hz * 977 = 4 001 792Hz -> 448 ppm
  • 5MHz ˜ 4096Hz * 1221 = 5 001 216Hz -> 243 ppm
  • 6MHz ˜ 4096Hz * 1465 = 6 000 640Hz -> 106 ppm
  • 7MHz ˜ 4096Hz * 1709 = 7 000 064Hz -> 9 ppm
  • 8MHz ˜ 4096Hz * 1953 = 7 999 488Hz -> -64 ppm
  • 9MHz ˜ 4096Hz * 2197 = 8 998 912Hz -> -121 ppm
  • 10MHz ˜ 4096Hz * 2441 = 9 998 336Hz -> -166 ppm
  • 11MHz ˜ 4096Hz * 2686 = 11 001 856Hz -> 168 ppm
  • 12MHz ˜ 4096Hz * 2930 = 12 001 280Hz -> 106 ppm
  • 13MHz ˜ 4096Hz * 3174 = 13 000 704Hz -> 54 ppm
  • 14MHz ˜ 4096Hz * 3418 = 14 000 128Hz -> 9 ppm
  • 15MHz ˜ 4096Hz * 3662 = 14 999 552Hz -> 30 ppm
  • 16MHz ˜ 4096Hz * 3906 = 15 998 976Hz -> 64 ppm

TÀhÀn sitten se huomio, ettÀ tuon referenssikellon tarkkuus on +/- 20 ppm. NÀin vÀsyneenÀ ei saisi tÀllÀisiÀ vÀitteitÀ heitellÀ lonkalta ilmaan, mutta jos 600ppm on sekunti puolessa tunnissa,niin 300 ppm on sekunti tunnissa, 150 ppm sekunti kahdessa tunnissa, 75 ppm sekunti neljÀssÀ tunnissa.

Olisiko niin, ettÀ kellon ulosotto tulee keskeytyksestÀ ja jos 32kHz kelloa jaetaan neljÀllÀ ja siellÀ on keskeytyksiÀ ja kellosignaali ei tule raudasta pihalle vaan ohjelmasta niin tuo voisi olla syy tuohon jitteriin. Jokin

main(){ while(1){ PORT ^= PORT; } } voisi olla myös hyvÀ skoopitettava.

Tai sitten syy on aivan jotain muuta. Parallaxin propellerista törmÀsin mielenkiintoiseen artikkeliin tÀstÀ synkkauksen puitteissa: http://www.linusakesson.net/programming/propeller/pllsync.php Uskomattoman hieno kehitystarina.

Flash ja muistit sieltĂ€ yleensĂ€ tippuvat ensimmĂ€isenĂ€. Sitten lĂ€htee vĂ€ylĂ€. Luku yleensĂ€ onnistuu nopeammalla nopeudella kuin kirjoitus, mutta siinĂ€ vaiheessa, kun nĂ€ihin törmÀÀ, on jo kaukana datalehden arvoista. Itse en saanut enÀÀn revittyĂ€ Atmelista yli 240% kellotaajuuksia pihalle suosiolla. Silloin jo mentiin epĂ€symmetrisellĂ€ kellolla ja tiedettĂ€essĂ€ kĂ€skyn vievĂ€n kaksi kellojaksoa, tuli toinen pulssi “hieman” ajoissa:) Normaali kĂ€yttö tippui 40% ylityksessĂ€, kun taisi muisti alkaa katoamaan.

HyvÀ idea nuo virheet! Jos et kauheasti pahastuisi laitan ne tuonne credittien kera :smiley:

Kokeilin myös tuota togglea.

[code]#include <msp430g2231_16MHz.h>

void main(void){
WDTCTL = WDTPW + WDTHOLD; // watchdog

//tarkista ettÀ [x]MHz on kalibroitu
if (CALBC1_16MHZ != 0xff && CALDCO_16MHZ != 0xff) {  
    //aseta kello
    BCSCTL1 = CALBC1_16MHZ;
    DCOCTL = CALDCO_16MHZ;
}

P1DIR |= (1<<0);
while(1){
    P1OUT ^= (1<<0);
}

}[/code]
toggle_16MHz_540.png

EDIT 1:
Ei esiinny jitteriĂ€ lĂ€heskÀÀn niin paljon uudella levyllĂ€ EIKÄ vanhallakaan jos jĂ€ttÀÀ tuon kellon mÀÀrittelemĂ€ttĂ€.

if (CALBC1_16MHZ != 0xff && CALDCO_16MHZ != 0xff) { //aseta kello BCSCTL1 = CALBC1_16MHZ; DCOCTL = CALDCO_16MHZ; }
korkkaamaton_1MHz_jitter_540.png

EDIT 2:
Northeastern University College of Computer and Information Sciencen sivulta löyty kiinnostava pdf

Sain kaavittua seuraavaa:
DCOCTL-rekisteri koostuu DCOx ja MODx osasta.

DCOx sijaitsee biteissÀ 7
5 ja sillÀ valitaan yksi DCO:n kahdeksasta(2^3=8) valmiiksi asetettusta taajuudesta.
MODx sijaitsee biteissĂ€ 4
0 ja sillĂ€ valitaan kuinka usein kĂ€ytetÀÀn korkeampaa fDCO+1-taajuutta 32:n DCO-kellon jaksonaikana. Lopulla ajalla kĂ€yetÀÀn valittua fDCO:ta

Nopeasti pÀÀteltynÀ tuo MODx voisi olla syypÀÀ tuohon kellosignaalin jitteriin. Se, ettÀ miksi 1MHz signaalissa esiintyy jitteriÀ johtuu luultavasti siitÀ, ettÀ tehtaalla on suosittu vakaampaa taajuutta vs oikea?

KĂ€ynnistyksen yhteydessĂ€ kontrolleri ei ilmeisesti lue noita flash:ssĂ€ sijaitsevia kalibrointiarvoja, koska jitteriĂ€ ei esiinny ennenkuin on mÀÀritellyt “DCOCTL = CALDCO_1MHZ;”.

okei ohjelma meni launchpadiin. tarkoittaako tuo punainen ledi ettÀ se meni lÀpi? se syttyy hetken virran laittamisen jÀlkee.

Taisi olla nÀin, jos ajoi 43oh-foorumin c-kielisellÀ kalibrointiohjelmalla.

ja tuon korjauksen kanssa syttyy vihreÀ ledi onnistumisen jÀlkeen.