小弟最近在熟悉MSP430F149的时候利用学习板编了一个让八位数码管循环显示0-7数字的时候发现利用下载器下载程序进430之后,段码显示正常,但是位码一直不正常,并且每次给单片机上电的时候数码管显示的结果都不一样,程序运行结果每次都不一样,求助各位大佬帮我看看这是什么情况,多谢各位了!程序代码和学习板电路图如下:
#include "msp430x14x.h"
void delay( int i)
{
while(i>0)
{
i–;
}
}
int cnt;
int n;
int duanma[16] = {0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07,0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};
int weima[8] = {0xfe,0xfd,0xfb,0xf7,0xef,0xdf,0xbf,0x7f};
void main( void )
{
// Stop watchdog timer to prevent time out reset
WDTCTL = WDTPW + WDTHOLD;
//时基模块的时钟设置
//单片机上电时,MCLK主时钟的源默认选择为DCO提供.F1系列DCO默认800KHZ.
//ACLK辅助时钟默认为XT1,XT1一般接32768HZ晶体.
//SMCLK子时钟默认为DCO,同样是800KHZ.
//XT2需要人为开启,并要检测其开启是否成功.
BCSCTL1 &= ~(XT2OFF + XTS); //启动XT2高速时钟模块
// BCSCTL3 |= XT2S3;
//刚才开启了XT2,需要一定时间XT2才进入稳定状态.所以需要等待并检测稳定状态.
do
{
IFG1 &=~OFIFG; //清OSCFault 标志
for(n=0xff;n>0;n–); //延时等待其开启稳定
}
while((IFG1 & OFIFG) !=0); //检查OSCFault标志位是否为0,若为0则表示XT2开启稳定.
//否则一直等下去…
BCSCTL2 |= SELM1; //MCLK主时钟选XT2为时钟源.TX2输入不分频.
BCSCTL2 &= ~SELS; //SMCLK选为DCO为时钟源.
//———————————————–
//—————–初始化IO口
P1DIR = 0xff; P1OUT = 0xff;
P2DIR = 0xff; P2OUT = 0xff;
P3DIR = 0xff; P3OUT = 0xff;
P4DIR = 0xff; P4OUT = 0xff;
P5DIR = 0xff; P5OUT = 0x5f;
P6DIR = 0xff; P6OUT = 0xbf;
cnt = 0;//——————
TACCTL0 = CCIE;
CCR0 = 8000;
TACTL = TASSEL_2 + MC_1;
_EINT();
while(1);
}
#pragma vector=TIMER0_A0_VECTOR
__interrupt void Timer_A (void)
{
_DINT();
while(cnt<8)
{
P4OUT = duanma[cnt];
P6OUT |= BIT6;
delay(10);
P6OUT = 0x00;
P4OUT = weima[cnt];
P5OUT |= BIT5;
delay(10);
P5OUT = 0x00;
delay(30000);
delay(30000);
delay(30000);
delay(30000);
delay(30000);
delay(30000);
delay(30000);
delay(30000);
delay(30000);
delay(30000);
delay(30000);
delay(30000);
delay(30000);
cnt++;
}
cnt = 0;
_EINT();
}
yang mao:
回复 灰小子:
多谢回复!
我用的MCLK是8MHz的,SMCLK是800K的,因为我想在学习板上用肉眼观察到数码管的变化情况,所以使用了大量的delay().
delay()少的时候由于数码管循环显示太快,会导致现象观察不到。
我在IAR里面观察过输出给74HC573的变量的变化过程,发现是没问题的。
我去用示波器观察一下74HC573的输出看看。
thank you for your reply again!
灰小子:
回复 yang mao:
我的意思是有可能中断服务程序还未执行完毕又来了新的中断信号,这样会导致中断服务程序执行完毕马上会响应新的中断
yang mao:
回复 灰小子:
所以我刚开始设计的是在中断程序里面将中断关闭,这样即使中断服务程序还未执行完毕又来了新的中断信号,也不会立刻响应新的中断,而是在将目前的中断服务程序执行完毕之后再将中断打开,这样的话就可以保证中断服务程序执行完成之后再去响应新的中断。刚刚听从你的建议,我用示波器查了一下74HC573的输出,发现确实有问题。
问题出在学习板本身电路设计上!
由于学习板在设计电路的时候可能并未考虑到单片机引脚的带载能力,将单片机的引脚P55直接连接到上述74HC573移位寄存器上面,与此同时P55还连接到了一个8路总线收发器以及3.3V转5V的SN74LVC4245芯片上,导致单片机P55引脚输出的高电平电压仅为大概0.3V左右,在74HC573上无法实现正确的逻辑判断,因此导致了数码管移位出现问题!
get!学到了!多谢你的耐心解答!示波器还是好用,哈哈哈。
yang mao:
回复 yang mao:
我直接把那个SN74LVC4245直接从学习板上焊下来了就正常了
灰小子:
回复 yang mao:
msp430模式是不进行中断嵌套的。进入中断服务程序的时候总中断就已经失能了,退出 中断的时候会自动使能。不需要手动关闭和开启中断的
yang mao:
回复 灰小子:
哦哦,这样呀,我再去看看中断相关的知识,多谢!
Susan Yang:
回复 yang mao:
很高兴您能解决问题!
中断的话,您可以看一下下面的链接
courses.cs.washington.edu/…/04-Interrupts-posted.pdf