Board logo

标题: SR12采用32.768K的晶振,用C语言怎样产生8M的频率,用CW怎么编写?? [打印本页]

作者: 37823542    时间: 2006-6-26 15:46     标题: SR12采用32.768K的晶振,用C语言怎样产生8M的频率,用CW怎么编写??

各位大侠:
  小弟,是刚接触MOTUO的C语言编程者。遇到这个问题后试了多种方法,都没有解决掉。请各位大侠帮帮小弟。
作者: seuafu2005    时间: 2006-6-26 22:30

可以用PE生成代码,我生成了一段,供你参考
/* Common initialization of the write once registers */
/* CONFIG1:
COPRS=0,LVISTOP=0,LVIRSTD=0,LVIPWRD=0,LVI5OR3=0,SSREC=0,STOP=0,COPD=1 */
setReg8(CONFIG1, 0x01);

/* CONFIG2: STOPICLKEN=0,STOPRCLKEN=0,STOPXCLKEN=0,OSCCLK1=0,OSCCLK0=0,??=0,CDOEN=0,SCIBDSRC=0 */
setReg8(CONFIG2, 0x00);

/* Common initialization of the write once registers */
/* PCTL: BCS=0 */
clrReg8Bits(PCTL, 0x10); /* Select clock source from XTAL */
/* PCTL: PLLON=0 */
clrReg8Bits(PCTL, 0x20); /* Disable the PLL */
/* PCTL: PLLIE=0,PLLF=0,PLLON=0,BCS=0,PRE1=0,PRE0=0,VPR1=1,VPR0=0 */

setReg8(PCTL, 0x02); /* Set VCO output Power-of-Two devider P=0 the VCO Power-of-Two multiplier E=2 */

/* PMS: ??=0,??=0,??=0,??=0,MUL11=0,MUL10=0,MUL9=1,MUL8=1,MUL7=1,MUL6=1,MUL5=0,MUL4=1,MUL3=0,MUL2=0,MUL1=0,MUL0=1 */
setReg16(PMS, 0x03D1); /* Set the Feedback divider N=977 */
/* PMRS: VRS7=1,VRS6=1,VRS5=0,VRS4=1,VRS3=0,VRS2=0,VRS1=0,VRS0=0 */
setReg8(PMRS, 0xD0); /* Set the VCO Linear multiplier L=208 */
/* PMDS: ??=0,??=0,??=0,??=0,RDS3=0,RDS2=0,RDS1=0,RDS0=1 */
setReg8(PMDS, 0x01); /* Set the Reference clock devider R=1 */
/* PBWC: AUTO=1,LOCK=0,ACQ=0,??=0,??=0,??=0,??=0,??=0 */
setReg8(PBWC, 0x80); /* Select the operating modes */
/* PCTL: PLLON=1 */
setReg8Bits(PCTL, 0x20); /* Enable the PLL */
while(!PBWC_LOCK) { /* Wait */
}
/* PCTL: BCS=1 */
setReg8Bits(PCTL, 0x10); /* Select clock source from PLL */
__asm("nop");
__asm("nop");
/*** End of PE initialization code after reset ***/

把setReg8Bits()函数可以直接设定成PCTL=0x10;这种形式


作者: 37823542    时间: 2006-6-29 08:32

谢谢拉!!
  不过,可以用PE生成代码??怎么生成啊??
  还有这些代码是放在什么地方??
  是“main.c”里,还是其它地方,还是建一子函数??
作者: 37823542    时间: 2006-6-29 08:43

谢谢拉!!
  我编写了一段代码,但不能产生0.5ms的中断,请问:“错在那里???”

uchar led_data;
void main(void)
{
EnableInterrupts; /* enable interrupts */
/* include your code here */
CONFIG1=0x09; //关闭看门狗, 5V模式
CONFIG2=0x01;
PCTL=0x00;
PBWC = 0X80;
PMSH = 0x03;
PMSL = 0xD1;
PMRS = 0xD0;
PCTL = 0x28; //E=2
while(PBWC_LOCK==0);
PCTL_BCS = 1;
T1SC_TSTOP=1;
T1SC_TRST=1;
T1SC=0x43;
T1MODH=0x01;
T1MODL=0xF4;


DDRD=0xFF; //PTD设置为输出
PTD=0;
led_data=0xFF;//初始化变量
while(1); /* loop forever */ ?????
}
interrupt void T1_OverFlow_ISR(void)
{
T1SC_TOIE=0;
//T1SC&=~0x80;
T1SC_TOF=0;
if(led_data<0x10)
{
led_data=0x80;
}
PTD=led_data;
led_data=(led_data>>1);
T1SC_TOIE=1;
}

作者: zfq711    时间: 2006-6-29 16:35

你的中断程序的中断号不对,正确的写法应该是:
interrupt 7 void T1_OverFlow_ISR(void)
7是定时器1溢出中断的中断号。



作者: seuafu2005    时间: 2006-6-30 15:33

不一定在中断服务子程序中写中断号,可以用中断服务程序配合prm文件的方式




欢迎光临 电子技术论坛_中国专业的电子工程师学习交流社区-中电网技术论坛 (http://bbs.eccn.com/) Powered by Discuz! 7.0.0