打印

C8051F单片机程序无法设置使用外部晶振,求哥哥姐姐解救。

[复制链接]
9728|32
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
meepo|  楼主 | 2013-1-23 20:43 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
本帖最后由 meepo 于 2013-1-25 08:37 编辑

C8051F580用的外部12M晶振(起振电容为33pF,接10M电阻),示波器观察起振,但是时钟初始化程序中设置使用外部晶振总是失败,即无法从内部晶振切换到外部晶振

时钟初始化相关程序如下:
/****** XTAL1\XTAL2:P0.2,P0.3 ******/
void PORT_INIT(void)   
{ U16 i;

  U8 SFRPAGE_SAVE =  SFRPAGE;
  SFRPAGE   = CONFIG_PAGE;

    //XTAL1,XTAL2,external osc init
  P0MDIN   &= ~0x0C; //P0.2,P0.3 analog in
  P0SKIP  |= 0x0C;   
  P0MDOUT  &= ~0x0c;
  P0    = P0|0x0c;  //force  P0.2 P0.3 in high votalg



//CROSSBAR INIT: UART0,SPI,SMBUS,T0
XBR0    = 0x0d;  //UART0,SPI,SMBUS
XBR1    = 0x02;  //T0 counter
XBR2    = 0x40;   //enable  crossbar


SFRPAGE  = SFRPAGE_SAVE;
}


void SYSCLK_INIT(void)
{
U16 i;
U8 SFRPAGE_SAVE = SFRPAGE;
SFRPAGE   = CONFIG_PAGE;
//RSTSRC = 0x06; //Enable missing clock detector and
                              
OSCXCN |= 0x67;    //external osc enable,12M
for(i=0;i<255;i++);      //Wait 1ms for initialization
while(!(OSCXCN & 0x80));    //waiting for external osc stable
CLKSEL |= 0x01;     //switch to external osc
OSCICN = 0x00;    //disable internal osc

SFRPAGE  = SFRPAGE_SAVE;  //JTAG调试时在此处加了断点
}


在SYSCLK_INIT{}中最后一句处设置断点,在线调试,运行到此处时右边的观察栏中相应寄存器数值:
OSCXCN 0xe7   //外部晶振起振且运行稳定
CLKSEL 0x00     //正常来讲此处应为0x01啊,已表示切换到了外部晶振
OSCICN 0x10     //

调试了一天也没结果,郁闷啊。。。  
是否为起振电容33pF不合适?
程序是照着例程写的,自己也看了datasheet很多,程序的问题?


求各路哥哥姐姐相助。。。。。


补充说明:
                开发工具 Selicon Lab  IDE
                廉价的JTAG仿真器 ,型号EC5
                外部晶振12M, 起振电容33pF

相关帖子

沙发
受不了了| | 2013-1-23 22:24 | 只看该作者
是不是被它的狗咬了,这个c8051f的仿真器太脆弱,我都是点一个灯,烧写进去运行观察

使用特权

评论回复
板凳
meepo|  楼主 | 2013-1-23 23:30 | 只看该作者
受不了了 发表于 2013-1-23 22:24
是不是被它的狗咬了,这个c8051f的仿真器太脆弱,我都是点一个灯,烧写进去运行观察 ...

被狗咬了?  没设置看门狗啊,是默认开启的?

后面几句话你是说先把程序烧进去,看看实际运行情况,不要太在意IDE中仿真器返回的寄存器数值?

使用特权

评论回复
地板
meepo|  楼主 | 2013-1-23 23:31 | 只看该作者
我也是有点怀疑仿真器是否百分百靠谱

使用特权

评论回复
5
DONGXU| | 2013-1-23 23:46 | 只看该作者
C8051有个配置软件,选外部晶振,一直这样用,没出过问题

使用特权

评论回复
6
受不了了| | 2013-1-23 23:50 | 只看该作者
它的狗是默认有效的,所以你最好先关狗,好像很多人都被那狗咬过。它的那个仿真器太脆弱,及其容易坏,我没用过仿真,都是直接烧写进去看运行效果,先控制一个脚点一个灯,然后控制串口,然后就啥都能看了,反正烧写也方便,几秒钟的事,还有,那片子烧写完一定要断一下电,直接运行容易死机

使用特权

评论回复
7
ningling_21| | 2013-1-23 23:54 | 只看该作者
用厂家提供的KIT板和例程试试,应该可以的.

使用特权

评论回复
评论
渤海三叠浪 2013-1-24 18:30 回复TA
回答的好! 
8
meepo|  楼主 | 2013-1-24 08:08 | 只看该作者
一会回去试试,有结果后告诉大家

使用特权

评论回复
9
ayb_ice| | 2013-1-24 08:16 | 只看该作者
你都没有初始化WDT,那100%是WDT引起复位了,导致不停的复位

C8051F的狗默认是开的

使用特权

评论回复
10
lee2k| | 2013-1-24 16:39 | 只看该作者
应该是被狗咬了,这个系列是默认开狗的,还有要用IDE带的那个启动程序,否则初始化太长时间也会被狗咬的!

使用特权

评论回复
11
遇从灵来| | 2013-1-24 16:57 | 只看该作者
怕是等待的时间太短了

使用特权

评论回复
12
渤海三叠浪| | 2013-1-24 18:31 | 只看该作者
ningling_21 发表于 2013-1-23 23:54
用厂家提供的KIT板和例程试试,应该可以的.

对  首先要用例程。用例子搞起来  建立信心再说。

然后自己弄 看看官方例程有什么不足。

使用特权

评论回复
13
hawksabre| | 2013-1-24 20:47 | 只看该作者
也不一定靠谱   呵呵

使用特权

评论回复
14
meepo|  楼主 | 2013-1-24 21:59 | 只看该作者
ayb_ice 发表于 2013-1-24 08:16
你都没有初始化WDT,那100%是WDT引起复位了,导致不停的复位

C8051F的狗默认是开的 ...

狗关了啊,还是不行
现在用那个低档仿真器进行仿真时,两个问题:
1. CLKSEL选择不了外部晶振
2. 程序总是不断循环执行main()函数


是不是我的12M晶振的起振电容33p有些大,不合适?明天我换成22p试试

使用特权

评论回复
15
meepo|  楼主 | 2013-1-24 22:00 | 只看该作者
dwh000 发表于 2013-1-24 14:03
应该是被狗咬了...

main()函数一开始就把狗关了,哎

使用特权

评论回复
16
原野之狼| | 2013-1-24 22:35 | 只看该作者
看看是否要配置交叉开关来接通管脚

使用特权

评论回复
17
受不了了| | 2013-1-24 22:52 | 只看该作者
电容应该没这么苛刻的,我12兆用30pf,11.0592也是30pf,工业现场用,很好用。两天时间,点个灯,烧写进去运行观察,一步跟过来,随便都能发现问题在哪一步了。我是怕了它的仿真器,经常找不到芯片,或者突然就坏了,我抽屉里好的坏的有十几个,现在出差我必须带两个,被它害过两次

使用特权

评论回复
18
sky大花猫| | 2013-1-24 22:57 | 只看该作者
我们公司也是用c8051f040系列,我遇到过晶振启用不了,程序跑偏了,我是从新建个工程,再把这个程序,一段一段复制过去,注意别一下全复制过去,全复制过去可能还会跑偏。

使用特权

评论回复
19
sky大花猫| | 2013-1-24 22:58 | 只看该作者
我们公司也是用c8051f040系列,我遇到过晶振启用不了,程序跑偏了,我是从新建个工程,再把这个程序,一段一段复制过去,注意别一下全复制过去,全复制过去可能还会跑偏。

使用特权

评论回复
20
受不了了| | 2013-1-24 23:11 | 只看该作者
或许原来的程序就有隐患

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

个人签名:善护口意身

9

主题

144

帖子

1

粉丝