You are on page 1of 52

FxDev.

org Sayfa 2














n Sz

2008de PIC ve CCS C ile baladm mikrodenetleyici programlama macerama 2009 ylnca Cnin
gcn grerek Hi-Tech ve PIC konusunda, daha sonrasnda ise 2009 ylnda WinAVR ile ilgili bir kitap
yazarak devam ettim.

Bu sre zarf boyunca Microchip PIC16, PIC18, PIC24, dsPIC30 ve dsPIC33F serilerinin yannda, NXP
firmasnn LPC serisi ARM mikrodenetleyicilerle ska alma frsat buldum. zellikle
mikrodenetleyiciler ile uraan herkesin son dura saylabilecek RTOS kullanmnn yannda C dilinin
gcn bir kez daha grdm.

Son dnemlerde ise g elektronii konusunda kendimi gelitirirken, mikrodenetleyicilerin oynad
kritik grevlere bizzat ahit oldum.

Bunlarn yannda zellikle analog ve sinyal ileme konusunda uzman olan Texas Ins. firmasnn
dnyada kullanmnn yaygnlamasn istedii ve ok dk g tketimiyle yola kan MSP430un
eitli vesilelerle kullanclara datlmas ve 16bit mikrodenetleyicilere yeni adm atmak isteyenlere
bir frsat domas benim de bu konuda alma yapmama vesile oldu.

Yukardaki dnceler nda hazrlanan kitap, sizlere MSP430 ile ilk admlar atmay retirken,
dier mikrodenetleyicilerde bulunmayan baz zellikler hakknda bilgi sahibi yapmann yan sra, Code
Composer Studionun kullanmn da sizlere aktaracaktr.
Frat Deveci
Austos 2011
fxdev@fxdev.org

Elektrik ve elektronie gnl veren herkese











FxDev.org Sayfa 3

BLM 1 MSP430 GENEL ZELLKLER VE OSC AYARLARI

1.1) MSP430F2013e Genel Bak

ekil 1 - MSP430F2013 Genel Yap

Hazrlanan not boyunca kullanlacak olan MSP430F2013n genel zellikleri tablo 1den
grlebilir.
Tablo 1- MSP430F2013 zellikleri
Frequency (MHz) 16
Flash (Kb) 2
SRAM (byte) 128
GPIO 10
Timers 16bit 1
Watchdog Var
Brown Out Reset Var
USI Var
Comparators Yok
Temp Sensor Var
ADC 16bit Sigma Delta
ADC Channel 4 adet

1.2) MSP430 Hakknda Genel Bilgi ve Dikkat Edilmesi Gereken Hususlar

MSP430 Texas Instrument firmasnn rettii ok dk g tketimiyle n plana kan bir
mikrodenetleyicidir. 16-bit RISC mimariye sahiptir, ierisinde I2C, SPI, USART, ADC gibi klasik
haline gelmi bir ok modl bulundurmaktadr.

MSP430 programlamak iin IAR Embedded Workbench zerine kurulu MSP430 derleyicisi ya
da Code Composer Studio kullanlmaktadr. Bu iki program da TI sitesinden cretsiz
indirilerek kullanlabilmektedir.

Code Composer Studionun kullanm basit olduundan, proje oluturma ve yaratma
ayarlarna deinilmeyecektir.

IAR Embedded Workbench program ile debug ilemleri yaplacanda zellikle aadaki
noktalara dikkat etmek gerekmektedir.

FxDev.org Sayfa 4


ekil 2 - MSP430 Option ayar

ncelikle ekil 2de grlen ksmdan options sekmesine girmek gerekir.


ekil 3 - Program Ayarlar

ekil 3te grlen Device ksmndan ncelikle programlayacamz ilemciyi semeli, daha
sonra Linker ksmndan Other->Output Format->Intel Standart seilmelidir. Bu ksm
nemlidir, nk bu ayar yaplmazsa MSP430 almamaktadr. Daha sonra Debugger
ksmndan FET Debugger, FET debugger ksmndan da TI USB-IF seip, Automatic ksmnn
yanndaki bo kareye basp MSP430un takl olduu COM portu seilmeli ve OK denmelidir.

FxDev.org Sayfa 5

1.3) MSP430 OSC Ayarlar

MSP430 kendi ierisinde kullanaca 3 adet saat kaynana sahiptir. Bunlar;

Master Clock (MCLK) : CPU ve birka evresel birim tarafndan kullanlr.
Sun-system Master Clock (SMCLK) : evresel birimler iin kullanlr.
Auxiliary Clock (ACLK) : evresel birimler iin kullanlr.

Bu birimlerin nasl balandklar ve ka nasl yansdklar ekil 4te grlebilir.

ekil 4 - Osilatr Kaynaklar

ekil 4te grlen MCLK veya SMCLK genellikle MHz dzeylerinde iken, ACLK birimi ise
genellikle kHz mertebesindedir. MSP430a saat sinyali reten 3 birim bulunur:

Low-or-high-freq-crystal-osc (LFXT1) : Genelde 32kHz civarndadr. Eer dtan
kristal kullanlacaksa MSP430 ile senkronize yaplmas gerekmektedir.

Internal Very-Low-Power-Low-Freq-Osc (VLO): Genellikle MSP430f2xx modellerinde
yaygndr. Kristal kullanlmayacaksa LFXT1in alternatifidir. Msp430f2013 iin hz 12kHzdir.

Digitally Controlled Osc (DCO) : Tm MSP430 entegrelerinde mevcuttur.
1us iinde almaya balayan, yazlmsal olara kontrol edilebilen, RC osilatrdr.

Frekans ayarlama ksm DCOCTL, BCSCTL1-3 registerleri ile IFG1 ve IE2 bitleri ile kontrol edilir.


ekil 5 - L or H Freq. Crystal Osc

FxDev.org Sayfa 6

1.3.1) VLO

VLO, 12kHz hznda alan internal osilatrdr ve LFXT1 yerine yeni modellerde kullanlr.
MSP430F2013 datasheetinde LFXT1 modl alrken 0.8uA, VLO alrken ise 0.5uA
ekildii sylenmitir. VLO, d etkenlere bal olarak 4kHzden 20kHze kadar deikenlik
gsterebilmektedir. Bunun iin zamann nem kazand devrelerde kullanlmamas gerekir.
Ayrca VLO kullanldnda LFXT1 modl etkisiz kalacandan P2.6 ve P2.7 pinleri dijital I/O
olurlar. Aadaki rnekte ise VLO saat kayna olarak seilmi, P2.6 ve P2.7 dijital I/O
yaplmtr.

#include "msp430.h" // MSP430 balk dosyas

void main( void )
{
int i;

WDTCTL = WDTPW + WDTHOLD; // Watchdog Timer' durdur.

BCSCTL3|=LFXT1S_2; // ACLK, VLO'dan gelecek
IFG1 &= ~OFIFG; // OSC hata bayra siliniyor

__bis_SR_register(SCG1 + SCG0); // DCO durduruluyor

BCSCTL2 |= SELM_3 | DIVM_0; // MCLK = LFXT1

P1DIR=0xFF; // P1 portu k olarak ynlendiriliyor

for(;;)
{
P1OUT^=0xFF;
// P1 k belirli bir gecikmeden sonra terslenecek
i=6000;while(i--); // Belirli bir gecikme salanyor.
}
}

1.3.2) Digitally Controlled Oscillator (DCO)

DCO birimi mikrodenetleyici enerjilendikten 1-2us iinde almaya balar.
RSELx ile 0.09-20MHz aralnda range belirlenirken,
DCOx ile de RSELx ile belirlenen aralktan %8 orannda frekans seer.

ekil 3 RSELx ve DCOx

FxDev.org Sayfa 7

RSELx ve DCOxin setii frekans deeri ise aadaki formlden hesaplanabilir.


Bu hesapla uralmamas iin derleyicinin iinde aadaki tanmlamalar yaplmtr.

BCSCTL1=CALBC1_1MHZ // Set range
DCOCTL =CALBC1_1MHZ // Set DCO step and modulation

CALBC1 kodu 1MHZ, 8MHZ, 12MHZ ve 16MHZ iin kullanlabilir.

Tm bunlar ayarladktan sonra saat kaynak seimi, div ilemlerinin ayarlar gibi ilemler iin
yine BCSCTL1-3 ayarlanmaldr.

Eer yukardaki kalplar kullanlmak istenmiyorsa aadaki rakamlar kullanlarak yine
istenilen frekans deeri elde edilebilir.

freq RSELx MOD DOCx
4MHz 1010 10111 101
8MHz 1101 00000 100
20MHz 1111 11010 110

1.4) Status Register Kullanarak Saat Modln Kontrol Etmek

Daha ok dk g operasyonlar ile ilgili ksmdr.
CPUOFF : MCLKyi deaktif eder, CPU ve MCLKyi kullanan d elemanlar durur.
SCG1 : SMCLKyi deaktif eder.
SCG0 : DC generatoru kapatr.
OSCOFF : VLO ve LFXT1i kapatr.

1.5) Dk G Tketimi

MSP403 ilemcisinin ekecei g yazlmsal olarak ayarlanabilmektedir.

Active Mode : MCLKyi deaktif eder, CPU ve MCLKyi kullanan d elemanlar durur.
LPM0 : SMCLKyi deaktif eder.
LPM3 : DC generatoru kapatr.
LPM4 : VLO ve LFXT1i kapatr.



FxDev.org Sayfa 8

instrinsics.h ktphanesi tanmlanarak,

__low_power_mode_3() eklinde o istenilen moda girilebilir ve
__low_power_mode_off_on_exit() ile tekrar aktif moda dnlebilir.

Ayrca;

__bis_SR_register(LPM3_bits) ile ayarlamalar yaplaca gibi
__bir_SR_register_on_exit(LPM3_bits) ile de bu moddan k yaplabilir.

1.6) Frekans Deerlerini Ayarlamak in Faydal Tablo


#define DCOCTL_ (0x0056) /* DCO Clock Frequency Control */
DEFC( DCOCTL , DCOCTL_)
#define BCSCTL1_ (0x0057) /* Basic Clock System Control 1 */
DEFC( BCSCTL1 , BCSCTL1_)
#define BCSCTL2_ (0x0058) /* Basic Clock System Control 2 */
DEFC( BCSCTL2 , BCSCTL2_)
#define BCSCTL3_ (0x0053) /* Basic Clock System Control 3 */
DEFC( BCSCTL3 , BCSCTL3_)
D
C
O
C
T
L

#define MOD0 (0x01) /* Modulation Bit 0 */
#define MOD1 (0x02) /* Modulation Bit 1 */
#define MOD2 (0x04) /* Modulation Bit 2 */
#define MOD3 (0x08) /* Modulation Bit 3 */
#define MOD4 (0x10) /* Modulation Bit 4 */
#define DCO0 (0x20) /* DCO Select Bit 0 */
#define DCO1 (0x40) /* DCO Select Bit 1 */
#define DCO2 (0x80) /* DCO Select Bit 2 */
B
C
S
C
T
L
1

#define RSEL0 (0x01) /* Range Select Bit 0 */
#define RSEL1 (0x02) /* Range Select Bit 1 */
#define RSEL2 (0x04) /* Range Select Bit 2 */
#define RSEL3 (0x08) /* Range Select Bit 3 */
#define DIVA0 (0x10) /* ACLK Divider 0 */
#define DIVA1 (0x20) /* ACLK Divider 1 */
#define XTS (0x40) /* LFXTCLK 0:Low Freq. / 1: High Freq. */
#define XT2OFF (0x80) /* Enable XT2CLK */

#define DIVA_0 (0x00) /* ACLK Divider 0: /1 */
#define DIVA_1 (0x10) /* ACLK Divider 1: /2 */
#define DIVA_2 (0x20) /* ACLK Divider 2: /4 */
#define DIVA_3 (0x30) /* ACLK Divider 3: /8 */
FxDev.org Sayfa 9

B
C
S
C
T
L
2

#define DIVS0 (0x02) /* SMCLK Divider 0 */
#define DIVS1 (0x04) /* SMCLK Divider 1 */
#define SELS (0x08) /* SMCLK Source Select 0:DCOCLK / 1:XT2CLK/LFXTCLK
*/
#define DIVM0 (0x10) /* MCLK Divider 0 */
#define DIVM1 (0x20) /* MCLK Divider 1 */
#define SELM0 (0x40) /* MCLK Source Select 0 */
#define SELM1 (0x80) /* MCLK Source Select 1 */

#define DIVS_0 (0x00) /* SMCLK Divider 0: /1 */
#define DIVS_1 (0x02) /* SMCLK Divider 1: /2 */
#define DIVS_2 (0x04) /* SMCLK Divider 2: /4 */
#define DIVS_3 (0x06) /* SMCLK Divider 3: /8 */

#define DIVM_0 (0x00) /* MCLK Divider 0: /1 */
#define DIVM_1 (0x10) /* MCLK Divider 1: /2 */
#define DIVM_2 (0x20) /* MCLK Divider 2: /4 */
#define DIVM_3 (0x30) /* MCLK Divider 3: /8 */

#define SELM_0 (0x00) /* MCLK Source Select 0: DCOCLK */
#define SELM_1 (0x40) /* MCLK Source Select 1: DCOCLK */
#define SELM_2 (0x80) /* MCLK Source Select 2: XT2CLK/LFXTCLK */
#define SELM_3 (0xC0) /* MCLK Source Select 3: LFXTCLK */
B
C
S
C
T
L
3

#define LFXT1OF (0x01) /* Low/high Frequency Oscillator Fault Flag */
#define XT2OF (0x02) /* High frequency oscillator 2 fault flag */
#define XCAP0 (0x04) /* XIN/XOUT Cap 0 */
#define XCAP1 (0x08) /* XIN/XOUT Cap 1 */
#define LFXT1S0 (0x10) /* Mode 0 for LFXT1 (XTS = 0) */
#define LFXT1S1 (0x20) /* Mode 1 for LFXT1 (XTS = 0) */
#define XT2S0 (0x40) /* Mode 0 for XT2 */
#define XT2S1 (0x80) /* Mode 1 for XT2 */

#define XCAP_0 (0x00) /* XIN/XOUT Cap : 0 pF */
#define XCAP_1 (0x04) /* XIN/XOUT Cap : 6 pF */
#define XCAP_2 (0x08) /* XIN/XOUT Cap : 10 pF */
#define XCAP_3 (0x0C) /* XIN/XOUT Cap : 12.5 pF */

#define LFXT1S_0 (0x00) /* Mode 0 for LFXT1 : Normal operation */
#define LFXT1S_1 (0x10) /* Mode 1 for LFXT1 : Reserved */
#define LFXT1S_2 (0x20) /* Mode 2 for LFXT1 : VLO */
#define LFXT1S_3 (0x30) /* Mode 3 for LFXT1 : Digital input signal */

#define XT2S_0 (0x00) /* Mode 0 for XT2 : 0.4 - 1 MHz */
#define XT2S_1 (0x40) /* Mode 1 for XT2 : 1 - 4 MHz */
#define XT2S_2 (0x80) /* Mode 2 for XT2 : 2 - 16 MHz */
#define XT2S_3 (0xC0) /* Mode 3 for XT2 : Digital input signal */

FxDev.org Sayfa 10

BLM 2 MSP430 GR IKI AYARLARI

MSP430F2013 denetleyicisinin pin yaps aadaki ekilde gsterilmitir.


ekil 4 MSP430F2013 Pin Yaps

ekilde de grlecei zere pin saysnn dk olmasndan dolay MSP430da bir pine birden
ok grev yklenmitir.

2.1) Pin Ynlendirmeleri ve Kullanm

Dier mikroilemcilerden farkl olarak MSP430da pin grevlerini zel olarak, dier
registerlerden bamsz semek mmkndr.
Genel anlamda ise pin ynlendirmelerini salayan registerler ve grevleri ksaca yledir.

PxIN : Port okuma registeridir. Sadece okuma yaplabilir.
PxOUT : Port k registeridir. Okuma ve yazma yaplabilir.
PxDIR : Port ynlendirmesidir.
Bit 1 olduunda k, 0 olduunda giritir.
Bu zellik itibari ile AVRlere benzemektedir.
PxREN : Pull-up diren ekleme ya da karma registeridir.
1 olduunda ilgili pine pull-up direnci balamaktadr.
PxSEL VE PxSEL2 : Pinlerin birincil ve ikincil grevlerini seme registerleridir.
zellikleri aadaki tablo 2de belirtilmitir.

Tablo 2 - Pin Grevlerinin Tanm


lk rneimizde pinlerin birinci grevlerini kullanarak P1.0 ve P1.4n birincil grevleri olan
srasyla ACLK ve SMCLK kristal frekanslarn bu bacaklardan grelim.
Bunun iin ncelikle P1SEL=0x11 olmaldr. Geri kalan program ise aadaki gibidir.





FxDev.org Sayfa 11

// MSP430F20xx
// -----------------
// /|\| |
// | | |
// --|RST |
// | |
// | P1.4/SMCLK|-->SMCLK = Default DCO // 8MHz u anlk
// | P1.1|-->MCLK/10 = DCO/10 // 800kHz
// | P1.0/ACLK|-->ACLK = 12kHz
//

#include <msp430.h>

void main(void)
{
WDTCTL = WDTPW +WDTHOLD; // Watchdog timer kapatlyor

// 1Mhz
// BCSCTL1 = CALBC1_1MHZ;
// DCOCTL = CALDCO_1MHZ;
// BCSCTL3= LFXT1S_2;

// 8Mhz
BCSCTL1= CALBC1_8MHZ; // Kristal u anlk 8MHz ayarlanyor
DCOCTL = CALDCO_8MHZ;
BCSCTL3= LFXT1S_2;

// 12Mhz
// BCSCTL1 = CALBC1_12MHZ;
// DCOCTL = CALDCO_12MHZ;
// BCSCTL3= LFXT1S_2;

// 16Mhz ayarlamak iin
// BCSCTL1 = CALBC1_16MHZ;
// DCOCTL = CALDCO_16MHZ;
// BCSCTL3= LFXT1S_2;

P1DIR |= 0xFF; // P1 portu k olarak ynlendiriliyor
P1SEL |= 0x11; // P1.0 ACLK, P1.4 SMCLK oluyor

for(;;)
{
P1OUT ^= 0x02; // P1.1 pini her dngde deitiriliyor
}
}

Resim 1de P1.4den kan sinyalin osiloskop eklini grebilirsiniz.
FxDev.org Sayfa 12


Resim 1 8MHz Clock Sinyali
2.2) Port Kesmeleri

P1 ve P2 portlar zerlerindeki deiimlere kesme retebilmektedirler. Ayrca bu kesmeleri
tm port deil, teker teker kontrol edebilmek de mmkndr.
Bu kesmeyi kontrol eden registerler ve grevleri ise yledir.

P1IE, P2IE : P1 veya P2 port deiim kesmesi aktif
P1IFG, P2IFG : P1 veya P2 port deiim kesme bayraklar. Burada dikkat
edilmesi gereken en nemli konu, eer port deiim kesmesi aktif edilirse ve o andan
sonra herhangi bir giri k, ynlendirme, porttan okuma yapma gibi ilemlerde bu
bayraklar set edilir. Bunun iin programda bu hususa dikkat edilmelidir.
P1IES, P2IES : P1 veya P2de hangi deiikliklerin kontrol edilecei belirtilir.
Hangi bitin hangi tetiklemeyi kontrol ettiini ise aada grebilirsiniz.

Tablo 3 - Tetikleme Kontrol

MSP430da, port deiimi kesme kontrol iin aadaki yap kullanlr:

#pragma vector=PORT1_VECTOR
__interrupt void isim(void)

#pragma vector=PORT1_VECTOR yerine #pragma vector=PORT2_VECTOR yazlarak P2nin
deiim kesmesi de gzlenebilir. Kesmenin knda ise ayn PICte olduu gibi kesme bayra
temizlenmelidir.

MSP430da kesmeleri amak iin ise _EINT(); fonksiyonu kullanlr.

Kesmelerle ilgili bilgiler daha sonraki blmlerde verilecektir.
FxDev.org Sayfa 13

BLM 3 MSP430 TIMER AYARLARI

3.1) TimerA Birimi

TimerA birimi 16bit ve 4 ayr moda alabilen bir timer birimidir. Saat kaynaklar istenildii
gibi seilebilir ve 2 ya da 3 adet capture/compare registeri ierir. Ayrca PWM ayarlamas da
yine bu sayc ile yaplabilir.

3.1.1) TimerA Sayc Modu


ekil 6 - TimerA Sayc Ksm

TimerA sayc ksm ekil 6da grlecei zere farkl saat kaynaklarndan beslenebilmektedir.
Bu kayna seen TASSELx bitleridir. Daha sonra seilen saat kayna IDx ile blm oranna
girer ve ykselen kenarda tetiklenmek zere 16 bitlik sayc saymaya balar. stenilen anda
TACLR biti 1 yaplarak TAR registerinin ierii sfrlanabilir. MCx ile sayc modlar seilir, sayc
moda gre, dolduunda kesme bayra eker.

TimerA ayarlanrken zamanlaycnn kapal olmas MSP datasheetinde nerilmitir. Ayrca
TimerAnn almas iin MCxin mutlaka sfrdan byk olmas gerekmektedir.

TimerAy kontrol eden registerler ise aadaki gibidir.







FxDev.org Sayfa 14

TASSELx Saat Kayna Seim Biti
00 TACLK
01 ACLK
10 SMCLK
11 INCLK
IDx Divider (Blc)
00 /1
01 /2
10 /4
11 /8
MCx Mode Kontrol
00 Stop Mode
01 Up Mode (TACCR0a kadar sayacak)
10 Continious Mode (0xFFFFe kadar sayacak)
11 TACCR0-0- TACCR0-0.. eklinde sayacak
TACLR TimerAy silen bit
TAIE TimerA interrupt enable
TAIFG TimerA interrupt flag

Dier registerler iin datasheete baknz.

3.1.1.1) TimerA Stop Modu

Bu modda sayc durdurulur. Bir nevi saycnn almayaca anlamna gelir.

3.1.1.2) TimerA Up Modu

Bu modda sayc TACCRx registerine yklenen deer kadar arttktan sonra sayc sfrlanr ve
tekrar sayc kendini TACCRxe kadar arttrr. ekil 7de bu modun alma ekli gsterilmitir.

ekil 7 TimerA Up Modu
Sayc up moddayken sayc dolduunda CCIFG, sfr deerine ulatnda ise TAIFG bayra set
edilir. Bu ksm ekil 8den ok net grlebilir.

ekil 8 - Up Modda Set Edilen Bayraklar


FxDev.org Sayfa 15

TimerA up mode alrken timer frekans aadaki forml ile hesaplanabilir.




lk rneimizde 1500Hzlik bir timer kuralm ve bunu P1.0dan darya alalm. Aadaki
program ncelikle TACCR0a kadar sayp kesme retecektir. Her dngde port dngs bir
kere deieceinden pinden alacamz frekans 750Hz olacaktr.

#include <msp430.h> // MSP430 balk dosyas

void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // Watchdog Timer' durdur.

BCSCTL1= CALBC1_16MHZ; // Kristal u anlk 16MHz ayarlanyor
DCOCTL = CALDCO_16MHZ;
BCSCTL3= LFXT1S_2;

TAR=0x0000; // TAR deeri sfrlanyor
TACTL=0x02D6;
// SMCLK seili, MOD1, 1:8, Interrupt Enable, Interrupt Flag temizleniyor
TACCR0= 1334;
// TACCR0 deerine 16.000.000/8=2.000.000/1500=1.334 ykleniyor

P1DIR=0xFF; // P1 k olarak ayarlanyor

for(;;)
{
if((TACTL&0x0001)==0x0001) // TimerA kesmesi bekleniyor
{
P1OUT^=0xFF; // Kesme gelince P1 klar tersleniyor
TACTL&=0xFFFE; // Kesme bayra temizleniyor
}
}
}

Yukardaki kodun alan halini resim 2de grebilirsiniz. Yalnz bu tr yazm olduka
amatrdr. imdi bunu gidermek iin TimerA kesmesini kullanacaz.


Resim 2 ~750Hz Clock Sinyali


FxDev.org Sayfa 16

#include <msp430.h> // MSP430 balk dosyas

// TimerA kesme vektr
#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P1OUT^=0xFF; // Kesme gelince P1 klar tersleniyor
}

void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // Watchdog Timer' durdur.

BCSCTL1= CALBC1_16MHZ; // Kristal u anlk 16MHz ayarlanyor
DCOCTL = CALDCO_16MHZ;
BCSCTL3= LFXT1S_2;

TAR=0x0000; // TAR deeri sfrlanyor
TACTL=0x02D6;
// SMCLK seili, MOD1, 1:8, Interrupt Enable, Interrupt Flag temizleniyor
TACCR0=1334;
TACCTL0=CCIE; // CCIFG interrupt' alyor

P1DIR=0xFF; // P1 k olarak ayarlnyor

_EINT(); // Genel kesmeler alyor

for(;;);
}

Bu rneimizde ise TimerA biriminin saat kaynan i kristal olan 12KHzden alp bir saniyede
bir led yakp sndren kodu yazacaz.

#include <msp430.h> // MSP430 balk dosyas

#pragma vector=TIMERA0_VECTOR
__interrupt void Timer_A (void)
{
P1OUT^=0xFF; // Kesme gelince P1 klar tersleniyor
}

void main( void )
{
WDTCTL = WDTPW + WDTHOLD; // Watchdog Timer' durdur.

BCSCTL3|=LFXT1S_2; // ACLK, VLO'dan gelecek
IFG1 &= ~OFIFG; // OSC hata bayra siliniyor
TAR=0x0000; // TAR deeri sfrlanyor
TACTL=0x0116; // ACLK seili, MOD1, 1:1, Interrupt Enable,
Interrupt Flag temizleniyor
TACCR0=6000; // TACCR0 deerine 12.000/1=12.000/2=6.000
ykleniyor
TACCTL0=CCIE; // CCIFG interrupt' alyor

P1DIR=0xFF; // P1 k olarak ayarlnyor

_EINT(); // Genel kesmeler alyor

for(;;);
}
FxDev.org Sayfa 17

Bu kod da istediimiz gibi gerekte almaktadr.

3.1.1.3) TimerA Continuous Modu

TimerA continuous modda alrken ekil 9da grld gibi ncelikle 0xFFFFe kadar sayar
ve daha sonra sayc sfrlanr. Sfrland anda ise TAIFG bayra set edilir.

ekil 9 - TimerA Cont. Mod

Bu konuda timer frekans aadaki formlle hesaplanr.




3.1.1.4) TimerA Up/Down Modu

TimerA up/down modda alrken sayc ekil-10da grld gibi nce TACCRxe kadar artarak
sonra da azalarak sayar. Sayc her seferinde dolduunda CCIFGve sfrlandnda ise TAIFG bayra set
edilir.

ekil 10 - TimerA Up/Down Modu
Bu konuda timer frekans aadaki formlle hesaplanr.




3.1.2) TimerA Up/Down Modunu Kullanarak Basit PWM Sinyali retmek

TimerAnn bir zellii de basit ekilde PWM retmektir. Bunun iin saycy up/down moda
almak ve TACCR0, TACCR1 ve TACCR2 registerlerini kontrol ederek basit PWM sinyali
retmek mmkndr.

ekil-10dan da grlecei zere ncelikle TimerA saat kayna seimi ve TACCR0 ile frekans
ayarlamas yaplr.

FxDev.org Sayfa 18


ekil 11 - PWM Oluturma Aamalar ve Dead Time

ekil-11de grlecei zere sayc sfrdan saymaya balar ve TACCR2ye kadar deeri 1 dir.
TACCR2ye ulatktan sonra sfr olur. Bu sfr olma ksm TACCR1e kadar srer. Bu ksma
dead time ad verilmektedir. Daha sonra TACCR1den TACCR0 ve tekrar TACCR1e kadar k
bir olduktan sonra periyodik ekilde bu sonsuza kadar devam eder. Bunlar oluurken
meydana gelen kesme olaylar ise yine ekil-11den grlebilir. Bu kesmelerden yola klarak
istenildii gibi PWM sinyalleri retilebilir.

Dead Time=(TACCR1-TACCR2) eklinde hesaplanr.























FxDev.org Sayfa 19

BLM 4 MSP430 LE LCD UYGULAMASI

4.1) LCD Ekran Hakknda Genel Bilgiler

ekil-12de bir rnei grlen karakter LCDler darya bilgi aktarmak iin kullanlan en
yaygn birimlerdendir. Genel itibari ile Hitachi firmasnn HD44780 entegresini ve trevlerini
tayan karakter LCDler eitli metotlarla srlrler. Biz bu blmde ekil-12de de
grlebilecek 2x16 yani 2 satr ve her satrda 16 karakter yazabilen karakter LCDleri
inceleyeceiz.


ekil 12 - 2x16 Karekter LCD

Karakter LCDlerin genelinde her harf ekil-13te grlecei gibi 5x7lik birimler halinde
ekillenirler. Altta bo kalan son birim ise imle iindir.

ekil 13 - 5x7 Karekter Oluumu

LCD birimi genellikle normal entegre g biriminden ayr bir de arka aydnlatma gc
verilerek kullanlrlar. Bu birimin nasl srlecei ise ekil-14te gzkmektedir.

ekil 14 - LCD G Balants

FxDev.org Sayfa 20

Karakter LCDlerin oluturabilecei her bir karakter ise karakter LCDnin zel CGROM
hafzasna kaydedilmilerdir. ASCII karakter uyumu olan karakterlerin listesi tablo-4de
grlebilmektedir.
Tablo 4 - LCD Karakter Tablosu

ekil-4te de grlecei zere CGROMun ilk 8 karakterlik (0x00..0x0F) ksm botur ve
yazlabilirdir. Bu kullancya tabloda olmayan karakterleri kendisi tanmlamasna olanak
salar.

Karakter LCDlerin genelinde 16 bacak bulunur. Bunlarn 14 tanesi LCDyi kontrol etmek
amal kullanlrken, 15 ve 16. bacaklar genellikle LCD arka iin kullanlrlar. LCD arka
yazlarn daha belirgin gzkmesi iin gereklidir.

Bu bacaklarn grevini srasyla verecek olursak;

1 - GND : Toprak ucudur
2 - VCC : +5V verilecek utur
3 - VEE : Kontrast ucudur, bir pot vastasyla +5V-0V aralnda srlmelidir
4 - RS : Gelen bilginin komut mu data m olduu bu ula belirlenir
(0: Komut, 1: Data)
5 - RW : LCDye veri yazma ya da okuma yetkilendirme ucudur (0: Yazma, 1: Okuma)
6 - E : Enable ucudur, LCDye bilgi giri kn kontrol eden utur, den kenar
tetiklemelidir
7..14 - Data : Data ulardr, bilgi giri klar bu bacaklar sayesinde olur
15,16 - BL : Backlight anot, katot uardr
FxDev.org Sayfa 21


Karakter LCDlerin kullanlmas, led, diren srm gibi olmamaktadr. Karakter LCD
kullanmnda, enerjiyi ilk verdiimiz anda karakter LCDyi nasl kullanmak istediimizi LCDye
belirli kurallar erevesinde iletmemiz gerekmektedir.

4.2) MSP430, 74HC595 ve LCD

MSP430un bacak saysnn kstl olmasndan dolay, dier ilevleri yerine getirmek iin LCD
ekran 74HC595 port oullac ile kullanmak ou ilemde bizlere kolaylk salamaktadr.

ekil-15te grlebilecek 74HC595 entegresi 100Mhze kadar alabilen 8 bitlik bir shift
registerdir. Bu zellii sayesinde 74HC595 entegresi ayrca DS ucundan girilen seri bilgileri
istenildii an Q0..Q7 ularndan paralel bilgi olarak alnmasna olanak salar.

ekil 15 - 74HC595 DIP Yaps

ekil-15te grlen pinlerin grevleri ise yledir;

Q0..Q7 - Paralel klar
DS - Seri data girii
OE - k ak
SH_CP - Shift register saat kayna
ST_CP - Kaydedici registerin saat kayna
MR - Reset ucu
Q7 - Seri data k
GND - Toprak ucu
Vcc - +5V

74HC595in alma mant ise yledir;
- OE ucu toprak hattna, MR ucu ise +5Va balanr,
- DS ucundan seri bilgi girii SH_CPnin her ykselen kenarnda shift edilerek kaydedici
registere yazlr,
- 8 kmz olduu iin bu ilem 8 kez gerekletirilir,
- Tm bu ilemler gerekleirken Q0..Q7 klarnda bir deiiklik olmaz,
- Son olarak kaydrma ilemi bittiinde kaydedici registerdeki deerin Q0..Q7 ularna
yansmas iin ST_CP ucuna ykselen kenarda sinyal verilir,
FxDev.org Sayfa 22

- Son olarak Q0..Q7 ularnda, ilk giren bilgi Q7 de son giren bilgi ise Q0da olmak koulu ile
sralama tamamlanr.
rnek olarak 0xA5nn ulara iletimini rnek verelim;

0xA5=0b10101001 olur. lk giren Q7de olacana gre ncelikle A5in en yksek biti olan 7.
Biti gndermeliyiz. Daha sonra ise 6,5,4.. eklinde bunu srdrmeliyiz.
Cde bu ilemi aadaki fonksiyon ile salayabiliriz.

void three_wire_control(unsigned char temp)
{
char i;
for(i=0;i<8;i++)
{
if(temp&0x80)
LCD_PORT |=DataIO_Pin;
else
LCD_PORT&= ~DataIO_Pin;
LCD_PORT|=Clock_Pin;
LCD_PORT&=~Clock_Pin;

temp*=2;;
}
LCD_PORT|=Enable_Pin;
LCD_PORT&=~Enable_Pin;
}

lem takip edilirse ncelikle 7. bitin daha sonra ise dier dk bitlerin, en sonunda ise 0.
bitin ka gnderildii grlebilir. Bu ekilde port geniletme ilemimizi de (3ten 8e)
gerekletirmitir.

Fakat bu ilemi LCDde gerekletirmek iin ncelikle LCD ktphanesinde baz deiiklikler
yapmamz gerekmektedir. Yapacamz modifiyenin rneini tek fonksiyonda gsterirsek,
kodlarmz aadaki gibi olacaktr.

~LCD dosyasnn orjinalini Hi-Tech ile Pic Programlama kitabnda bulabilirsiniz~

void lcd_komut(unsigned char c)
{
unsigned char temp;
temp = 0x00;
temp |= 0x04;
three_wire_control(temp);
temp |= ( c & 0xF0 );
three_wire_control(temp);
temp &= 0xF0;
three_wire_control(temp);
lcd_busy();
temp = 0x00;
temp |= 0x04;
three_wire_control(temp);
temp |= ( (c & 0x0F)<<4 );
three_wire_control(temp);
temp &= 0xF0;
three_wire_control(temp);
lcd_busy();
}
FxDev.org Sayfa 23

Kodlar dikkatle incelerseniz aslnda yaplan iin tm giri klar 8 bit haline getirmek
olduu rahatlkla grlebilir.

Tm kodlar bu ekilde modifiye edip, son olarak 3-Wire fonksiyonumuzu da ekleyip
ktphane haline getirirsek lcd.h dosyamz aadaki gibi olacaktr.

/* www.FxDev.org
* 3 Kablolu 2x16 LCD Kullanm Klavuzu
* 74LS595 ile birlikte kullanlmaldr.
* Cursor kapaldr.
*
* lcd_init(); ile LCD'nin ilk ayarlarn yap
* lcd_clear(); ile LCD'yi sil
* lcd_yaz("deneme"); eklinde yaz yazdr.
* veri_yolla('F'); eklinde tek ascii kodu yazdr.
* lcd_gotoxy(1,13); eklinde LCD'nin istenilen yerine git.
* www.FxDev.org
*/

#define LCD_PORT P1OUT // LCD'nin baland port
#define Clock_Pin BIT0 // 74LS595 Clk girii, ykselen kenar
#define DataIO_Pin BIT1 // 74LS595 Data girii
#define Enable_Pin BIT2 // 74LS595 Enable girii

/* LCD'de kullanilan komutlarin tanimlamasi*/
#define Sil 1 // Ekrani temizler
#define BasaDon 2 // Imleci sol st kseye getirir
#define SolaYaz 4 // Imlecin belirttigi adres azalarak gider
#define SagaYaz 6 // Imlecin belirttigi adres artarak gider
#define ImlecGizle 12 // Gstergeyi ac, kursor grnmesin
#define ImlecAltta 14 // Yanip snen blok kursor
#define ImlecYanSon 15 // Yanip snen blok kursor
#define ImlecGeri 16 // Kursor bir karakter geri kaydir
#define KaydirSaga 24 // Gstergeyi bir karakter saga kaydir
#define KaydirSola 28 // Gstergeyi bir karakter sola kaydir
#define EkraniKapat 8 // Gstergeyi kapat (veriler silinmez)
#define BirinciSatir 128 // LCD'nin ilk satir baslangic adresi
// (DDRAM adres)
#define IkinciSatir 192 // Ikinci satirin baslangic adresi
#define KarakUretAdres 64 // Karakter reteci adresini belirle
// (CGRAM adres)
/* LCD'de Kullanilan Fonksiyon Seimi */
#define CiftSatir8Bit 56 // 8 bit ara birim, 2 satir, 5*7 piksel
#define TekSatir8Bit 48 // 8 bit ara birim, 1 satir, 5*7 piksel
#define CiftSatir4Bit 40 // 4 bit ara birim, 2 satir, 5*7 piksel
#define TekSatir4Bit 32 // 4 bit ara birim, 1 satir, 5*7 piksel

extern void three_wire_control(unsigned char temp);
extern void veri_yolla(unsigned char);
extern void lcd_clear(void);
extern void lcd_yaz(const char * s);
extern void lcd_gotoxy(unsigned char x, unsigned char y);
extern void lcd_init(void);
extern void lcd_enable(void);
extern void lcd_komut(unsigned char c);


Tm bu fonksiyonlar yerine getiren lcd.c dosyamz ise aadaki gibi olacaktr.
FxDev.org Sayfa 24

#include <msp430.h>
#include "lcd.h"
#include "delay.h"

void three_wire_control(unsigned char temp)
{
char i;
for(i=0;i<8;i++)
{
if(temp&0x80)
LCD_PORT |=DataIO_Pin;
else
LCD_PORT&= ~DataIO_Pin;
LCD_PORT|=Clock_Pin;
LCD_PORT&=~Clock_Pin;

temp*=2;;
}
LCD_PORT|=Enable_Pin;
LCD_PORT&=~Enable_Pin;
}

void lcd_busy(void)
{
DelayUs(100);
}

void lcd_komut(unsigned char c)
{
unsigned char temp;
temp = 0x00;
temp |= 0x04;
three_wire_control(temp);
temp |= ( c & 0xF0 );
three_wire_control(temp);
temp &= 0xF0;
three_wire_control(temp);
lcd_busy();
temp = 0x00;
temp |= 0x04;
three_wire_control(temp);
temp |= ( (c & 0x0F)<<4 );
three_wire_control(temp);
temp &= 0xF0;
three_wire_control(temp);
lcd_busy();
}

void veri_yolla(unsigned char c)
{
unsigned char temp=0;
temp |= 0x05;
three_wire_control(temp);
temp |= ( c & 0xF0 );
three_wire_control(temp);
temp &= 0xF1;
three_wire_control(temp);
lcd_busy();
temp = 0x00;
temp |= 0x05;
three_wire_control(temp);
FxDev.org Sayfa 25

temp |= ( (c & 0x0F)<<4 );
three_wire_control(temp);
temp &= 0xF1;
three_wire_control(temp);
lcd_busy();
}

void lcd_clear(void)
{
lcd_komut(0x1);
DelayMs(2);
}

void lcd_yaz(const char *s)
{
lcd_busy();
while(*s)
veri_yolla(*s++);
}

void lcd_gotoxy(unsigned char x,unsigned char y)
{
if(x==1)
lcd_komut(0x80+((y-1)%20));
else
lcd_komut(0xC0+((y-1)%20));
}

void lcd_enable(void)
{

three_wire_control(0x04);_NOP();_NOP();_NOP();_NOP();three_wire_control(0x
00);
}

void lcd_init()
{
three_wire_control(0);

DelayMs(100);
lcd_komut(0x03);
DelayMs(10);
lcd_enable();
DelayMs(10);
lcd_enable();
lcd_komut(0x02);
DelayMs(20);

lcd_komut(CiftSatir4Bit);
lcd_komut(SagaYaz);
lcd_komut(ImlecGizle);
lcd_clear();

lcd_komut(BirinciSatir);
}





FxDev.org Sayfa 26

Ktphanemizi tanmladktan sonra, istediimiz herhangi bir yazy LCDmize yazdralm.

ekil 16 - 74HC595 ile 2x16 LCD Uygulamas
ekil-16daki devreyi altran kodumuz ise aadadr.

// MSP430F2013
// . -----------------
// /|\ | |
// | | |
// --|RST |
// | P1.0|-->Clock
// | P1.1|-->Data
// | P1.2|-->Enable
//

#include <msp430.h>
#include "delay.h"
#include "lcd.h"

void main(void)
{
WDTCTL = WDTPW +WDTHOLD; // Watchdog timer kapatlyor

// alma frekans 16Mhz
BCSCTL1 = CALBC1_16MHZ;
DCOCTL = CALDCO_16MHZ;
BCSCTL3= LFXT1S_2;

P1DIR = 0x07; // P1.0, P1.1, P1.2 k olarak tanmlanyor
P1SEL = 0x00; // P1 GPIO oldu

DelayMs(250); // LCD'nin ilemcisinin stabil olmas
// iin 250ms bekleniyor
lcd_init();

lcd_gotoxy(1,1);
lcd_yaz("FxDev.org-MSP430");
lcd_gotoxy(2,1);
lcd_yaz("3-WIRE-LCD DEMO");

for(;;);
}


FxDev.org Sayfa 27

Devrenin gereklenmi halini (LCD ve 74HC595i) ise resim 3te grebilirsiniz.


Resim-3 74HC595 ile 2x16 LCD Uygulamasnn Gereklenmesi

4.3) MSP430, LCD ile Sayc Uygulamas

LCD kullanmnn ardndan bunu bir rnee dkelim. u ana kadar rendiimiz aamalardan
0-9999 saniye sayc uygulamasn rahatlkla gelitirebiliriz. Bunun iin ncelikle ekil 17deki
devreyi kuruyoruz.

ekil 17 - 0/9999 Saniye Sayici Uygulamas

ekil 17deki devreyi kurduktan sonra blm 3.1.1deki Timer A modunu kullanarak bir
saniyede bir zamanlayc kesmesi veren programmz yazalm. Bunun iin saat kaynamzn
frekansn 8Mhz kabul ederek 3.1.1de verilen forml 25msde bir kesme oluacak ekilde
iletildiinde TACCRRxe yklenecek deer 25000 olarak bulunur.

Sylediklerimizin nda isteimizi yerine getiren kod beini aada bulabilirsiniz.

FxDev.org Sayfa 28

// MSP430F2013
// . -----------------
// /|\ | |
// | | |
// --|RST |
// | P1.0|-->Clock
// | P1.1|-->Data
// | P1.2|-->Enable
// | |
//

#include <msp430.h>
#include "delay.h"
#include "lcd.h"

char flag=0,
i =0;
int sayi=0;

void main(void)
{
WDTCTL = WDTPW +WDTHOLD; // Watchdog timer kapatlyor

// alma frekans 8Mhz
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;
BCSCTL3= LFXT1S_2;

P1DIR = 0x07; // P1.0, P1.1, P1.2 k olarak tanmlanyor
P1SEL = 0x00; // P1 GPIO oldu

DelayMs(500); // LCD'nin ilemcisinin stabil olmas
// iin 250ms bekleniyor
lcd_init();

lcd_gotoxy(1,1);
lcd_yaz("FxDev.org-MSP430");
lcd_gotoxy(2,1);
lcd_yaz("0-9999sn Sayici");
DelayMs(2000);

TAR=0x0000; // TAR deeri sfrlanyor
TACTL = TASSEL_2 + MC_3 + TAIE;
// SMCLK seili, MOD1, 1:8, Interrupt Enable, Interrupt Flag temizleniyor
TACCR0=25000;
// TACCR0 deerine 8.000.000/8=1000000/40=25000 ykleniyor

_EINT();

lcd_clear();
lcd_gotoxy(1,1);
lcd_yaz("Sayi=");

for(;;)
{
lcd_gotoxy(1,6);
veri_yolla((sayi/1000)+48);
veri_yolla((sayi%1000)/100+48);
veri_yolla((sayi%100)/10+48);
veri_yolla('.');
veri_yolla((sayi%10)+48);
FxDev.org Sayfa 29

lcd_yaz("sn");
}
}

// TimerA kesme vektr
#pragma vector=TIMERA1_VECTOR
__interrupt void Timer_A (void)
{
i++;
if(i==40)
{
if(sayi<10000) sayi++; else sayi=0;
i=0;
}

TACTL&=0xFFFE; // Kesme bayra temizleniyor
}

Uygulamann alr hailini resim 4de grebilirsiniz.


Resim-4 0/9999 Saniye Sayc Uygulamas









FxDev.org Sayfa 30

BLM 5 MSP430 ADC LEMLER

Bu kitab hazrlarken blm 1de bahsettiimiz MSP430F2013n normal ADC blou yerine
blok diyagramn ekil 18de greceiniz 16 bitlik sigma delta modlasyonlu ADC mimarisine
sahiptir. Bu birim aadaki zelliklere sahiptir;

Yazlmsal olarak seilebilen referans gerilimi (1.2V)
Yazlmsal olarak seilebilen d ya da i referans kayna
sel scaklk sensr barndrma
1.1MHz hzna kabilme
Yksek empedans giri buffer


ekil 18 - SD16_A Birimi





FxDev.org Sayfa 31

5.1) Modlasyon Nedir?

Sigma delta modlasyonu yksek znrlkl kodlama yapmak iin kullanlan bir metottur.
Analog ve dijital sinyal ilemede sklka kullanlan bu yntem ADC, DAC, frekans reticiler,
anahtarlamal g kaynaklar ve motor denetleyiciler gibi bir ok uygulamada aktif olarak
kullanlrlar. zellikle MP3 gibi gncel uygulamalarn kodlamasnda da sigma delta
modlasyon kullanlmaktadr.

Sigma delta modlasyonun almas ekil 19da grlebilir.

ekil 19 - Sigma Delta Modlasyon




FxDev.org Sayfa 32

ekil 19dan da grlecei zere sigma delta modlasyon hassas evrim yapabilmek iin giri
gerilimine gre tatikleme sinyali retir. Bu bir nevi PWM kullanarak DAC yapmaya benzer.
Gerilim seviyesi arttka tetikleme sinyali says artar , bu tetiklemelerin says saylarak
gerilim deeri renilebilir.

5.2) ADC lemleri

5.2.1) Referans Belirleme

MSP430 ile ADC ilemine balamadan nce her ADC ileminde olduu gibi gvenilir bir
referans gerilimine ihtiyacmz vardr. ekil 20de grnen ksmda MSP430un referans
seimi yaplabilmektedir.

ekil 20 - ADC Referans Blou

ekil-20den de grlecei zere SD16CTL registerinde bulunan SD16REFON biti ile isel 1.2V
referans kayna aktif edilir. Ayrca bu gerilim SDVMIDON biti ile darya alnabilir. Bu ekilde
kullanmda bu kaynaktan en fazla 1mA almak mmkndr. 1.2V bu ekilde entegre dna
alndnda besleme ular arasna 470nF koyulmas nerilmitir.

5.2.2) evrim Frekans Belirleme

ADC biriminin bir dier nemli ayar da evrim sresinin belirlenmesidir. ekil-21de
MSP430un ADC frekans belirleme birimi grlmektedir.

ekil 21 - SD16_A Frekans Blou

Bu blok ekil 21den de grlecei zere her trl saat kayna ile beslenebilmektedir. Ayrca
iki ayr frekans blc birimi de ierisinde barndrmaktadr. ADC evrim hz 1.1MHze kadar
kabilmektedir.



FxDev.org Sayfa 33

5.2.3) Kanal Seimi ve Filtre Bloklar

MSP430 SD16_A biriminin son ksm ekil 22de grlen ksmdr. Bu blm kanal seme
birimi, harici buffer, kazan birimi, 2. derece sigma delta modlasyonu ve filtre birimini
barndrr.
lk 5 kanal normal ADC girileri iken, A5 isel direnlerle blnm deeri ve A6 ise isel
scaklk sensrn okumaktadr. A7 ise kendi ierisinde ksa devre edilmitir.

ekil 22 - ADC Giri ve Filtre Birimleri

5.2.4) ADC Kullanm Registerleri

5.2.4.1) SD16CTL

MSP430da ADC kullanlmadan ilk nce SD16CTL registeri ayarlanmaldr. Bu registerin
zellikleri aada gsterilmitir.




FxDev.org Sayfa 34

Bit 15-12 - Ayrlm alan
Bit 11-9 SD16XDIVx 000 - / 1
001 - / 3
010 - / 16
011 - / 48
1xx - / Ayrlm alan
Bit 8 SD16LP 0: Low power mod deaktif
1: Low power mod aktif
Bit 7-6 SD16DIVx 00 - / 1
01 - / 2
10 - / 4
11 - / 8
Bit 5-4 SD16SSELx 00 - / MCLK
01 - / SMCLK
10 - / ACLK
11 - / External TACLK
Bit 3 SD16VMIDON 0: 1.2V ka yansmayacak
1: 1.2V ka yansyacak
Bit 2 SD16REFON 0: Referans kapal
1: Referans ak
Bit 1 SD16OVIE 0: Tama kesmesi aktif deil
1: Tama kesmesi aktif

Bu bitten nce GIE aktif yaplmal.
Bit 0 - Ayrlm alan

5.2.4.2) SD16CCTL0

Bu register ile ilgili birimin tm filtre ilemleri ile evrim modlar ve sonularn nasl elde
edilecei bilgileri ele alnmaktadr. Ayrca kesme bayraklar ve kesme izin bitleri ile giri
buffernn kullanlp kullanlmayaca da yine bu registerle ayarlanabilmektedir.






FxDev.org Sayfa 35

Bit 15 - Ayrlm alan
Bit 14-13 SD16BUFx 00 - / Buffer kullanlmayacak
01 - / Yava hz
10 - / Normal hz
11 - / Yksek hz
Bit 12 SD16UNI 0: Bipolar mod
1: Unipolar mod
Bit 11 SD16XOSR Gelitirilmi ar rnekleme biti
Bit 10 SD16SNGL 0: Devaml evrim modu
1: Tek evrim modu
Bit 9-8 SD16OSRx SD16XOSR=1 ise;
00: 256
01: 128
10: 64
11: 32
SD16XOSR=0 ise;
00: 512
01: 1024
10: -
11: -
Bit 7 LSBTOG LSB toggle biti, bu bit aktifse SD16LSBACC, SD16MEM0
okunduka srekli toggle yapar.
0: Toggle kapal
1: Toggle ak
Bit 6 LSBACC Bu bit evrimin dk ya da yksek bitli deerleri okuma izni
verir.
0: SD16MEMx yksek bite eriim izni verildi
1: SD16MEMx dk bite eriim izni verildi
Bit 5 SD16OVIFG Tama kesmesi bayra
0: Tama yok
1: Tama var
Bit 4 SD16DF SD16_A Data format
0: Offset binary
1: 2s complement
Bit 3 SD16IE SD16_A kesme izin biti
0: zin yok
1: zin var
Bit 2 SD16IFG SD16_A kesme bayra
0: Kesme yok
1: Kesme olutu
Bit 1 SD16SC SD16_A evrimini balat
0: evrim balatma
1: evrim balat
Bit 0 - Ayrlm bit


FxDev.org Sayfa 36

ok ksa register bitlerinin grevlerinden bahsedelim; ncelikle bit 14 ve 13e bakldnda
giriteki buffer ayarladn grebilirsiniz. Hata orann drmek iin kullanlan yksek
empedans girileri aadaki ekilde tanmlanmtr. lm frekansnza gre bu
empedanslarn seimi, lm hatalarn engelleyecektir.



Bit 12 ve bit 4te bahsi geen bit ise okunan deerin iaretli olup olmamasn belirler. Bunun
ayrntsn ekil 23te grebilirsiniz.

ekil 23 - aret Seme

Bit 10 biti ile de evrimi ister srekli isterseniz de tek seferde yapabilmeniz mmkndr.

5.2.4.3) SD16INCTL0

Bu register kesme zamann, giri kazancn ve kanal seimi ile ilgilidir.



Bit 7-6 SD16INTDLYx Kesmenin ne zaman olacan belirten bitler
00 - 4 rnek kesmeye neden olur
01 - 3 rnek kesmeye neden olur
10 - 2 rnek kesmeye neden olur
11 - 1 rnek kesmeye neden olur
Bit 5-3 SD16GAINx Giri n kazans
000 x1
001 x2
FxDev.org Sayfa 37

010 x4
011 x8
100 x16
101 x32
110 ayrlm
111 ayrlm
Bit 2-0 SD16INCHx Giri kanal seme bitleri
000 A0
001 A1
010 A2
011 A3
100 A4
101 A5 (AVCC AVSS) / 11
110 A6 Scaklk sensr
111 A7 PGA ofset lm iin ksa devre

5.2.4.4) SD16MEM0

ADC evriminin sakland 16bit registerdir.



5.2.4.5) SD16AE

Bu register giri birimlerinin toprak hatlarnn nereye balanacan belirtir. Normal durumda
toprak hatlarnn tm MSP430un VSSine baldr. Birimlerin topraklar bitler 1 olduunda
d kaynaa, sfr olduunda ise VSSye bal olurlar.







FxDev.org Sayfa 38

5.3) ADC Uygulamas

Yukardaki teorik ksmlardan sonra ilk uygulamamz gerekletirelim. Bu uygulamamzda
ekil 24te grlen P1.4/A2 kanalna bir pot balayarak 0-65535 arasndaki register deerini
LCDye yazdralm.

ekil 24 - MSP430 Pinout emas

ncelikle ekil 25teki devreyi kuralm.

ekil 25 - ADC lm Devresi

Daha sonra aadaki kod ile isteimizi yerine getirelim. Burada srekli evrim ile registere
srekli evrimi yazdralm ve SD16 kesmesiyle evrim bittiinde okunan deeri sayi
deikenine aktaralm.

// MSP430F2013
// . -----------------
// /|\ | |
// | | |
// --|RST |
// | P1.0|-->Clock
// Vin+ -->|A2+ P1.4 P1.1|-->Data
// |A2- = VSS P1.2|-->Enable
// | |
//

#include <msp430.h>
FxDev.org Sayfa 39

#include "delay.h"
#include "lcd.h"

char flag=0,
i =0;
unsigned int sayi=0;

void main(void)
{
WDTCTL = WDTPW +WDTHOLD; // Watchdog timer kapatlyor

// alma frekans 8MHz
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;
BCSCTL3= LFXT1S_2;

P1DIR = 0x07; // P1.0, P1.1, P1.2 k olarak
tanmlanyor
// P1.0, P1.1, P1.2 GPIO,
P1.4 A2 olarak ilev yapacak

// Giri frekans 48'e blnyor, rnekleme frekansmz 166kHz
// 1.2V referans gerilimi aktif
// SMCLK frekans kayna olarak kullanlacak, 8MHz
SD16CTL= SD16XDIV1 | SD16XDIV0 | SD16REFON | SD16SSEL_1;
// A2+ seildi, kazan 1, 4 rnek sonra kesmeye girilecek
SD16INCTL0=SD16INCH_2;
// Kesme aktif
// evrim unipolar, yani 0V=0, 3.3V=0xFFFF olacak
// evrim memory'nin son 16 bitine atlacak
// evrim unipolar
// 256OSR
SD16CCTL0 = SD16UNI | SD16IE;
// Tm A-'ler VSS'ye balanacak
SD16AE = 0;

DelayMs(250); // LCD'nin ilemcisinin stabil olmas
// iin 250ms bekleniyor
lcd_init();

lcd_gotoxy(1,1);
lcd_yaz("FxDev.org-MSP430");
lcd_gotoxy(2,1);
lcd_yaz("SD16 ADC Ornegi");
DelayMs(2000);

// evrime balanyor
SD16CCTL0 |= SD16SC;

_EINT(); // Enter LPM0 w/ interrupt

lcd_clear();
lcd_gotoxy(1,1);
lcd_yaz("Sayi=");

for(;;)
{
lcd_gotoxy(1,6);
veri_yolla((sayi/10000)+48);
veri_yolla((sayi%10000)/1000+48);
veri_yolla((sayi%1000)/100+48);
FxDev.org Sayfa 40

veri_yolla((sayi%100)/10+48);
veri_yolla((sayi%10)+48);
}
}

// SD16 kesme vektr
#pragma vector = SD16_VECTOR
__interrupt void SD16ISR(void)
{
sayi=SD16MEM0;
SD16CCTL0&=~SD16IFG; // Kesme bayra temizleniyor
}

Yukardaki kodun alr halini ise resim 5te grebilirsiniz.


Resim-5 ADC Uygulamas

5.4) A5 Kanaln Okuma

Blm 5.2de belirtilen registerlerden de grebileceiniz zere A5 kanal zel bir kanaldr.
Bize (Vdd-Vss)/11 gerilimini vermektedir. Buradaki gerilimi okumak iin ekil 25deki devreyi
hibir deiiklik yapmadan kullanabilirsiniz.

A5ten okuma yapmak iin ise aadaki koddan da grebileceiniz zere kk bir deiiklik
yapmamz gerekmektedir. Ayrca gerilim referans 1.2V olduu iin, Vss: 0, 1.2V: 65535
olacandan buna gre katsaymz da programa adapte edelim.
ekil 26da grlecei zere gerilim deerimiz Vcc/5 olacaktr. A5- Vssye balanacaktr.

ekil 26 - A5 Blm
FxDev.org Sayfa 41

steimizi yerine getiren kod beini aada grebilirsiniz.

// MSP430F2013
// . -----------------
// /|\ | |
// | | |
// --|RST |
// | P1.0|-->Clock
// |A5 P1.1|-->Data
// |A5- = VSS P1.2|-->Enable
// | |
//

#include <msp430.h>
#include "delay.h"
#include "lcd.h"

char flag=0,
i =0;
unsigned int sayi=0,
temp=0;

void main(void)
{
WDTCTL = WDTPW +WDTHOLD; // Watchdog timer kapatlyor

// alma frekans 1MHz
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;
BCSCTL3= LFXT1S_2;

P1DIR = 0x07; // P1.0, P1.1, P1.2 k olarak tanmlanyor
// P1.0, P1.1, P1.2 GPIO, P1.4 A2 olarak ilev yapacak

// Giri frekans 48'e blnyor, rnekleme frekansmz 166kHz
// 1.2V referans gerilimi aktif
// SMCLK frekans kayna olarak kullanlacak, 8MHz
SD16CTL= SD16XDIV1 | SD16XDIV0 | SD16REFON | SD16SSEL_1;
// A5+ seildi, kazan 1, 4 rnek sonra kesmeye girilecek
// A5=Vss/11 olacak
SD16INCTL0=SD16INCH_5;
// Kesme aktif
// evrim unipolar, yani 0V=0, 3.3V=0xFFFF olacak
// evrim memory'nin son 16 bitine atlacak
// evrim unipolar
// 256OSR
SD16CCTL0 = SD16UNI | SD16IE;
// Tm A-'ler VSS'ye balanacak
SD16AE = 0;

DelayMs(250); // LCD'nin ilemcisinin stabil olmas
// iin 250ms bekleniyor
lcd_init();

lcd_gotoxy(1,1);
lcd_yaz("FxDev.org-MSP430");
lcd_gotoxy(2,1);
lcd_yaz("SD16 ADC Orn. 2");
DelayMs(2000);

// evrime balanyor
FxDev.org Sayfa 42

SD16CCTL0 |= SD16SC;

_EINT(); // Enter LPM0 w/ interrupt

lcd_clear();
lcd_gotoxy(1,1);
lcd_yaz("A5=");

for(;;)
{
temp=sayi*0.001831;
lcd_gotoxy(1,4);
veri_yolla((temp%1000)/100+48);
veri_yolla('.');
veri_yolla((temp%100)/10+48);
veri_yolla((temp%10)+48);
veri_yolla('V');
}
}

// SD16 kesme vektr
#pragma vector = SD16_VECTOR
__interrupt void SD16ISR(void)
{
sayi=SD16MEM0;
SD16CCTL0&=~SD16IFG; // Kesme bayra temizleniyor
}

Devrenin alan grntsn ise resim 6da grebilirsiniz.


Resim-6 A5 Kanal Okumas

FxDev.org Sayfa 43

5.5) A6/Temp Kanaln Okuma

MSP430, yava yava ou mikrodenetleyicide grmeye baladmz i scaklk sensryle
birlikte gelmektedir. Bu da profesyonel uygulamalarda hem entegrenin bulunduu ortamn
scakln renmede, hem de iletiim hzlar gibi kritik uygulamalarda, scaklkla deien
frekans tekrar kalibre etmek iin kullanlmaktadr. MSP430un ierisindeki scaklk sensr
ekil 27de greceiniz zere A6 kanalna balanmtr.

ekil 27 - Scaklk Sensr

MSP430un ierisindeki bu scaklk sensr ekil 28den de grlecei zere bize lineer bir
karakteristik gstermektedir.

ekil 28 - A6/Temp Kanal Karakteristii

ekil 28deki karakteristii verilen sensr kullanabilmek iin ekil 29daki bilgiler gz nne
alnmaldr.
FxDev.org Sayfa 44


ekil 29 - Temp. Bilgileri
ekil 29 gz nne alndnda Voffset gerilimi 0 kabul edilirse scaklk deeri aadaki
formlle hesaplanabilir;

T=(Vsensor/TCsensor)-273
T=(Vsensor/1.32)-273

rnein Vsensor 395 olursa T, yukardaki forml iletildiinde 26C bulunacaktr.

Tm bunlar gz nne alndnda ekil 25teki devre kurulduunda yazlacak kod aadaki
gibi olacaktr.

// MSP430F2013
// . -----------------
// /|\ | |
// | | |
// --|RST |
// | P1.0|-->Clock
// Vin+ -->|A6+/Temp P1.1|-->Data
// |A6- = VSS P1.2|-->Enable
// | |
//

#include <msp430.h>
#include "delay.h"
#include "lcd.h"

unsigned int sayi=0,
temp=0,
Vsensor=0;

void main(void)
{
WDTCTL = WDTPW +WDTHOLD; // Watchdog timer kapatlyor

// alma frekans 1MHz
BCSCTL1 = CALBC1_8MHZ;
DCOCTL = CALDCO_8MHZ;
BCSCTL3= LFXT1S_2;

P1DIR = 0x07; // P1.0, P1.1, P1.2 k olarak
tanmlanyor
// P1.0, P1.1, P1.2 GPIO,
P1.4 A2 olarak ilev yapacak

// Giri frekans 48'e blnyor, rnekleme frekansmz 166kHz
FxDev.org Sayfa 45

// 1.2V referans gerilimi aktif
// SMCLK frekans kayna olarak kullanlacak, 8MHz
SD16CTL= SD16XDIV1 | SD16XDIV0 | SD16REFON | SD16SSEL_1;
// A6+ seildi, kazan 1, 4 rnek sonra kesmeye girilecek
// A6=temp olacak
SD16INCTL0=SD16INCH_6;
// Kesme aktif
// evrim unipolar, yani 0V=0, 3.3V=0xFFFF olacak
// evrim memory'nin son 16 bitine atlacak
// evrim unipolar
// 256OSR
SD16CCTL0 = SD16UNI | SD16IE;
// Tm A-'ler VSS'ye balanacak
SD16AE = 0;

DelayMs(500); // LCD'nin ilemcisinin stabil olmas
// iin 250ms bekleniyor
lcd_init();

lcd_gotoxy(1,1);
lcd_yaz("FxDev.org-MSP430");
lcd_gotoxy(2,1);
lcd_yaz("Temperature Exm.");
DelayMs(2000);

// evrime balanyor
SD16CCTL0 |= SD16SC;

_EINT(); // Enter LPM0 w/ interrupt

lcd_clear();
lcd_gotoxy(1,1);
lcd_yaz("Temp=");

for(;;)
{
Vsensor=(int)((float)sayi*0.00916);
temp=(int)((float)Vsensor*1.32)-273;
lcd_gotoxy(1,6);
veri_yolla((temp%1000)/100+48);
veri_yolla((temp%100)/10+48);
veri_yolla(0xDF);
veri_yolla('C');
}
}

// SD16 kesme vektr
#pragma vector = SD16_VECTOR
__interrupt void SD16ISR(void)
{
sayi=SD16MEM0;
SD16CCTL0&=~SD16IFG; // Kesme bayra temizleniyor
}

Devrenin alr halini resim 7de grebilirsiniz.
FxDev.org Sayfa 46


Resim-7 Scaklk Okumas

BLM 6 EK KISIM/ DERLEYCLER ve KULLANILAN DONANIM

6.1) IAR Proje zellikleri

MSP430u Proteusta simle etmek iin IARda ekil 30 ve 31deki aadaki deiikliklerin
yaplmas gerekmektedir.

ekil 30 - IAR Deiiklikleri 1

FxDev.org Sayfa 47


ekil 31 - IAR Deiiklikleri 2

6.2) Code Composer Studio

zellikle MSP430 mikrodenetleyicisini programlamak iin kullanlan Code Composer Studio,
TIn yaynlad, Eclipse tabanl bir derleyicidir. zellikle IARn sert yapsnn yannda
sunduu Eclipse IDEsi avantajlar kullancya ok fazla kolaylk salad iin bu kitap
ierisindeki tm rnekler bu IDE ile yaplmtr.

Code Composer Studionun snrl versiyonlar aadaki linkten indirilebilir. Kullandmz
mikrodenetleyicilerin hafzas snrl olduundan indirilen snrl versiyonlar
uygulamalarmzda bizlere sknt karmamaktadr.

http://focus.ti.com/docs/toolsw/folders/print/ccstudio.html?DCMP=dsp_ccs_v4&HQS=Other+OT+ccs

Code Composer Studioda yeni bir proje oluturmak iin aadaki admlar srasyla
uygulanmaldr.
FxDev.org Sayfa 48


ekil 32 - Proje Oluturma


ekil 33 - Proje smi Belirleme


FxDev.org Sayfa 49

Bu ksmdan sonra next sekmelerine basarak donanm seme ekranna geliniz.


ekil 34 - Donanm Seim Ekran

Daha sonra ise Finish diyerek projemizi oluturmalyz. Daha sonrasnda proje isminin zerine
gelip sa tklayarak new ve source file diyerek projemize main.c dosyasn ekleyelim.


ekil 35 - Source Dosyas Ekleme




FxDev.org Sayfa 50

Projede main.c dosyasn oluturduktan sonra kitabmzdaki ilk rnek kodlar bu dosyaya
yaptralm ve ekil 36da grlen buton ile derlemeyi gerekletirelim.


ekil 36 - Derleme lemi

Daha sonra ise ekil 37de grlen bcek ekline basarak debug ilemine geerek
donanmmza programmz ykleyelim.


ekil 37 - Donanma Program Ykleme

ekil 38den de grlecei zere debug ekran bize donanmz alrken tm deiiklikleri
ayn anda grmemizi salyor. Bu blm zellikle hata ayklamada bizlere olduka kolaylk
salamaktadr.

ekil 38 - Debug Ekran

FxDev.org Sayfa 51

Daha sonrasnda programmz altrmak iin sadece ekil 39daki play tuuna basmamz
yeterlidir.


ekil 39 - Program altrmak

Ayrca debug ekrannda programmz adm adm yrtmek de mmkndr. Elbette tm bu
ilemleri kullanabilmek iin TIn rettii kitlere ya da programlayclara sahip olunmaldr.

6.3) Kullanlan Donanm

Tm kitap boyunca kullandm donanm resim 8de grlen EZ430-F2013 donanmdr. Bu
donanm zerinde dahili programlayc ve MSP4302013 donanmn barndrmaktadr. Detayl
bilgilere TIn sitesinden ulalabilmektedir.


Resim 8 Kullanlan Donanm

Donanmla ilgili detayl bilgiye aadaki linkten ulaabilirsiniz;

http://focus.ti.com/docs/toolsw/folders/print/ez430-f2013.html





FxDev.org Sayfa 52

BTRRKEN

Sizlere 5 blm boyunca Texas Inst. gelimesi ve dnya apnda kullanmnn artmas iin youn
aba harcad MSP430 mikrodenetleyicisini, IAR ve Code Composer Studio ile birlikte anlatmaya
altm. Kitabta zellikle ska kullandmz mikrodenetleyicilerde grmediimiz 16 bit
znrlkl, sigma/delta ADC birimine daha fazla eilmeye zen gsterdim. Ayrca dier
kitaplarmdan farkl olarak uygulamalarn resimlerini de elimden geldiince ilk kez
mikrodenetleyici renecek kiiler iin koymaya altm.

Mikrodenetleyicinin dk hafza ve kullanm zorluu gibi dezavantajlarndan dolay SPI, I
2
C ve
UART gibi birimlerine kitabn ilk basksnda girmeyi dnmedim, ileride elime daha gl
MSP430 donanm getii taktirde kitabn ikinci basksnda bu ksmlarnda ekleneceini buradan
sylemek isterim.

Kitab takip eden ve katks olan herkese teekkrler

Frat Deveci
Austos 2011
fxdev@fxdev.org
www.fxdev.org

You might also like