TimerA流水燈問題分析
做出總結(jié)與糾正,以后可能會(huì)出現(xiàn)同樣的問題.當(dāng)然全不是TimerA
定時(shí)器設(shè)置問題而是在MSP430基礎(chǔ)方面做得不夠.
程序如下:
#include"MSP430x16x.h"
unsigned char LED;
void Init_SystemClock(void)
{
unsigned char i;
BCSCTL1=0x00; //XT2OFF XT2 DIVA.1 DIVA.0 XT5V
RSE.2 RSE.1 RSE.0
BCSCTL2|=SELM1+SELS; //SSEL1 SSEL0 DIVM.1 DIVM.0 SELS
DIVS.1 DIVS.0 DOR
do
{
IFG1&=~OFIFG;
for(i=0xFF;i>0;i--);
}
while((IFG1&OFIFG)!=0);
P5DIR=BIT4+BIT5+BIT6; //MCLK SMCLK ACLK
P5SEL|=BIT4+BIT5+BIT6; //功能端口輸出
}
void Init_Port(void)
{
P4DIR=0xFF;
P4SEL=0x00; //
return;
}
void Init_TimerA(void)
{
TACTL=TASSEL0+TACLR;
TACCTL0=CCIE; //
TACCR0=32768;
TACTL|=MC0;
//TACTL|=TAIE;
return;
}
#pragma vector = TIMERA0_VECTOR
__interrupt void TimerA_ISR(void)
{
LED=((LED==0X80)?0x01LED<<1));
P4OUT=LED;
}
void main(void)
{
WDTCTL=WDTPW+WDTHOLD;
Init_SystemClock();
Init_Port();
Init_TimerA();
_EINT();
LED=0x80;
while(1);
}
程序下載到MSP430F1611后出現(xiàn)如下情況:
1:程序編譯通過卻LED不能顯示
2ED出現(xiàn)后不是按設(shè)定的部位顯示--0X01--而是顯示0X02-
>0X01...0X80;
經(jīng)過單步跟蹤發(fā)現(xiàn)for(i=0xFF;i>0;i--);上的問題,
原定義為:
unsigned char i;
for(i=0;i<256;i++);
i已經(jīng)超值.定義unsigend char i 取值范圍是:0 ~ 255
最好寫成
unsigned char i;
for(i=0xff;i>0;i--);
寫成:
unsigned char i;
for(i=0;i<255;i++); 在觀察窗口發(fā)現(xiàn) i:Error(col1):Unknown
or ambiguous symbol.i --i的值不能確定(模棱兩可)
解決情況1 出現(xiàn)情況2.
原ED=0x01;放在 _EINT(); 前;
但ED=0x01;放在 _EINT(); 后顯示0X40->0x02>0X01...0X80;
經(jīng)分析:
將LED=0X80 放在 _EINT(); 后,顯示正常.
同時(shí)發(fā)現(xiàn)MSP430各寄存器是采用位操作.
<位或>是采用:BCSCTL2=SELM1+SELS;
還是 :BCSCTL2|=SELM1+SELS;
但結(jié)果還是一樣的.這當(dāng)然要和<位與>區(qū)分了 ^_^
評(píng)論