pupist 发表于 2013-2-16 21:22:40

关于OSCCAL – RC 精调控制寄存器

我以前用的Tiny13需要使用这个寄存器校准时钟

校准值是从芯片内读出的   看LGT的手册似乎不能读到这个数字 我应该怎么做呢
一个一个校准不太可能啊

xwkm 发表于 2013-2-16 22:44:05

校准的话,可以使用编程器来校准。
也可以使用程序自动校准。然后把OSCCAL写入eeprom保存。

pupist 发表于 2013-2-16 23:47:08

编程器怎么校准呢LGT提供的工具有这个功能么?

xwkm 发表于 2013-2-16 23:57:17

本帖最后由 xwkm 于 2013-2-16 23:59 编辑

pupist 发表于 2013-2-16 23:47 static/image/common/back.gif
编程器怎么校准呢LGT提供的工具有这个功能么?

具体这个我就不清楚了。因为目前我用的还是山寨工具,非官方的。
至于OSCCAL可以自己找个有源晶振。输入捕获,自己校准就OK了。
顺带说一句,不要试图使用LGT目前自带的RC振荡器跑V-USB。
就算是使用了外部8M的有源晶振校准。但是还是在HUB上99%起不来。
在Intel的后USB接口还好。AMD和HUB的情况一样,完全认不出来。

总之内部目前LGT的内部RC振荡器跑115200波特率,校准过几乎没问题。
但是跑USB就省省吧。老老实实外接晶振吧。

pupist 发表于 2013-2-17 00:12:53

那你的意思是一个一个校准了? 我一次要烧写千把个 不是死翘翘了...   LGT省略了一个有成本的步骤啊

xwkm 发表于 2013-2-17 00:22:31

pupist 发表于 2013-2-17 00:12 static/image/common/back.gif
那你的意思是一个一个校准了? 我一次要烧写千把个 不是死翘翘了...   LGT省略了一个有成本的步骤啊 ...

我放出了一部分的ISP时序。你可以试试自制脱机编程器。然后主控MCU自动校准LGT。
不过貌似脱机编程器可以联系官方获得。应该烧好了OSCCAL也校准好了。
还有我还是老话,V-USB不适合用内部RC,谁用谁知道。

logicgreen 发表于 2013-2-17 13:27:14

工厂出厂之前是已经校准了的,如果认为有必要校准,就给OSCAL赋值就可以。

因为系统启动时先从FUSE处载入OSCAL的值,如果程序再次赋值那么就是使用最新的用户程序的值了。

goodcode 发表于 2013-2-17 18:55:32

写OSCAL时会自动存储OSCAL的值, 这个不知道以后会不会改一下.

pupist 发表于 2013-2-17 20:06:52

logicgreen 发表于 2013-2-17 13:27 static/image/common/back.gif
工厂出厂之前是已经校准了的,如果认为有必要校准,就给OSCAL赋值就可以。

因为系统启动时先从FUSE处载入O ...

这么说 LGT比AVR出厂前还多做了一些呢明白了

xwkm 发表于 2013-2-17 20:27:49

goodcode 发表于 2013-2-17 18:55 static/image/common/back.gif
写OSCAL时会自动存储OSCAL的值, 这个不知道以后会不会改一下.

给OSCCAL赋值的时候貌似没有存储动作。
只是在这个芯片这一次有效,下次加电没去赋值就还是FUSE的值。

goodcode 发表于 2013-2-17 20:45:39

记得之前的测试写OSCAL的值会被存储, 这样会带来一些麻烦.

xwkm 发表于 2013-2-18 10:04:09

goodcode 发表于 2013-2-17 20:45 static/image/common/back.gif
记得之前的测试写OSCAL的值会被存储, 这样会带来一些麻烦.

不会的。你上电的时候试下绝对没存储。

goodcode 发表于 2013-2-18 14:16:02

又测了一下确实不会写熔丝位
    uint8_t i, oldOSCCAL, oldCLKPR;

    oldOSCCAL = OSCCAL;
    oldCLKPR = CLKPR;

    //LED初始化
    DDRD = 1<<PD7;
    ledRedOff();

    _delay_ms(500);

    //2分频 8M 19200
        InitUART( 0x0067);
        TransmitByte( 0xff);
        TransmitByte( 0x00);
        TransmitByte( OSCCAL);
        TransmitByte( CLKPR);
    TransmitByte( 0x00);
    TransmitByte( 0xff);

    //重设时钟校准值
    OSCCAL = 7;
        CLKPR = 0x80;
        CLKPR = 0x80;
        _delay_ms(100);
        //1分频 16M 19200
        InitUART( 0x0067);
        TransmitByte( 0xff);
        TransmitByte( 0x00);
        TransmitByte( OSCCAL);
        TransmitByte( CLKPR);
    TransmitByte( oldOSCCAL);
    TransmitByte( oldCLKPR);
    TransmitByte( 0x00);
    TransmitByte( 0xff);

        for (i=0; i<20; i++)
    {
      ledRedToggle();
      _delay_ms(100);
    }

    ledRedOff();

        _delay_ms(1000);



    while(1);
    return 0;

软复位 FF 00 07 00 07 00 00 FF
上电 FF 00 07 00 40 00 00 FF
不知道为什么 芯片上电不是2分频
看返回的值 OSCCAL 在设置之前读取没意义

xwkm 发表于 2013-2-18 19:07:27

goodcode 发表于 2013-2-18 14:16 static/image/common/back.gif
又测了一下确实不会写熔丝位
    uint8_t i, oldOSCCAL, oldCLKPR;



芯片上电的时候是二分频,设置分频后复位就不会变。但是如果是非SOP28的芯片复位后时钟源一定是IRC。你可以试试。

goodcode 发表于 2013-2-18 19:38:16

我这是工程片 看上面代码 InitUART( 0x0067); 按8m收到的是错位的

之前工程里
    if (OSCCAL != 0x08)
      OSCCAL = 0x08;
蛋疼了

pupist 发表于 2013-3-10 11:45:36

logicgreen 发表于 2013-2-17 13:27 static/image/common/back.gif
工厂出厂之前是已经校准了的,如果认为有必要校准,就给OSCAL赋值就可以。

因为系统启动时先从FUSE处载入O ...

Hello LGT我看到官方例程里每个程序都给OSCAL赋值校准了能解释一下么   TC的例子赋值0x0a Uart例子赋值 0x05   我批量生产的时候到底应该怎么做呢

不赋值?还是挨个校准?

pupist 发表于 2013-3-10 16:45:01

pupist 发表于 2013-3-10 11:45 static/image/common/back.gif
Hello LGT我看到官方例程里每个程序都给OSCAL赋值校准了能解释一下么   TC的例子赋值0x0a Uart例子 ...

又试了一次默认8M是不用校准的

pupist 发表于 2013-3-10 20:42:29

还是这个问题我如果使用默认8MHz 8分频 似乎就不准了哦   难道这个跟直接用8MHz是不同的么?
页: [1]
查看完整版本: 关于OSCCAL – RC 精调控制寄存器