|
![](static/image/common/ico_lz.png)
楼主 |
发表于 2007-11-5 15:29:32
|
显示全部楼层
忙了几天,今天有空写了一小段程序来验证内部8M RC震荡器是不是出厂时已经校准的,测试结果是:当编程使用内部8M RC震荡器做时钟源时,OSCCAL 寄存器在复位后确实加载了出厂时经过校准的值,而且在最近买的Mega8中这个校准值的时钟误差基本在1%内,而手上一个2年前的片误差在4~5%之间。
下面简单介绍测试过程及给出相关代码,希望有兴趣的能重复这个测试,以得到更多数据。
一、测试方法
用一个标准频率发生器产生恒定频率的脉冲,例如400us周期的脉冲(200us电平变化一次),测试系统采用内部RC为时钟源,使用1us计时器计数,每个电平变化记录一次计数器值,记录一定数量,计算平均值,消除代码运行时间误差后输出该值,该值和200的比率就是误差。
二、测试系统
要测试内部RC震荡器频率是否准确,就要有基准,手上没有准确的频率发生器,使用一个M16的开发系统来做,使用8M 30ppm的晶体做时钟源,被测系统为M8,通过Int0捕捉M16产生的频率变化。
三、同步基准
因为使用代码来发生脉冲和捕捉脉冲,代码运行需要时间,需要用同一标准来测定代码的运行误差,所以在采用内部RC前被测M8系统先接外部8M晶体做时钟源,用实际测量代码来捕捉脉冲,计算出误差,然后在代码中消除该误差。因为使用30ppm的晶体同步,所以2系统合在一起的误差不会超过1/10000,比1%的RC误差要精确2个数量级以上,所以计算出来的代码误差值是可信的。
测试
频率发生部分代码:
' Bascom 代码
$regfile = "m16def.dat"
$crystal = 8000000 '8M频率
$hwstack = 32
$swstack = 32
$framesize = 48
Config Timer0 = Timer , Prescale = 8 ' 每us计数1次
Config Pina.3 = Output
Config Pina.2 = Output
Enable Interrupts '全局中断允许
Enable Timer0
On Timer0 Tim1_isr Nosave
Porta.2 = 1
Porta.3 = 1
Tcnt0 = 55 ' 计200次还是201次不要紧了, 反正两边会通过同一标准计算差值
Start Timer0
Do
nop
Loop
End
Tim1_isr:
PUSH R24
IN r24, SREG
PUSH R24
Toggle Porta.3 ' 约200us翻转一次电平
Tcnt0 = 55
POP R24
!Out Sreg , R24
POP R24
Return
=================
被测系统部分代码
$regfile = "m8def.dat" ' 编译参数设置
$crystal = 8000000
$hwstack = 32
$swstack = 32
$framesize = 48
$baud = 9600
Config Timer0 = Timer , Prescale = 8 ' 计时器0采用8分频, 每us计数一次
Config Int0 = Change ' 电平变化触发外部中断(约每 200us 1次)
Enable Interrupts '全局中断允许
Enable Int0
On Int0 Int_isr '捕捉外部中断0
Dim Mindex As Byte
Dim I As Byte
Dim Sos As Byte
Dim Mword As Word
Dim Bytes(100) As Byte ' 记100个数
Sos = Osccal ' 原来的OSCCAL
Waitms 100
Tcnt0 = 0
Mindex = 0
Start Timer0 ' 开始计数
Do
If Mindex >= 100 Then ' 已经到了100次(约0.2s)
Mword = 0
For I = 11 To 100 ' 舍弃前10个数, 计算平均数
Mword = Mword + Bytes(i)
Next
Mword = Mword / 90
Stop Timer0
Exit Do
End If
Loop
Mword = Mword - 2 ' 2是用晶体同步得到的代码计数误差
Print "osccal:" ; Sos ; ", avg:" ; Mword ' 输出到PC
End
Int_isr: ' 外部中断处理
Incr Mindex
Bytes(mindex) = Tcnt0 ' 记录当前计数器值
Tcnt0 = 0 ' 计数器清零
Return
测试几片的结果:
osbc`l:175, avf:208
orcbal:165, avg:208
osbc`l:174, avg:208
orccal:174, avg:209 (这4个是同1片,当208左右时数据已经出现"错位")
osccal:185, avg:202
osccal:181, avg:201
osccal:179, avg:199 (这是不同的片, 误差大致为1%)
平均值Mword大多在198-202之间,频率误差基本在1%内,但一片2年前买的Mword为208-209, 误差在4%,PC接收到的字符有时是错误的(例如175有时会变成075), 手上就几片PI的片子, 只能做几个测试, 谁有片的再做测试看看情况如何? |
|