搜索
bottom↓
回复: 23

LGT内部RC精准度问题【已解决】

[复制链接]

出0入0汤圆

发表于 2012-5-27 20:18:26 | 显示全部楼层 |阅读模式
本帖最后由 bozai 于 2012-5-28 07:47 编辑

--------------------------------------------------------------------------------------------------
需要使用ISP读出配置值,然后把熔丝配置使能选上 再写入即可。

没有勾选熔丝配置使能时写入任何值都没有效果。

或者在code里写OSCCAL值为0x6 或者0x0A (具体要看出厂校验值) 也可以
--------------------------------------------------------------------------------------------------


准备DIY个东西,看到LGT拥有1%精度的内部RC,打算不使用晶振。

测试UART发现57600波特率PC收没问题,LGT收到的是乱码。换9600,两边全是乱码。
于是写了个程序测翻转IO,用频率计测频率,用来间接测量RC频率。 程序很简单 优化等级-Os
#include "iolgt8f0xa.h"
#include <avr/io.h>

#define LED_DDR                DDRA
#define LED_PORT        PORTA
#define LED_BIT                PA5
#define LED_ON                LED_PORT &= ~(1<<LED_BIT)
#define LED_OFF                LED_PORT |= (1<<LED_BIT)

int main(void)
{
        PMCR |= _BV(CFDS);

        CLKPR = _BV(CLKPCE);
        CLKPR = _BV(CLKPCE); /* Set main clock to 16M */


        LED_DDR |= (1<<LED_BIT);


        while(1)
        {
                LED_ON;
                LED_OFF;
        }

        return 0;
}


反汇编后有三条指令。两条IO翻转的,一条跳转指令。因此是每次翻转需要3个时钟。
用示波器量低电平1个时钟周期,高电平2个时钟周期
用频率计测试发现频率为 4834KHz, 因此系统时钟是14.5M

又找来LGT的demo板测试,频率为4991KHz,约为15MHz

以为自己看错了datasheet,看到的不是精度,而是稳定度。
因此还特地用热风枪吹吹芯片,看看频率漂移如何是不是1%。
用200度的热风正对芯片吹20秒,频率由4991KHz 降到4962KHz。 稳定度的确小于1%。
但是后来仔细看看datasheet,写的的确是精度。

想到芯片可以自己微调,于是用ISP写入RC时钟校验值 (试验的这块默认读出来的值是06),(分别为00,,10,3f)发现没啥影响,都为4991KHz。
自己在code里调整OSCCAL值,发现写入最大值,频率是最小的。 约4940KHz,写0是最大的4992KHz.

由我的试验看LGT的精度并没有1% (稳定性还是不错的), 不知道是不是因为这一批芯片是工程样片的原因。
还是我code 写的有问题。 请帮忙分析一下,谢谢!

阿莫论坛20周年了!感谢大家的支持与爱护!!

曾经有一段真挚的爱情摆在我的面前,我没有珍惜,现在想起来,还好我没有珍惜……

出0入0汤圆

发表于 2012-5-27 20:53:14 | 显示全部楼层
稳定性有1%,不错呀

出0入0汤圆

发表于 2012-5-27 21:50:27 | 显示全部楼层
楼主的实验好仔细
不懂支持下

出0入0汤圆

发表于 2012-5-27 22:22:08 | 显示全部楼层
不懂 ~~帮顶

出0入27汤圆

发表于 2012-5-27 22:36:40 | 显示全部楼层
还没用上LGT,也没有下载到详细的规格书。
据我的经验是选择<=8M的内部时钟才有1%精度,台系芯片大都选择<=4M的内部时钟有3%精度。
lZ选择的内部时钟可能太高了,想想目标芯片的时钟远高于 ISP的时钟,ISP如何能给目标芯片校准?

出0入169汤圆

发表于 2012-5-27 22:40:19 | 显示全部楼层
还没做过多少测试,关注。

出0入0汤圆

发表于 2012-5-27 22:46:43 | 显示全部楼层
俺用默认的设置,115200 全正常。

出0入0汤圆

发表于 2012-5-27 23:18:32 | 显示全部楼层
  1. while(1)
  2. {
  3.      LED_ON;
  4.      LED_OFF;
  5. }
复制代码
这样是不准的,
  1. while(1)
  2. {
  3.      LED_ON;
  4.      LED_OFF;
  5.      LED_ON;
  6.      LED_OFF;
  7.      LED_ON;
  8.      LED_OFF;
  9.      LED_ON;
  10.      LED_OFF;
  11.      LED_ON;
  12.      LED_OFF;
  13.      LED_ON;
  14.      LED_OFF;
  15.      LED_ON;
  16.      LED_OFF;
  17.      LED_ON;
  18.      LED_OFF;
  19. }
复制代码
这样就准多了,至少,除头尾都是准的。

出0入0汤圆

发表于 2012-5-28 00:31:33 | 显示全部楼层
我测试过很多,大多把OSCCAL设为$0A或$06都是16Mhz+-1%。

出0入0汤圆

发表于 2012-5-28 00:36:32 | 显示全部楼层
16Mhz+-1% ,那看来还不错

出0入0汤圆

 楼主| 发表于 2012-5-28 07:20:45 | 显示全部楼层
neutronlmk 发表于 2012-5-27 22:36
还没用上LGT,也没有下载到详细的规格书。
据我的经验是选择

谢谢! LGT只有一个16M的

出0入0汤圆

 楼主| 发表于 2012-5-28 07:21:17 | 显示全部楼层
aozima 发表于 2012-5-27 23:18
这样是不准的,这样就准多了,至少,除头尾都是准的。

这样子测IO翻转频率不错

出0入0汤圆

 楼主| 发表于 2012-5-28 07:30:01 | 显示全部楼层
logicgreen 发表于 2012-5-28 00:31
我测试过很多,大多把OSCCAL设为$0A或$06都是16Mhz+-1%。

听了你的建议, 我把两块板子在code里设置成06 或者0A,的确频率上来了,一个是5283KHz,一个是5315KHz, 这样子的确是1%的精度。
另外通过ISP 写入06 或者0A时 要把 “熔丝配置使能位”选上,然后就能配置成功。

另外问个问题,我一直以为芯片出厂时已经校准好的。直接就能用,不需要ISP读出来校准值,然后配置熔丝使能位再写进去才可以。请问芯片使用前是需要这样操作吗?

出0入0汤圆

发表于 2012-5-28 09:10:55 | 显示全部楼层
看来不错呢?~~

出0入0汤圆

发表于 2012-5-28 10:01:28 | 显示全部楼层
bozai 发表于 2012-5-28 07:30
听了你的建议, 我把两块板子在code里设置成06 或者0A,的确频率上来了,一个是5283KHz,一个是5315KHz,  ...

我们测试的时候会校正RC16Mhz的,不过不知道你那片肿么没有了?ISP工具可以删除配置数据的!

出0入0汤圆

 楼主| 发表于 2012-5-28 10:19:50 | 显示全部楼层
logicgreen 发表于 2012-5-28 10:01
我们测试的时候会校正RC16Mhz的,不过不知道你那片肿么没有了?ISP工具可以删除配置数据的! ...

两片都这样的,所以有可能是被我误删了?
可是我刚开始发现问题的那个芯片是第一次使用,只是烧了个flash,后来发现问题后才尝试去动熔丝的。
另一块是在demo板上的,有可能被设置过熔丝。不过没有选过“熔丝配置使能”为允许。 所以按我得实验这样不会改变时钟值的。

下次再用新的芯片试试。

出0入0汤圆

发表于 2012-5-28 12:53:15 | 显示全部楼层
我的片子也是一样,刚开始用频率正常,串口波特率正常。烧写几次后就不对了,我用的是jtag调试,不知道jtag可不可以修改。

出0入0汤圆

 楼主| 发表于 2012-5-28 18:25:12 | 显示全部楼层
hyg2012 发表于 2012-5-28 12:53
我的片子也是一样,刚开始用频率正常,串口波特率正常。烧写几次后就不对了,我用的是jtag调试,不知道jtag ...

我发现以下情况会导致丢失配置

Code里面对OSCCAL进行了配置,比如写入0x1f
并且 ISP 没有使能 “熔丝配置使能”

这样就会乱掉。 单纯烧flash (代码中没有对OSCCAL赋值的语句)不会导致配置丢失。自己试过30次没发现问题。

出0入0汤圆

 楼主| 发表于 2012-5-28 21:19:56 | 显示全部楼层
logicgreen 发表于 2012-5-28 10:01
我们测试的时候会校正RC16Mhz的,不过不知道你那片肿么没有了?ISP工具可以删除配置数据的! ...

晚上又做了一次实验。拿一片全新的芯片。 只用ISP烧flash,不操作熔丝位。 结果出来的频率是5010KHz。

程序见附件,只是简单的翻转IO (输出到PA5),简单的连一个变量都没有。 具体可看压缩包内的lss文件。
能帮忙检查一下么?

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?注册

x

出0入0汤圆

发表于 2012-5-28 21:35:36 | 显示全部楼层
  1. #define LED_ON                LED_PORT &= ~(1<<LED_BIT)
  2. ...
  3.                 LED_ON;
  4.                 LED_OFF;
复制代码
use this instead:

  1. #define LED_FLP(bit)                LED_PORT ^= (1<<(bit))
  2. ...
  3.                 LED_FLP(RA5);
复制代码
you will need to see the assembly listing to see how many instructions / cycles for each loop.

出0入0汤圆

发表于 2012-5-28 21:46:00 | 显示全部楼层
for comparison, a usb1286 running at 16Mhz produces 143khz waveform in gcc-avr release mode and 74khz waveform in debug mode.

出0入0汤圆

 楼主| 发表于 2012-5-28 22:12:37 | 显示全部楼层
millwood0 发表于 2012-5-28 21:35
use this instead:you will need to see the assembly listing to see how many instructions / cycles for ...

It uses 4 cycles to toggle an IO with your method. The frequency is about 1.87MHz (frc=15MHz).
  1.                 LED_FLP(PA5);
  2.   aa:        90 e2               ldi        r25, 0x20        ; 32
  3.   ac:        82 b1               in        r24, 0x02        ; 2
  4.   ae:        89 27               eor        r24, r25
  5.   b0:        82 b9               out        0x02, r24        ; 2
  6.   b2:        fc cf               rjmp        .-8              ; 0xac <main+0x18>
复制代码
While use “|=” and "&=" operand, the compiler is smart enough to translate it to "cbi" and "sbi" instuction. (but the duty cycle is not 50%, a nop is needed)
  1.                 LED_ON;
  2.   aa:        15 98               cbi        0x02, 5        ; 2
  3.                 LED_OFF;
  4.   ac:        15 9a               sbi        0x02, 5        ; 2
  5.   ae:        fd cf               rjmp        .-6              ; 0xaa <main+0x16>
复制代码

出0入0汤圆

发表于 2012-5-28 22:24:05 | 显示全部楼层
bozai 发表于 2012-5-28 22:12
It uses 4 cycles to toggle an IO with your method. The frequency is about 1.87MHz (frc=15MHz).Whil ...

几年少有露面,原来造小bozai去了呀。。

出0入0汤圆

 楼主| 发表于 2012-5-28 22:37:42 | 显示全部楼层
aozima 发表于 2012-5-28 22:24
几年少有露面,原来造小bozai去了呀。。

哈哈,是女儿。 等稳定了才有点小时间搞搞东西。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片。注意:要连续压缩2次才能满足要求!!】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-8-25 11:13

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表