打印
[PIC®/AVR®/dsPIC®产品]

请教关于PIC18 的时钟问题,求高手指点!!!

[复制链接]
4950|11
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
本帖最后由 vincentwang 于 2014-9-16 12:38 编辑

刚开始用PIC单片机,看DATASHEET有些地方还是不太明白,再这里请教各位大侠,先谢谢了!
单片机型号是PIC18F87K22,外接8M晶振,开启PLL(PLLX4),问题来了:
1.手册上有个Fosc,此处的Fosc是指外接的8M还是开启PLL后的8X4=32M?
2.使用定时器时(如TIMER0),T0的时钟由Fosc/4和预分频器来决定,那么这里的Fosc/4是指8/4=2M还是32/4=8M?
3.用Protues仿真是,单片机属性中的Processor Clock frequency应该设置成8M还是PLL后的32M?(如图)
求高手指点!


补充:
用protues进行仿真,timer0每1ms中断一次,在1ms中断里面计数200(即200ms)翻转一次LED1的电平。
用示波器测试波形如下图:
当Processor Clock frequency设置为32M时,示波器显示的波形是50ms翻转一次,而当Processor Clock frequency设置为8M时才是200ms翻转一次,才和预期的对得上。
因此有点不解,这个Processor Clock frequency到底是外接晶振的8M还是PLL之后的32M?
实验结果貌似就是外接的8M晶振的频率,求高手指点一下!

仿真图如下:


部分代码如下:
//MPLAB X IDE   + XC8

//部分配置字设置
// CONFIG1L
#pragma config RETEN = ON       // VREG Sleep Enable bit (Enabled)
#pragma config INTOSCSEL = HIGH // LF-INTOSC Low-power Enable bit (LF-INTOSC in High-power mode during Sleep)
#pragma config SOSCSEL = HIGH   // SOSC Power Selection and mode Configuration bits (High Power SOSC circuit selected)
#pragma config XINST = ON       // Extended Instruction Set (Enabled)

// CONFIG1H
#pragma config FOSC = HS1       // Oscillator (HS oscillator (Medium power, 4 MHz - 16 MHz))
#pragma config PLLCFG = ON      // PLL x4 Enable bit (Enabled)
#pragma config FCMEN = OFF      // Fail-Safe Clock Monitor (Disabled)
#pragma config IESO = OFF       // Internal External Oscillator Switch Over Mode (Disabled)

// CONFIG2L
#pragma config PWRTEN = OFF     // Power Up Timer (Disabled)
#pragma config BOREN = SBORDIS  // Brown Out Detect (Enabled in hardware, SBOREN disabled)
#pragma config BORV = 3         // Brown-out Reset Voltage bits (1.8V)
#pragma config BORPWR = ZPBORMV // BORMV Power level (ZPBORMV instead of BORMV is selected)

// CONFIG2H
#pragma config WDTEN = OFF      // Watchdog Timer (WDT disabled in hardware; SWDTEN bit disabled)
#pragma config WDTPS = 1048576  // Watchdog Postscaler (1:1048576)

// timer0初始化
void Tmr0_Init(void)
{
    T0CON = 0X45; //8bit mode ,  F = (Fosc/4)/64 = 32MHz/256 = 125000HZ,   T = 1000000/125000 = 8us
    TMR0L = 125; //125*8us = 1ms

    INTCONbits.INT0IF = 0; // clear intterrupt flag
    INTCON2bits.TMR0IP = 0; // low Priority
    INTCONbits.TMR0IE = 1; // enable Timer0 overflow interrupt

    INTCONbits.PEIE = 1; //enable  low Priority interrupt
    T0CONbits.TMR0ON = 1;
}
// timer0中断函数
void interrupt low_priority Low_ISR()
{
    static u16 i = 0;
    if(TMR0IF & TMR0IE) //Timer0 interrupt
    {
        TMR0IF = 0; //clear flag
        TMR0L = 125;

        if(++i >=200)
        {
            LATAbits.LATA1 = !LATAbits.LATA1; // led1
            i = 0;
        }
    }
}

// main
int main(int argc, char** argv)
{
    DevInit();
    while(1)
    {
        LATAbits.LATA2 = 1; // led2
    }
}
沙发
yklstudent| | 2014-9-11 12:51 | 只看该作者
自己试试就知道了 还来问

使用特权

评论回复
板凳
tdh03z| | 2014-9-11 22:03 | 只看该作者
配置成PLLX4方式了,外接8M晶振后Fosc当然是32MHz

使用特权

评论回复
地板
vincentwang|  楼主 | 2014-9-14 13:54 | 只看该作者
yklstudent 发表于 2014-9-11 12:51
自己试试就知道了 还来问

当然是有试过的,因为和Protues仿真出来的现象不一样,于是就有了这个疑问,比如用TIMER产生一个方波,在protues里用示波器看方波周期,和预期的对不上

使用特权

评论回复
5
vincentwang|  楼主 | 2014-9-14 14:01 | 只看该作者
tdh03z 发表于 2014-9-11 22:03
配置成PLLX4方式了,外接8M晶振后Fosc当然是32MHz

感谢回复!
请教一下,protues仿真时的Processor Clock Frequency是指PLL后的32M还是就是指外接晶振的8M?

使用特权

评论回复
6
yklstudent| | 2014-9-14 18:14 | 只看该作者
32.。。。。

使用特权

评论回复
7
vincentwang|  楼主 | 2014-9-16 08:29 | 只看该作者
yklstudent 发表于 2014-9-14 18:14
32.。。。。

谢谢!
Fosc为32M,那PROTUES里的时钟应该设为多少?图中红色框框那里,貌似我设为8M的时候和预期的现象一致,设为32M时反而不一样了?求解

使用特权

评论回复
8
yklstudent| | 2014-9-16 10:15 | 只看该作者
vincentwang 发表于 2014-9-16 08:29
谢谢!
Fosc为32M,那PROTUES里的时钟应该设为多少?图中红色框框那里,貌似我设为8M的时候和预期的现象 ...

1.手册上有个Fosc,此处的Fosc是指外接的8M还是开启PLL后的8X4=32M?
32MHz
2.使用定时器时(如TIMER0),T0的时钟由Fosc/4和预分频器来决定,那么这里的Fosc/4是指8/4=2M还是32/4=8M?
32/4=8MHz
3.用Protues仿真是,单片机属性中的Clock frequency应该设置成8M还是PLL后的32M?(如图)
32MHz

使用特权

评论回复
9
vincentwang|  楼主 | 2014-9-16 12:34 | 只看该作者
本帖最后由 vincentwang 于 2014-9-16 12:39 编辑
yklstudent 发表于 2014-9-16 10:15
1.手册上有个Fosc,此处的Fosc是指外接的8M还是开启PLL后的8X4=32M?
32MHz
2.使用定时器时(如TIMER0),T ...


非常感谢yklstudent的耐心指导,请看我上面补充的部分代码和仿真图,假如在Protues里的clock frequency 设置为32M,貌似结果不对,反而是设置为8M时结果是对的?有点不解了,不知道这个如何理解?烦请赐教!

使用特权

评论回复
10
yklstudent| | 2014-9-16 14:22 | 只看该作者
vincentwang 发表于 2014-9-16 12:34
非常感谢yklstudent的耐心指导,请看我上面补充的部分代码和仿真图,假如在Protues里的clock frequency  ...

搞错了,PROTEUS下PIC18F87K22确实是该用8MHz,估计读取程序内的配置信息,开启了PLL,导致不用设置成32MHz

使用特权

评论回复
11
vincentwang|  楼主 | 2014-9-29 08:35 | 只看该作者
非常感谢各位,结贴了

使用特权

评论回复
12
wangtao478552| | 2015-7-24 21:16 | 只看该作者
vincentwang 发表于 2014-9-29 08:35
非常感谢各位,结贴了

楼主,同样代码,仿真和实际效果不同,大多是配置字造成的,我看你最后更新的配置字,也没有关闭掉扩展指令集使能位XINST,可能会出很多很奇怪的问题,我也是今天才知道这点。https://bbs.21ic.com/forum.php?mo ... p;page=1#pid5709694

使用特权

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

本版积分规则

5

主题

11

帖子

0

粉丝